Skip to content

Cle2ment/DKD-SMC

Repository files navigation

Early Prediction and Key Factor Analysis of Diabetic Kidney Disease — A Cross-Population Statistical Study Based on CHARLS and NHANES

糖尿病肾病早期预测与关键因素分析——基于CHARLS与NHANES的跨人群统计测度研究

Project Management

Building Tools

  • Python (>=3.14, tested 3.14.4)
  • Rust (nightly 1.97+, tested 1.97.0-nightly)

Management Tools

  • uv (Python 包管理)
  • maturin (Rust/Python 混编构建)
  • Cargo (Rust 包管理)

Development Tools

  • OpenCode
  • Cherry Studio

AI Drive

  • DeepSeek V4 Pro
  • Claude Opus 4.7

Key Dependencies

Package Version Purpose
numpy >=2.4.4 数值计算基础
pandas >=3.0.2 数据处理与表格操作
pyreadstat >=1.3.4 SAS XPT / Stata .dta 文件读取
scipy >=1.14.0 统计检验(Spearman ρ p 值)
scikit-learn >=1.8.0 机器学习模型与特征工程
lightgbm >=4.6 高效梯度提升树分类器
shap >=0.51 模型可解释性(SHAP 值)
imbalanced-learn >=0.14 不平衡数据处理(SMOTE 等)
matplotlib >=3.10 论文图表绘制
seaborn >=0.13 统计可视化

How to Use

Python 脚本运行

uv run python <filepath/filename>.py

Rust/Python 混编开发(maturin + PyO3)

前置条件:

# 确保 Rust 已安装 (需 nightly 1.97+)
rustc --version
cargo --version

初始化(首次设置):

# 安装 maturin 构建工具
uv pip install maturin

日常开发流程:

# 1. 编辑 Rust 代码(src/lib.rs)
# 2. 编译并安装到虚拟环境
uv run maturin develop

# 3. 在 Python 中调用
uv run python -c "import stat_core; print(stat_core.ckd_epi_2021_creatinine_rs([1.0], [50.0], [0]))"

添加新的 Rust 函数:

  1. src/lib.rs 中定义 #[pyfunction]
  2. stat_core 模块注册函数 m.add_function(wrap_pyfunction!(...)?)?
  3. 运行 uv run maturin develop
  4. Python 端 import stat_core 即可使用

依赖同步(其他开发者拉取代码后):

uv sync                    # 同步 Python 依赖
uv run maturin develop     # 编译 Rust 扩展
git lfs pull               # 拉取 Git LFS 管理的原始数据文件
uv run python setup.py    # 安装 bootstrap.pth(使 import bootstrap 全局可用)

Git LFS 管理

本项目使用 Git LFS 管理原始数据文件(*.sas7bdat, *.dta, *.xpt),数据总量约 2 GB。

日常 LFS 操作:

git lfs pull          # 拉取/更新 LFS 文件到工作目录
git lfs ls-files      # 查看当前 LFS 追踪的文件
git lfs track "*.ext" # 添加新的 LFS 追踪模式
git lfs fetch         # 仅下载到 .git/lfs 缓存,不替换工作目录文件
git lfs checkout      # 用缓存中的 LFS 对象替换工作目录文件

添加新的 LFS 文件:

# 1. 确保文件扩展名已在 .gitattributes 中追踪
git lfs track "*.new_ext"
# 2. 正常添加和提交
git add path/to/file.new_ext
git commit -m "add: 新数据集"

Research Direction

Training on Chinese data (CHARLS 2015), external validation on US data (NHANES), quantifying cross-population generalization.

CHARLS 2015 (训练, 中国人群) → NHANES 2017-2020 (外部验证, 美国人群) → NHANES 2021-2023 (时域验证)

Label: eGFR < 60 (CKD-EPI 2021). CHARLS has no UACR — DKD per KDIGO not definable on training set. NHANES sensitivity analysis with UACR quantifies eGFR-only miss rate.

Key Results

Metric CHARLS (Train) NHANES P (Spatial) NHANES L (Temporal)
LASSO LR AUC 0.829 [0.794, 0.877] 0.907 [0.879, 0.914] 0.910 [0.879, 0.913]
LightGBM AUC 0.790 0.872 0.858
≥45 subset AUC 0.894 0.899
Top SHAP features Age, BUN, Uric_Acid Age, BUN, Uric_Acid Age, BUN, Uric_Acid

Cross-population generalization: AUC increases 0.829→0.907 despite BMI/Waist shifts >1.5σ. See docs/Modeling Methodology.md §8 for full results.

Project Structure

