06 · 逻辑回归与分类评估
一、二分类与 logit
当因变量是二分类(如有效/无效、发病/未发病、死亡/存活)时,常用逻辑回归建立“自变量 → 发生概率”的关系。逻辑回归既能用于解释(OR)也能用于预测(概率/分类)。
1.1 为什么不用线性回归
1.2 logit 与优势
逻辑回归把概率 \(p\) 映射到实数轴:
\[ \mathrm{logit}(p) = \log\left(\frac{p}{1-p}\right) = \beta_0 + \beta_1 x_1 + \cdots + \beta_p x_p \]
其中 \(\frac{p}{1-p}\) 称为优势(odds)。系数 \(\beta\) 的指数 \(\exp(\beta)\) 就是优势比(OR)。
二、glm 与系数解读
R 中用 glm(..., family = binomial) 拟合二项分布的广义线性模型(逻辑回归)。示例用 R 内置数据集 mtcars:以变速箱类型 am(0 自动 / 1 手动)为结局。
2.1 glm(..., binomial)
data(mtcars)
# 把 am 当作 0/1 结局
fit <- glm(am ~ wt + hp, data = mtcars, family = binomial)
summary(fit)
2.2 OR 与置信区间
逻辑回归的系数是 log(OR)。取指数即可得到 OR,并可报告 OR 的置信区间。
# OR(优势比)
or <- exp(coef(fit))
or
# OR 的置信区间
or_ci <- exp(confint(fit))
or_ci
2.3 预测概率与阈值
模型输出的是概率 \(p\)。把概率转换成类别需要选择阈值(常见 0.5,但医学场景往往需要基于成本/风险调整阈值)。
# 预测概率(0~1)
pred_prob <- predict(fit, type = "response")
head(pred_prob)
# 用 0.5 阈值转类别
pred_class <- ifelse(pred_prob >= 0.5, 1, 0)
三、混淆矩阵与指标
分类评估从混淆矩阵出发:真阳性(TP)、假阳性(FP)、真阴性(TN)、假阴性(FN)。
3.1 Accuracy / Recall / Specificity
# 混淆矩阵
tb <- table(真实 = mtcars$am, 预测 = pred_class)
tb
TP <- tb["1","1"]; TN <- tb["0","0"]; FP <- tb["0","1"]; FN <- tb["1","0"]
acc <- (TP + TN) / sum(tb)
sens <- TP / (TP + FN) # 灵敏度/召回
spec <- TN / (TN + FP) # 特异度
c(accuracy = acc, sensitivity = sens, specificity = spec)
3.2 类别不平衡
当阳性远少于阴性时,单看准确率可能误导(“全预测为阴性”也可能准确率很高)。这时更应关注灵敏度/特异度、ROC/AUC,或精确率(Precision)等。
四、ROC 与 AUC
ROC 曲线以 “1−特异度(FPR)” 为横轴、灵敏度(TPR)为纵轴,展示阈值变化下模型的整体判别能力。
4.1 ROC 的含义
- 每个阈值对应一对(FPR, TPR),连起来就是 ROC 曲线。
- 曲线越靠近左上角(高 TPR、低 FPR)越好。
4.2 AUC 的解读
AUC(曲线下面积)可理解为:随机抽取一个阳性与一个阴性,模型给阳性的预测概率更高的概率。AUC 越接近 1 判别越强;0.5 接近随机。
# 需要 pROC 包(若环境已安装)
# install.packages("pROC")
library(pROC)
roc_obj <- roc(mtcars$am, pred_prob)
auc(roc_obj)
plot(roc_obj)
五、小结与练习
本节要求:能用 glm(..., family = binomial) 拟合逻辑回归;会将系数转为 OR 并解释;能从混淆矩阵计算常用指标,并理解 ROC/AUC 的意义与阈值选择。
- 用
mtcars:拟合am ~ wt + hp + factor(cyl),比较 OR 变化并解释。 - 尝试不同阈值(0.3/0.5/0.7)计算灵敏度与特异度,讨论哪个阈值更适合“筛查”。
- 用
pROC画 ROC 并报告 AUC。