Excel 中的药代动力学 - 如何解释多种药物的摄入量?
Pharmacokinetics in Excel - how to account for multiple drug intakes?
虽然听起来很痛苦,但我的任务是实现一个电子表格来计算药物吸收和消除半衰期。我实际上使用的是 LibreOffice Calc,但在 Excel 中测试过的解决方案也会对我有所帮助(因为它可能是便携的,无论如何)。
我的电子表格目前如下所示:
它必须考虑多剂量摄入(即 D 列中的任意新条目)。例如,要使用此电子表格的人需要每 56 小时服用一剂新的 50 毫克药物。
为了在 C 列上写一个工作公式,我遵循了很多步骤:
(所有示例均针对C3;C2手动设置为0
)
= ( C2 * 0,5 ^ ( (B3 - B2) / $H ) ) + D2 * J
- 这确实考虑了多剂量摄入,但没有考虑吸收时间。相反,它 returns 50
在 C3 (8 小时后),48.577
在 C4 (16 小时), (...) and 25.000
on C27 (192 hours, or 1 half-life), etc. 换句话说,血液中的药物浓度升高立即。相反,根据 H2.'Time to Cmax'
,它应该线性上升
= IFERROR( ( ( INDEX( $D:$D2; MATCH(1E+306; $D:$D2; 1) ) * J ) * MIN( ( B3 - ( INDEX( $B:$B2; MATCH(1E+306; $D:$D2; 1) ) ) ) / $H; 1 ) ); 0 )
- 这会计算 总 吸收随时间的推移,它线性上升直到在 C16 [=65= 中达到 50
](112 小时) 之后就住在那里。它与前面的公式不同,因为这个公式找到了在 D 列中输入的最后一个值(使用 INDEX 和 MATCH 的组合)。但是,正因为如此,它不再考虑多次摄入 - 只有最后一次。
= IFERROR( ( ( ( INDEX( $D:$D2; MATCH(1E+306; $D:$D2; 1) ) * J ) * MIN( ( B3 - ( INDEX( $B:$B2; MATCH(1E+306; $D:$D2; 1) ) ) ) / $H; 1 ) ) - ( ( INDEX( $D:$D2; MATCH(1E+306; $D:$D2; 1) ) * J ) * MIN( ( B2 - ( INDEX( $B:$B2; MATCH(1E+306; $D:$D2; 1) ) ) ) / $H; 1 ) ) ); 0 )
- 此 returns 在过去 8 小时(1 行)期间吸收的药物量。即,C3 是 3.704
,C4 也是 3.704
,(...) C15 (104 小时) 也是 3.704
,而 C16 (112小时)为1.852
,C17及以下为0
(假设除D2外没有其他剂量摄入)。它和前面的公式有同样的缺点。
= ( C2 * 0,5 ^ ( (B3 - B2) / $H ) ) + IFERROR( ( ( ( INDEX( $D:$D2; MATCH(1E+306; $D:$D2; 1) ) * J ) * MIN( ( B3 - ( INDEX( $B:$B2; MATCH(1E+306; $D:$D2; 1) ) ) ) / $H; 1 ) ) - ( ( INDEX( $D:$D2; MATCH(1E+306; $D:$D2; 1) ) * J ) * MIN( ( B2 - ( INDEX( $B:$B2; MATCH(1E+306; $D:$D2; 1) ) ) ) / $H; 1 ) ) ); 0 )
- 这个是是我目前最先进的公式。它解释了吸收量的线性吸收和对数消除。
2019-10-11 更新: 我想出了对上面第 3 步的性能改进,形式为:= IFERROR( ( ( IF( ( B3 - INDEX( $B:$B2; MATCH(1E+306; $D:$D2; 1) ) ) <= H; (B3 - B2); IF( ( ( B3 - INDEX( $B:$B2; MATCH(1E+306; $D:$D2; 1) ) ) - H ) < (B3 - B2); ( ( B3 - INDEX( $B:$B2; MATCH(1E+306; $D:$D2; 1) ) ) - H ); 0 ) ) * INDEX( $D:$D2; MATCH(1E+306; $D:$D2; 1) ) ) / H ); 0 )
。
更新后的完整公式和当前最先进,如上面的屏幕截图所示,是: = ( C2 * 0,5 ^ ( (B3 - B2) / $H ) ) + IFERROR( ( ( IF( ( B3 - INDEX( $B:$B2; MATCH(1E+306; $D:$D2; 1) ) ) <= H; (B3 - B2); IF( ( ( B3 - INDEX( $B:$B2; MATCH(1E+306; $D:$D2; 1) ) ) - H ) < (B3 - B2); ( ( B3 - INDEX( $B:$B2; MATCH(1E+306; $D:$D2; 1) ) ) - H ); 0 ) ) * INDEX( $D:$D2; MATCH(1E+306; $D:$D2; 1) ) ) / H ); 0 )
.
但是,这个公式仍然没有考虑后续的剂量摄入,无论如何都不正确。 IE。如果我在单元格 D9 中输入新值 50
,单元格 C10 中的值应该会增加,但实际上并没有增加。
经过深思熟虑并寻求帮助elsewhere,我仍然不知道如何才能做到这一点。
有人能帮忙吗?
作为附加上下文,此示例中的药物是环戊丙酸睾酮 (TC),以肌内注射方式给药,'T / TC ratio' 指存在的睾酮 (T) 的比例在 TC 上,我真的不知道这个比率是否真的是 1。'Time to Cmax' 是药物在血液中达到最大浓度所需的时间。
我被告知吸收可能不是完全线性的,当达到 Cmax 时,药物可能不会 100% 吸收,这意味着其中一些之后会继续吸收;尽管如此,我还是可以假设它是线性的,并且在 Cmax 处 100% 被吸收,因为对于将要使用电子表格的人来说,这是一个足够好的近似值。
I'm putting the spreadsheet on Google Drive 让其他人更容易帮助我。
谢谢。
试试这个:
首先,由于没有办法声明一个可能的永无止境的功能,所以只计算1毫克,直到浓度消失。
将那个保留在一列中(我放在 J 列中),你只需要制作一个循环即可。
Public Function Concent(Time_Origin As Long)
Dim Cycle As Long
Dim i As Long
Dim j As Long
Dim Items(10000) As Long
Dim Intake(10000) As Long
Dim Concent_1mg(2152) As Double
j = 0
Cycle = Time_Origin / 8 + 7
For i = 6 To Cycle
If Cells(i, 4) <> "" Then
Items(j + 1) = i
Intake(j + 1) = Cells(i, 4).Value2
j = j + 1
End If
Next
For i = 1 To 2147
Concent_1mg(i) = Cells(i + 5, 10).Value2
Next
For i = 1 To j
Concent = Concent + Intake(i) * Concent_1mg(Cycle - Items(i))
Next i
End Function
一旦这样,调用这个函数就可以计算出自起源以来的时间浓度。
希望对您有所帮助
虽然听起来很痛苦,但我的任务是实现一个电子表格来计算药物吸收和消除半衰期。我实际上使用的是 LibreOffice Calc,但在 Excel 中测试过的解决方案也会对我有所帮助(因为它可能是便携的,无论如何)。
我的电子表格目前如下所示:
它必须考虑多剂量摄入(即 D 列中的任意新条目)。例如,要使用此电子表格的人需要每 56 小时服用一剂新的 50 毫克药物。
为了在 C 列上写一个工作公式,我遵循了很多步骤:
(所有示例均针对C3;C2手动设置为0
)
,它应该线性上升= ( C2 * 0,5 ^ ( (B3 - B2) / $H ) ) + D2 * J
- 这确实考虑了多剂量摄入,但没有考虑吸收时间。相反,它 returns50
在 C3 (8 小时后),48.577
在 C4 (16 小时), (...) and25.000
on C27 (192 hours, or 1 half-life), etc. 换句话说,血液中的药物浓度升高立即。相反,根据 H2.'Time to Cmax'= IFERROR( ( ( INDEX( $D:$D2; MATCH(1E+306; $D:$D2; 1) ) * J ) * MIN( ( B3 - ( INDEX( $B:$B2; MATCH(1E+306; $D:$D2; 1) ) ) ) / $H; 1 ) ); 0 )
- 这会计算 总 吸收随时间的推移,它线性上升直到在 C16 [=65= 中达到50
](112 小时) 之后就住在那里。它与前面的公式不同,因为这个公式找到了在 D 列中输入的最后一个值(使用 INDEX 和 MATCH 的组合)。但是,正因为如此,它不再考虑多次摄入 - 只有最后一次。= IFERROR( ( ( ( INDEX( $D:$D2; MATCH(1E+306; $D:$D2; 1) ) * J ) * MIN( ( B3 - ( INDEX( $B:$B2; MATCH(1E+306; $D:$D2; 1) ) ) ) / $H; 1 ) ) - ( ( INDEX( $D:$D2; MATCH(1E+306; $D:$D2; 1) ) * J ) * MIN( ( B2 - ( INDEX( $B:$B2; MATCH(1E+306; $D:$D2; 1) ) ) ) / $H; 1 ) ) ); 0 )
- 此 returns 在过去 8 小时(1 行)期间吸收的药物量。即,C3 是3.704
,C4 也是3.704
,(...) C15 (104 小时) 也是3.704
,而 C16 (112小时)为1.852
,C17及以下为0
(假设除D2外没有其他剂量摄入)。它和前面的公式有同样的缺点。= ( C2 * 0,5 ^ ( (B3 - B2) / $H ) ) + IFERROR( ( ( ( INDEX( $D:$D2; MATCH(1E+306; $D:$D2; 1) ) * J ) * MIN( ( B3 - ( INDEX( $B:$B2; MATCH(1E+306; $D:$D2; 1) ) ) ) / $H; 1 ) ) - ( ( INDEX( $D:$D2; MATCH(1E+306; $D:$D2; 1) ) * J ) * MIN( ( B2 - ( INDEX( $B:$B2; MATCH(1E+306; $D:$D2; 1) ) ) ) / $H; 1 ) ) ); 0 )
- 这个是是我目前最先进的公式。它解释了吸收量的线性吸收和对数消除。2019-10-11 更新: 我想出了对上面第 3 步的性能改进,形式为:
= IFERROR( ( ( IF( ( B3 - INDEX( $B:$B2; MATCH(1E+306; $D:$D2; 1) ) ) <= H; (B3 - B2); IF( ( ( B3 - INDEX( $B:$B2; MATCH(1E+306; $D:$D2; 1) ) ) - H ) < (B3 - B2); ( ( B3 - INDEX( $B:$B2; MATCH(1E+306; $D:$D2; 1) ) ) - H ); 0 ) ) * INDEX( $D:$D2; MATCH(1E+306; $D:$D2; 1) ) ) / H ); 0 )
。更新后的完整公式和当前最先进,如上面的屏幕截图所示,是:
= ( C2 * 0,5 ^ ( (B3 - B2) / $H ) ) + IFERROR( ( ( IF( ( B3 - INDEX( $B:$B2; MATCH(1E+306; $D:$D2; 1) ) ) <= H; (B3 - B2); IF( ( ( B3 - INDEX( $B:$B2; MATCH(1E+306; $D:$D2; 1) ) ) - H ) < (B3 - B2); ( ( B3 - INDEX( $B:$B2; MATCH(1E+306; $D:$D2; 1) ) ) - H ); 0 ) ) * INDEX( $D:$D2; MATCH(1E+306; $D:$D2; 1) ) ) / H ); 0 )
.
但是,这个公式仍然没有考虑后续的剂量摄入,无论如何都不正确。 IE。如果我在单元格 D9 中输入新值 50
,单元格 C10 中的值应该会增加,但实际上并没有增加。
经过深思熟虑并寻求帮助elsewhere,我仍然不知道如何才能做到这一点。
有人能帮忙吗?
作为附加上下文,此示例中的药物是环戊丙酸睾酮 (TC),以肌内注射方式给药,'T / TC ratio' 指存在的睾酮 (T) 的比例在 TC 上,我真的不知道这个比率是否真的是 1。'Time to Cmax' 是药物在血液中达到最大浓度所需的时间。
我被告知吸收可能不是完全线性的,当达到 Cmax 时,药物可能不会 100% 吸收,这意味着其中一些之后会继续吸收;尽管如此,我还是可以假设它是线性的,并且在 Cmax 处 100% 被吸收,因为对于将要使用电子表格的人来说,这是一个足够好的近似值。
I'm putting the spreadsheet on Google Drive 让其他人更容易帮助我。
谢谢。
试试这个:
首先,由于没有办法声明一个可能的永无止境的功能,所以只计算1毫克,直到浓度消失。
将那个保留在一列中(我放在 J 列中),你只需要制作一个循环即可。
Public Function Concent(Time_Origin As Long)
Dim Cycle As Long
Dim i As Long
Dim j As Long
Dim Items(10000) As Long
Dim Intake(10000) As Long
Dim Concent_1mg(2152) As Double
j = 0
Cycle = Time_Origin / 8 + 7
For i = 6 To Cycle
If Cells(i, 4) <> "" Then
Items(j + 1) = i
Intake(j + 1) = Cells(i, 4).Value2
j = j + 1
End If
Next
For i = 1 To 2147
Concent_1mg(i) = Cells(i + 5, 10).Value2
Next
For i = 1 To j
Concent = Concent + Intake(i) * Concent_1mg(Cycle - Items(i))
Next i
End Function
一旦这样,调用这个函数就可以计算出自起源以来的时间浓度。
希望对您有所帮助