我想写估计函数来估计模型参数。我写了我的函数没有任何错误,但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
}
有什么帮助吗?
你在实际案例中遇到的问题是:1)将向量参数传递给family
; 2)只有它的第一个值用于if
块; 3)它与您检查的任何值都不匹配; 4)因此low
和up
没有被分配。
如果你想传递矢量参数family
,请看看ifelse
来替换你的if
块。如果没有,如果给定的length(family) > 1
与您的任何选择都不匹配,则在else
时抛出错误并向if
块添加family
以抛出错误。