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
相关产品推荐
相关产品推荐

