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 包):将参数值更改为时间函数 的相关文章

  • 从 glmnet 获取变量选择顺序

    我一直在使用 glmnet R 包为一个目标变量 Y 数字 和 762 个协变量构建 LASSO 回归模型 我使用 glmnet 函数 然后coef fit s 0 056360 获取该特定 lambda 值的系数值 我现在需要的是变量选择
  • 在R中使用plotly在轴标题中换行和下标

    我刚开始使用plotly对于 R 中的一些交互式散点图 并且在轴标签上遇到困难 通常我设计我的情节ggplot2然后使用ggplotly函数来转换它们 但这有时由于某种原因非常慢 所以我想直接在中创建我的图plotly 我现在尝试更改轴标题
  • 如何测试字符串中的前三个字符是r中的字母还是数字?

    下面给出了我拥有的数据集的示例 请注意 总数据集中我有超过两列 ID X 1 MJF34 2 GA249D 3 DEW235R 4 4SDFR3 5 DAS3 我想测试 X 中的前三个字符是否是字母 如果是 那么我想替换该值以仅显示前三个字
  • dplyr::mutate 添加多个值

    网上有几个与此相关的问题dplyr Github 存储库 https github com hadley dplyr已经 并且至少有一个相关的问题 但没有一个问题完全涵盖了我的问题 我认为 在 dplyr mutate 调用中添加多列 ht
  • 在 R 中查找 Windows 用户名

    有没有办法在 R 会话中获取当前的 Windows 用户名或 Windows 主目录 Thanks 抱歉 如果我错过了什么 但我找不到任何东西 你可以做 Sys getenv USERNAME Sys getenv HOME 如果你只是输入
  • knn-相同的k,不同的结果

    我有一个矩阵ZZ 我跑完之后prcomp并选择了我收到的前 5 台电脑data new P prcomp zz data new P x 1 5 然后我分成训练集和测试集 pca train data new 1 121 pca test
  • RQuantLib 包不适用于 R 3.5.0

    有没有其他人尝试加载 R 3 5 0 的 RQuantLib 包 我尝试过 以前有效 install packages drat dependencies TRUE drat addRepo ghrr install packages RQ
  • R 中数据帧的条件求和

    我正在努力将在 Excel 中进行的分析迁移到 R 因为我的数据集已达到 Excel 的限制 在 Excel 中 我有一个工作表 状态 它执行 sumifs 函数 对另一个工作表 成员 中 状态 中具有相同状态 周组合的值求和 我想在 R
  • 使用 ggplot 将条形图的列与线图的点对齐

    当线图的点与条形图的条具有相同的 x 轴时 有什么方法可以使用 ggplot 将它们对齐 这是我尝试使用的示例数据 library ggplot2 library gridExtra data data frame x rep 1 27 e
  • 如何删除括号内的值的行?

    我正在使用以下数据框 Name Height Eric 64 Joe 67 Mike 66 Nick 72 Dave 69 Steve 73 我想删除 名称 列以左括号 开头的所有行 因此最终的数据框如下所示 Name Height Eri
  • 在 r 中使用 SSasymp

    我想我不知道如何在 r 中使用 SSasymp 函数 我想为我的项目创建一个渐近函数 我试过这个 c lt seq 0 200 0 5 d lt SSasymp c 500 0 log 50 plot c d type l log 50 应
  • 计算带状矩阵的 colCumsums 的更快替代方案

    我是 R 和 stats 的新手 在我当前工作的领域中 我需要以独特的方式计算累积列总和 最初提供宽度为 b 行数为 n 的方带矩阵 例如 n 8 且 b 3 0 1 2 7 0 0 0 0 0 0 3 6 7 0 0 0 0 0 0 3
  • R:几个单独图的重新排序因子水平

    我正在尝试从同一个 data frame 创建多个单独的图 每个图的 y 轴上的因子水平顺序不同 每个图都应该对 y 上的因子水平进行递减排序 我知道这可以为每个图手动完成 但我正在寻找一种更有效和更优雅的方法 因为我需要创建相当多的图 这
  • 将数据框中的 1 列拆分为 2 列 [重复]

    这个问题在这里已经有答案了 这是我的数据框 gt data Manufacturers 1 Audi RS5 2 BMW M3 3 Cadillac CTS V 4 Lexus ISF 所以我想将制造商和型号分开 就像这样 gt data
  • R - 对矩阵的每行/列应用具有不同参数值的函数

    我试图将函数应用于矩阵的每一行或每一列 但我需要为每一行传递不同的参数值 我以为我熟悉 lapply mapply 等 但可能还不够 举个简单的例子 gt a lt matrix 1 100 ncol 10 gt a 1 2 3 4 5 6
  • 寻找一种有效的方法来计算两个表中间隔集之间的重叠数量?

    注意 为了方便起见 我使用上一篇文章中的示例数据集 假设有两个数据集 ref and map 他们是 ref lt data table space rep nI 3 t1 c 100 300 500 t2 c 150 400 600 id
  • R tidyr regex:从字符列中提取有序数字

    假设我有一个像这样的数据框 df lt data frame x c This script outputs 10 visualizations This script outputs 1 visualization This script
  • 滚动最小值,固定起点[重复]

    这个问题在这里已经有答案了 好的 我想计算数据框中的滚动最小值 向下滚动列 到目前为止 我无法确定该系列的起点并滚动到结尾 我努力了 mins lt c 10 5 6 10 6 6 7 8 2 12 roll min expected lt
  • R 版本 4.0.0 上的 ROracle

    当尝试使用 ROracle 时 我收到以下错误消息 gt library ROracle Error package or namespace load failed for ROracle package ROracle was inst
  • 在 R 中绘制 3D 数据

    我有一个 3D 数据集 data data frame x rep c 0 1 0 2 0 3 0 4 0 5 each 5 y rep c 1 2 3 4 5 5 data z runif 25 min data x data y 0 1

随机推荐

  • 基于 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