Cargo.toml                ← Rust 项目配置(依赖 pyo3)
Cargo.lock                ← Rust 依赖锁文件
src/lib.rs                ← Rust 源码(stat_core PyO3 模块:CKD-EPI×3, net_benefit, spearman_rho)
pyproject.toml            ← Python 项目 + maturin 构建配置
uv.lock                   ← uv 依赖锁文件
LICENSE                   ← GNU GPL v3
.github/workflows/        ← CI/CD: ci.yml, cd-release.yml, opencode.yml
.gitattributes            ← Git LFS 配置(*.sas7bdat, *.dta, *.xpt)
source/
  __init__.py                   ← package 标记
  utils.py                      ← 共享 FEATURES 常量 + Rust stat_core 的 numpy 封装
  pre-processing/
    CHARLS/parse_merge.py    ← CHARLS 2015 预处理(血检+体格+问卷→eGFR→T2DM筛选)
    NHANES/parse_merge_p.py  ← NHANES 2017-2020 P-cycle 预处理
    NHANES/parse_merge_l.py  ← NHANES 2021-2023 L-cycle 预处理
  model/
    train_evaluate.py             ← LASSO LR + LightGBM 训练与跨人群验证
    ckd_epi_formula_sensitivity.py  ← 三种 CKD-EPI 公式标签敏感性分析
    bootstrap_ci.py               ← Bootstrap 1000 次 AUC 置信区间
    shap_analysis.py              ← SHAP 特征重要性(LightGBM)
    calibration_dca.py            ← 校准曲线 + 决策曲线分析
    robustness_checks.py          ← 重复CV + DM筛查亚组 + 年龄分层
tests/                    ← (待构建)单元测试
docs/                     ← 详细文档(Modeling Methodology.md 为建模权威文档,Figure Guidelines.md 为图表绘制建议)
figures/                  ← 15 张论文 SVG + 图表说明(Figure Description.md)+ 补充材料(docx + 说明md)
thesis/                   ← 论文撰写工作区
  note/                     ← 论文稿件 + 框架笔记 + 数据表
  知网查重报告/              ← CNKI 查重报告(4 份 PDF)
  糖尿病肾病...研究.docx      ← 完整版论文(命名版 + 匿名送审版)
scripts/                   ← 一键运行脚本(run_pipeline.ps1)
Dataset/
  Raw/
    CHARLS/               ← 中国健康与养老追踪调查(主训练集)
      2015r/              ← Wave 3 (2015): 血检+体格+完整问卷, 13,420人
      2018r/              ← Wave 4 (2018): 问卷, 无血检/体格
      2020r/              ← Wave 5 (2020): COVID电话随访, 无血检
      Harmonized/         ← 跨波次标准化数据 (2011-2018), 25,586人
    NHANES/               ← 美国国家健康与营养调查(外部验证集)
      2017-2020p/    ← P-cycle: 含完整UACR+血检+体格
      2021-2023p/    ← L-cycle: 同上, 独立时域验证
    CHNS/                 ← 中国健康与营养调查(弃用, 仅2009波血检且无尿检)
      Biomarker/          ← biomarker_09.sas7bdat
      Individual-Level/   ← 27张SAS表(健康、体检、人口学等, 1989-2015)
      Household-Level/    ← 15张SAS表
      Diet/               ← 膳食摄入
      Constructed-Variables/ ← hhinc, indinc, urban
      Supplemental/       ← 权重与关系说明
    DiaKG/                ← 中文糖尿病知识图谱(轻量引用, 不做模型输入)
      Wave2021_05/        ← 41篇标注JSON文献
    Pima Indians Diabetes Database.csv  ← 经典基线数据集
  Int/
    CHARLS/CHARLS_T2DM_train.csv   ← 训练集 (1,992人, 124阳性)
    NHANES/NHANES_P_T2DM_val.csv   ← 空间验证集 (1,612人, 272阳性)
    NHANES/NHANES_L_T2DM_val.csv   ← 时域验证集 (1,022人, 174阳性)
  Result/                   ← 模型输出(23 CSVs)
    LASSO_coefficients.csv         ← LASSO 回归系数
    feature_distribution_shift.csv ← 特征分布偏移分析
    model_metrics.csv              ← 模型性能指标汇总(含 ≥45 子集)
    CHARLS_predictions.csv         ← 训练集预测概率
    validation_predictions.csv     ← 三数据集预测概率与真实标签
    bootstrap_ci.csv               ← Bootstrap 1000 次 AUC 分布
    bootstrap_coefficients.csv     ← Bootstrap 1000 次 LASSO 系数分布
    formula_sensitivity_coefficients.csv  ← 三公式 LASSO 系数对比
    formula_sensitivity_metrics.csv       ← 三公式 AUC 指标对比
    formula_sensitivity_predictions.csv   ← 三公式 NHANES 预测概率
    formula_label_reclassification.csv    ← 三公式 per-patient DKD 标签
    kdigo_detection.csv            ← KDIGO-DKD 检出 vs 漏诊
    shap_importance.csv            ← SHAP 特征重要性
    shap_direction_consistency.csv ← SHAP 方向跨人群一致性
    shap_values_CHARLS.csv         ← CHARLS 逐样本 SHAP 值
    shap_values_NHANES_P.csv       ← NHANES P 逐样本 SHAP 值
    shap_values_NHANES_L.csv       ← NHANES L 逐样本 SHAP 值
    calibration_bins.csv           ← 校准曲线 bin 数据
    calibration_metrics.csv        ← 校准斜率和截距
    decision_curve.csv             ← 决策曲线净收益
    repeated_cv.csv                ← 5 seed 重复 CV 结果
    dm_subgroup_auc.csv            ← DM 筛查亚组 AUC
    age_stratification_auc.csv     ← 年龄分层 AUC
