我写了一个业余爱好程序来简化护士的工作,根据测得的血糖计算胰岛素药丸的剂量和输注率。
这里有几个协议。几乎所有的医院都制定自己的协议或修改现有的协议,以满足他们对手头病人的特殊关切。
这是科学文章的一个例子:
<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>这是我最初写的函数之一:
(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章:英语子集的语法)时,我决定尝试一种基于规则、数据驱动的方法,并将上述代码转换为:
(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之间的血糖范围,肯定会更容易。
胰岛素输注一旦启动,就会根据一系列测量结果进行调节。同一项研究的一个例子如下:
<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连接到数据库,并运行一些测试。然而,最常见的情况是,我运行奇怪的函数来计算两个血糖测量值之间差异的方差,因为统计编程语言并不仅仅是用来计算方差的。
我没有把这些功能包括在这个问题中,因为它们非常复杂,质量也很差。更重要的是,我经常根据统计分析的结果来改变它们。
然而,在每次分析之后,我经常用手修改血糖范围或相应的剂量。因此,我想扩展以上的数据结构,以容纳一些变量,如病人年龄,或糖尿病病史。
到目前为止,我想出了一个类似矩阵的结构,例如:
'(old-person fragile undernourished diabetic) x '(144 - 179 3 1)或
'(young-person fit obese non-diabetic) x '(144 - 179 6 2)当然,真正的表现是:
#2A((YOUNG-PERSON FIT OBESE NON-DIABETIC) (144 179 6 2))我的灵感来自于在机器学习(如郁郁葱葱 )中大量使用矩阵操作,同时试图理解这一主题。虽然矩阵非常适合R和其他几个软件,但在我看来,它们就像sql表的另一种表示形式。我寻找一个更自然的数据表示。
问题:
analysis -> modify ranges/doses的过程。由于对病人安全的担忧,这将不可避免地涉及大规模的实时检查,以检查各种可能的错误。在建议使用任何其他方法之前,请记住,我还考虑过通过持续分析数据,并借助CL-普及率或AllegroGraph三倍的对象持久性来进行实时优化。我还没有试过其中的任何一种,因为我还没有准备好接受实时监控和与之相关的潜在风险。我只需要一个简单的、可扩展的入门,这显然是设计过程中最重要的部分之一。
发布于 2017-11-30 23:12:00
一些编码风格反馈:
<=允许检查变量是否在边界之间。values返回多个对象示例:
(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))))(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" )nthLOOP可以分解列表示例:
(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))))https://codereview.stackexchange.com/questions/181577
复制相似问题