首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >胰岛素负荷量和输注率的计算

胰岛素负荷量和输注率的计算
EN

Code Review用户
提问于 2017-11-29 12:23:10
回答 1查看 111关注 0票数 1

我写了一个业余爱好程序来简化护士的工作,根据测得的血糖计算胰岛素药丸的剂量和输注率。

这里有几个协议。几乎所有的医院都制定自己的协议或修改现有的协议,以满足他们对手头病人的特殊关切。

这是科学文章的一个例子:

代码语言:javascript
复制
<table cellpadding="2">
<tr><td>Blood Glucose</td><td>Regular Insulin, Bolus</td><td>Regular lnsulin, Infusion</td></tr>
<tr><td>151-200</td><td>No bolus</td><td>2 units/h intravenously</td></tr>
<tr><td>201-250</td><td>3 units intravenously</td><td>2 units/h intravenously</td></tr>
<tr><td>251-300</td><td>6 units intravenously</td><td>3 units/h intravenously</td></tr>
<tr><td>301-350</td><td>9 units intravenously</td><td>3 units/h intravenously</td></tr>
<tr><td>350</td><td>10 units intravenously</td><td>4 units/h intravenously</td></tr>
</table>

这是我最初写的函数之一:

代码语言:javascript
复制
(defun calculate-insulin-dose (blood-glucose)
  "Returns a cons as: ("bolus dose" . "infusion rate")
  (cond ((and (> kan-sekeri 116) (<= kan-sekeri 143)) (cons 0 1))
        ((and (> kan-sekeri 143) (<= kan-sekeri 179)) (cons 5 1))
        ((and (> kan-sekeri 179) (<= kan-sekeri 233)) (cons 7 2))
        ((and (> kan-sekeri 233) (<= kan-sekeri 287)) (cons 10 3))
        ((and (> kan-sekeri 287) (<= kan-sekeri 360)) (cons 13 4))
        ((> kan-sekeri 360) (cons 15 5))))

在阅读彼得·诺维格( Peter Norvig )的著作“人工智能编程范例:公共Lisp案例研究”(第2章:英语子集的语法)时,我决定尝试一种基于规则、数据驱动的方法,并将上述代码转换为:

代码语言:javascript
复制
(defparameter *INFUSION-TABLE*
  '((117 - 143            0           1              )
    (144 - 179            5           1              )
    (180 - 233            7           2              )
    (234 - 287            10          3              )
    (288 - 359            13          4              )
    (360 - 999            15          5              ))
    "Blood glucose range  Bolus dose  Infusion rate"  )

(defun check-protocol (blood-glucose row)
  (when (and (> blood-glucose (first row))
         (<= blood-glucose (third row)))
    (list* (fourth row) (fifth row))))

