【问题标题】:Pharmacokinetics in Excel - how to account for multiple drug intakes?Excel 中的药代动力学 - 如何计算多种药物摄入量?
【发布时间】:2020-02-03 07:43:00
【问题描述】:

虽然听起来很痛苦,但我的任务是实施一个电子表格来计算药物吸收和消除半衰期。我实际上使用 LibreOffice Calc,但在 Excel 中测试的解决方案也会对我有所帮助(因为它可能是可移植的,无论如何)。

我的电子表格目前如下所示:

它必须考虑多剂量摄入(即 D 列中的任意新条目)。例如,要使用此电子表格的人需要每 56 小时服用一次新的 50mg 剂量的药物。

为了在 C 列上编写工作公式,我遵循了许多步骤:
(所有示例均针对 C3;C2 手动设置为 0

  1. = ( C2 * 0,5 ^ ( (B3 - B2) / $H$3 ) ) + D2 * J$2 - 这确实考虑了多剂量摄入,但不考虑吸收时间。相反,它在 C3 (8 小时后) 上返回 50,在 C4 (16 小时) 上返回 48.577,在 C27 上返回 (...) 和 25.000 (192小时,或1个半衰期)等。换句话说,血液中的药物浓度立即上升。相反,它应该线性上升,根据 H2 中的“达到 Cmax 的时间”。

  2. = IFERROR( ( ( INDEX( $D$2:$D2; MATCH(1E+306; $D$2:$D2; 1) ) * J$2 ) * MIN( ( B3 - ( INDEX( $B$2:$B2; MATCH(1E+306; $D$2:$D2; 1) ) ) ) / $H$2; 1 ) ); 0 ) - 这会计算随着时间的推移总吸收,它会线性上升,直到在 C16 达到50(112 小时),然后保持在那里。它与前面的公式不同,因为这个公式查找在 D 列中输入的最后一个值(结合了 INDEX 和 MATCH)。但是,正因为如此,它不再占多个摄入量 - 只占最后一个。

  3. = IFERROR( ( ( ( INDEX( $D$2:$D2; MATCH(1E+306; $D$2:$D2; 1) ) * J$2 ) * MIN( ( B3 - ( INDEX( $B$2:$B2; MATCH(1E+306; $D$2:$D2; 1) ) ) ) / $H$2; 1 ) ) - ( ( INDEX( $D$2:$D2; MATCH(1E+306; $D$2:$D2; 1) ) * J$2 ) * MIN( ( B2 - ( INDEX( $B$2:$B2; MATCH(1E+306; $D$2:$D2; 1) ) ) ) / $H$2; 1 ) ) ); 0 ) - 返回过去 8 小时(1 行)期间吸收的药物量。即,C3 是3.704,C4 也是3.704,(...)C15 (104 小时) 也是3.704,而C16 (112 小时)1.852,C17 及以下是0(假设除了 D2 之外没有其他剂量摄入)。和上一个公式有同样的缺点。

  4. = ( C2 * 0,5 ^ ( (B3 - B2) / $H$3 ) ) + IFERROR( ( ( ( INDEX( $D$2:$D2; MATCH(1E+306; $D$2:$D2; 1) ) * J$2 ) * MIN( ( B3 - ( INDEX( $B$2:$B2; MATCH(1E+306; $D$2:$D2; 1) ) ) ) / $H$2; 1 ) ) - ( ( INDEX( $D$2:$D2; MATCH(1E+306; $D$2:$D2; 1) ) * J$2 ) * MIN( ( B2 - ( INDEX( $B$2:$B2; MATCH(1E+306; $D$2:$D2; 1) ) ) ) / $H$2; 1 ) ) ); 0 ) - 这 我目前最先进的公式。它说明了吸收量的线性吸收和对数消除。

  5. 2019 年 10 月 11 日更新:我想出了对上述第 3 步的性能改进,形式为:= IFERROR( ( ( IF( ( B3 - INDEX( $B$2:$B2; MATCH(1E+306; $D$2:$D2; 1) ) ) <= H$2; (B3 - B2); IF( ( ( B3 - INDEX( $B$2:$B2; MATCH(1E+306; $D$2:$D2; 1) ) ) - H$2 ) < (B3 - B2); ( ( B3 - INDEX( $B$2:$B2; MATCH(1E+306; $D$2:$D2; 1) ) ) - H$2 ); 0 ) ) * INDEX( $D$2:$D2; MATCH(1E+306; $D$2:$D2; 1) ) ) / H$2 ); 0 )

    如上面的屏幕截图所示,更新后的完整公式和当前最新技术是:= ( C2 * 0,5 ^ ( (B3 - B2) / $H$3 ) ) + IFERROR( ( ( IF( ( B3 - INDEX( $B$2:$B2; MATCH(1E+306; $D$2:$D2; 1) ) ) <= H$2; (B3 - B2); IF( ( ( B3 - INDEX( $B$2:$B2; MATCH(1E+306; $D$2:$D2; 1) ) ) - H$2 ) < (B3 - B2); ( ( B3 - INDEX( $B$2:$B2; MATCH(1E+306; $D$2:$D2; 1) ) ) - H$2 ); 0 ) ) * INDEX( $D$2:$D2; MATCH(1E+306; $D$2:$D2; 1) ) ) / H$2 ); 0 )

但是,这个公式仍然没有考虑到后续的剂量摄入,无论如何都不正确。 IE。如果我在单元格 D9 中输入新值 50,则单元格 C10 中的值应该会增加,但不会增加。
经过深思熟虑并寻求帮助elsewhere,我仍然不知道它是如何做到的。

谁能帮忙?


作为附加上下文,本例中的药物是环戊丙酸睾酮 (TC),作为肌肉注射给药,“T / TC 比率”是指 TC 上存在的睾酮 (T) 的比率,我真的不知道这个比率是否真的是 1。'Time to Cmax' 是药物在血液中达到最大浓度所需的时间。

有人告诉我,吸收可能不是完全线性的,当达到 Cmax 时,药物可能不会 100% 被吸收,这意味着之后会继续吸收一些药物;尽管如此,我可以假设它是线性的,并且在 Cmax 处被 100% 吸收,因为对于将要使用电子表格的人来说,这是一个足够好的近似值。

I'm putting the spreadsheet on Google Drive 方便其他人帮助我。

谢谢。

【问题讨论】:

  • 不需要使用 1E+306。你的公式有问题 ` ( ( INDEX( $D$2:$D3; MATCH(1E+306; $D$2:$D3; 1) ) * J$2 ) * MIN( ( B2 - ( INDEX( $ B$2:$B3; MATCH(1E+306; $D$2:$D3; 1) ) ) ) / $H$2; 1 ) ) ` 将始终为Intake x Ratio * 0。如果你能带上你需要使用的公式以及应该考虑哪些值,那会更有用。看来这个公式没有像你预期的那样工作
  • 根据您的第一步,您希望时间随着“单元格 H2 中的时间 Cmax”线性上升,但该单元格不包括在该计算中......
  • @SolarMike 它是-我将其称为$H$2。请仔细检查
  • @DavidGarcíaBodego 啊,为每个新剂量摄入创建一个新列。我考虑了这种可能性,但发现它不能很好地扩展。例如,如果我想使用该电子表格的变体来绘制另一种药物的浓度图表,并且在 6 个月内每 8 小时服用一次新剂量。使用起来太不实用了。
  • 今天我请假。明天我会尝试看看根据您的原始描述生成代码。

标签: excel excel-formula libreoffice-calc scientific-software


【解决方案1】:

试试这个:

首先,由于没有办法声明可能的永无止境的功能,只需计算 1 mg 直到浓度消失。

将那个放在一列中(我放在 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 上工作,并在此过程中学习 API。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多