每当您尝试拟合具有随机斜率的模型时,这是预期的行为,其中随机斜率的变量是分类的并且每个治疗/组组合只有一个观察值。
这是因为分类变量的水平由虚拟变量表示 - 本质上它们被视为不同的变量。因此,在您的情况下,仅当您拟合随机斜率时,您才要求软件为每组估计 5 个随机斜率。当您拟合随机截距和随机斜率时,将有 407 个随机截距,但每组只有 4 个随机斜率(因为一个级别将被视为参考组并包含在截距中),因此无论哪种方式,您都会有 5 x 407随机效应。
解决这个问题的唯一方法是将变量编码为数字,如果这在您的研究/数据中是合理的,或者不拟合随机斜率,或者每组每次治疗有超过 1 个观察值。
使用玩具数据集可以说明这一点:
> set.seed(1)
> dt <- expand.grid(G = LETTERS[1:4], a = LETTERS[1:2])
> dt$Y = rnorm(nrow(dt))
> dt
G a Y
1 A A -0.6264538
2 B A 0.1836433
3 C A -0.8356286
4 D A 1.5952808
5 A B 0.3295078
6 B B -0.8204684
7 C B 0.4874291
8 D B 0.7383247
现在我们拟合模型,由于上述原因,这两个模型都不会运行。
> lmer(Y ~ a + (0 + a | G), data = dt) %>% summary()
Error: number of observations (=8) <= number of random effects (=8) for term (0 + a | G); the random-effects parameters and the residual variance (or scale parameter) are probably unidentifiable
> lmer(Y ~ a + (1 + a | G), data = dt) %>% summary()
Error: number of observations (=8) <= number of random effects (=8) for term (1 + a | G); the random-effects parameters and the residual variance (or scale parameter) are probably unidentifiable
但是现在我们只向数据集添加 1 行,它们运行:
> (dt <- rbind(dt, dt[1, ]))
G a Y
1 A A -0.6264538
2 B A 0.1836433
3 C A -0.8356286
4 D A 1.5952808
5 A B 0.3295078
6 B B -0.8204684
7 C B 0.4874291
8 D B 0.7383247
9 A A -0.6264538
> lmer(Y ~ a + (0 + a | G), data = dt) %>% summary()
Random effects:
Groups Name Variance Std.Dev. Corr
G aA 1.451e+00 1.205e+00
aB 3.224e-01 5.678e-01 -0.04
Residual 4.239e-15 6.511e-08
> lmer(Y ~ a + (1 + a | G), data = dt) %>% summary()
Random effects:
Groups Name Variance Std.Dev. Corr
G (Intercept) 9.776e-01 9.887e-01
aB 1.222e+00 1.105e+00 -0.81
Residual 1.159e-14 1.077e-07
Number of obs: 9, groups: G, 4
在仅具有随机斜率的模型中,我们有 4 组中的 2 个随机斜率(8 个随机效应),而在具有随机截距和随机斜率的模型中,我们有 4 个随机截距和 4 个随机斜率。