即使在数据框中对变量进行分组之后,lme4 upgrade也会生成错误消息

时间:2013-11-03 02:42:05

标签: r lme4

我一直使用旧版本的lme4运行线性混合模型。现在我已经更新了lme4,我收到以下错误:

  

错误en [[<-.data.frame*tmp*,i,value = integer(0)):     替换有0行,数据有4211

我在这个网站上找到了一个答案,建议将所有分组变量放在data参数指定的数据框中。我已经完成了,但我的代码仍然不起作用。

这是:

msdgtot=glmer(sdg.dens ~ ngbr.trees + (1 + ngbr.trees | factor(species)), data=d.sdg.ngb,family=poisson)
  

错误en [[<-.data.frame*tmp*,i,value = integer(0)):     替换有0行,数据有4211

知道为什么会这样吗? 非常感谢! 纳塔利娅·诺登

1 个答案:

答案 0 :(得分:7)

这确实是lme4https://github.com/lme4/lme4/issues/156中尚未修复的错误。但是,解决方法很简单:只需在数据框内进行转换,例如as.factor()as.numeric(),而不是在公式中进行转换,例如。

d.sdg.ngb = transform(d.sdg.ngb,species=factor(species))
msdgtot = glmer(sdg.dens ~ ngbr.trees + (1 + ngbr.trees | species),
    data=d.sdg.ngb,family=poisson)

一般来说,我认为这甚至不是必要的 - 至少最近版本的glmer会自动将分组变量(如species)转换为因子 - 但我可以体会到要小心/明确。如果由于某种原因我不想永久地将分组变量转换为因子,我通常会制作变量的因子版本,例如。

d.sdg.ngb = transform(d.sdg.ngb,fspecies=factor(species))

然后在公式中使用fspecies而不是species

对于它的价值,这在先前发布的lme4版本中也会出现问题:使用lme4.0(向后兼容版本),

gm1 <- glmer(cbind(incidence, size - incidence) ~ period + (1 | herd),
  data=cbpp,family=binomial)

工作正常,但

gm1 <- glmer(cbind(incidence, size - incidence) ~ period + (1 | factor(herd)),
data=cbpp,family=binomial)

给出Error in factor(herd) : object 'herd' not found(诚然,这是一个不太神秘的错误信息,但仍然是错误的。)