您的剩余结构完全符合此模型规范和指定错误模型的指示。您基本上要做的是通过在轴上只能取 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=yi−E(yi|Xi)=yi−logit−1(Xiβ)
因为数据yi是离散的,残差也是。在上图中,通过根据拟合值将数据划分为类别来对残差进行分箱,然后针对每个类别(分箱)的平均残差与平均拟合值进行绘制。线条表示±2标准误差范围,假设模型为真,我们预计大约 95% 的分箱残差会落在该范围内。
因此,解决您当前问题的方法是通过键入以下内容来拟合混合效应逻辑回归:
model <- glmer(error~is_frisian*condition*person+(1|subject_id),
data=output, family="binomial")
有关混合效应逻辑回归的良好介绍R
,请参见此处。有关线性和广义线性模型中的诊断的良好概述,请参见此处。