R用optim做极大似然估计报错:目标函数返回长度为50而非1
问题原因
你的代码存在两个核心问题:
- optim函数调用参数名错误:
optim的待优化参数入参名是par,你错误写成了p,导致optim无法正确接收长度为3的初始值向量,反而将长度为50的my_data错误传入参数优化流程,最终目标函数返回值长度异常。 - 负对数似然函数公式推导错误:你当前写的似然函数存在项的符号、结构错误,会导致参数估计结果收敛到边界,无法得到合理的估计值。
修复方案
1. 修正optim调用参数
将第一个参数名从p改为par,或者直接省略参数名按位置传值即可。
2. 修正负对数似然函数
结合你给出的λ、β、α三项参数结构,修正后的负对数似然函数参考如下(可对照你要拟合的分布公式调整具体项):
lx <- function(p,x){ l <- p[1] b <- p[2] a <- p[3] n <- length(x) lnL <- n*log(l) + n*log(b) + n*log(a) + (b-1)*sum(log(x)) - (a+1)*sum(log(1 + l*x^b)) - sum((1 + l*x^b)^(-a)) return(-lnL) }
完整可运行代码
# 输入数据 my_data = c(0.1,0.2,1,1,1,1,1,2,3,6,7,11,12,18,18,18,18,18,21,32,36,40, 45,45,47,50,55,60,63,63,67,67,67,67,72,75,79,82,82,83, 84,84,84,85,85,85,85,85,86,86) # 修正后的负对数似然函数 lx <- function(p,x){ l <- p[1] b <- p[2] a <- p[3] n <- length(x) lnL <- n*log(l) + n*log(b) + n*log(a) + (b-1)*sum(log(x)) - (a+1)*sum(log(1 + l*x^b)) - sum((1 + l*x^b)^(-a)) return(-lnL) } # 修正后的optim调用 optim(par = c(1,1,1), fn = lx, method = "L-BFGS-B", lower = c(0.0001, 0.0001, 0.0001), hessian = FALSE, x = my_data)
内容的提问来源于stack exchange,提问作者mathz
相关产品推荐
相关产品推荐

