我正在尝试引导使用优化的常微分方程(deSolve :: lsoda)生成的最大似然估计模型(bbmle :: mle2)5000次,以生成两个参数(h和c1)的95%CI ,其中另一个参数为固定/常数(a)。我只想保存点估计。
引导程序适用于较小的数字(n.sim = 5),但是任何大于10的错误都会弹出
Error in { : task 4 failed - "subscript out of bounds"
根据引导程序的数量,任务的数量可能会有所不同-但是“下标超出范围”错误是一致的。
我建立了一个空矩阵来保存估计值,该估计值的长度(行)等于模拟引导程序的数量(egnsim = 20),并且列的数量等于要计算的参数的数量引导程序(ncol = 2)。
store.matrixBedAngII = matrix(NA, nrow = n.sim, ncol = 2)
为了运行引导程序,我使用了并行化循环(foreach :: foreach)。我用替换对数据集(FRmod; N = 105)进行了重新采样。
set.seed(105)
store.matrixBedAngII = foreach(i = 1:n.sim, .combine = "rbind", .packages = c("deSolve", "bbmle")) %dopar% {
index = sample(1:nrow(FRmod), dim(FRmod)[1], replace = TRUE)
data.new = FRmod[index,]
m = mle2(minuslogl = BedAngII.NLLmleRR,
start = list(h = 1.826809,
c1 = 1.326134),
fixed = list(a = 1.263170),
data = list(Neaten = data.new$Neaten,
N0 = data.new$N0,
P = data.new$P,
Tt = data.new$Tt),
method = "Nelder-Mead",
control = list(maxit = 1000000))
store.matrixBedAngII[i, ] = as.vector(t(rbind(coef(summary(m))[, 1])))
}
我假设这与我在store.matrixBedAngII对象中存储系数的方式有关,但是我一生无法弄清楚为什么。对于其他不包含固定参数的模型也可以使用,但是一旦包含固定参数,该错误就会突然出现。
有关其他上下文,我的ODE和MLE的结构如下:
# Define gradient function
eq.BedAngII.odeRR = function(t, x, parms){
with(as.list(parms), {
dN = -a * x[1] * P / (1 + a * h * x[1] + c1 * P)
return (list(c(dN)))
})
}
# Define ordinary differential equation (ODE) to simulate number of
## prey consumed (Ne) from initial population (N0) over time T by
### population of predators (P)
BedAngII.eaten.odeRR = function(N0, a, h, c1, Tt, P, steps = 100){
Neaten.est = vector()
for(i.eaten in 1:length(N0)){
Neaten.est[i.eaten] = N0[i.eaten] - lsoda(y = N0[i.eaten],
times = seq(0,Tt[i.eaten],
length = steps),
func = eq.BedAngII.odeRR,
parms = c(a = a, h = h, c1 = c1, P = P[i.eaten]),
maxsteps = 1e6
)[length(seq(0,Tt[i.eaten], length = steps)),2]
}
return(Neaten.est)
}
# Define negative log-likelihood function(s)
# MLE2 suitable version
BedAngII.NLLmleRR = function(Neaten, N0, a, h, c1, Tt, P, steps = 100){
if(a <= 0|| h <= 0) return(Inf)
prob = BedAngII.eaten.odeRR(N0 = N0, a = a, h = h, c1 = c1, Tt = Tt, P = P, steps = steps)
dprob = dbinom(x = Neaten, size = N0, prob = prob/N0, log = TRUE)
NLL = -1*sum(dprob)
return(NLL)
}
数据集(FRmod)包含以下变量; N0 =初始猎物数量,Neaten =消耗的猎物数量,P =捕食者数量,Tt =实验时间段。