在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 <- 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,同时减小了概率的值。这样可以使模拟更加随机。