由于警告消息,Optim功能无法按预期工作

问题描述 投票:-1回答:1

我想写估计函数来估计模型参数。我写了我的函数没有任何错误,但optim函数不能按预期工作。当我逐行运行我的代码时,我发现我的条件会返回warnings消息(the condition has length > 1 and only the first element will be used)。所以,我认为这是使optim不能按预期工作的问题。那是因为,当我逐行运行我的代码时,我收到了这条消息,当我运行optim函数时,我得到了这个:~Error in optim(par = start.parm, fn = t_LL, method = "L-BFGS-B", lower = low, : object 'low' not found

但是,我不确定。

这是我的代码:

library(VineCopula)

simdata <– BiCopSim(300, 5, -2)

##我这样调用我的函数:

Myfun <- MLE(simdata, family = 5, par = -2, par2 = 0)

MLE <- function(data, family, par,par2) {

  n <- dim(data)[1]
  start.parm <- c(par,par2)


if (family %in% c(3, 13)) {
  low <- 1e-04
  up <- 100
} else if (family %in% c(4, 14)) {
  low <- 1.0001
  up <- 100
} else if (family %in% c(5)) {
  low <- -100
  up <- 100
} 



t_LL <- function(param, family, start, start2) {
    start <- param[[1]]
    start2 <- param[[2]]
    ll <- sum(log(BiCopPDF(data[,1], data[,2], family, start, start2)))
    return(ll)
  }
optimout <- optim(par = start.parm,
                  fn = t_LL,
                  family= family,
                  start=start, 
                  start2=start2,
                  method = "L-BFGS-B",
                  lower = low,
                  upper = up,
                  control = list(fnscale = -1, maxit = 500))




out <- list()


      out$par <- optimout$par[1]




 out$value <- optimout$value
  out
}

有什么帮助吗?

r
1个回答
0
投票

你在实际案例中遇到的问题是:1)将向量参数传递给family; 2)只有它的第一个值用于if块; 3)它与您检查的任何值都不匹配; 4)因此lowup没有被分配。

如果你想传递矢量参数family,请看看ifelse来替换你的if块。如果没有,如果给定的length(family) > 1与您的任何选择都不匹配,则在else时抛出错误并向if块添加family以抛出错误。

© www.soinside.com 2019 - 2024. All rights reserved.