optim in r:非有限差分误差
我有一个简单的似然函数(来自均值为0的正常距离),我想最大化它。optim一直给我这个错误: optim中的错误(par=phi,fn=loglike,estimates=estimates,NULL,hessian=TRUE,:非有限差分值[1] 这是我的数据和似然函数:optim in r:非有限差分误差,r,optimization,R,Optimization,我有一个简单的似然函数(来自均值为0的正常距离),我想最大化它。optim一直给我这个错误: optim中的错误(par=phi,fn=loglike,estimates=estimates,NULL,hessian=TRUE,:非有限差分值[1] 这是我的数据和似然函数: y = [ -0.01472 0.03942 0.03592 0.02776 -0.00090 ] C = a varcov matrix: 1.66e-03 -0.000120 -6.780e-06 0.0
y = [ -0.01472 0.03942 0.03592 0.02776 -0.00090 ]
C = a varcov matrix:
1.66e-03 -0.000120 -6.780e-06 0.000102 -4.000e-05
-1.20e-04 0.001387 7.900e-05 -0.000140 -8.000e-05
-6.78e-06 0.000079 1.416e-03 -0.000070 8.761e-06
1.02e-04 -0.000140 -7.000e-05 0.001339 -6.000e-05
-4.00e-05 -0.000080 8.761e-06 -0.000060 1.291e-03
我的对数似然函数是:
lglkl=-.5*(log(det(v))+(t(y)%%vi%%y))`其中v=phi*I+C,vi=inverse(v),I=5*5单位矩阵
我正在尝试获取“phi”的mle估计值。我认为这将是一个简单的优化问题,但我正在努力。非常感谢任何帮助。提前感谢。我的代码如下:
loglike <- function(phi,y) {
v = phi*I + C
vi = solve(v)
loglike = -.5*(log(det(v)) + (t(y)%*%vi%*%y))
return(-loglike)
}
phi = 0
parm <- optim(par=phi,fn=loglike,y=y,NULL,hessian = TRUE, method="L-BFGS-B",lower=0,upper=1000)
loglike您遇到的错误是因为在一定次数的迭代之后,φ变为负值(这表明算法没有正确应用约束)。此外,解决方案不会收敛到单个值,而是在到达更新的协方差矩阵不再是正定的情况之前,在几个小值之间跳跃。在该阶段,您将得到det(v)<0,并且log[det(v)]未定义。optim
算法在该阶段退出
要查看发生了什么,请使用下面代码中的maxit
和ndeps
参数
require("matrixcalc")
#-------------------------------------------------
# Log-likelihood function
#-------------------------------------------------
loglike <- function(phi, y) {
# Shift the covariance matrix
print(paste("phi = ", phi))
#v = phi*I + (1 - phi)*C
v = phi*I + C
stopifnot(is.positive.definite(v))
# Invert shifted matrix
vi = solve(v)
# Compute log likelihood
loglike = -.5*(log(det(v)) + (t(y) %*% vi %*% y))
print(paste("L = ", loglike))
return(-loglike)
}
#-------------------------------------------------
# Data
#-------------------------------------------------
y = c(-0.01472, 0.03942, 0.03592, 0.02776, -9e-04)
C = structure(c(0.00166, -0.00012, -6.78e-06, 0.000102, -4e-05, -0.00012,
0.001387, 7.9e-05, -0.00014, -8e-05, -6.78e-06, 7.9e-05,
0.001416, -7e-05, 8.761e-06, 0.000102, -0.00014, -7e-05,
0.001339, -6e-05, -4e-05, -8e-05, 8.761e-06, -6e-05, 0.001291),
.Dim = c(5L, 5L ))
#--------
# Initial parameter
#--------
I = diag(5)
phi = 50
#--------
# Minimize
#--------
parm <- optim(par = phi, fn = loglike, y = y, NULL, hessian = TRUE,
method = "L-BFGS-B", lower = 0.0001, upper = 1000,
control = list(trace = 3,
maxit = 1000,
ndeps = 1e-4) )
require(“matrixcalc”)
#-------------------------------------------------
#对数似然函数
#-------------------------------------------------
如果你能使用有效的R语法共享你的数据(y
和V
),那就太棒了。使用dput()
可以很好地解决这个问题。你是说这个吗?dput(y)c(-0.01472,0.03942,0.03592,0.02776,-9e-04)>dput(V)结构(c(0.00166,-0.00012,-6.78e-06,0.000102,-4e-05,-0.00012,0.001387,7.9e-05,-0.00014,-8e-05,-6.78e-06,7.9e-05,0.001416,-7e-05,8.761e-06,0.000102,-0.00014,-7e-05,0.001339,-6e-05,-4e-05,-8e-05,8.761e 06,-6e-05,0.0011,-295L)正是。我可以将其复制/粘贴到R中以获得y和V对象。理想情况下,您可以将其编辑到您的问题中。只是对我的帖子进行了更正。之前我的帖子中几乎没有错误。