You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:18:01