【问题标题】:Running simulations varying parameter values in deSolve在 deSolve 中运行不同参数值的模拟
【发布时间】:2026-01-26 09:40:01
【问题描述】:

我试图弄清楚如何在使用 deSolve 时运行不同参数值的模拟。我对 R 非常陌生,并且难以解决我遇到的错误。我创建了一组非常简单的微分方程,并尝试从我的参数的均匀分布中运行 for 循环采样。

我的模特:

sir <- function(time, state, parameters) {

with(as.list(c(state, parameters)), {

dS <- -beta1 * (S * I)/N
dI <-  beta1 * (S * I)/N - gamma1 * I
dR <-                 gamma1 * I

return(list(c(dS, dI, dR)))
})
}
init       <- c(S = 99999, I = 1, R = 0)

尝试 for 循环:

outlist <- list()
plist <- cbind(beta1 = runif(30, min = .1, max  = .9),
           gamma1 = runif(30, min = .1, max = .9))
for(i in 1:nrow(plist))
outlist[[i]] <- ode(y = init, times = times, func = sir, parms = plist[i])
plot(out, outlist)

我收到以下错误:

eval(expr, envir, enclos) 中的错误:找不到对象“beta1”

非常感谢您提供的任何帮助,

【问题讨论】:

  • 您没有显示所有代码。正如错误消息所暗示的那样,您没有为函数中的参数beta1 赋值。您应该在with 之前的函数中插入一行beta1 &lt;- parameter[1]gamma1N 类似。对象timesN 在哪里?你需要{}for 循环的主体周围。还缺少out。现在我放弃了。

标签: r


【解决方案1】:

您的代码有各种各样的错误。我在我的 cmets 中注意到的更多。 R 代码中一个非常典型的错误:你使用plist[i] 来使用plist 的行i。你应该使用plist[i,]

试一试你的东西:

library(deSolve)

sir <- function(time, state, parameters) {

    beta1 <- parameters[1]
    gamma1 <- parameters[2]
    with(as.list(c(state, parameters)), {

    dS <- -beta1 * (S * I)/N
    dI <-  beta1 * (S * I)/N - gamma1 * I
    dR <-                 gamma1 * I
    return(list(c(dS, dI, dR)))
    })
}

init <- c(S = 99999, I = 1, R = 0)
times <- seq(1,5,.5) # trial
N <- 10000000 # having a guess
outlist <- list()
plist <- cbind(beta1 = runif(30, min = .1, max  = .9),
           gamma1 = runif(30, min = .1, max = .9))

plist[c(1,2)]
for(i in 1:nrow(plist)) {
    outlist[[i]] <- ode(y = init, times = times, func = sir, parms =  plist[i,])
}

# just display the first item
outlist[[1]]

分配给变量out 并继续由您决定。

【讨论】:

    最近更新 更多