当使用遗传算法和lme4时,glmulti无限运行

时间:2012-09-01 14:04:03

标签: r genetic-algorithm lme4

我正在使用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的新手,我无法解决这个问题。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:5)

我收到了包维护者的解决方案。问题是探索的模型数量由参数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)

但是,对于小型模型,使用穷举搜索(method =“h”)可能就足够了:

babs <- glmulti(y~a*b*c, level = 2, fitfunc = lmer.glmulti, 
                random = "+(1|x)", method = "h")

答案 1 :(得分:2)

是的,我已经解决了这个问题 - 问题是我用来测试运行这个包的例子(上面)只包含3个变量。当您添加第四个时,它可以正常工作:

d = runif(30)

再次运行告诉它使用GA:

babs <- glmulti(y~a*b*c*d, level = 2, fitfunc = lmer.glmulti, random = "+(1|x)", method = "g")

返回:

...

After 190 generations:
Best model: y~1
Crit= 159.374382952181
Mean crit= 163.380382861026
Improvements in best and average IC have bebingo en below the specified goals.
Algorithm is declared to have converged.
Completed.

如果您尝试使用少于三个变量的GA,则使用带有GLM的glmulti开箱即可得到相同的结果。这不是一个真正的问题,但是如果你只有三个变量就可以进行详尽的搜索。问题就是这个例子。