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