Bootstrap使用foreach循环错误:下标超出范围

时间:2019-12-27 15:21:14

标签: loops optimization foreach ode mle

我正在尝试引导使用优化的常微分方程(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 =实验时间段。

0 个答案:

没有答案
相关问题