我相信这个问题与经常想知道的“必须始终在线性回归中包含截距项”非常相似,对此商定的答案是“是的,除非您有充分的理由不这样做”。
在进行任何实验之前,我试图考虑没有固定效应项会发生什么。让我们详细写出你的两个模型。第一个,具有固定效应斜率,是
y∼N(μα+α[i]+(μβ+β[i])x,σ)
α∼N(0,σα)
β∼N(0,σβ)
其中是天数,我们有一个随机截距和每个主题的随机斜率。在另一种情况下,没有固定斜率,模型是xα[i]β[i]
y∼N(μα+α[i]+β[i]x,σ)
α∼N(0,σα)
β∼N(0,σβ)
不同之处在于,在第二个模型中,我们先验地假设随机斜率的平均值为零。这意味着,我们期望与各个主题相关的斜率均匀分布在斜率附近(例如,一半应该是负数,一半应该是正数)。0
现在,在您的数据模型中,这似乎不是真的。在您的第二个图中,每个主题内的估计斜率都是正的。看起来此模型对您的数据无效。包含固定斜率包括作为自由度的主体斜率的平均值,在此图中,您可以看到随机斜率均匀地聚集在零附近,如您所愿。
至于从模型中的参数推断,我相信模型的这种错误陈述会导致以下参数估计存在偏差
- 主体斜率将偏向零,因为可能性中均值为零的假设会将它们拉向零。
- 随机斜率的估计标准偏差会太大,因为膨胀这个参数会让斜率聚集在它们的真实、非零均值周围,而不会受到如此严重的惩罚。
在这里,我将创建一些模拟数据,其中真实的主题平均斜率非零
library("lme4")
library("arm")
set.seed(154)
N_classes = 50
N_obs <- 10000
random_intercepts <- structure(
rnorm(N_classes), names = as.character(1:N_classes)
)
random_slopes <- structure(
rnorm(N_classes, mean = 1), names = as.character(1:N_classes)
)
classes <- sample(as.character(1:N_classes), size = N_obs, replace = TRUE)
x <- runif(N_obs)
y <- random_intercepts[classes] + random_slopes[classes] * x + rnorm(N_obs)
df <- data.frame(class = factor(classes), x = x, y = y)
第一个模型很好地估计了所有真实参数
> M <- lmer(y ~ x + (x | class), data = df)
> display(M)
lmer(formula = y ~ x + (x | class), data = df)
coef.est coef.se
(Intercept) 0.01 0.15
x 1.02 0.15
Error terms:
Groups Name Std.Dev. Corr
class (Intercept) 1.03
x 1.01 0.19
Residual 1.00
看起来这里所有的参数都被很好地估计了,包括随机斜率的标准偏差。
这是没有固定斜率的模型
> N <- lmer(y ~ (x | class), data = df)
> display(N)
lmer(formula = y ~ (x | class), data = df)
coef.est coef.se
-0.14 0.15
Error terms:
Groups Name Std.Dev. Corr
class (Intercept) 1.04
x 1.43 0.24
Residual 1.00
随机斜率标准差的估计值为1.43
,证实了我的直觉,即它会偏大。
模型中主体斜率的平均值M
很好
> mean(fixef(M)["x"] + ranef(M)$class$x)
[1] 1.015418
在另一个模型上,我的直觉似乎不太正确
> mean(ranef(N)$class$x)
[1] 0.9858566
看起来模型比确保完全满足随机斜率假设的正态性更认真地拟合数据。总而言之,随机斜率标准差的膨胀似乎是最严重的问题。