(defun calculate-insulin-dose (blood-glucose)
  (mapcan #'(lambda (x)
          (check blood-glucose (nth x *INFUSION-TABLE*)))
      '(0 1 2 3 4 5)))

我并不是说这就是彼得·诺维格的意思,但要检查简单的范围误差,比如检查144-179和179-233之间的血糖范围,肯定会更容易。

胰岛素输注一旦启动,就会根据一系列测量结果进行调节。同一项研究的一个例子如下:

代码语言:javascript
复制
<table cellpadding="2">
<tr><td></td>
    <td colspan="3" align="center">Current Insulin Infusion Rates</td></tr>
<tr><td>Current Blood Glucose</td>
    <td>1-5 units/h</td>
    <td>6-10 units/h</td>
    <td>11-15 units/h</td></tr>
<tr><td valign="top">151-200</td><td>No bolus<p>↑ by 1 unit/h</td>
    <td>No bolus<p>↑ by 2 units/h</td>
    <td>No bolus<p>↑ by 2 units/h</td></tr>
<tr><td valign="top">201-250</td><td>3 units<p>↑ by 1 unit/h</td>
    <td>5 units<p>↑ by 2 units/h</td>
    <td>5 units<p>↑ by 2 units/h</td></tr>
<tr><td valign="top">201-250</td><td>3 units<p>↑ by 1 unit/h</td>
    <td>5 units<p>↑ by 2 units/h</td>
    <td>5 units<p>↑ by 2 units/h</td></tr>
<tr><td valign="top">251-300</td><td>8 units<p>↑ by 1 unit/h</td>
    <td>8 units<p>↑ by 2 units/h</td>
    <td>8 units<p>↑ by 2 units/h</td></tr>
<tr><td valign="top">301-350</td><td>10 units<p>↑ by 1 unit/h</td>
    <td>10 units<p>↑ by 2 units/h</td>
    <td>10 units<p>↑ by 2 units/h</td></tr>
<tr><td valign="top">>350</td><td>10 units<p>↑ by 2 unit/h</td>
    <td>10 units<p>↑ by 3 units/h</td>
    <td>10 units<p>↑ by 3 units/h</td></tr>
</table>

目前,测量值、胰岛素剂量和输注率都存储在postgresql数据库中,以及有关相应患者的几个人口统计学信息;我偶尔会进行一些统计分析,以确定某一比例的患者是否做得足够好。要做到这一点,我检查不良事件,如低血糖或持续高血糖。我还检查某些病人群体(如创伤病人等)是否受益于目前的输液方案。

我经常通过R连接到数据库,并运行一些测试。然而,最常见的情况是,我运行奇怪的函数来计算两个血糖测量值之间差异的方差,因为统计编程语言并不仅仅是用来计算方差的。

我没有把这些功能包括在这个问题中,因为它们非常复杂,质量也很差。更重要的是,我经常根据统计分析的结果来改变它们。

然而,在每次分析之后,我经常用手修改血糖范围或相应的剂量。因此,我想扩展以上的数据结构,以容纳一些变量,如病人年龄,或糖尿病病史。

到目前为止,我想出了一个类似矩阵的结构,例如:

代码语言:javascript
复制
'(old-person fragile undernourished diabetic) x '(144 - 179 3 1)

代码语言:javascript
复制
'(young-person fit obese non-diabetic) x '(144 - 179 6 2)

当然,真正的表现是:

代码语言:javascript
复制
#2A((YOUNG-PERSON FIT OBESE NON-DIABETIC) (144 179 6 2))

我的灵感来自于在机器学习(如郁郁葱葱 )中大量使用矩阵操作,同时试图理解这一主题。虽然矩阵非常适合R和其他几个软件,但在我看来,它们就像sql表的另一种表示形式。我寻找一个更自然的数据表示。

问题:

  1. 我无法想象数据驱动的方法会如何简化我的工作(修改范围和剂量),因为我将所有内容都存储在sql数据库中。(我不感兴趣,比方说,面向对象或XXX的方法会有什么用。)效率不是我最关心的问题,因为系统每小时接收大约20个输入(我使用hunchentoot作为用户界面)。但是,我打算在将来通过构造一个闭环来自动化analysis -> modify ranges/doses的过程。由于对病人安全的担忧,这将不可避免地涉及大规模的实时检查,以检查各种可能的错误。
  2. 是否有修改上述数据结构的提示,以便从可扩展的数据结构开始?**

在建议使用任何其他方法之前,请记住,我还考虑过通过持续分析数据,并借助CL-普及率或AllegroGraph三倍的对象持久性来进行实时优化。我还没有试过其中的任何一种,因为我还没有准备好接受实时监控和与之相关的潜在风险。我只需要一个简单的、可扩展的入门,这显然是设计过程中最重要的部分之一。

EN

回答 1

Code Review用户

发布于 2017-11-30 23:12:00

一些编码风格反馈:

函数

  • <=允许检查变量是否在边界之间。
  • values返回多个对象

示例:

代码语言:javascript
复制
(defun calculate-insulin-dose (blood-glucose)
  "Returns bolus dose and infusion rate"
  (cond ((<= 117 blood-glucose 143)  (values  0 1))
        ((<= 144 blood-glucose 179)  (values  5 1))
        ((<= 180 blood-glucose 233)  (values  7 2))
        ((<= 234 blood-glucose 287)  (values 10 3))
        ((<= 288 blood-glucose 360)  (values 13 4))
        ((<= 361 blood-glucose    )  (values 15 5))))

代码语言:javascript
复制
(defparameter *INFUSION-TABLE*
  '((117 - 143            0           1              )
    (144 - 179            5           1              )
    (180 - 233            7           2              )
    (234 - 287            10          3              )
    (288 - 359            13          4              )
    (360 - 999            15          5              ))
    "Blood glucose range  Bolus dose  Infusion rate"  )
  • 直接迭代列表,不要使用nth
  • LOOP可以分解列表

示例:

代码语言:javascript
复制
(defun calculate-insulin-dose (blood-glucose)
  (loop for (a nil b dose rate) in *INFUSION-TABLE*
        when (<= a blood-glucose b)
        do (return (values dose rate))))
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/181577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档