使用lmer出现分组错误

5

我有一个具有以下结构的数据框:

> t <- read.csv("combinedData.csv")[,1:7]
> str(t)
'data.frame':   699 obs. of  7 variables:
 $ Awns               : int  0 0 0 0 0 0 0 0 1 0 ...
 $ Funnel             : Factor w/ 213 levels "MEL001","MEL002",..: 1 1 2 2 2 3 4 4 4 4 ...
 $ Plant              : int  1 2 1 3 8 1 1 2 3 5 ...
 $ Line               : Factor w/ 8 levels "a","b","c","cA",..: 2 2 1 1 1 3 1 1 1 1 ...
 $ X                  : int  1 2 3 4 7 8 9 10 11 12 ...
 $ ID                 : Factor w/ 699 levels "MEL_001-1b","MEL_001-2b",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ BobWhite_c10082_241: int  2 2 2 2 2 2 0 2 2 0 ...

我希望构建一个混合效应模型。在我的数据框中,我知道想要包含的随机效应(漏斗)是一个因素,但它不起作用:

> lmer(t$Awns ~ (1|t$Funnel) + t$BobWhite_c10082_241)
Error: couldn't evaluate grouping factor t$Funnel within model frame: try adding grouping factor to data frame explicitly if possible

实际上,无论我想将什么作为随机效应(例如植物),都会发生这种情况:

> lmer(t$Awns ~ (1|t$Plant) + t$BobWhite_c10082_241)
Error: couldn't evaluate grouping factor t$Plant within model frame: try adding grouping factor to data frame explicitly if possible

为什么R会给我这个错误?我通过谷歌搜索得到的唯一答案是随机因素在DF中不是一个因子。但是,如str所示,df $ Funnel肯定是一个因子。

4
你真的、真的应该使用 data 参数:lmer(Awns ~ (1|Funnel) + BobWhite_c10082_241, data = t)。如果你不遵循这个惯例(在其他模型函数如lm中也是如此),会发生奇怪的事情。 - Roland
那确实完全解决了!创建一个答案,我会将其设为被接受的。 - SJWard
@Roland,请以答案的形式发布? - Ben Bolker
@BenBolker 由于我正在参加会议,所以回复有些晚了,但我已经发布了答案。如果我没有正确表达包作者的观点,请随意编辑它。 - Roland
看起来不错。有人可以通过查看源代码来确定出现了什么问题,但我认为你的答案基本上就是解决方案。 - Ben Bolker
1个回答

5
实际上,在为建模函数提供方便的语法并同时拥有强大的实现上,并不容易。大多数软件包作者假定你使用"data"参数,即使在这种情况下也会出现作用域问题。因此,如果你使用"DF$col"语法指定变量,可能会发生奇怪的事情,因为软件包作者很少花费大量精力来正确处理这些情况,并且不包括很多单元测试。
因此,强烈建议在模型函数提供"formula"方法时使用"data"参数。如果不遵循这个惯例(例如使用其他模型函数如"lm"),可能会发生奇怪的事情。
在你的示例中:
lmer(Awns ~ (1|Funnel) + BobWhite_c10082_241, data = t) 

这不仅有效,而且写起来更加方便。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接