You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用R包fitode拟合简单ODE时出现optim错误的原因排查

问题

使用R包fitode拟合肿瘤生长微分方程模型时,遇到如下错误:

Error in optim(par = c(log.r1 = 0, log.X0 = 0), fn = function (p)  : 
  initial value in 'vmmin' is not finite

即使简化到最简复现案例,错误依然存在:

  • 调用包并模拟指数增长的细胞计数数据:
library(fitode)
days <- c(1, 3, 6, 8, 9, 11, 13, 14)
data_test <- data.frame(day = days, size = rpois(length(days), exp(days)))
  • 定义指数增长模型:
model_test <- odemodel(
  name="test",
  model=list(
    X1 ~ r1 * X1
  ),
  observation=list(
    size ~ dpois(lambda=X1)
  ),
  initial=list(
    X1 ~ X0
  ),
  par=c("r1", "X0")
)
  • 已知真实参数r1=1、X0=1,模拟数据正常,但用该初始值拟合时仍报错:
start_test <- c(r1=1, X0=1)
fit_test <- fitode(
  model=model_test,
  data=data_test,
  start=start_test
)

解决方案

问题核心是调用fitode时未指定时间变量,程序无法正确匹配观测数据的时间点与ODE求解时间,进而引发数值计算错误。

修改拟合代码,添加time参数指定数据中的时间列(即day)即可解决:

fit_test <- fitode(
  model=model_test,
  data=data_test,
  start=start_test,
  time = "day"  # 指定时间变量
)

也可以在定义odemodel时提前指定时间变量,让模型结构更清晰:

model_test <- odemodel(
  name="test",
  model=list(
    X1 ~ r1 * X1
  ),
  observation=list(
    size ~ dpois(lambda=X1)
  ),
  initial=list(
    X1 ~ X0
  ),
  par=c("r1", "X0"),
  time="day"  # 提前定义时间变量
)

修改后即可正常拟合,得到符合预期的参数估计结果。

内容的提问来源于stack exchange,提问作者Ed Schrom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 19:23:09