奇怪的glmulti结果:为什么要删除/不包括来自候选模型的交互变量?

时间:2019-05-15 18:12:24

标签: r lme4 glmulti

我一直在使用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)

1 个答案:

答案 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"))
}