R- ode 函数(deSolve 包):将参数值更改为时间函数

2023-12-11

我正在尝试使用该函数求解一阶微分方程ode来自deSolve包裹。问题如下:药物在某些时间(输注时间)以恒定的输注速率给药,并以一阶速率消除。因此,该过程可以描述为:

if(t %in% Infusion_times){Infusion <- Infusion_rate} else{Infusion <- 0}
    dC <- -Ke*C + Infusion

where t是时候了,Infusion_times是包含给药时间的载体,C是药物的量,Ke是它的消除常数,Infusion是一个变量,有输液时取输液速率的值,否则取值0。 因此,假设我们想要注射 3 剂,从时间 0、24 和 40 开始,每次输注持续两个小时,假设我们想要deSolve每 0.02 个时间单位计算一次答案。 我们想要deSolve例如,以 0.02 次单位的步长求解 0 到 48 次之间的微分方程。所以我们的向量指定了时间ode函数将是:

times <- seq(from = 0, to = 48, by = 0.02)

输注时间由下式给出:

Infusion_times <- c(seq(from = 0, to = 2, by = 0.02), seq(from = 24, to = 26, by = 0.02), 
                    seq(from = 40, to = 42, by = 0.02))

起初,我担心问题可能出在浮点数的比较上。为了防止这种情况,我将两个向量四舍五入到小数点后两位:

times <- round(times, 2)
Infusion_times <- round(times, 2)

所以现在,希望所有Infusion_times都包含在times vector:

(sum(Infusion_times %in% times)/length(Infusion_times))*100
[1] 100

如您所见,中的所有值Infusion_times(100%)包含在向量中times,因此变量Infusion应该取值Infusion_rate在指定的时间。然而,当我们解方程时,它不起作用。 让我们证明一下,但首先,让我们指定该函数所需的其他值ode功能:

parameters <- c(Ke = 0.5)
amounts <- c(C = 0) #Initial value for drug is 0
Inf_rate <- 5

现在,让我们根据需要编写一个函数来说明变化率:

OneComp <- function(t, amounts, parameters){
  with(as.list(c(amounts, parameters)),{
      if(t %in% Infusion_times){Infuse =Inf_rate} else{Infuse = 0}
      dC <- -Ke*C + Infuse
  list(c(dC))})
}

对于那些不熟悉的人deSolve包,参数t函数的值将说明方程应该积分的时间,amounts将指定 C 的初始值和parameters将给出参数的值(在本例中,只是Ke)。 现在,让我们解方程:

out <- ode(func = OneComp, y = amounts, parms = parameters, times = times)

让我们绘制结果:

library(ggplot2)

ggplot(as.data.frame(out)) + geom_line(aes(x = times, y = C))

这与我们得到的结果完全相同Infusion始终等于 0。 然而,请注意,如果我们只模仿单剂量,并且我们要尝试类似的方法,它会起作用:

OneComp <- function(t, amounts, parameters){
      with(as.list(c(amounts, parameters)),{
          if(t < 2){Infuse =Inf_rate} else{Infuse = 0}
          dC <- -Ke*C + Infuse
      list(c(dC))})
    }
out <- ode(func = OneComp, y = amounts, parms = parameters, times = times)
ggplot(as.data.frame(out)) + geom_line(aes(x = times, y = C))

在这里,我们设置了变量Infuse取值Inf_rate仅当时间少于2小时时,它有效!因此,我对这些行为完全感到困惑。这不是更改变量值的问题,也不是浮点数之间比较的问题......知道这些可能是什么吗?谢谢


大多数求解器deSolve使用自动内部时间步长,根据系统的粗糙度或平滑度进行自我调整。指某东西的用途if陈述或if()模型函数中的函数不是一个好主意,原因有两个:(i) 时间步长可能无法准确命中,(2) 模型函数(即导数)理想情况下应为连续且可微并避免逐步行为,即使求解器在这种情况下非常强大。

The deSolve包提供了解决您的问题的两种方法:“强制函数”和“事件”。两者都有其优点和缺点,但如果“事件”(例如注射)的时间与积分时间步相比非常短,“事件”特别有用。

