【问题标题】:Changing the labels of your random-effects grouping variable changes the results in lme4更改随机效应分组变量的标签会更改 lme4 中的结果
【发布时间】:2021-02-22 04:02:04
【问题描述】:

标题说明了一切:更改随机效应分组变量的(假设是任意的)标签(例如,重复测量实验中的受试者姓名)可以更改 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 将它们转换为因子,并且不同的名称会产生不同的因子级别排序。例如。这产生了问题:

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。另外,如果这是正确的,我认为这可能会导致轻微的可重复性问题——例如,如果在完成分析后,实验者将他们的人类受试者数据匿名(通过更改名称),然后将其发布到公共存储库中。)

【问题讨论】:

    标签: r lme4 mixed-models


    【解决方案1】:

    当我适合这个模型时,我会在适合它时收到一个奇异的适合警告。这不是一个好兆头,因为仅由随机截距计算的方差实际上是 0,而且您也有一个随机斜率。这里的随机效应可能不会在模型中做任何有意义的事情。

    其次,我质疑这是否是适合这种情况的正确模型,以下是不请自来的建议,如果您认为这不合适,我深表歉意。其次,我会对此发表评论,但不确定如何添加图片。

    首先,我做了一些探索性绘图,发现您的因变量和固定效应都具有双峰分布。如果我们像下面这样绘制散点图,我们肯定可以看到它可能不是线性趋势。

    当我们查看模型残差时,我们会看到异方差性,这是次优的。我不是统计学家,但我有一些顾问告诉我,这是线性模型中最糟糕的假设之一。

    我认为您可能会看到由于奇异拟合而导致的估计不稳定,但希望其他人能提出来,了解更多可以解决这个问题。

    【讨论】:

    • 感谢您的回复!是的,这些实际上并不是我最初发现问题的数据——我只是选择了一个随机的 R 数据集来生成一个最小的示例。我同意这个模型显然不适合这个数据。但即使在一个指定不佳的模型中,为什么更改任意变量标签会​​改变结果?这似乎无论如何都不应该发生,你知道吗? (换句话说,在我看来,模型拟合的质量对于这个问题并不重要。但我在这里很容易犯错。)
    【解决方案2】:

    序列的第一部分1:8 以数字或字符格式给出相同的order,而第二部分则没有:

    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
    

    已经有一个ticket filed at github,您应该加入其中。也许可以尝试事先找到一个类似的情况,其中存在排序问题,但不是单数拟合。

    【讨论】:

    • 感谢您的回复。这是有道理的——这就是我在问题的第二部分中试图表达的意思,当时我谈到了因子水平排序(尽管我解释得不好)。但我认为我的问题仍然存在。为什么分组因子中水平的顺序对结果很重要? (github票链接非常有帮助。我一定会加入。谢谢!!)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    相关资源
    最近更新 更多