使用maxLik执行似然比测试时遇缺失值错误的解决求助
修复似然比测试中的
missing value where TRUE/FALSE needed错误 我来帮你定位并解决这个问题。这个错误的根源是参数估计过程中产生了无效的NA值,导致后续逻辑判断无法得到合法的TRUE/FALSE结果。下面是具体的分析和修复步骤:
错误原因拆解
你遇到的Error in if (all(y == 0)) { : missing value where TRUE/FALSE needed,本质是当maxLik尝试计算似然值时,部分参数组合(比如m<=0、o<=0)会让似然函数返回NA,而内部函数在处理这些NA值时,触发了需要布尔值但得到NA的判断。
比如你的Logliknak1函数中,如果m或o为负数,log(o)或lgamma(m)会返回NA,整个似然值就变成了NA,进而导致后续判断出错。
具体修复方案
1. 在似然函数中添加参数有效性校验
提前拦截无效参数组合,直接返回-Inf(让maxLik自动跳过这些无效参数):
library("maxLik") library("flexsurv") n=20 den1=1000 mpar=3 omepar=5 spar=3 # 修复后的原假设似然函数 Logliknak1=function(param){ m=param[1] o=param[2] # 校验参数必须为正 if(m <= 0 || o <= 0) return(-Inf) n*(log(2)+m*log(m)-lgamma(m)-m*log(o))+(2*m-1)*sum(log(y))-(m/o)*sum(y^(2)) } # 修复后的备择假设似然函数 Loglikgennak= function(param){ s <- param[1] ome <- param[2] m<-param[3] # 校验所有参数必须为正 if(s <= 0 || ome <= 0 || m <= 0) return(-Inf) n*(log(2*s)+m*log(m)-lgamma(m)-m*log(ome))+(2*m*s-1)*sum(log(y))-(m/ome)*sum(y^(2*s)) }
2. 增强循环中的收敛性与NA检查
在repeat循环中,先确认模型收敛且系数无NA,避免后续使用无效值:
LR2=rep(0,den1) ps=0; pome=0; pm=0; for(i in 1:den1){ repeat { x=rgengamma.orig(n,shape=spar,scale=(omepar/mpar),k=mpar) y=x^0.5 # 额外检查y是否全为正(理论上不会,但以防极端情况) if(any(y <= 0)) next ot=mean(y^2) mt=(mean(y)*mean(y^2))/(2*(mean(y^3)-(mean(y)*mean(y^2)))) # 拟合原假设模型并检查收敛性 mle2 <- maxLik(logLik=Logliknak1, start = c(m=mt, o=ot),method="BFGSR") if(!converged(mle2) || any(is.na(coef(mle2)))) next lnull=logLik(mle2) mm=coef(mle2)[[1]] mo=coef(mle2)[[2]] # 拟合备择假设模型并检查收敛性 mle3 <- maxLik(logLik=Loglikgennak, start = c(s=1.5,ome=omepar+1,m=mpar+1),method="BFGSR") if(!converged(mle3) || any(is.na(coef(mle3)))) next lalt=logLik(mle3) ps=coef(mle3)[[1]] pome=coef(mle3)[[2]] pm=coef(mle3)[[3]] # 只有当所有条件都满足时才退出循环 if (lalt>lnull && ps>1 && pome>0 && pm>0) {break} } LR2[i]=2*(lalt-lnull) print(i) print(LR2[i]) print(pm) print(pome) print(ps) }
3. 可选:优化初始值
你当前的备择模型初始值是固定的c(s=1.5,ome=omepar+1,m=mpar+1),可以考虑用原模型的估计值来初始化,提升收敛概率:
# 用原模型的系数作为备择模型的初始值参考 mle3 <- maxLik(logLik=Loglikgennak, start = c(s=1.5, ome=mo, m=mm), method="BFGSR")
为什么这样能解决问题?
- 参数有效性校验确保似然函数永远返回合法值(要么是有效的对数似然,要么是
-Inf),避免NA流入后续计算; - 收敛性检查确保你只使用成功拟合的模型结果,不会用未收敛的无效系数;
- 额外的y值检查避免极端情况导致的计算异常。
内容的提问来源于stack exchange,提问作者deniss
相关产品推荐
相关产品推荐

