在R中,lmer(或lme)中的随机效应变量是否自动被视为因子?

9
我了解在混合效应模型中,将连续或数值变量作为随机效应并不太合理(例如,请参见此处)。
但我想知道的是,R中的lme4::lmernlme::lme是否有意防止你这样做...
具体来说,我的问题是:如果我将任何非因子(非分类)变量作为随机效应提供给lmer(或lme),该函数会自动将其视为因子吗? 直接将factor()插入lmer(使用lm时通常的方法)会产生以下错误:
lmer(y ~ z + (1|factor(x)), data = dat)
Error: couldn't evaluate grouping factor factor(x) within model frame: try adding grouping factor to data frame explicitly if possible

尽管上述错误提到直接将分组因素添加到数据中,但它并没有明确指出是否该分组因素需要是一个因子(或者这个词的选择可能隐含了这一点)?
我知道很容易直接从我的数据中创建一个新的因子类变量,但我只是好奇在使用 lmer(或lme)时是否真的有必要。
1个回答

6

似乎并不重要。

library(lme4)

sl <- sleepstudy
sl$Subject <- as.numeric(levels(sl$Subject))[sl$Subject]

## subject as factor
m1 <- lmer(Reaction ~ Days + (1|Subject), data = sleepstudy)

## subject as numeric
m2 <- update(m1, data = sl)

all.equal(VarCorr(m1), VarCorr(m2))
# TRUE

检查对象的其余部分,调用不同(这是有道理的,我把数据框命名为不同的名称),并且框架不同(由于Subject中数字与因子的差异)。其他所有内容都相同。

all.equal(m1, m2)
#[1] "Attributes: < Component “call”: target, current do not match when deparsed >"     
#[2] "Attributes: < Component “frame”: Component “Subject”: 'current' is not a factor >"

分组因素在mkBlist()中进行factorize()处理,该函数在mkReTrms()中调用,用于为随机效应创建模型矩阵。 factorize()是一个辅助函数,最终会在随机效应公式的右侧项上调用factor(x)(条件是它是否已经是因子等)。


感谢您的反馈!这个回答有点肤浅(只回答了加粗的问题“函数是否自动将其视为因子?”而不是为什么在公式的RE部分调用函数不起作用)。这不是我理解得足够好的东西,您想添加一个关于这个的答案吗? - alexforrence
@alexforrence 谢谢,Alex,这很有帮助。你是如何确定你的最后一段话(“分组因素...等等”)的位置和方式的? - theforestecologist
1
@theforestecologist,通常从https://github.com/lme4/lme4/blob/master/R/utilities.R源代码中,有具体的哪一部分让您感到困惑? - alexforrence
@alexforrence 不,我只是不知道如何独立完成那个:p。 - theforestecologist

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