我一直在使用glmulti
来获取模型平均估计值和我感兴趣的变量的相对重要性值。在运行glmulti
时,我基于先验知识(请参见下面的代码)指定了一个候选模型,其中包括了所有变量和交互。
运行glmutli
模型后,我使用函数summary()
和weightable()
研究了结果。结果似乎发生了许多奇怪的事情,我不理解。
首先,当我使用lme4
glmer()
函数运行候选模型时,我获得的AIC值为2086。在glmulti输出中,该候选模型(具有完全相同的公式)具有较低的AIC值。 AIC值(2107),其结果将出现在所有潜在模型列表中26的第8位(通过weigtable()函数获得)。
似乎引起此问题的原因是尽管指定了level=2
,但从候选模型中删除了logArea:Habitat交互。与summary(output_new@objects[[8]])
提供的公式相比,函数weightable()
提供了不同的公式(没有logArea:Habitat交互变量)。这解释了为什么候选模型AIC值与通过lme4
获得的值不同,但是我不明白为什么公式中缺少交互变量logArea:Habitat。对于其他可能的模型也是如此。对于所有具有2个或更多交互的模型,似乎删除了一个交互。
有人对发生的事情有任何解释吗?任何帮助将不胜感激!
最好, 罗伯特
注意:我创建了数据的一个子集(https://drive.google.com/open?id=1rc0Gkp7TPdnhW6Bw87FskL5SSNp21qxl),并通过删除变量来简化候选模型,以减少模型运行时间。 (问题仍然相同)
newdat <- Data_ommited2[, c("Presabs","logBodymass", "logIsolation", "Matrix", "logArea", "Protection","Migration", "Habitat", "Guild", "Study","Species", "SpeciesStudy")]
glmer.glmulti <- function (formula, data, random, ...) {
glmer(paste(deparse(formula), random), data = data, family=binomial(link="logit"),contrasts=list(Matrix=contr.sum, Habitat=contr.treatment, Protection=contr.treatment, Guild=contr.sum),glmerControl(optimizer="bobyqa", optCtrl = list(maxfun = 100000)))
}
output_new <- glmulti(y = Presabs ~ Matrix + logArea*Protection + logArea*Habitat,
data = sampledata,
random = '+(1|Study)+(1|Species)+(1|SpeciesStudy)',
family = binomial,
method = 'h',
level=2,
marginality=TRUE,
crit = 'aic',
fitfunc = glmer.glmulti,
confsetsize = 26)
print(output_new)
summary(output_new)
weightable(output_new)
答案 0 :(得分:0)
我找到了遇到相同问题的人的帖子(https://stats.stackexchange.com/questions/341356/glmulti-package-in-r-reporting-incorrect-aicc-values),看来该问题是由以下代码行引起的:
glmer.glmulti <- function (formula, data, random, ...) {
glmer(paste(deparse(formula), random), data = data, family=binomial(link="logit"))
}
通过将代码的这一部分更改为以下内容,可以解决该问题:
glmer.glmulti<-function(formula,data,random,...) {
newf <- formula
newf[[3]] <- substitute(f+r,
list(f=newf[[3]],
r=reformulate(random)[[2]]))
glmer(newf,data=data,
family=binomial(link="logit"))
}