在sir模型中通过从二项分布中抽样加入随机性(R语言

在sir模型中通过从二项分布中抽样加入随机性(R语言
不知道怎么更改,可以帮我看下代码吗

sir_step <- function (t,x,parms) {
  S<-x[1]
  I<-x[2]
  R<-x[3]
  beta<-params[1]
  mu_IR<-params[2]
  delta.t<-params[3]
  with(as.list(c(parms,x)),{
    dN_SI <- rbinom(n=1,size=S,prob=1-exp(-beta*I/N*delta.t))
    dN_IR <- rbinom(n=1,size=I,prob=1-exp(-mu_IR*delta.t))
    S <- S - dN_SI
    I <- I + dN_SI - dN_IR
    R <- R + dN_IR
    res<-c(S,I,R)
    list(res) 
  })
}
N<-38000
params<-c(beta=100,mu_IR=0.5,delta.t=1/7)
t<-seq(1,1000,by=1)
xstart<-c(S=N-1,I=1,R=0)
out <- as.data.frame(lsoda(xstart,times = t,sir_step,parms))

警告信息:
1: In rbinom(n = 1, size = S, prob = 1 - exp(-beta * I/N * ... : 产生了NA Error in cat("1: In rbinom(n = 1, size = S, prob = 1 - exp(-beta * I/N * ... : 产生了NA", :
cat目前还不能处理2(种类为'list')参数

你的代码有一些问题。

  • 首先,在sir_step()函数中,参数params拼写错误,应该是parms。
  • 其次,在rbinom函数中,n = 1表示每次仅从二项分布中抽取一个随机数。如果您希望抽取多个随机数,应将n设置为适当的整数值。
  • 另外,在使用rbinom函数时,概率不能为1,这是不合理的。概率必须在0和1之间。

根据上述信息,修改后的代码如下:

sir_step <- function (t,x,parms) {
  S<-x[1]
  I<-x[2]
  R<-x[3]
  beta<-parms[1]
  mu_IR<-parms[2]
  delta.t<-parms[3]
  with(as.list(c(parms,x)),{
    dN_SI <- rbinom(n=S,size=1,prob=1-exp(-beta*I/N*delta.t))
    dN_IR <- rbinom(n=I,size=1,prob=1-exp(-mu_IR*delta.t))
    S <- S - dN_SI
    I <- I + dN_SI - dN_IR
    R <- R + dN_IR
    res<-c(S,I,R)
    list(res) 
  })
}
N<-38000
params<-c(beta=100,mu_IR=0.5,delta.t=1/7)
t<-seq(1,1000,by=1)
xstart<-c(S=N-1,I=1,R=0)
out <- as.data.frame(lsoda(xstart,times = t,sir_step,parms))

上述代码修改了参数的拼写错误,并将rbinom函数中的n值设置为S和I,同时减小了概率的值。这样可以使模拟更加随机。