R中使用lmer(lme4包)的混合线性模型的意外残差图

机器算法验证 r 混合模式 残差
2022-03-24 03:13:07

我已经对每个受试者进行了多个(分类)条件和多个受试者测量的实验。

简而言之,我的数据框:一个主题有一个属性,is_frisian根据主题为 0 或 1。并针对两个条件进行测试,personcondition测量变量为error,为 0 或 1。

我在 R 中的混合线性模型是:

> model <- lmer(error~is_frisian*condition*person+(1|subject_id), data=output)

然而,这个模型的残差图给出了一个意想不到的(?)结果。

残差 lmer 模型

我被告知这个图应该显示随机分散的点,并且它们应该是正态分布的。在绘制拟合的密度和残差时,它显示出合理的正态分布。您可以在图中看到的线条,但是,如何解释呢?这可以吗?

我唯一能想到的是,由于分类变量,该图有两条线。输出变量error是 0 或 1。但我对底层系统没有太多了解来确认这一点。再说一次,线条似乎也有一个低的负斜率,这可能是一个问题吗?

更新:

> model <- glmer(error~is_frisian*condition*person + (1|subject_id), data=output, family='binomial')
> binnedplot(fitted(model),resid(model))

给出以下结果:

分箱残差图

最终编辑:

密度图已被省略,在这种情况下,它们与满足假设无关。有关逻辑回归的假设列表(使用 family=binomial 时),请参见此处的统计解决方案。

1个回答

您的剩余结构完全符合此模型规范和指定错误模型的指示。您基本上要做的是通过在轴上只能取 0 和 1 值的点拟合一条线性线。y

让我们看一个任意生成变量的简单示例:

#-----------------------------------------------------------------------------
# Generate random data for logistic regression
#-----------------------------------------------------------------------------

set.seed(123)
x <- rnorm(1000)          
z <- 1 + 2*x
pr <- 1/(1+exp(-z))
y <- rbinom(1000,1, pr)

#-----------------------------------------------------------------------------
# Plot the data
#-----------------------------------------------------------------------------

par(bg="white", cex=1.2)
plot(y~x, las=1, ylim=c(-0.1, 1.3))

#-----------------------------------------------------------------------------
# Fit a linear regression (nonsensical) and plot the fit
#-----------------------------------------------------------------------------

linear.mod <- lm(y~x)
segments(-2.32146, 0, 1.24196, 1, col="steelblue", lwd=2)
segments(1.24196, 1, 100, 28.71447, col="red", lwd=2)
segments(-100, -27.41153, -2.32146, 0, col="red", lwd=2)

不适

如您所见,通过数据拟合了一条线性线。其中一个问题是该线预测的结果超出了区间[0,1](由该区间外的红线说明)。我们来看看残差:

#-----------------------------------------------------------------------------
# Add the residual lines
#-----------------------------------------------------------------------------

x.y0 <- sample(which(y==0), 50, replace=F)
x.y1 <- sample(which(y==1), 50, replace=F)

pre <- predict(linear.mod)

segments(x[x.y0], y[x.y0], x[x.y0], pre[x.y0], col="red", lwd=2)
points(x[x.y0], y[x.y0], pch=16, col="red", las=1)

segments(x[x.y1], y[x.y1], x[x.y1], pre[x.y1], col="blue", lwd=2)
points(x[x.y1], y[x.y1], pch=16, col="blue", las=1)

不正常的残差

我随机选择了一些值来显示模式。红线和蓝线表示残差,即线的预测值与实际观察值(红点和蓝点)之间的差异。蓝线对应于的残差,而红色的残差对应于的情况。因为结果只能是 0 或 1,所以残差只是回归线与 0 或 1 之间的距离。残差完全采用您在数据中看到的形式:y=1y=0

#-----------------------------------------------------------------------------
# Plot the residuals
#-----------------------------------------------------------------------------

res.linear <- residuals(linear.mod, type="response")

par(bg="white", cex=1.2)
plot(predict(linear.mod)[y==0], res.linear[y==0], las=1,
     xlab="Fitted values", ylab = "Residuals",
     ylim = max(abs(res.linear))*c(-1,1), xlim=c(-0.4, 1.6), col="red")
points(predict(linear.mod)[y==1], res.linear[y==1], col="blue")
abline(h = 0, lty = 2)

病态模型残差图

颜色对应于上面显示的残差:蓝点是残差,其中y=1红点是残差y=0. 在正态线性回归中,残差被假定为近似正态分布。但在这种情况下,残差几乎不可能是正常的。它们是二项式的。

我们需要一个转换概率的转换,它绑定在[0,1]变成一个范围超过的变量(,). 一种这样的转换是logit(这不是唯一的可能性:我们也可以使用probit互补的 log-log 函数)。让我们用 logit-link 拟合逻辑回归,并再次绘制分箱残差Gelman 和 Hill (2007)在第 97 页上进行了解释)。在逻辑回归之后,绘制原始残差与拟合值的关系图通常没有用:

#-----------------------------------------------------------------------------
# Fit a logistic regression
#-----------------------------------------------------------------------------

glm.fit <- glm(y~x, family=binomial(link="logit"))

#-----------------------------------------------------------------------------
# Plot the binned residuals as recommended by Gelman and Hill (2007)
#-----------------------------------------------------------------------------

library(arm)
par(bg="white", cex=1.2, las=1)
binnedplot(predict(glm.fit), resid(glm.fit), cex.pts=1, col.int="black")

分箱残差

逻辑回归中的残差可以定义 - 与线性回归一样 - 观察到的减去预期值:

residuali=yiE(yi|Xi)=yilogit1(Xiβ)
因为数据yi是离散的,残差也是。在上图中,通过根据拟合值将数据划分为类别来对残差进行分箱,然后针对每个类别(分箱)的平均残差与平均拟合值进行绘制。线条表示±2标准误差范围,假设模型为真,我们预计大约 95% 的分箱残差会落在该范围内。

因此,解决您当前问题的方法是通过键入以下内容来拟合混合效应逻辑回归:

model <- glmer(error~is_frisian*condition*person+(1|subject_id),
data=output, family="binomial")

有关混合效应逻辑回归的良好介绍R,请参见此处有关线性和广义线性模型中的诊断的良好概述,请参见此处