有关此内容的更多信息,请参阅deSolve帮助页面?forcings and ?events, in deSolve:强制函数和事件来自 userR!2017 会议,以及slides来自用户R!2014。

请检查以下内容是否适合您:

library("deSolve")

OneComp <- function(t, y, parms){
  with(as.list(c(y, parms)),{
    dC <- -Ke * C
    list(c(dC))
  })
}

eventfunc <- function(t, y, parms) {
  with(as.list(c(y, parms)),{
    C + Inf_rate
  })
}

parms <- c(Ke = 0.5, Inf_rate = 5)

y0 <- c(C = 0)            # Initial value for drug is 0

Infusion_times <- c(seq(from =  0, to =  2, by = 0.02), 
                    seq(from = 24, to = 26, by = 0.02), 
                    seq(from = 40, to = 42, by = 0.02))

# time step can be made bigger to speedup simulation
times <- round(seq(from = 0, to = 48, by = .1) , 2)

# check that all events are in 'times', but no duplicates
# this check is also done by the solver and may print a warning
# to ensure that the user is very careful with this
unique_times <- cleanEventTimes(times, Infusion_times)
times        <- sort(c(unique_times, Infusion_times))

out <- ode(func = OneComp, y = y0, parms = parms, times = times, 
           events = list(func = eventfunc, time = Infusion_times))

plot(out)
rug(Infusion_times)

The two cleanEventTimes线是确保模拟命中所有事件时间的一种可能方法。它通常由求解器自动完成,并且可能会发出警告以提醒用户对此非常小心。

我使用了“基本”情节rug来指示注射时间。

我对这些条款有些疑问Infusion_times and Inf_rate。在基于事件的方法中,“量”在离散时间点被添加到状态变量 C,而“速率”则表示在一个时间点内连续添加。时间间隔。这通常称为强制函数。

强制函数会更简单并且在数值上更好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R- ode 函数(deSolve 包):将参数值更改为时间函数 的相关文章

