05 · 线性回归与模型诊断
一、线性回归概览
线性回归用于刻画连续型因变量与一个或多个自变量之间的线性关系。医学中常见问题包括“剂量–效应”“年龄与指标”“多因素对结局的独立贡献”等。线性回归不仅能做预测,更重要的是提供可解释的效应估计(系数 + 置信区间)。
1.1 适用场景与问题
什么时候用
- 因变量是连续值:如
mpg、血压、某检验指标 - 想要解释“一个因素变化 1 单位,结果平均变化多少”
- 需要控制混杂(多重回归)
什么时候不要用
- 因变量是二分类/计数/生存时间(应选逻辑回归、Poisson、Cox 等)
- 关系明显非线性且无法通过变换/分段处理
- 残差结构强烈违背假定且无法修复
1.2 模型形式与最小二乘
简单线性回归:
\[ y = \beta_0 + \beta_1 x + \varepsilon \]
多重线性回归:
\[ y = \beta_0 + \beta_1 x_1 + \cdots + \beta_p x_p + \varepsilon \]
最小二乘(OLS)的思想是:选择一组系数,使残差平方和 \(\sum (y_i-\hat{y}_i)^2\) 最小。
二、简单线性回归
用 R 内置数据集 mtcars 示意:以油耗 mpg 为因变量,车重 wt 为自变量。
2.1 拟合与解释
data(mtcars)
# 简单线性回归:mpg ~ wt
fit1 <- lm(mpg ~ wt, data = mtcars)
summary(fit1)
# 预测:给定 wt 的 mpg 预测值
predict(fit1, newdata = data.frame(wt = c(2.0, 3.0)))
系数解读:
wt 的系数表示车重每增加 1(单位是 1000 磅),mpg 平均变化多少(通常为下降)。
2.2 R² 与置信区间
- R²:模型解释的方差比例,越大拟合越好(但不是越大越好)。
- 调整 R²:对自变量个数做惩罚,便于比较不同复杂度模型。
- 置信区间:提供系数估计的范围与不确定性。
# 系数区间
confint(fit1)
# 拟合值与残差
head(fitted(fit1))
head(residuals(fit1))
三、多重线性回归
加入多个自变量可控制混杂、考察多个因素的独立贡献。例如在 mtcars 中加入马力 hp 与汽缸数 cyl。
3.1 控制混杂与自变量选择
# 多重回归:mpg ~ wt + hp + cyl
fit2 <- lm(mpg ~ wt + hp + cyl, data = mtcars)
summary(fit2)
# 比较模型(嵌套模型可用 anova)
anova(fit1, fit2)
医学语境:“控制混杂”指在多重模型中调整共同影响结局的因素,使主要暴露的系数更接近因果效应(仍需依赖研究设计与假设)。
3.2 分类变量与交互项
分类变量进入线性模型时通常会被编码为虚拟变量。交互项用于表达“一个变量的效应随另一个变量而变”。
# 将 cyl 视为分类变量
fit3 <- lm(mpg ~ wt + hp + factor(cyl), data = mtcars)
summary(fit3)
# 交互项:wt 的影响是否随 hp 改变
fit4 <- lm(mpg ~ wt * hp, data = mtcars) # 等价于 wt + hp + wt:hp
summary(fit4)
四、残差与模型诊断
线性回归常见假定:线性、残差正态、方差齐性、观测独立。诊断的目标不是“挑刺”,而是判断模型是否适合解释与预测,是否需要变换/加项/稳健方法。
4.1 四大假定
线性
关系应大致线性;若弯曲明显,考虑变换或加入非线性项。
残差正态
影响区间估计与显著性检验;大样本时相对不敏感。
方差齐性
残差波动在不同拟合值水平上应相近;异方差会影响标准误。
独立性
时序/聚类数据常违背,需要用混合效应或 GEE 等。
4.2 诊断图与影响点
plot(fit) 会给出一组经典诊断图:残差 vs 拟合值、Q-Q、尺度-位置、杠杆/影响点等。
# 常用四张诊断图
par(mfrow = c(2, 2))
plot(fit2, which = 1:4)
par(mfrow = c(1, 1))
# 影响点:Cook 距离(值大者需人工核查)
cooks <- cooks.distance(fit2)
head(sort(cooks, decreasing = TRUE))
实践建议:影响点不一定要删,但必须解释:它是录入错误、罕见亚型,还是模型确实捕捉到的极端现象?
4.3 共线性与稳健性
共线性指自变量之间高度相关,会导致系数不稳定、标准误变大。常见处理:删/合并变量、构造综合指标、PCA、正则化(岭回归/LASSO)等。
# 一个简单的相关性查看(非严格的共线性诊断)
cor(mtcars[, c("wt", "hp", "cyl")])
# 若安装 car 包,可用 VIF(可选)
# install.packages("car")
# car::vif(fit2)
五、小结与练习
本节要求:能用 lm() 拟合简单与多重线性回归,读懂系数、R²、置信区间;能用诊断图识别常见违背假定的情形,并提出改进方向(变换、加项、稳健方法等)。
练习建议(R 内置数据集):
- 用
mtcars:拟合mpg ~ wt + hp,解释系数含义,并画诊断图。 - 尝试加入
factor(cyl)或交互项wt*hp,比较模型变化。 - 找出 Cook 距离最大的 1–3 个样本,查看它们的特征并讨论是否可能是影响点。