如何用maxLik包计算MLE?Newton-Raphson算法R代码报错求助
问题解决步骤
1. 错误根源
maxLik要求对数似然函数的第一个参数必须是待估计的参数向量theta,你写的obs.loglik把y放在第一个参数位置,导致函数调用时无法正确识别theta,触发"argument 'theta' is missing"错误。另外,原似然公式中平方项的括号位置有误,应该先对每个观测计算平方再求和,否则结果会偏离正确值。
2. 修正后的代码
调整参数顺序+修正似然公式
# 修正对数似然函数:theta作为第一个参数,调整平方项的括号位置 obs.loglik <- function(theta, y) { mu <- theta[1] sigma2 <- theta[2] lambda <- theta[3] n <- length(y) # 对每个观测计算平方后再求和 sq_term <- sum( ((y^lambda - 1)/lambda - mu)^2 ) # 对数似然公式 -0.5*n*log(2*pi) - 0.5*n*log(sigma2) - sq_term/(2*sigma2) + (lambda - 1)*sum(log(y)) } library(maxLik) # 示例:模拟一组观测数据(替换为你的真实数据即可) set.seed(123) y <- exp(rnorm(100, mean=0.5, sd=0.3)) # 优化初始值:用lambda=0.5变换后变量的均值、方差作为mu、sigma²的初始值 init_mu <- mean((y^0.5 - 1)/0.5) init_sigma2 <- var((y^0.5 - 1)/0.5) # 调用maxLik,通过...传递y参数,显式指定Newton-Raphson方法 mle <- maxLik(obs.loglik, start=c(init_mu, init_sigma2, 0.5), y=y, method="Newton-Raphson") # 查看估计结果 summary(mle)
3. 额外提示
- 初始值选择:用lambda初始值对应的变换后变量的统计量作为mu、sigma²的初始值,能提升算法收敛概率,避免因初始值偏离太远导致收敛失败。
- 收敛检查:若运行后提示收敛失败,可尝试微调lambda的初始值(比如0.4或0.6),或者增加迭代次数(通过
control=list(maxIter=1000)参数设置)。
内容的提问来源于stack exchange,提问作者user367987
相关产品推荐
相关产品推荐

