从数据清洗一路走到模型外部验证 —— 一套可复现的 R 教程程序
From data cleaning to external validation — a reproducible R tutorial for building clinical prediction models.
本仓库把《预测模型》课程的 lab 与作业整理、串讲成一套可复现的 R 教程, 用一条主线案例把零散的知识点连成完整链路:
数据清洗 → 缺失值多重插补 → 描述性统计 → 建模(回归 / 机器学习)→ 内部验证 → 外部验证
主线案例为 MPE(恶性胸腔积液)预测:结局是胸腔积液是否为恶性(MPE vs Non-MPE)。
data_1(北京 + 武汉队列)用于建模与内部验证,data_2(外部队列)用于外部验证。
- 想系统学习「从数据到预测模型」完整流程的初学者
- 做过零散 lab / 作业,但缺少一条主线把它们串起来的人
- 需要用 R 做临床或流行病学预测建模与验证的研究者
- 一条主线到底:同一个 MPE 数据集贯穿 8 章,前后呼应,不做孤立 demo
- 一键复现:
Rscript run_all.R跑完全流程(约 3 分钟),结果自动写入output/ - 中文字体自动适配:自动探测系统字体 +
showtext渲染,图表中文不再乱码 - 出版级图表:所有图同时输出 300 dpi 的
png与矢量pdf - 跨平台:macOS / Windows / Linux 均可运行,章节可单独 Source
- 可浏览的示例结果:仓库内保留了一次完整运行的输出,无需本地运行即可查看
git clone https://github.com/SAMCYK0921/predictive-modeling-tutorial.git
cd predictive-modeling-tutorialRscript install_deps.R不执行也没关系:
R/00_setup.R在运行时会自动安装缺失的包(需联网)。
方式 A · 一键跑完全流程(推荐)
Rscript run_all.R或在 RStudio 中打开 PredictiveModelingTutorial.Rproj,再打开 run_all.R 点击 Source。
只想学部分章节?编辑 run_all.R 顶部的 RUN_CHAPTERS:
RUN_CHAPTERS <- c("01", "02") # 只运行数据清洗与缺失值处理方式 B · 逐章学习
直接打开并 Source R/ 下的任意章节文件即可(章节会自动载入公共设置)。
方式 C · 交互式学习
source("R/00_setup.R") # 载入环境与工具函数
source("R/05_logistic_regression.R")运行完成后,所有图表与表格会出现在 output/ 目录。
| 章节 | 主题 | 关键内容 | 对应 lab / 作业 |
|---|---|---|---|
| 第 0 章 | 环境准备与全局设置 | 依赖安装、路径定位、工具函数、数据读取 | — |
| 第 1 章 | 数据清洗与预处理 | 合并 / 重塑 / 去重 / 异常值 / 逻辑核查 / 变量派生 | data preprocessing |
| 第 2 章 | 缺失值处理与多重插补 | 缺失模式诊断、单一插补、热卡 / KNN / LOCF、mice、psfmi |
missing data handling / imputation |
| 第 3 章 | 描述性统计与可视化 | Table 1、分布图、相关性热图、组间检验 | MPE 数据描述分析 |
| 第 4 章 | 线性回归与 GAM | 四大假设检验、多重共线性、非线性、连续结局预测 | 04Continuous + Task 3 |
| 第 5 章 | Logistic 回归 | LASSO 选变量、OR 与 95%CI、ROC / 混淆矩阵 | Task 4 + Assignment 2 |
| 第 6 章 | 机器学习建模 | 决策树 / 随机森林 / XGBoost、超参调优、四模型对比 | Task 5 + Assignment 2 |
| 第 7 章 | 内部验证 | K 折交叉验证、Bootstrap 乐观校正 | Assignment 2 · Task 1 |
| 第 8 章 | 外部验证 | 区分度(AUC / DeLong)、校准度(校准图 / 斜率 / Brier) | Assignment 2 · Task 2 |
predictive-modeling-tutorial/
├── README.md # 本说明文件
├── LICENSE # MIT 许可证(数据另有声明)
├── CITATION.cff # 引用信息
├── CONTRIBUTING.md # 贡献指南
├── install_deps.R # 依赖一键安装
├── run_all.R # 一键运行入口(可勾选章节)
├── PredictiveModelingTutorial.Rproj
├── R/ # 各章节 R 程序
│ ├── 00_setup.R # 公共底座:环境 / 路径 / 工具函数 / 数据读取
│ ├── 01_data_preprocessing.R
│ ├── 02_missing_data.R
│ ├── 03_descriptive_analysis.R
│ ├── 04_linear_regression_gam.R
│ ├── 05_logistic_regression.R
│ ├── 06_machine_learning.R
│ ├── 07_internal_validation.R
│ └── 08_external_validation.R
├── data/ # 全部数据(已随教程打包)
│ ├── MPE/ # 主线案例:MPE 数据集(6 个 CSV)
│ ├── missing_data/ # 缺失值 lab 数据 + GustoW.sav
│ ├── preprocessing/ # 数据清洗 lab 数据(10 个 .rda)
│ └── linear/ # 线性回归 lab 数据
└── output/ # 运行产物(仓库内已含一次完整运行的结果)
以下图表均由 run_all.R 自动生成(300 dpi),可直接在 output/ 中查看 png 与 pdf。
| 四模型 ROC 对比(第 6 章) | 外部验证校准图(第 8 章) |
|---|---|
![]() |
![]() |
| 生物标志物分布(第 3 章) | 线性回归诊断(第 4 章) |
|---|---|
![]() |
![]() |
部分表格结果(完整结果见 output/):
| 模型 | AUC | Accuracy | Sensitivity | Specificity |
|---|---|---|---|---|
| Logistic Regression | 0.876 | 0.788 | 0.619 | 0.903 |
| Classification Tree | 0.848 | 0.827 | 0.810 | 0.839 |
| Random Forest | 0.962 | 0.923 | 0.952 | 0.903 |
| XGBoost | 0.962 | 0.923 | 0.952 | 0.903 |
结果会随 R 版本与随机种子略有波动;教程中所有涉及随机的步骤均已
set.seed()。
建议按顺序推进,每一章都建立在前一章的基础上:
- 打地基(第 1–2 章):数据质量决定模型上限。先把清洗与缺失值处理做扎实。
- 做探索(第 3 章):描述性统计与可视化,帮你发现非线性、异常与候选变量。
- 学建模(第 4–6 章):从可解释的回归,到更灵活的树模型与集成学习。
- 学验证(第 7–8 章):内部验证校正乐观偏倚,外部验证检验泛化能力。
- 训练集性能总是偏乐观,必须做内部验证校正后再报告;
- 预测模型既要「区分得开」(AUC),也要「概率准」(校准);
- 变量筛选、超参数、预处理流程都是模型的一部分,外部验证时必须完整复现。
- 把第 7 章的 Bootstrap 次数
B从 200 调到 1000,观察 AUC 置信区间如何变化; - 把
data/换成你自己的数据,复用整条流程; - 在第 6 章加入 SVM 或神经网络,与现有四模型做对比。
- R ≥ 4.1(开发环境:R 4.5,macOS)
- 中文字体:macOS 自带 Hiragino / STHeiti;Windows 自带微软雅黑 / 黑体;
Linux 建议安装
fonts-noto-cjk或文泉驿微米黑(脚本会自动探测)
主要依赖包(详见 install_deps.R):
| 用途 | 包 |
|---|---|
| 数据处理 | tidyverse dplyr tidyr readr stringr lubridate haven |
| 可视化 | ggplot2 gridExtra corrplot scales reshape2 showtext sysfonts |
| 统计与回归 | broom knitr lmtest mgcv MASS psych |
| 缺失值 | mice VIM naniar imputeTS zoo e1071 survival |
| 建模 | glmnet rpart rpart.plot randomForest xgboost |
| 评价与验证 | pROC caret rms psfmi |
图表里的中文显示成方框 / 乱码怎么办?
脚本会按顺序自动探测系统字体(macOS → Windows → Linux)。 若仍未生效,请安装任一常见中文字体后重试:
# macOS 一般自带;Ubuntu/Debian:
sudo apt-get install -y fonts-noto-cjk提示 psfmi 安装失败?
psfmi 偶尔会被 CRAN 归档。可改用 GitHub 安装:
remotes::install_github("mwheymans/psfmi")第 2 章的 psfmi 进阶示例在缺包时会自动跳过,不影响主线流程。
运行很慢 / 想快速体验?
第 7 章的 Bootstrap 与第 6 章的交叉验证调参最耗时。可临时调小:
R/07_internal_validation.R中的B(Bootstrap 次数)R/06_machine_learning.R中的k(交叉验证折数)
输出结果和我看到的不完全一致?
结果受 R 版本、包版本与随机种子影响。教程已在关键位置 set.seed(),
仍可能有轻微波动,属于正常现象。
可以直接用我自己的数据吗?
可以。把数据放入 data/,并修改 R/00_setup.R 中的 load_mpe_data()(或新增读取函数),
其余章节的流程都可直接复用。
欢迎纠错、补充与改进,详见 CONTRIBUTING.md。 发现问题的同学请直接开 Issue。
- 代码与文档:采用 MIT License
- 数据:
data/下的数据集来自课程实验与作业,仅用于教学与自学演示, 版权归原始数据提供方与课程所有,不适用 MIT 许可,请勿用于商业用途。 详见 DATA_NOTICE.md。
本教程由课程 lab 与作业整理重构而成,感谢课程与数据提供方。 如果它对你有帮助,欢迎点一个 ⭐ Star。



