修改随机效应分组变量的标签会改变lme4模型的结果。

4
标题已经说明了一切: 在lme4中更改随机效应分组变量(例如重复测量实验中被试的名称)的(据说是任意的)标签可能会改变结果输出。最小示例:
require(dplyr)
require(lme4)
require(digest)
df = faithful %>% mutate(subject = rep(as.character(1:8), each = 34),
                         subject2 = rep(as.character(9:16), each = 34))
summary(lmer(eruptions ~ waiting + (waiting | subject), data = df))$coefficients[2,1] # = 0.07564181
summary(lmer(eruptions ~ waiting + (waiting | subject2), data = df))$coefficients[2,1] # = 0.07567655

我认为这是由于lme4将它们转换为因子(factor),而不同的名称会产生不同的因子水平排序。例如,以下代码会导致问题:

df2 = faithful %>% mutate(subject = factor(rep(as.character(1:8), each = 34)),
                          subject2 = factor(rep(as.character(9:16), each = 34)))
summary(lmer(eruptions ~ waiting + (waiting | subject), data = df2))$coefficients[2,1] # = 0.07564181
summary(lmer(eruptions ~ waiting + (waiting | subject2), data = df2))$coefficients[2,1] # = 0.07567655

但这个不行:
df3 = faithful %>% mutate(subject = factor(rep(as.character(1:8), each = 34)),
                          subject2 = factor(rep(as.character(1:8), each = 34),
                                            levels = as.character(1:8),
                                            labels = as.character(9:16)))
summary(lmer(eruptions ~ waiting + (waiting | subject), data = df3))$coefficients[2,1] # = 0.07564181
summary(lmer(eruptions ~ waiting + (waiting | subject2), data = df3))$coefficients[2,1] # = 0.07564181

这似乎是lme4中的一个问题。不同的任意变量标签不应该产生不同的输出,对吧?我有遗漏什么吗?为什么lme4会这样做?

(我知道输出差异很小,但在其他情况下我得到了更大的差异,足以改变p值从0.055到0.045等。此外,如果这是正确的,我认为它可能会导致轻微的再现性问题--例如,如果实验者在完成分析后匿名化他们的人类主体数据(通过更改名称),然后将其发布在公共存储库中。)

2个回答

2

你的序列的第一部分 1:8 以数字或字符格式给出相同的 顺序,而第二部分则不是:

identical(order(1:8), order(as.character(1:8)))
# [1] TRUE
identical(order(9:16), order(as.character(9:16)))
# [1] FALSE

这是因为数字会按照它们的第一位进行排序:
sort(9:16)
# [1]  9 10 11 12 13 14 15 16
sort(as.character(9:16))
# [1] "10" "11" "12" "13" "14" "15" "16" "9" 

因此,如果您使用两个不同但仅有一位数字的字符序列,则似乎没有问题:

library(lme4)
fo1 <- eruptions ~ waiting + (waiting | sub)
fo2 <- eruptions ~ waiting + (waiting | sub2)

df1 <- transform(faithful, sub=rep(as.character(1:8), each=34), 
                 sub2=rep(as.character(2:9), each=34))

summary(lmer(fo1, data=df1))$coe[2, 1]
# boundary (singular) fit: see ?isSingular
# [1] 0.07564181
summary(lmer(fo2, data=df1))$coe[2, 1]
# boundary (singular) fit: see ?isSingular
# [1] 0.07564181

然而,在使用lmer()时,您的分组变量的顺序确实很重要。这可以通过给subject和subject2相同的级别但不同的顺序来展示:

set.seed(840947)
df2 <- transform(faithful, sub=rep(sample(1:8), each=34), sub2=rep(sample(1:8), each=34))

summary(fit2a <- lmer(fo1, data=df2))$coe[2, 1]
# boundary (singular) fit: see ?isSingular
# [1] 0.07564179
summary(fit2b <- lmer(fo2, data=df2))$coe[2, 1]
# boundary (singular) fit: see ?isSingular
# [1] 0.07567537

这将再次产生完全不同的系数。可以像这样检查级别和级别顺序:
fit2a@flist$sub
# [1] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
# [33] 4 4 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
# [65] 8 8 8 8 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
# [97] 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
# [129] 3 3 3 3 3 3 3 3 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
# [161] 6 6 6 6 6 6 6 6 6 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
# [193] 1 1 1 1 1 1 1 1 1 1 1 1 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
# [225] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
# [257] 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
# Levels: 1 2 3 4 5 6 7 8

fit2b@flist$sub2
# [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
# [33] 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
# [65] 2 2 2 2 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
# [97] 6 6 6 6 6 6 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
# [129] 8 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
# [161] 7 7 7 7 7 7 7 7 7 7 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
# [193] 3 3 3 3 3 3 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
# [225] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
# [257] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
# Levels: 1 2 3 4 5 6 7 8

已经有人在 GitHub 上提交了一个报告,您可以加入讨论。也许您可以先尝试找到一个类似的案例,其中存在排序问题,但不存在奇异拟合。


1
感谢您的回复。这很有道理--这正是我在问题的第二部分试图表达的,当我谈到因子水平排序时(尽管我解释得不好)。但我认为我的问题仍然存在。为什么分组因子中水平的顺序会影响结果?(Github票证链接非常有帮助...我一定会加入。谢谢!!) - Adam Morris

1
当我拟合这个模型时,出现了奇异拟合警告。这并不是一个好的迹象,因为仅随机截距所解释的方差实际上是0,并且您还有一个随机斜率。在此情况下,随机效应可能在模型中没有任何意义。
其次,我质疑这是否是适合此情况的正确模型,以下是一些未经请求的建议,如果您认为不合适,请谅解。其次,我本来想将此作为评论发布,但不确定如何添加图像。
首先,我进行了一些探索性绘图,发现您的因变量和固定效应都具有双峰分布。如果我们像下面这样绘制散点图,我们肯定可以看到它可能不是线性趋势。

enter image description here

当我们查看模型残差时,发现存在异方差性,这是不太理想的。虽然我不是统计学家,但一些顾问告诉我,这是线性模型中最严重的假设之一。

enter image description here

我认为你可能会看到估计值不稳定,这是由于奇异拟合引起的,但希望有人能来解决这个问题。

谢谢回复!是的,这些实际上不是我最初发现问题的数据 - 我只是选择了一个随机的R数据集来生成一个最小的示例。我同意,这个模型显然不适合这些数据。但即使在规范不良的模型中,为什么更改任意变量标签会改变结果呢?无论如何,这似乎都不应该发生,你知道吗?(换句话说,对我来说,模型拟合的质量似乎不应该影响这个问题。但我愿意接受我的错误。) - Adam Morris

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