Skip to content

Repository files navigation

预测模型自学教程(R)

从数据清洗一路走到模型外部验证 —— 一套可复现的 R 教程程序

From data cleaning to external validation — a reproducible R tutorial for building clinical prediction models.

R License: MIT Platform PRs Welcome

简介 · 快速开始 · 章节地图 · 示例结果 · 常见问题


简介

本仓库把《预测模型》课程的 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
  • 可浏览的示例结果:仓库内保留了一次完整运行的输出,无需本地运行即可查看

快速开始

1. 获取代码

git clone https://github.com/SAMCYK0921/predictive-modeling-tutorial.git
cd predictive-modeling-tutorial

2. 安装依赖(可选,首次建议执行)

Rscript install_deps.R

不执行也没关系:R/00_setup.R 在运行时会自动安装缺失的包(需联网)。

3. 运行

方式 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、micepsfmi 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 章)
ROC Calibration
生物标志物分布(第 3 章) 线性回归诊断(第 4 章)
Biomarker Diagnostics

部分表格结果(完整结果见 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. 打地基(第 1–2 章):数据质量决定模型上限。先把清洗与缺失值处理做扎实。
  2. 做探索(第 3 章):描述性统计与可视化,帮你发现非线性、异常与候选变量。
  3. 学建模(第 4–6 章):从可解释的回归,到更灵活的树模型与集成学习。
  4. 学验证(第 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。

About

预测模型自学教程:从数据清洗到模型外部验证(R 语言)

Topics

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages