剂量优化多因素校正分析 + PPT报告生成
适用场景
- 对临床试验数据进行剂量优化相关的多因素校正分析
- 比较不同剂量/治疗组的PFS/ORR,逐步加入协变量校正
- 使用PSM(倾向性评分匹配)和IPTW(逆概率加权)校正基线不平衡
- 通过敏感性分析验证结论稳健性
- 生成包含完整分析结果的PPT报告
前置条件
- Python 环境已安装:pandas, lifelines, matplotlib, python-pptx, statsmodels, openpyxl, scikit-learn, scipy
- 可选:pyreadstat(如需读取 SAS 数据集)
执行步骤
Step 1: 交互式参数收集
通过以下 5 步问答收集分析参数。如用户已提供部分信息则跳过对应问题。
Q1 - 项目与数据源
询问用户:
- 项目名称(用于PPT封面标题)
- 数据源类型:
- A) 已整理的分析数据(CSV/Excel 单表)— 推荐,直接使用
- B) ADaM Excel(多 sheet: ADSL/ADTTE/ADRS 等)— 需指定合并逻辑
- C) SAS 数据集目录(.sas7bdat)— 需指定域和合并逻辑
- 文件路径
- PPT 模板路径(可选,不指定则使用默认样式)
Q2 - 剂量组定义
询问用户:
- 哪个列包含剂量/治疗组信息?
- 需要比较哪些组?(试验组 vs 参考组,参考组为HR分母)
- 是否有多个比较方案?(如同线比较 + 跨线比较)
Q3 - 终点变量
询问用户:
- PFS 时间列名
- 删失列名及编码规则(如 CNSR: 0=事件发生, 1=删失)
- ORR 列名及编码规则(如 orr: 1=缓解, 0=未缓解)
- 若使用 ADaM 数据源:指定 PARAMCD 筛选条件(如 PARAMCD='PFS')
Q4 - 协变量
询问用户:
- 列出所有需要校正的协变量及其在数据中的列名
- 每个协变量的类型(分类/连续)和编码方式
- 是否有特殊衍生规则?(如:从其他列衍生、需要分组等)
- 若某些变量在数据源中不存在,是否需要从其他文件补充?
Q5 - 确认
汇总所有参数并展示给用户确认,格式参考 参数模板。
Step 2: 数据加载与预处理
根据数据源类型执行不同的加载逻辑:
模式 A(已整理数据):
- 读取 CSV/Excel 文件
- 验证必要列是否存在
- 处理缺失值和数据类型转换
模式 B(ADaM 多 sheet):
- 读取 ADSL sheet → 提取基线特征(SUBJID, 治疗组, 协变量)
- 读取 ADTTE sheet → 筛选指定 PARAMCD → 提取 AVAL, CNSR
- 读取 ADRS sheet → 筛选 BOR → 衍生 ORR
- 按 SUBJID 合并所有 sheet
- 应用用户指定的衍生规则
模式 C(SAS 数据集):
- 使用 pyreadstat 读取指定 .sas7bdat 文件
- 合并逻辑同模式 B
通用预处理:
- 根据删失编码统一为:event=1 表示事件发生, event=0 表示删失
- 协变量 dummy 编码(二分类变量转为 0/1)
- 仅保留比较组中的受试者
Step 3: PFS 生存分析概况
- 计算各组的样本量、事件数、删失数
- 计算各组中位PFS(mPFS)及95%CI
- 计算6个月、9个月、12个月PFS率
Step 4: 亚组中位PFS
按用户指定的各协变量分层,分别计算各治疗组的mPFS:
- 每个协变量的每个水平单独计算
- 计算亚组内的HR和95%CI
Step 5: 基线特征比较
- 列出各比较组的基线特征分布(n, %)
- 使用卡方检验或Fisher精确检验计算P值
- P<0.05的行标注显著
Step 6: KM生存曲线
绘制各比较组的PFS KM曲线:
- 添加删失标记(竖线tick marks)
- 添加风险表(Number at risk)
- 添加y=50%虚线标注中位PFS
- 标注HR、95%CI、Log-rank P值
- X轴每2个月一个刻度
- 参考组为HR分母(HR<1表示试验组优于参考组)
- 保存为PNG,分辨率≥150 DPI
- 使用中文字体(SimHei/Microsoft YaHei)
Step 7: 逐步单因素Cox回归
- 方法:每次在基础模型(仅含arm变量)上加入一个协变量
- 输出:每个模型的校正后HR、95%CI、P值、AIC、BIC
- 按AIC排序标识最优模型
- 列出未校正基础模型结果作为对照
Step 8: ORR逐步单因素Logistic回归
- 方法:与Step 7相同逐步法
- 因变量:ORR(1=缓解, 0=未缓解)
- 输出:每个模型的校正后OR、95%CI、P值、AIC、BIC
- 按AIC排序标识最优模型
Step 9: PSM 倾向性评分匹配
- 倾向性评分估计:使用 statsmodels Logit(无正则化),因变量为治疗组指示变量,自变量为所有非零方差协变量。不使用 sklearn(其 L2 正则化会压缩 PS 分布)。
- 匹配方法:最近邻贪心匹配(1:1),距离度量为 Logit 距离,caliper=0.2×SD(logit(PS))。不随机打乱治疗组顺序(确保可重现)。
- 匹配后评估:
- 计算匹配前后各协变量的标准化均数差(SMD)
- 绘制 Love plot(SMD 变化图),阈值线 SMD=0.1
- 匹配后分析:
- Cox 回归使用 cluster-robust SE(
cluster_col='pair_id'),处理匹配对内相关性 - KM 曲线 + Cox HR + 95%CI + P值
- ORR 比较(Fisher精确检验 + Logistic回归)
- Cox 回归使用 cluster-robust SE(
Step 10: IPTW 逆概率加权
- PS 估计:同 Step 9,使用 statsmodels Logit(无正则化)
- 权重计算:
- 稳定化 IPTW 权重:治疗组 $w = \bar{p}/\hat{p}_i$,对照组 $w = (1-\bar{p})/(1-\hat{p}_i)$
- 不截断权重(小样本下截断引入偏差,匹配R默认行为)
- 平衡检查:加权后 SMD 应 < 0.1
- 加权分析:
- Weighted Cox 回归(使用 robust 标准误)→ HR + 95%CI + P值
- Weighted Logistic 回归(GLM Binomial, freq_weights)→ ORR OR + 95%CI + P值
- 加权 KM 中位数及CI:使用手动 Greenwood + log变换CI(匹配R survfit),不使用lifelines加权KM(对非整数权重CI有偏)
Step 11: 敏感性分析
- 生成多种协变量组合(如:全部协变量、去除每个协变量、两两组合等)
- 对每种组合重复 IPTW 分析
- 汇总所有组合的 HR 和 95%CI
- 绘制 Forest plot:
- Y轴列出各协变量组合
- X轴为 HR(对数刻度)
- 添加 HR=1 的参考线
- 标注每个组合的 HR (95%CI) 数值
Step 12: 生成PPT报告
使用 python-pptx 生成PPT,详细格式要求见 PPT格式规范。
如用户提供了 PPT 模板文件,则以模板为基础添加幻灯片。
幻灯片结构(约20张):
- 封面(项目名称、比较方案、日期)
- 分析方法概述
- PFS 概况汇总表
- 基线特征比较表
- 亚组 mPFS 表格
- KM 生存曲线图(每个比较一张)
- Cox 逐步回归结果表
- ORR 概况
- ORR 逐步 Logistic 回归结果表
- PSM 方法描述
- PSM 匹配平衡性(Love plot)
- PSM 匹配后 KM 曲线
- PSM 匹配后 Cox/ORR 结果
- IPTW 方法描述
- IPTW 加权后平衡性
- IPTW 加权后 KM 曲线
- IPTW 加权后 Cox/ORR 结果
- 敏感性分析汇总表
- Forest plot(多方法HR汇总)
- 关键发现与结论
Step 13: 汇总与交付
- 总结各比较组的关键发现
- 列出多方法对比(未校正 vs 逐步Cox vs PSM vs IPTW)
- 评价结论稳健性
- 交付PPT文件
代码参考
详细代码框架见 分析方法参考
技术栈
| 库 | 用途 |
|---|---|
| pandas + openpyxl | 数据读取(CSV/Excel) |
| pyreadstat | SAS 数据集读取(可选) |
| lifelines | KM估计、Cox回归、Log-rank检验 |
| statsmodels | Logistic回归 |
| scikit-learn | PSM倾向性评分估计 |
| scipy | 统计检验(Fisher、卡方) |
| matplotlib | KM曲线、Forest plot、Love plot |
| python-pptx | PPT生成 |