我正在使用glmulti在R中进行模型平均。我的模型中有〜10个变量,因此无法进行详尽的筛选-因此,我需要使用遗传算法(GA)(称为:method =“g”)。
我需要包括随机效果,因此我将glmulti用作lme4的包装。此处的方法可在http://www.inside-r.org/packages/cran/glmulti/docs/glmulti中找到,glmulti软件包中也包含一个pdf文件,其中有更详细的说明。问题是,当告诉glmulti在此设置中使用GA时,即使找到了最佳模型,它也会无限期地运行。
这是从glmulti软件包中包含的pdf中获取的示例:
library(lme4)
library(glmulti)
# create a function for glmulti to act as a wrapper for lmer:
lmer.glmulti <- function (formula, data, random = "", ...) {
lmer(paste(deparse(formula), random), data = data, REML=F, ...)
}
# set some random variables:
y = runif(30,0,10) # mock dependent variable
a = runif(30) # dummy covariate
b = runif(30) # another dummy covariate
c = runif(30) # an another one
x = as.factor(round(runif(30),1))# dummy grouping factor
# run exhaustive screening with lmer:
bab <- glmulti(y~a*b*c, level = 2, fitfunc = lmer.glmulti, random = "+(1|x)")
这很好。问题是当我告诉它使用遗传算法时:
babs <- glmulti(y~a*b*c, level = 2, fitfunc = lmer.glmulti, random = "+(1|x)", method = "g")
它只是无限期运行,并且AIC不会更改:
...
After 19550 generations:
Best model: y~1
Crit= 161.038899734164
Mean crit= 164.13629335762
Change in best IC: 0 / Change in mean IC: 0
After 19560 generations:
Best model: y~1
Crit= 161.038899734164
Mean crit= 164.13629335762
Change in best IC: 0 / Change in mean IC: 0
After 19570 generations:
Best model: y~1
Crit= 161.038899734164
Mean crit= 164.13629335762
... etc.
我尝试使用告诉glmulti何时停止的调用(deltaB = 0,deltaM = 0.01,conseq = 6),但似乎没有任何作用。我认为问题必须出在设置函数(?)上。可能确实很明显,但是我是R的新手,所以无法解决。
任何帮助,将不胜感激。
最佳答案
我从软件包维护者那里收到了解决方案。问题在于,探索的模型数量由参数confsetsize
设置。默认值为100。
根据?glmulti
,此参数为:
解决方案是将confsetsize
设置为小于或等于模型总数。
从OP中未停止的示例开始:
babs <- glmulti(y~a*b*c, level = 2, fitfunc = lmer.glmulti,
random = "+(1|x)", method = "g")
glmulti
将使用method = "d"
确定候选模型的总数babs <- glmulti(y~a*b*c, level = 2, fitfunc = lmer.glmulti,
random = "+(1|x)", method = "d")
Initialization...
TASK: Diagnostic of candidate set.
Sample size: 30
0 factor(s).
3 covariate(s).
...
Your candidate set contains 64 models.
因此,将
confsetsize
设置为小于或等于64将导致所需的行为。babs <- glmulti(y~a*b*c, level = 2, fitfunc = lmer.glmulti,
random = "+(1|x)", method = "g", confsetsize = 64)
但是,对于小型模型,使用穷举搜索可能就足够了(方法=“h”):
babs <- glmulti(y~a*b*c, level = 2, fitfunc = lmer.glmulti,
random = "+(1|x)", method = "h")
关于r - 在lme4中使用遗传算法时,glmulti会无限期运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12228418/