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

R optim报错cannot be evaluated at initial parameters解决求助

问题原因
  • 你的Dx是浮点型数值,不是整数,factorial()函数仅支持非负整数输入,计算log(factorial(y))会直接返回NaN,导致对数似然无法计算。
  • 泊松对数似然里的阶乘项是不随待估参数变化的常数项,优化时可以直接删除,不会影响参数估计结果。
  • 初始参数不合适时可能出现mu为负、或者lambda <= 0的情况,log(lambda)也会返回NaN。
  • 当参数b趋近于0时,a/b会出现除以0的错误,也会导致函数无法求值。
修复后的代码
age <- c(0,30,60,90)
Dx <- c(49294.57, 2975.1, 11456.38, 2977.08)
Ex <- c(1572608.38, 1531956.05, 650404.58, 9728.47)

log_lik <- function(par,x,y,z){
  a <- par[1]
  b <- par[2]
  c <- par[3]
  s <- par[4]
  # 增加极小值避免mu为0或负,防止log报错
  mu <- (a*exp(b*x))/(1+s * (a)/(b) * (exp(b*x)-1)) + c + 1e-10
  lambda <- mu * z
  # 删除不影响优化结果的常数阶乘项
  lnL <- sum(y*log(lambda) - lambda)
  -lnL
}

# 使用带参数边界约束的L-BFGS-B方法,避免参数出现负数或趋近于0的异常值
# 调整初始值为符合死亡率模型特征的小数值
optim(par = c(0.001, 0.05, 0.001, 0.01), 
      fn = log_lik, 
      x = age, y = Dx, z = Ex,
      method = "L-BFGS-B",
      lower = c(1e-8, 1e-4, 1e-8, 1e-8))
补充优化建议
  • 如果仍存在收敛问题,可以换用bbmle包的mle2函数做最大似然估计,对非数值情况的容错性更高。
  • 如果使用的是标准死亡率模型,可直接调用MortalitySmooth等专业精算模型包的内置函数,避免手写似然函数的低级错误。

内容的提问来源于stack exchange,提问作者mathz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:54:02