logs/                     ← 预处理日志文件
Paper/                    ← 参考文献(gitignored)
资料/                     ← 竞赛资料(gitignored)

Datasets

NHANES(美国国家健康与营养调查)

  • 2017-2020 (P-cycle): 8 张 SAS XPT 表,含人口学、体格检查、生化指标、糖尿病问卷等
  • 2021-2023 (L-cycle): 同上结构,用于独立验证集

CHARLS(中国健康与养老追踪调查)

  • 2015r (Wave 3): 18 张 Stata .dta 文件(Blood.dta 血检 23 变量 + Biomarker.dta 体格测量 222 变量 + 16 张问卷表),13,420 人采血
    • 血检含:肌酐(bl_crea) + 胱抑素C(bl_cysc) → 可算三合一 CKD-EPI eGFR;HbA1c、空腹血糖、血脂全套、尿酸、CRP、BUN、血常规
    • 体格含:血压(3次)、BMI、腰围、握力、步速、平衡等
    • 注意:CHARLS未采集尿检 — 无UACR/尿白蛋白
  • 2018r (Wave 4): 14 张 .dta 表,仅问卷,无血检/体格测量
  • 2020r (Wave 5): COVID-19 电话随访,数据量极少,基本不可用
  • Harmonized (Version D): 跨波次(2011-2018)标准化,25,586 人,含自报病史(RwDIABE, RwKIDNEYE)、体格(RwSYSTO, RwMBMI)、用药等

CHNS(中国健康与营养调查)— 已弃用

  • 仅 2009 年一波血检,无任何尿检数据,无法构建完整 DKD 标签,与 CHARLS 角色重叠但更弱。保留以备参考。

DiaKG(中文糖尿病知识图谱)

  • Wave2021_05: 41 篇医学文献的结构化标注(JSON 格式)
  • 包含实体标注(疾病、药物、检验指标等)和关系标注(药物-疾病、病理-疾病等),可用于特征工程启发

Pima Indians Diabetes Database

  • 经典糖尿病预测数据集,用于基线模型验证

References

补充文献解读(figures/)

文件 内容 详细解读
Supplementary Figures S1-S3 (OPLS-DA Volcano ROC).docx 代谢组学补充图(OPLS-DA、火山图、ROC) figures/Supplementary Figures S1-S3 说明.md
Supplementary Tables S1-S4 (Internal Standards and Differential Metabolites).docx 差异代谢物表 + 内标(DM vs Control、DN vs DM、DN-1 vs DN-2) figures/Supplementary Tables S1-S4 说明.md

该文献研究 DKD 代谢组学生物标志物,分组标准与本项目 NHANES 的 DKD 分期完全一致(uACR <30 / 30–300 / >300 mg/g),可作为特征筛选的方法学参考。差异代谢物(如 Adenine、L-Tryptophan、Pseudouridine 等)在 DKD 分期中呈现逐级变化趋势。

参考文献(Paper/)

共 13 篇 PDF,涵盖 DKD 临床诊疗指南、机器学习预测模型、数字健康干预、全球糖尿病疾病负担及代谢组学生物标志物等领域。

License

本项目采用 GNU Affero General Public License Version 3

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License along with this program. If not, see https://www.gnu.org/licenses/.

Copyright

Copyright (C) 2026 Jingran JIAO, Yikun CHEN, Yaxuan WANG, all from Nanjing University of Science and Technology, NJUST.

About

2型糖尿病肾病的早期预测与跨人群泛化:CHARLS 2015 训练 → NHANES 2017-2023 验证。Python + Rust (CKD-EPI/PyO3)。

Topics

Resources

License

Stars

Watchers

Forks

Contributors