如何使用stats4包计算MLE?R代码报错排查求助
问题解决:stats4::mle参数不匹配错误
错误原因分析
第一个错误:
Mismatch in length of start values
你的似然函数obs.loglik4第一个参数是观测数据y,但mle会将start的数值依次传入函数参数。传入start=c(1,1,0.5)时,mle把1当作y,剩余两个值对应theta,但start有3个元素,和函数参数数量(2个)不匹配,导致长度错误。第二个错误:
some named values are not arguments to the supplied log-likelihoodstart使用了mu、sig2、lambda命名,但你的函数参数只有y和theta,不存在这些命名参数,因此报错。
修正方案1:独立参数形式
将待估计参数设为独立参数,观测数据y作为额外参数传入,同时返回负对数似然(mle默认最小化负对数似然):
library(stats4) # 定义负对数似然函数 obs.loglik4 <- function(mu, sig2, lambda, y) { n <- length(y) loglik <- -0.5*n*log(2*pi) - 0.5*n*log(sig2) - sum(((y^lambda - 1)/lambda - mu)^2)/(2*sig2) + (lambda - 1)*sum(log(y)) return(-loglik) # 返回负对数似然供mle最小化 } # 示例观测数据(替换为你的真实数据) set.seed(123) y <- rlnorm(100, meanlog=0, sdlog=0.5) # 调用mle:命名初始值+传递观测数据 mle.4 <- mle(minuslogl=obs.loglik4, start=list(mu=mean((y^0.5-1)/0.5), sig2=var((y^0.5-1)/0.5), lambda=0.5), data=list(y=y)) # 查看估计结果 summary(mle.4)
修正方案2:参数向量形式
保留向量传递参数的形式,将theta作为函数第一个参数,y作为第二个参数:
library(stats4) # 定义负对数似然函数,theta为参数向量 obs.loglik4 <- function(theta, y) { mu <- theta[1] sig2 <- theta[2] lambda <- theta[3] n <- length(y) loglik <- -0.5*n*log(2*pi) - 0.5*n*log(sig2) - sum(((y^lambda - 1)/lambda - mu)^2)/(2*sig2) + (lambda - 1)*sum(log(y)) return(-loglik) } # 示例观测数据 set.seed(123) y <- rlnorm(100, meanlog=0, sdlog=0.5) # 调用mle:向量初始值+传递观测数据 mle.4 <- mle(minuslogl=obs.loglik4, start=c(mean((y^0.5-1)/0.5), var((y^0.5-1)/0.5), 0.5), data=list(y=y)) # 查看估计结果 summary(mle.4)
关键提示
stats4::mle默认最小化负对数似然,必须确保函数返回负的对数似然值,否则会得到错误的估计结果。- 初始值设置可更合理:用初始lambda值对y做变换后,取均值作为mu初始值、方差作为sig2初始值,能提升优化收敛效率。
内容的提问来源于stack exchange,提问作者user367987
相关产品推荐
相关产品推荐