随机推荐

  • 基于 ggplot 中百分位的颜色代码点

    我有一些非常大的文件 其中包含基因组位置 位置 和相应的群体遗传统计数据 值 我已成功绘制这些值 并希望对前 5 蓝色 和 1 红色 值进行颜色编码 我想知道在 R 中是否有一种简单的方法可以做到这一点 我已经尝试编写一个定义分位数的函数
  • PostgreSQL 上的透视行

    我有一个返回整行的查询 我需要将此结果转换到一个新表中 SELECT id no stud name group no class 1 class 2 class 3 class 4 FROM tbl stud class 这将返回以下内容
  • 通过 C# 中的反射获取“基本”数据类型,而不是奇怪的可空数据类型

    我的基本需求是从 LINQ to SQL 查询生成的匿名类型中获取数据类型 我有一段代码 比我能写的更聪明 因为我还没有真正深入研究反射 它从匿名类型返回数据类型 并且非常适合 linq2sql 属性中标记为 不可为空 的元素 因此 如果我
  • Spring Rest - 生成 Json 数据的异常[重复]

    这个问题在这里已经有答案了 我有一个值对象 我想通过 json Rest 调用公开它 我的项目中有许多其他的休息调用都工作得很好 但这个 1 由于某种原因不能 当我尝试返回该对象时 我收到一个我不知道如何解决的异常 值对象代码如下 减去访问
  • 如何将父 div 放置在其子 div 之上?

    我有一个容器 div 它有background color red 这个容器大约有 12 个孩子 最后一个孩子有background color blue 我试图将容器移到孩子的顶部background color blue 我为容器使用了
  • 如何在nodejs aws-sdk模块中设置多个aws凭证?

    我需要对 s3 SNS 等不同服务使用多个 AWS 凭证 var awsS3 require aws sdk var awsSes require aws sdk awsS3 config update region config awsR
  • 如何将 mysql 转储文件导入 Docker mysql 容器

    提前致以问候和感谢 我实际上是 docker 和 docker compose 的新手 迄今为止观看了大量视频并阅读了很多文章并进行了尝试 我有一个前端容器和一个后端容器 它们作为 Dockerfile 和 docker compose 设
  • 在 tableHeaderView 中使用自动布局

    我有一个UIView包含多行的子类UILabel 该视图使用自动布局 我想将此视图设置为tableHeaderView of a UITableView not节标题 该标题的高度将取决于标签的文本 而标签的文本又取决于设备的宽度 自动布局
  • Java 字节码签名

    作为我正在开发的编程语言的编译器的一部分 我在字节码中遇到了通用签名 我正在尝试将其解析并转换为 AST 解析算法大部分都有效 但似乎有一种特殊情况 其中这些签名的格式表现得有点奇怪 以下是其中一些案例 java util Arrays p
  • Spring MVC:即使存在所需的参数,文件上传也会出现错误请求(缺少参数)

    我有一个文件上传控制器 其方法如下所示 RequestMapping value upload method RequestMethod POST produces application json public ResponseBody
  • INDY 10 TCP 服务器 - 与非线程安全 VCL 代码结合

    VCL 不是线程安全的 因此我想在 INDY 10 TCP 中向 gui 写入信息不是一个好主意server execute 功能 如何将信息从服务器执行发送到VCL 我需要修改一个 TBitmap 里面tcpserver execute功
  • 模拟鼠标移动

    我的 UserControl 中有带有图像的 ListView 当我带来图片时 我会在从图像中移除鼠标时重新绘制图片 图片会滋养旧的 但是 当我第二次在同一张图片上绘制时 我不想重新绘制 但是当我拿走 ListView 的教堂时 navoz
  • C 中链表的问题

    我收到的提示要求使用 c 语言的程序来实现链接列表 并为用户提供在链接列表上执行不同功能的选项 需要的功能是 isempty 检查列表是否为空并返回指示是否为空的值 add 向列表尾部添加一个元素 insert 在列表中的特定索引处插入元素
  • 如何防止我的 Python 应用程序在到达代码末尾后自动关闭? [复制]

    这个问题在这里已经有答案了 我是编程新手 尤其是Python 我正在尝试制作一个将华氏温度转换为摄氏度的应用程序 但我不知道如何使该程序保持打开状态 每当它到达代码末尾时 它就会在用户看到他或她的结果之前自动关闭 我正在使用Python 2
  • 由于以下错误而失败:800704a6 尝试从 teamcity 中的文本文件读取数据时

    我正在使用 teamcity 运行一些测试用例 它成功地将数据保存在文本文件中 但是当我尝试从同一位置读取该数据时 出现以下错误 设置方法失败 System Runtime InteropServices COMException 使用 C
  • 自定义 ActiveModel full_messages

    我想从自定义验证消息中删除该属性并仅显示该消息 因此而不是 School Please Provide Your School Name 我想回来 Please Provide Your School Name 正如我的模型中所设置的 va
  • 如何在 UITextView 中插入 UIImageView,就像 iphone 默认消息 (SMS) 应用程序在 UITextView 中插入多媒体内容一样

    我想在具有发送和相机按钮的工具栏的 UITextView 中插入 UIImageView 就像 iPhone 默认短信应用程序一样 你最好使用UIScrollView和管理UITextViews and UIImageView就在里面 UI
  • TinyMCE Editor 不更新 IE11 中的隐藏字段

    我使用 TinyMCE 作为 CMS 的 HTML 编辑器 这一直工作正常 表单提交了正确的数据 就像在 Chrome 中一样 它在 IE 11 中也能正确显示 但是 如果我使用 IE11 提交表单 浏览器不会 POST 表单中的数据 检查
  • 使用选择查询动态添加列

    我有一张表 默认有 20 列 这 20 列命名为 D1 D2 D3 D20 现在通过选择查询我想动态添加其他列 对于前 D21 D22 D31 那么我如何编写一个查询来动态添加此列并增加值 最大限制为 31 请帮助 默认表列D1 D2 D3
  • R- ode 函数(deSolve 包):将参数值更改为时间函数

    我正在尝试使用该函数求解一阶微分方程ode来自deSolve包裹 问题如下 药物在某些时间 输注时间 以恒定的输注速率给药 并以一阶速率消除 因此 该过程可以描述为 if t in Infusion times Infusion lt In