CRC-ADVANCE-01
MSS/pMMR 晚期结直肠癌的事件驱动随机研究,最适合理解治疗策略、总生存期、期中分析和确认性证据责任。
这门课面向懂医学与一般科研、但尚未系统学习临床试验的准博士生和青年研究者。每章围绕一个真实项目决策展开;不需要先掌握全部统计术语,也不要求独立写代码或完成作业。
MSS/pMMR 晚期结直肠癌的事件驱动随机研究,最适合理解治疗策略、总生存期、期中分析和确认性证据责任。
安全先导加 Simon 两阶段的转化研究,最适合理解确认 ORR、方案可实施性、动态样本和探索性结论边界。
从临床问题到估计目标(estimand)
一名患者随机进入试验组,治疗三个周期后因为不良反应停药,随后改用其他抗肿瘤治疗。主要分析时,他还应该留在原来的试验组吗?
表面上,这是一个“停药以后怎么算”的问题。真正要先确认的却是:研究比较的是两套最初分配的治疗策略,还是只比较患者实际使用研究药物期间的效果。两种问题都可以研究,但不能共用同一套处理规则。
研究比较的是随机分配后的两套治疗策略;主要人群在随机时已经确定;停药、换药和后续治疗后的生存结局仍能继续收集。只要其中任何一点改变,主要分析的问题也可能随之改变。
本章真正的分界是:研究比较的是随机分配的治疗策略,还是实际持续用药期间的效果。先把这个分界说清,Protocol 的随访规则、CRF 的后续治疗记录、ITT 分母和 OS 报告才不会各自采用不同口径。
读到这里,先不用判断哪一种分析方法更高级。只要能指出“这项研究究竟想回答什么?”中的冲突发生在研究问题、分母、时间顺序或证据责任的哪一处,就已经抓住后续判断的入口;术语会在需要时再出现。
在案例 A 中,这名患者仍留在最初的随机组,并继续随访总生存期。停药、减量或后续治疗不会把他从主要分析中移走。
这个结论成立,是因为案例 A 关心两套随机分配的治疗策略在真实治疗过程中的总体差异。患者后来的治疗经历发生了变化,研究最初提出的问题没有因此改变。
研究比较的是随机分配后的两套治疗策略;主要人群在随机时已经确定;停药、换药和后续治疗后的生存结局仍能继续收集。只要其中任何一点改变,主要分析的问题也可能随之改变。
这并不表示所有研究都必须把停药后的经历纳入同一个效果。若真正关心的是“假如患者始终按方案治疗会怎样”,就需要提出另一个问题,并为反事实假设准备不同的数据和敏感性分析。
这一小步的落点:先把“研究比较的是随机分配的治疗策略,还是实际持续用药期间的效果”作为当前案例的判断基准,再检查结论依赖的条件。
审阅这条结论时,应把适用条件和替代处理放在同一处。尤其当研究问题改为“始终按方案治疗”的假设性效果时,原来的分母、事件规则或解释不能只换一个术语继续使用;需要从研究问题重新推导。
停药、换药、手术和失访都会改变后续观察。如果团队没有先说清研究问题,同一名患者可能在不同分析中被任意保留、删失或排除。
只分析“坚持用药的人”会留下耐受更好、病情更稳定的患者,从而破坏随机化形成的可比性,结果往往显得过于乐观。
研究真正要回答的问题,可以整理成明确的估计目标(estimand):针对谁、比较什么、观察什么、怎样处理治疗后事件,以及用什么总体指标概括差异。
这里采用治疗策略原则,是因为主要问题比较随机分配的整体策略。如果研究关心的是“在未换药状态下的纯药物效应”,就需要另一个估计目标和更强假设。
这里需要的专业工具是估计目标(estimand)。它把目标人群、治疗条件、结果变量、治疗中事件的处理以及总体差异怎样概括放在同一张问题清单里,防止团队先写模型、后补研究问题。
遇到类似问题,先按时间顺序列出随机、停药、换药、后续治疗和死亡,再选择术语和分析方法。这样更容易看出哪一步改变了比较对象、分母或可解释人群。
这一小步的落点:先识别错误做法会怎样扭曲“研究比较的是随机分配的治疗策略,还是实际持续用药期间的效果”,再记住本章术语。
先盯住一名已经停药的患者:方案是否仍要求随访,CRF 是否继续记录后续治疗和死亡,分析程序是否仍把他留在 ITT 分母,OS 表是否按原随机组呈现。四处必须回答同一个研究问题。
真实文件写法:“所有随机化患者均按原分组分析;停药、剂量调整和后续治疗后继续收集死亡结局。”
分析动作:分析程序从随机化清单建立 ITT 分母,以随机日期为起点派生 OS;不能先按是否持续用药、是否有复查影像或是否接受后续治疗筛人。
a_sets <- transform(a,
ITTFL = "Y",
SAFFL = ifelse(treated == 1, "Y", "N")
)对应下载脚本:R/04_analysis_sets.R。ITTFL 对全部随机化患者赋值为 Y;SAFFL 另按是否实际治疗派生。结果怎样写:报告应说明风险比和生存率描述的是随机分配治疗策略的总体效果,而不是研究药持续暴露期间的纯药理效应。
为什么重要: 如果患者在停药后从其中任何一环消失,最终结果就不再是随机分配治疗策略的总体效果,而会悄悄变成“坚持用药者”的效果。
这一小步的落点: 选一名停药患者,从随机化清单追到 OS 输出;他始终留在原组,才说明治疗策略原则真正落实了。
案例 B 没有随机对照,主要问题是目标方案患者中的确认缓解率及其与预设无效率的关系。分母、治疗后事件和证据责任因此不同,不能把案例 A 的 ITT 解释原样搬过去。
这里不能把“保留不利结局患者”简单理解成 ITT 的专属做法。案例 B 也要保留无影像和早期死亡者,但目的是守住单臂 ORR 的预设分母;两项研究保护的是不同的证据责任。
判断案例 A 的规则能否带到案例 B,先问三件事:有没有随机对照、主要分母在何时确定、结果准备支持比较性结论还是推进性判断。答案不同,停药和无评价的解释也不同。
这一小步的落点: 案例 B 同样不能事后缩小分母,但理由从“保护随机比较”变成了“避免夸大单臂缓解率”。
患者停药或换药
先确认研究真正比较什么
案例 A 比较随机分配的治疗策略
患者继续留在原随机组
Protocol 要求停药后继续随访
CRF 记录停药、后续治疗和生存结局
SAP 按意向性治疗原则分析
报告说明估计的是整体治疗策略效果
从“停药或换药”开始,先确认研究仍在比较最初分配的两套策略。随后逐项查看:方案要求继续随访,CRF 留下后续治疗与死亡日期,SAP 保留原随机组,报告说明估计的是整体策略效果。
结论边界:这条路径能够支持治疗策略层面的比较;不能单独分离某个药物成分的贡献,也不能自动回答“始终按方案治疗”的假设性问题。
反向检查时,可从 OS 表中抽取一名停药患者,依次回到分析集、随访记录和随机化清单。任何一步找不到他,都意味着研究问题在执行过程中发生了漂移。
“治疗有没有效”至少缺少五个要素:针对谁、比较什么策略、观察什么变量、随机后事件怎样处理、用什么总体指标概括差异。团队必须在看见治疗效果之前,把这些要素写进 protocol 与 SAP。
这项主要分析纳入全部随机化患者,比较被分配到策略 A 与策略 B 后的总生存期。患者停药、减量、接受后续治疗或局部治疗后,仍按原随机组继续随访。
这项主要分析关注符合入组条件并接受目标方案 T 的患者,结果由独立影像评审确认的最佳总体疗效来衡量。首次影像前死亡、没有治疗后影像或提前停药者,不能因为“不可评价”而自动移出主要分母。
| 患者情景 | 案例 A OS | 案例 B 确认 ORR | 必须记录 |
|---|---|---|---|
| 停药后继续随访 | 仍按原随机组,死亡为事件 | 若继续影像,按预设窗口判定;不能因停药剔除 | 停药日期/原因、后续随访 |
| 开始新抗癌治疗 | 主要 OS 不在换药日删失 | 通常在新治疗前完成主要响应判定;规则须预设 | 新治疗类型和开始日 |
| 转化手术 | 继续随访 OS | 手术前响应、手术日期和术后无靶病灶处理需写清 | R0/R1、病理、术后治疗 |
| 首次影像前死亡 | 死亡事件 | 非缓解者,留在主要分母 | 死亡日期、死因、影像计划 |
| 无基线后评估 | OS 仍可分析 | 通常计为非缓解/NE;不得事后改成 response-evaluable 分母 | 无评估原因、是否开始治疗 |
| 项目文件 | 本章写入内容 | 最晚决策时间 | 主要责任角色 |
|---|---|---|---|
| Protocol | 临床问题、estimand 五属性、随机后事件策略 | 首例入组前 | 临床/统计 |
| Schedule of Assessments | 停药后随访、影像窗、生存随访 | 首例入组前 | 临床/影像/运营 |
| SAP | 主要 estimator、敏感性与补充 estimand | 揭盲或主要分析前冻结 | 统计 |
| CRF | 停药、换药、手术、死亡和无评估原因 | 数据库上线前 | 数据/临床 |
案例 A:“所有随机化患者均按原分组分析;停药和后续治疗后继续收集死亡结局。”
案例 B:“确认 ORR 的主要分母不因缺少治疗后影像而事后缩小;原因分类单列。”
列出每类 intercurrent event 的策略,并说明敏感性分析改变的是假设还是临床问题。
分析数据保留 ICECAT、ICESTRAT、ANL01FL 和不可评价原因。
逐例核对随机后事件与源数据;检查是否有人因不利结局被排除。
表格脚注明确主要分母、无评估与早期死亡的归类。
main <- subset(adsl_b, treated == 1 & dose_level == "T")
main$confirmed_response <- with(main,
best_confirmed_response %in% c("CR", "PR"))
# NA/NE 不从分母删除,而是按预设规则计为非缓解
x <- sum(main$confirmed_response, na.rm = TRUE)
n <- nrow(main)
binom.test(x, n)“在预先定义的目标方案分析集中,BICR 确认 ORR 为估计值及 95% CI;无治疗后影像和早期死亡者保留在分母中。”
“在可评价患者中 ORR 很高,因此治疗有效。”
# 正确:在相同 estimand 下改变关键假设
# 例:对失访者做 tipping-point / worst-case 情景
# 错误:主分析不显著后改成仅“可评价患者”分析并称为敏感性分析人群与治疗中事件(intercurrent events)
一名患者完成随机分组,却在首剂治疗前病情恶化。另一名患者接受治疗后没有任何复查影像。第三名患者因为毒性换了方案。三个人是否进入主要结果,不能等到看到结局以后再决定。
真正的冲突不是“数据够不够完整”,而是每项分析在回答哪个问题。总生存期、安全性、确认缓解率和动态生物标志物使用的分母可以不同,但每个分母都必须提前定义并能逐例重建。
每个分析集都必须先有明确目的,再有可执行的纳入、排除和归组规则。患者是否治疗、是否完成影像、是否有合格样本以及发生了什么治疗中事件,都只能按预先冻结的规则进入判断。
本章真正的分界是:每项输出的分母必须由它要回答的问题决定。先把这个分界说清,分析集标志、排除原因、患者级名单和 TFL 脚注才不会各自采用不同口径。
读到这里,先不用判断哪一种分析方法更高级。只要能指出“哪些患者应该算进结果?”中的冲突发生在研究问题、分母、时间顺序或证据责任的哪一处,就已经抓住后续判断的入口;术语会在需要时再出现。
案例 A 的主要总生存期分析纳入全部随机化患者,并按最初分组比较;即使患者未治疗、停药或接受后续治疗,也保留在主要分析中。安全性分析则纳入至少接受一次研究治疗者,并按实际治疗呈现。
主要疗效分析保护的是随机比较,安全性分析描述的是实际暴露。两者目的不同,因此不能只写“ITT”“Safety”三个字就结束。
每个分析集都必须先有明确目的,再有可执行的纳入、排除和归组规则。患者是否治疗、是否完成影像、是否有合格样本以及发生了什么治疗中事件,都只能按预先冻结的规则进入判断。
“数据完整的人”不是天然正确的分母。把没有复查、早期死亡或治疗中断者事后删除,常常会留下预后更好的患者,使结果看起来更有利,却不再代表最初要研究的人群。
这一小步的落点:先把“每项输出的分母必须由它要回答的问题决定”作为当前案例的判断基准,再检查结论依赖的条件。
审阅这条结论时,应把适用条件和替代处理放在同一处。尤其当分析目的从疗效变为安全性、可评价性或标志物分析时,原来的分母、事件规则或解释不能只换一个术语继续使用;需要从研究问题重新推导。
同一名患者可能符合一个分析集,却不符合另一个分析集。若规则只存在于手工名单中,结果无法复核,分母也会随版本漂移。
把无影像或早期死亡者归为“不可评价”并删除,会让分母取决于结局是否可见。精确模型和置信区间无法修复这种选择。
患者停药、换药或接受手术后,结果该怎样计算,必须提前定好。这类影响结果解释的治疗后事件,称为治疗中事件(intercurrent event)。
全部随机化患者进入案例 A 的主要分析,是因为研究问题针对随机分配策略。生物标志物动态分析则需要基线阳性和目标时间点样本,不能把它伪装成全队列结论。
这里的核心术语是分析集(analysis set)。分析集不是一个缩写标签,而是一组可以从源数据逐例重建的条件,包括谁被纳入、按什么组归类、为什么被排除以及每张输出使用哪个分母。
遇到类似问题,先按时间顺序列出随机、首次用药、影像可用性、样本可用性和治疗变化,再选择术语和分析方法。这样更容易看出哪一步改变了比较对象、分母或可解释人群。
这一小步的落点:先识别错误做法会怎样扭曲“每项输出的分母必须由它要回答的问题决定”,再记住本章术语。
不要先背 ITT、Safety 或 ORR_T_FL 的缩写。先拿同一名患者逐项核对:他为什么进入主要疗效集、为什么可能不进安全集、排除原因保存在哪里,表格脚注是否把实际分母说清。
真实文件写法:“主要疗效分析采用全部随机化患者;安全性分析纳入至少接受一次研究治疗的患者,并按实际接受治疗汇总。”
分析动作:在 ADSL 中用 ITTFL、SAFFL、ORR_T_FL 等标志派生分析集,同时保存排除原因;每个 TFL 程序显式引用对应标志,而不是复制人工名单。
b_sets <- transform(b,
SAFFL = ifelse(treated == 1, "Y", "N"),
ORR_T_FL = ifelse(treated == 1 & dose_level == "T" &
baseline_measurable == "Y", "Y", "N")
)对应下载脚本:R/04_analysis_sets.R。两个标志服务不同问题,不能用同一份人工名单替代。结果怎样写:表题和脚注应显示实际分母,并让处置表、分析集 listing 与患者级记录互相核对。结果只代表该分析集覆盖的人群。
为什么重要: 分析集一旦靠手工名单或结局可见性决定,分母就可能随着结果变化。保存患者级标志和排除原因,才能证明纳入规则是在看见结果前确定的。
这一小步的落点: 对任一患者,都能用数据标志和排除原因解释他为何进入或不进入某个输出,分析集才算可执行。
案例 B 的目标方案 ORR 集强调接受目标方案且符合预设规则的人群,但无评价和早期死亡不能因为结局不利而被移出主要分母。它与随机试验的 ITT 不是同义替换。
案例 B 的目标方案 ORR 集、安全先导集和样本集分别回答疗效、可实施性和转化问题,不能用一张“可评价患者”名单包办。它们与案例 A 的 ITT 共享预先定义原则,却不共享同一个分母含义。
比较两项研究时,不要只问“谁被纳入”,还要问“按什么治疗条件归组”和“缺失是否与结局有关”。随机试验最怕破坏随机化,单臂和样本分析还要警惕用可评价性筛出更有利的人群。
这一小步的落点: 同一名患者可以属于安全集、却不属于目标方案 ORR 集或配对样本集;每个分母都要有自己的问题和规则。
出现未治疗、停药、无影像或样本失败
先问这项输出回答什么问题
把纳入与归组规则写成可执行条件
在分析数据中保存标志和原因
输出显示分母与不可评价分类
独立复算并核对患者级名单
解释只覆盖该分析集代表的人群
从未治疗、无影像或样本失败的患者出发,先说明当前输出要回答什么,再看规则怎样变成分析集标志、排除原因和表格分母。最终解释只能覆盖这个分析集实际代表的人群。
结论边界:分母规则能够减少选择性分析,却不能弥补从未收集的数据。若研究问题、治疗责任或样本可用性不同,应另建分析集并明确结论边界。
反向复核不从分析集名称开始,而从患者级名单开始:逐个解释纳入、归组和排除原因,再核对表格人数。说不清某一名患者,就说明规则还不够可执行。
分析集是由可执行规则形成的分母。mITT 没有统一定义;response-evaluable 和 biomarker-evaluable 极易因为结局可见性而产生选择偏倚。每个输出都应显示分母,并能从患者级标志反向重建。
主要 OS 分析为全部随机化患者(ITT),按原分组。Safety Set 为实际接受至少一次研究治疗者,按实际治疗策略。PP 只作为支持性分析,不能替代 ITT。
至少区分安全先导集、全治疗安全集、目标方案 ORR 集、所有治疗 ORR 描述集、降阶队列、baseline ctDNA 阳性集和配对样本集。
| 患者 | 情景 | 案例 A ITT | 案例 B 目标方案 ORR | 安全先导 | ctDNA/配对样本 |
|---|---|---|---|---|---|
| P01 | 随机但未治疗 | 是 | 若单臂仅入组未治疗,按预设主要规则保留或列非缓解 | 否 | 可能有基线,不代表可动态分析 |
| P02 | 治疗后无影像 | 是 | 是,非缓解/NE | 若完成观察窗则是 | 按实际样本 |
| P03 | 首次影像前死亡 | 是,OS 事件 | 是,非缓解 | 是,安全事件可能触发暂停 | 无动态样本,不能进入 landmark |
| P04 | 目标方案先导患者 | 不适用 | 满足并入条件则是 | 是 | 按样本质量 |
| P05 | 降阶方案 D | 不适用 | 不进目标方案 Simon;单列 | 是 | 可探索描述 |
| P06 | 基线 ctDNA 阴性 | 是 | 是 | 按治疗 | 不能定义“清除” |
| P07 | 治疗中活检失败 | 是 | 是 | 按治疗 | 不进配对组织集,失败原因保留 |
| P08 | 样本 QC 失败 | 是 | 是 | 按治疗 | 采集集是,可分析集否 |
| 项目文件 | 本章写入内容 | 最晚决策时间 | 主要责任角色 |
|---|---|---|---|
| Protocol | 主要分析原则和关键排除不可变部分 | 首例入组前 | 临床/统计 |
| SAP Analysis Sets | 逐条 inclusion/exclusion 与归组规则 | 揭盲/主要分析前 | 统计 |
| Blind Data Review Plan | 重大偏离分类、不可评价原因 | 揭盲前 | 临床/统计/数据 |
| ADSL specification | 分析标志、排除原因和实际治疗 | 编程前 | 统计/程序 |
明确主要疗效按随机分组,安全性按实际治疗;单臂主要 ORR 分母和降阶队列预先定义。
逐条写出 ITT、Safety、PP、ORR、lead-in、baseline-positive、paired-sample 的规则。
在 ADSL 中保存 ITTFL、SAFFL、ORR_T_FL、LEADINFL、CTDNA_BASEPOS_FL 等。
独立从源数据复算分母;检查同一患者在互斥队列中是否冲突。
CONSORT 风格处置表和分母核对 listing 同时交付。
adsl_b <- transform(patient_b,
LEADINFL = safety_leadin == "Y" & treated == 1,
SAFFL = treated == 1,
ORR_T_FL = treated == 1 & dose_level == "T" &
baseline_measurable == "Y",
CTDNA_BASEPOS_FL = baseline_ctdna == "positive")
stopifnot(!anyDuplicated(adsl_b$patient_id))“目标方案 ORR 集共 38 人,其中 3 人无治疗后影像,均按预设规则留在分母。”
“剔除 3 名无影像患者后,response-evaluable ORR 更能反映药物活性。”
肿瘤缓解、独立影像评审与缓解持续时间(DoR)
一名患者首次复查显示部分缓解,但三周后病情恶化,没有完成规定的确认扫描。另一名患者治疗后从未复查影像。第三名患者在首次缓解后接受手术。三人的结果不能靠临床印象临时决定。
主要问题不是“影像上看起来有没有缩小”,而是从每次扫描记录到患者级确认缓解,评审来源、时间窗、新病灶、手术和无评价怎样形成一条可重复的规则。
影像缓解必须基于预先规定的评审来源、实际扫描日期、确认间隔和新病灶规则。首次 CR/PR、确认扫描、手术、新治疗和死亡之间的时间顺序会直接改变患者级结论。
本章真正的分界是:一次影像变化在什么条件下才能成为确认响应。先把这个分界说清,扫描日期、评审来源、确认间隔、患者级 BOR 和 ORR 输出才不会各自采用不同口径。
读到这里,先不用判断哪一种分析方法更高级。只要能指出“患者没有复查影像,还能怎样判断疗效?”中的冲突发生在研究问题、分母、时间顺序或证据责任的哪一处,就已经抓住后续判断的入口;术语会在需要时再出现。
案例 B 的主要终点采用独立影像评审委员会确认的客观缓解率。未满足最小确认间隔的 PR、首次影像前死亡和无治疗后影像者,都留在主要分母并计为非缓解。
这个处理较为保守,但它保护了预先定义的目标方案分母。手术或停药不能事后自动确认一次尚未满足规则的响应。
影像缓解必须基于预先规定的评审来源、实际扫描日期、确认间隔和新病灶规则。首次 CR/PR、确认扫描、手术、新治疗和死亡之间的时间顺序会直接改变患者级结论。
一次扫描显示肿瘤缩小,不等于主要分析中的确认缓解。若只保留完成确认扫描的人,早期进展、死亡和无评价患者会被系统性排除,ORR 可能被高估。
这一小步的落点:先把“一次影像变化在什么条件下才能成为确认响应”作为当前案例的判断基准,再检查结论依赖的条件。
审阅这条结论时,应把适用条件和替代处理放在同一处。尤其当确认间隔、评审来源或手术与新治疗规则改变时,原来的分母、事件规则或解释不能只换一个术语继续使用;需要从研究问题重新推导。
同一患者可能有研究者评审、独立评审、不同扫描日期和多个病灶层级。没有固定优先级,患者级最佳疗效会随解释者变化。
只在“可评价患者”中计算 ORR,会删除早死、漏扫和病情迅速恶化者。单臂研究没有随机对照来抵消这种选择,结果尤其容易被放大。
客观缓解率(ORR)通常统计达到完全缓解或部分缓解的患者比例;案例 B 还要求在规定间隔后再次满足条件,形成确认缓解。
主要结论依赖统一的 BICR 流程、足够的影像时间窗和透明分母。如果评审来源、确认要求或手术处理改变,得到的 ORR 回答的就不是同一个问题。
这里需要区分访视级疗效与最佳总体疗效(best overall response, BOR)。BOR 是把多次扫描按既定顺序整合成患者级结果;独立影像评审(BICR)则规定由谁、按什么章程完成判读。
遇到类似问题,先按时间顺序列出首次 CR/PR、确认扫描、PD、新病灶、手术和新治疗,再选择术语和分析方法。这样更容易看出哪一步改变了比较对象、分母或可解释人群。
这一小步的落点:先识别错误做法会怎样扭曲“一次影像变化在什么条件下才能成为确认响应”,再记住本章术语。
从一名被判为响应者的患者开始追:两次扫描分别何时完成、由谁评审、间隔是否合格,此前有没有 PD、新病灶、新治疗或手术,患者级 BOR 又怎样进入 ORR 分子。
真实文件写法:“主要终点为 BICR 按 RECIST 1.1 判定并满足预设确认间隔的 CR 或 PR;无治疗后影像和首次评估前死亡者保留在主要分母。”
分析动作:程序先按扫描日期形成访视级评价,再检查确认间隔、新病灶、新治疗和手术,派生 confirmed BOR、响应者标志及 DoR 起止日期。
main <- subset(base, treated == 1 & dose_level == "T" &
baseline_measurable == "Y")
x <- sum(main$confirmed_response)
n <- nrow(main)
ci <- clopper_pearson(x, n)对应下载脚本:R/05_response_endpoints.R。无评价患者已在上游被明确派生为非响应,而不是从 n 中删除。结果怎样写:主表同时给出响应人数、主要分母、ORR 和精确置信区间,并用脚注说明无评价患者的处理。单臂 ORR 不能证明优于标准治疗。
为什么重要: ORR 的分子不是把所有 CR/PR 标签相加。只有每名响应者的评审来源、时间顺序和确认条件都能重建,确认缓解才不是一个无法复核的结果标签。
这一小步的落点: 任选一名响应者,都能找到两次合格判定及其先后顺序,ORR 的分子才可信。
案例 A 的确认性证据更依赖随机比较和时间结局,影像评审常用于 PFS 支持;案例 B 则把确认 ORR 直接放在阶段决策中心,因此确认规则和分母更敏感。
案例 A 与案例 B 都可以报告 ORR,但承担的任务不同:前者多为随机试验中的支持性证据,后者直接驱动单臂阶段决策。因此相同的 CR/PR 规则需要放在不同的终点层级和结论边界中解释。
比较两项研究时,先确认 ORR 在证据链中的位置。它是支持主要生存结论,还是决定单臂研究是否继续?终点责任不同,确认要求、分母敏感性和可写出的结论都会改变。
这一小步的落点: 确认规则可以相似,但随机试验的支持性 ORR 与单臂主要 ORR 不能承担同样的结论。
获得一次 CR/PR 记录
确认评审来源和扫描日期
检查是否满足确认间隔
检查此前是否出现 PD、新病灶、新治疗或手术
按预设规则形成患者级 BOR
无影像和早期死亡保留在分母
报告 ORR、置信区间与证据边界
沿着扫描日期和评审记录检查:第一次 CR/PR 是否来自指定评审,确认间隔是否满足,期间是否出现进展、新病灶、新治疗或手术,最后才形成患者级 BOR 并进入 ORR。
结论边界:该流程能让缓解判定可重复,但不能消除扫描缺失、评审差异或单臂设计的因果限制。影像频率或确认要求改变时,结果不能直接横向比较。
从 ORR 表中的一名响应者退回患者级 BOR,再退回每次扫描记录。若只能看到最终标签、找不到两次合格判定,确认规则就没有真正落到数据里。
RECIST 分类只是起点。主要分析还要定义 reader、窗口、确认间隔、同日冲突、新病灶、早期死亡、无评估、手术和新治疗的优先级。单臂研究的 ORR 依赖分母和确认规则,尤其容易被选择性“可评价”分析放大。
可比较研究者与独立评审;随机化减轻组间基线混杂,但开放标签仍可能影响扫描和判读。主要 OS 结论不由 ORR 替代。
确认缓解要求同一评审流程和时间窗。早期死亡、无后续影像和未确认 PR 留在主要分母并计为非缓解;降阶患者与目标方案 T 分开。
| 患者 | 影像序列 | 患者级判定 | 是否响应者 | 理由 |
|---|---|---|---|---|
| R01 | PR → PR(5 周) | 确认 PR | 是 | 满足确认间隔 |
| R02 | PR → PD | 未确认 PR / PD | 否 | 第二次未确认 |
| R03 | SD → PR → PR | 确认 PR | 是 | 从首次 PR 起算 DoR |
| R04 | CR → CR | 确认 CR | 是 | 所有病灶消失并确认 |
| R05 | SD → 新病灶 | PD | 否 | 新病灶优先 |
| R06 | 首次评价前死亡 | NE/非缓解 | 否 | 留在主要分母 |
| R07 | 无治疗后影像 | NE/非缓解 | 否 | 不能从分母删除 |
| R08 | PR → 手术,无后续可测量病灶 | 按预设规则处理 | 取决于术前是否确认 | 手术不能事后自动确认响应 |
| R09 | PR(3 周)→ PR | 未满足最小确认间隔 | 否 | 时间窗不足 |
| R10 | BICR PR;研究者 SD | 主要按 BICR PR | 按确认状态 | 评审来源预先指定 |
| 项目文件 | 本章写入内容 | 最晚决策时间 | 主要责任角色 |
|---|---|---|---|
| Imaging charter | reader、窗口、测量、确认和争议处理 | 首例影像前 | 影像/统计 |
| Protocol endpoint section | 主要 ORR 定义和手术/新治疗规则 | 首例入组前 | 临床/统计 |
| SAP response algorithm | BOR、确认、NE、DoR 和敏感性 | 分析前冻结 | 统计 |
| ADRS specification | 访视级与患者级变量、来源和标志 | 编程前 | 统计/程序 |
明确 BICR 为主要评审,确认间隔、评价期和新治疗/手术规则。
先定义 visit response,再定义 confirmed BOR、响应者和 DoR;无评估患者的主要处理透明。
保留 AVALC、ANL01FL、CONFIRMFL、DTYPE、SRCDOM。
独立逐例手工核对边界患者;检查 BICR 与研究者差异表。
主表同时给出响应数、分母、ORR、精确 CI 和关键脚注。
d <- d[order(d$assessment_date), ]
confirmed_pr <- any(d$response[-nrow(d)] %in% c("CR","PR") &
d$response[-1] %in% c("CR","PR") &
diff(d$assessment_date) >= 28)
# 正式实现需按每次候选响应逐一匹配确认访视,并处理 PD、新治疗和窗口“目标方案集中 34/47 例达到 BICR 确认 CR/PR,精确 95% CI 为……;结果越过教学阈值,但需要随机研究验证增量贡献。”
“剔除无扫描和早期死亡后,ORR 为……,证明双特异性抗体具有独立活性。”
总生存期(OS)、无进展生存期(PFS)与固定时间生存率
一名患者在 1 月 10 日随机,5 月停药,6 月开始新治疗,7 月影像确认进展,8 月死亡。总生存期和无进展生存期分别算到哪一天?新治疗开始日是否应该删失?
时间结局看似只是日期相减,真正决定答案的是起点、事件来源、同日优先级、最后一次充分评估,以及缺失扫描和后续治疗怎样处理。
时间结局必须同时固定起点、事件、删失、数据来源和日期优先级。停药、新治疗、手术、缺失扫描和死亡并不是自动的事件或删失点,它们怎样处理取决于终点和研究问题。
本章真正的分界是:起点、事件和删失优先级如何共同定义时间结局。先把这个分界说清,源日期、事件候选、ADTTE 派生、KM/Cox 输出和风险人数才不会各自采用不同口径。
读到这里,先不用判断哪一种分析方法更高级。只要能指出“生存时间到底从哪里算到哪里?”中的冲突发生在研究问题、分母、时间顺序或证据责任的哪一处,就已经抓住后续判断的入口;术语会在需要时再出现。
案例 A 的总生存期从随机化日算起,任何原因死亡都是事件;停药、后续治疗和局部治疗不会让主要 OS 在当天停止计算。
PFS 则要按预先规定的影像或临床进展来源选择事件日期。固定时间 PFS 率来自 Kaplan–Meier 风险集,不是只在“刚好有 12 个月扫描”的患者中计算比例。
时间结局必须同时固定起点、事件、删失、数据来源和日期优先级。停药、新治疗、手术、缺失扫描和死亡并不是自动的事件或删失点,它们怎样处理取决于终点和研究问题。
把“最后一次有记录的日期”机械当作删失日,可能把已发生但未及时记录的进展当成无事件,也可能把新治疗后的信息全部丢掉。模型无法修复错误的患者级事件流程。
这一小步的落点:先把“起点、事件和删失优先级如何共同定义时间结局”作为当前案例的判断基准,再检查结论依赖的条件。
审阅这条结论时,应把适用条件和替代处理放在同一处。尤其当影像计划、随访来源或治疗后事件策略改变时,原来的分母、事件规则或解释不能只换一个术语继续使用;需要从研究问题重新推导。
患者可能同时出现停药、新治疗、临床恶化、影像进展和死亡。若不先规定日期优先级,不同程序会选出不同事件日。
在新治疗日直接删失,可能把即将进展的高风险患者提前移出风险集;只看有完整 12 个月记录者,则会产生明显的完整病例选择。
删失表示在已知最后一个可用时间点后不再观察到结局,并不等于患者没有发生事件。删失规则隐含对未观察结局的假设。
案例 A 的 OS treatment-policy 处理依赖持续生存随访。PFS 结论还依赖扫描频率、失访机制和组间评估完整性。
这里第一次正式使用删失(censoring)。删失表示在某个时间点以后不再知道目标事件何时发生,而不是患者“没有事件”。删失规则必须与随访过程和可验证假设相匹配。
遇到类似问题,先按时间顺序列出随机、扫描、进展、新治疗、死亡和最后随访,再选择术语和分析方法。这样更容易看出哪一步改变了比较对象、分母或可解释人群。
这一小步的落点:先识别错误做法会怎样扭曲“起点、事件和删失优先级如何共同定义时间结局”,再记住本章术语。
先不要看 KM 曲线。挑一名患者,列出随机日期、每次充分影像、新治疗、手术、死亡和最后确认存活日期,再看 SAP 如何从这些候选日期中选出事件或删失。
真实文件写法:“OS 从随机日期计算至任何原因死亡;存活患者在最后确认存活日期删失。PFS 的事件和删失按预设影像与死亡优先级表派生。”
分析动作:先在 ADTTE 保存 STARTDT、ADT、AVAL、CNSR、事件或删失原因和来源,再用 KM 或 Cox 汇总;同日事件、缺失扫描和新治疗须按 SAP 顺序逐例处理。
y <- survival::Surv(a$time, a$event)
fit <- survival::survfit(y ~ arm, data = a)对应下载脚本:R/07_case_A_primary_analysis.R。患者级 time 与 event 必须先按规则派生,survfit 只负责汇总。结果怎样写:KM 图和表应同时给事件数、删失原因、风险人数和固定时间估计。风险比需要结合随访成熟度与比例风险假设解释。
为什么重要: 生存函数只汇总已经派生好的患者级时间。若起点、事件或删失原因不能回到源日期,曲线再平滑,也无法证明每名患者被按同一规则处理。
这一小步的落点: 先把一名患者的起点、事件或删失原因说清,再谈 KM、Cox 和固定时间生存率。
案例 B 的 12 个月 PFS 率也应来自 KM 风险集,而不是只计算有完整 12 个月随访者的比例;但单臂结果仍缺少随机对照,不能写成相对疗效优势。
案例 B 的 12 个月 PFS 也需要 KM 风险集,但它缺少随机对照,更容易受影像频率、历史背景和手术或新治疗规则影响。方法名称相同,不代表估计对象和证据强度相同。
能否照搬规则,取决于 time zero、评估计划和治疗后事件策略是否一致。只要其中一项不同,12 个月 PFS 与随机组间 PFS 就不能因为都来自 KM 而直接比较。
这一小步的落点: 案例 B 可以用 KM 估计 12 个月 PFS,却不能把这个单臂数字写成相对疗效优势。
列出随机/入组、扫描、新治疗、手术、死亡等日期
固定 time zero
构建所有候选事件
按 SAP 的优先级选择事件或删失
保存日期、标志、原因和来源
用 KM 等方法汇总患者级结果
结合风险人数和随访完整性解释
从全部候选日期出发,先固定 time zero,再按 SAP 的优先级确定事件或删失,并保存原因和来源。KM 或 Cox 位于这条链的末端,不负责替代前面的临床规则。
结论边界:正确派生能保证时间尺度一致,却不能让信息性失访自动消失。若影像计划、随访来源或治疗后事件策略不同,应重新评估删失假设。
从图表中的删失标记抽查患者,回到 ADTTE 的日期、标志和原因,再回到影像或生存源记录。无法解释的删失不应被曲线自动掩盖。
OS/PFS 的关键不是 Surv(),而是 time zero、事件来源、同日优先级、最后充分评估、缺失扫描、新治疗和数据截止。固定时间 PFS 率来自 KM 风险集,不是“有 12 个月记录者中的比例”。
time zero 为随机化日。任何原因死亡为事件;停药、后续治疗和局部治疗后继续随访。主要结论依赖死亡事件核实、失访机制和组间随访完整性。
time zero 为首次治疗/入组中预先指定的起点;进展由 BICR 或预设来源判定。需要说明手术、新治疗、缺失扫描和早期死亡如何进入事件流程。
| 记录 | 日期 | OS | 主要 PFS | 敏感性情景 |
|---|---|---|---|---|
| 随机/入组 | 2026-01-10 | time zero | time zero | 固定 |
| 最后充分影像 SD | 2026-05-01 | 无影响 | 潜在删失锚点 | 需判断后续缺失 |
| 停药 | 2026-05-15 | 继续随访 | 不自动删失 | while-on-treatment 另一个问题 |
| 新抗癌治疗 | 2026-06-01 | 不删失 | 按主要规则处理 | 可在敏感性中于前一充分评估删失 |
| 临床进展 | 2026-06-18 | 无影响 | 取决于 endpoint 是否接受临床 PD | 影像限定 vs 临床/影像复合 |
| 影像 PD | 2026-07-03 | 无影响 | 事件 | 若连续缺失扫描,需预设回溯规则 |
| 死亡 | 2026-08-20 | 事件 | 若尚未 PD,则死亡事件 | 同日事件优先级需冻结 |
随机试验通常从随机化;单臂可从首次治疗,但必须与 estimand 和 protocol 一致。
影像 PD、临床 PD(如允许)、死亡、新治疗、手术和最后充分评估。
同日死亡/PD、缺失扫描后 PD、新治疗前后评价必须逐项编码。
患者级数据同时保存 event flag、analysis date、censor/event reason 和 source。
| 项目文件 | 本章写入内容 | 最晚决策时间 | 主要责任角色 |
|---|---|---|---|
| Protocol endpoint definition | 起点、事件、删失、评估频率 | 首例入组前 | 临床/统计/影像 |
| SAP time-to-event rules | 日期优先级、缺失扫描、新治疗和敏感性 | 分析前冻结 | 统计 |
| ADTTE specification | 参数、日期、事件标志、原因和来源 | 编程前 | 统计/程序 |
| TFL shells | KM、风险表、固定时间估计、listing | 数据库锁定前 | 统计 |
明确死亡来源、影像频率、进展定义和停药后随访;新治疗不应在实施层面导致主要数据停止收集。
用患者级流程表规定所有事件组合;12 月 PFS 指定 KM 和 CI 方法。
保存 STARTDT、ADT、AVAL、CNSR、EVNTDESC、SRCDOM。
逐例核对日期最小值、同日优先级和负时间;独立复算 12 月风险人数。
KM 图/表显示截止日期、事件、删失原因、风险人数和固定时间估计。
a <- read_utf8("case_A_patient.csv")
resp <- read_utf8("case_A_response.csv")
resp$assessment_date <- as_date(resp$assessment_date)
resp$last_alive_date <- a$last_alive_date[match(resp$patient_id, a$patient_id)]
valid <- resp$adequate == "Y" &
!is.na(resp$assessment_date) &
resp$assessment_date <= resp$last_alive_date
adequate <- resp[valid, ]
last_assessment <- aggregate(
assessment_date ~ patient_id, data = adequate, FUN = max)
a$last_adequate_assessment <- last_assessment$assessment_date[
match(a$patient_id, last_assessment$patient_id)]
# 进展或死亡取较早者;两者均无时,在最后一次充分评估日删失
candidate <- pmin(a$progression_date, a$death_date, na.rm = TRUE)
none <- is.na(a$progression_date) & is.na(a$death_date)
candidate[none] <- as.numeric(a$last_adequate_assessment[none])
a$PFS_date <- as.Date(candidate, origin = "1970-01-01")
# 仍无法派生者单独输出 listing,不静默排除fit <- survival::survfit(
survival::Surv(PFS_days, PFS_event) ~ 1, data = adtte_b)
summary(fit, times = 365, extend = TRUE)
# 输出 estimate、95% CI、风险人数和累计事件,不计算完整病例比例“在数据截止日,12 个月 PFS 的 KM 估计为……,95% CI 为……;12 个月仍在风险集人数为……。”
“在有 12 个月扫描的患者中,80% 未进展,因此 12 个月 PFS 率为 80%。”
Protocol synopsis 与终点体系
一次方案会议上,团队列出了 OS、PFS、ORR、安全性、生活质量和多个生物标志物。每个指标都重要,但如果没有层级、时间点和分析责任,这仍然只是一张愿望清单。
可执行的方案摘要必须让研究目的、设计、人群、治疗、主要终点、阶段性决策和分析互相对得上。
方案摘要必须让研究目的、设计、人群、治疗、终点层级、评估计划和分析责任互相对齐。任何一项只写成口号,后续 CRF、SAP 和 TFL 都会出现不同版本的解释。
本章真正的分界是:研究目的、终点层级和分析责任是否真正对齐。先把这个分界说清,synopsis、评估计划、样本量假设、SAP 和 TFL shell才不会各自采用不同口径。
读到这里,先不用判断哪一种分析方法更高级。只要能指出“怎样把研究问题写成一份能执行的方案?”中的冲突发生在研究问题、分母、时间顺序或证据责任的哪一处,就已经抓住后续判断的入口;术语会在需要时再出现。
案例 A 将总生存期设为主要终点,预设 PFS 可承担关键次要角色,ORR、安全性和其他结果用于支持或补充解释。终点层级与多重性、期中分析和最终结论强度相连。
方案摘要不需要装下全部编程细节,但必须锁定研究真正承诺回答的问题,以及各终点在证据链中的位置。
方案摘要必须让研究目的、设计、人群、治疗、终点层级、评估计划和分析责任互相对齐。任何一项只写成口号,后续 CRF、SAP 和 TFL 都会出现不同版本的解释。
终点越多并不代表证据越完整。若主要、关键次要和探索终点没有层级,团队可能在结果出来后挑选最有利的指标,样本量与错误率控制也失去明确对象。
这一小步的落点:先把“研究目的、终点层级和分析责任是否真正对齐”作为当前案例的判断基准,再检查结论依赖的条件。
审阅这条结论时,应把适用条件和替代处理放在同一处。尤其当主要终点、比较目标或确认性责任改变时,原来的分母、事件规则或解释不能只换一个术语继续使用;需要从研究问题重新推导。
同一研究可以收集很多结果。没有终点层级,团队可能在结果出来后挑选最有利指标,报告也无法说明哪些结论经过正式错误率控制。
把 endpoint 和 estimand 当作同义词,会漏掉分母、治疗后事件和总体汇总方式。仅写“主要终点为 OS”仍不足以执行。
终点(endpoint)描述可观察结果怎样定义;估计目标描述完整治疗效应问题。两者必须对应,但承担的内容不同。
案例 A 的确认性层级依赖随机设计和预设错误率控制。探索终点可以丰富解释,却不能在事后替代失败的主要终点。
这里的关键是终点体系(endpoint hierarchy)。它不仅排列名称,还规定哪个终点承担主要证据责任、哪些终点受多重性保护、哪些只能提供支持或探索性信息。
遇到类似问题,先按时间顺序列出临床目的、终点、评估时间、分析方法和结论层级,再选择术语和分析方法。这样更容易看出哪一步改变了比较对象、分母或可解释人群。
这一小步的落点:先识别错误做法会怎样扭曲“研究目的、终点层级和分析责任是否真正对齐”,再记住本章术语。
把 synopsis 当作一条证据路径来读:研究目的指向哪个主要终点,评估计划怎样产生该终点,样本量依赖什么假设,SAP 如何分析,TFL 又准备怎样呈现。任何一段脱节,方案都还不能执行。
真实文件写法:“主要目的为比较策略 A 与策略 B 对全部随机化患者 OS 的影响;主要终点为 OS,关键次要终点按预设层级检验。”
分析动作:方案中的每个终点要映射到评估时间、数据域、分析集、效应量和 TFL shell;样本量假设与主要终点必须使用同一事件定义。
结果怎样写:最终报告按终点层级区分确认性、支持性和探索性结论,不能因某个次要终点数值更好就替代主要终点。
为什么重要: 主要终点若没有唯一的评估、分析和输出落点,团队就会在实施后才补定义。那时改变的不只是文字,而是样本量依据、数据收集和最终结论责任。
这一小步的落点: 从研究目的走到 TFL shell,每个主要或关键次要终点都有唯一落点,方案摘要才是一份执行承诺。
案例 B 的单臂 IIT 可以把确认 ORR 与 Simon 阶段决策连接,但结论责任仍是“是否值得继续验证”,而不是证明联合方案优于现有标准。
案例 B 的 synopsis 把确认 ORR、Simon 阶段决策和安全先导连在一起,目的是筛选是否值得继续验证;案例 A 则围绕随机比较和确认性终点组织。两者都要完整,但结论责任不同。
判断两份方案能否共用写法,先看最终决策是什么:确认一种治疗策略的比较效果,还是决定单臂方案是否进入下一步。这个差异会一路改变终点层级、样本量、阶段规则和报告措辞。
这一小步的落点: 案例 B 的方案可以支持“是否继续验证”,不能沿用案例 A 的确认性结论口径。
从临床目的出发
确定设计和目标人群
选定主要终点及完整定义
安排关键次要和支持性终点
连接评估计划、样本量和阶段决策
预先形成分析与输出框架
按终点层级限制最终结论
从临床目的开始,依次确认目标人群、主要终点、评估计划、样本量与阶段决策,再落到 SAP 和 TFL。每个环节都应解释前一环提出的问题,而不是另起一套术语。
结论边界:一份完整方案能够减少后续歧义,却不能替代可行性、外部证据和实施质量。研究问题改变时,终点体系、样本量和数据计划都要同步更新。
从一个拟写的主要结论往回找:对应哪个 TFL、哪个分析、哪套评估和哪个方案目标。若回不到唯一位置,说明终点体系还只是列表,没有形成证据路径。
Synopsis 必须让目的、设计、人群、治疗、终点、样本量与分析互相对得上。主要、关键次要、其他次要和探索终点承担不同证据责任;endpoint 是可观测结果的定义,estimand 是完整治疗效应问题,二者不能互换。
主要终点 OS;关键次要终点可包括 PFS;ORR、安全性、PRO 等作为其他次要或支持性终点。终点层级与 alpha 分配、正式期中分析和 CSR 结论强度相连。
主要终点为 BICR 确认 ORR;关键次要终点为 12 个月 PFS 率;DoR、PFS、OS、安全性和转化切除率为其他次要;ctDNA 清除和免疫微环境变化为探索终点。
| 项目 | CRC-ADVANCE-01 | CRC-IMMUNE-IIT-01 |
|---|---|---|
| 设计 | 开放标签、1:1 随机、Ⅲ期、事件驱动 | 单臂Ⅱ期 IIT;安全先导+Simon 两阶段 |
| 人群 | MSS/pMMR 不可切除晚期 CRC | 初治、不可切除 MSS/pMMR mCRC,不额外富集 |
| 治疗 | 试验策略 A vs 标准策略 B | 依沃西单抗+FOLFOXIRI;目标方案 T/预设降阶 D |
| 主要终点 | OS | BICR 确认 ORR |
| 关键次要 | 预设 PFS 等 | 12 个月 PFS 率 |
| 阶段决策 | 约 70% OS 信息量正式期中 | 两周期安全先导;Simon 第一阶段无效早停 |
| 证据边界 | 随机比较支持策略间因果解释,仍受实施和缺失影响 | 单臂不能证明优于 FOLFOXIRI 或新增药物独立贡献 |
明确影像模态、基线窗口、靶/非靶病灶和中央影像传输要求。
例如每 8 周一次,不因临床判断或治疗组随意改变;超窗原因结构化记录。
单臂研究 CR/PR 在至少 4 周后再次确认;预设如何处理手术、新治疗和无后续扫描。
治疗停止后仍有生存随访;血液和组织采样与临床时间点对齐。
| 项目文件 | 本章写入内容 | 最晚决策时间 | 主要责任角色 |
|---|---|---|---|
| Protocol synopsis | 目的、设计、终点层级、分析和阶段决策 | 首例入组前 | 临床/统计 |
| Endpoint definition table | 起点、事件、窗口、确认、缺失和评审 | 首例入组前 | 统计/影像 |
| Schedule of Assessments | 影像、实验室、生存、组织与血液采样 | 首例入组前 | 临床/运营/转化 |
| TFL shells | 标题、分母、时间点与脚注 | 数据库锁定前 | 统计/医学写作 |
用一句话将每个目标与终点相连;明确独立影像评审、确认规则、随访和多重性地位。
分别定义主要、关键次要、其他次要和探索终点。12 月 PFS 率指定 KM 方法与 CI。
终点规格逐项写出 source、time origin、event、censor、window、analysis flag。
检查 endpoint 表是否能由现有 CRF 字段重建;检查影像计划与扫描数据是否一致。
终点表显示分析集、评审来源、确认要求、数据截止和成熟度。
# ORR
binom.test(responders, denominator, conf.level = 0.95)
# 12-month PFS is a KM estimate, not a complete-case proportion
fit <- survival::survfit(Surv(pfs_days, pfs_event) ~ 1, data = adtte_b)
summary(fit, times = 365, extend = TRUE)“确认 ORR 为主要终点;12 个月 PFS 率、DoR 与安全性用于描述获益的持续性和可实施性。”
“ORR 较高证明依沃西单抗使 FOLFOXIRI 更有效。”
试验设计、样本量与决策规则
单臂研究开始后,前几名患者出现缓解,但也有严重毒性。团队想继续观察几例再决定。这样的灵活看似稳妥,却可能让样本量、错误率和停止边界随着数据变化。
设计要在入组前回答:什么结果说明方案缺乏前景、什么安全信号必须暂停、什么条件允许进入下一阶段。
样本量和停止边界依赖目标效应、错误率、把握度、可评价定义和数据成熟条件。阶段决策必须在看见开放结果前固定,并由有明确权限的委员会按冻结数据执行。
本章真正的分界是:阶段阈值是否来自预先设定的目标效应和错误率。先把这个分界说清,设计参数、可计入名单、阶段边界、冻结结果和决策记录才不会各自采用不同口径。
读到这里,先不用判断哪一种分析方法更高级。只要能指出“为什么样本量和停止规则必须提前定?”中的冲突发生在研究问题、分母、时间顺序或证据责任的哪一处,就已经抓住后续判断的入口;术语会在需要时再出现。
案例 B 先用两周期安全先导判断目标联合方案是否安全且可实施;通过后,按预设 Simon 两阶段规则评估确认 ORR。教学设定中,第一阶段 16 名目标方案患者若确认缓解不超过 10 人则停止,达到 11 人可继续;总样本 47 人,至少 34 人越过无效阈值。
这些数字是教学设定,不是现实处方或真实试验建议。价值在于每个阈值都在看见结果之前冻结,并能由独立程序复算。
样本量和停止边界依赖目标效应、错误率、把握度、可评价定义和数据成熟条件。阶段决策必须在看见开放结果前固定,并由有明确权限的委员会按冻结数据执行。
“再多看几例”不是中性的做法。若团队根据当前缓解或毒性不断改变入组数和阈值,实际假阳性率、停止概率和研究资源都会偏离原设计。
这一小步的落点:先把“阶段阈值是否来自预先设定的目标效应和错误率”作为当前案例的判断基准,再检查结论依赖的条件。
审阅这条结论时,应把适用条件和替代处理放在同一处。尤其当p0、p1、可评价定义、信息量或错误率分配改变时,原来的分母、事件规则或解释不能只换一个术语继续使用;需要从研究问题重新推导。
样本量同时受目标效应、错误率、把握度、失访、不可评价、入组速度和决策代价影响,不是一个孤立数字。
看到结果后延长第一阶段或改变可计入人群,会让实际错误率偏离设计;把降阶患者并入目标方案决策也会改变治疗条件。
Simon 两阶段设计允许在第一阶段疗效不足时提前停止,以减少无效暴露;安全先导则同时观察严重事件、延迟、相对剂量强度和永久停药。
阶段规则只有在同一入组标准、目标方案、评审流程和主要终点定义下才可执行。真实设计必须由临床、统计和安全团队结合真实剂量确认。
随机试验常用信息比例(information fraction)描述期中时已获得多少主要终点信息;单臂研究可使用 Simon 两阶段设计,把早停无效和继续入组写成可复算的整数边界。
遇到类似问题,先按时间顺序列出设计参数、入组、观察窗完成、数据冻结、计数和决策,再选择术语和分析方法。这样更容易看出哪一步改变了比较对象、分母或可解释人群。
这一小步的落点:先识别错误做法会怎样扭曲“阶段阈值是否来自预先设定的目标效应和错误率”,再记住本章术语。
把阶段决策拆成可核对的五件事:设计参数是什么,哪些患者可以计入,数据在何时冻结,观察到的响应数落在哪条边界,委员会最后记录了什么决定。
真实文件写法:“第一阶段纳入 16 例目标方案患者;确认缓解数不超过 10 例则停止,至少 11 例方可进入第二阶段。总样本 47 例,成功阈值为至少 34 例确认缓解。”
分析动作:独立程序复算 alpha、power、PET 和期望样本量;阶段报告从冻结的可计入名单统计响应数,并把不可评价、降阶和安全先导患者逐例说明。
decision <- if (N < n1) "not_ready" else
if (N == n1 && x <= r1) "stop_for_futility" else
if (N >= n && x >= r) "crosses_teaching_threshold" else
if (N >= n) "does_not_cross_threshold" else "continue_accrual"对应下载脚本:R/08_case_B_simon_and_orr.R。决策同时检查实际分母 N 和响应数 x,不能只看比例。结果怎样写:决策记录应写明实际分母、观察结果与预设边界的关系。越过阈值只支持按方案继续或考虑后续验证,不等同于已证明临床获益。
为什么重要: 只报一个响应率会掩盖阶段分母和整数边界。实际分母、可计入规则或冻结状态只要与设计不同,原先计算的错误率和决策性能就不再自动成立。
这一小步的落点: 实际分母和响应数能一一对应到预设边界,阶段决定才不是看见结果后的临时判断。
案例 A 的事件驱动期中分析需要 alpha spending、DMC 防火墙和最终检验衔接;案例 B 的 Simon 决策主要围绕整数响应数,两者不能共用同一停止逻辑。
案例 A 的事件驱动期中分析围绕信息比例和 alpha spending;案例 B 的 Simon 设计围绕可计入患者与整数响应数。它们都要求预设和冻结,但控制的错误与暴露风险并不相同。
看到“期中”或“停止规则”时,不要先套同一套边界。先确认统计目标是控制重复检验错误,还是尽早停止无效方案;再检查信息量、分母和委员会权限。
这一小步的落点: Simon 的整数边界不能替代随机试验的 alpha spending,反过来也一样。
把临床假设转成目标效应和可接受错误率
选择与问题匹配的设计
计算事件数或阶段样本量
定义可计入人群和数据成熟条件
预设继续、停止、暂停和降阶规则
委员会按冻结数据执行
记录实际结果与预设边界的关系
先把目标效应和可接受错误率转成样本量或事件数,再定义可计入人群、数据成熟条件和停止边界。委员会只能在冻结数据满足触发条件后执行这些规则。
结论边界:预设边界控制的是特定假设和数据结构下的决策性能。真实发生率、失访、评审延迟或方案改变后,原边界不能未经重算继续使用。
从决策备忘录中的“继续”或“停止”往回核对:当时的分母、响应数和数据版本是否与设计完全一致。任何事后更换口径,都需要重新评估设计性能。
样本量不是单个数字,而是效应假设、错误率、信息量、失访、不可评价、入组速度和决策代价的共同结果。所有数字在本课程中均为教学设定,真实设计必须由有经验的临床统计师与相关专家确认。
教学设定 等比例分组、HR=0.75、双侧 α=0.05、把握度 90%,Schoenfeld 近似需要约 508 个死亡事件。总随机人数还取决于入组期、随访期、退出和事件发生率。
教学设定 安全先导先入 9 例,前两周期综合评价;黄色可扩至 12。通过后,Simon optimal:p0=0.60、p1=0.78、单侧 α=0.05、power=0.80;n1=16,≤10 缓解停止;总 N=47,≥34 缓解越过无效阈值。
| 层面 | 绿色 | 黄色 | 红色/硬暂停 |
|---|---|---|---|
| 方案限制性毒性(RLT) | 9 例中 ≤2,且无硬暂停事件 | 9 例中 3:暂停扩至 12;12 例中 ≤3 可讨论继续 | 9 例中 ≥4,或 12 例中 ≥4 |
| 立即硬暂停 | 无 | 单一罕见严重事件待因果复核 | 任何治疗相关死亡、胃肠穿孔、4 级出血、动脉血栓;或首 6 例中 ≥2 RLT |
| 进入周期 3 | ≥75% 在第 43 天前开始 | 60%–<75% | <60% |
| 组分 RDI | 中位数 ≥80% | 70%–<80% | <70% |
| 永久停药 | ≤20% | >20%–33% | >33% |
| 项目文件 | 本章写入内容 | 最晚决策时间 | 主要责任角色 |
|---|---|---|---|
| Protocol | 样本量假设、阶段设计、先导边界、降阶路径 | 首例入组前 | 统计/临床/安全 |
| SAP | 精确二项决策、不可评价与并入规则 | 首例入组前或阶段开放前 | 统计 |
| Safety Committee Charter | 硬暂停、可实施性指标和记录模板 | 首例入组前 | 临床/药物警戒/统计 |
| Randomization/DMC plan | 案例 A 事件和期中信息规则 | 首例入组前 | 统计/DMC |
参数全部标注“教学设定”;目标方案 T 与降阶 D 只用协议定义,不在课程中给出现实处方剂量。
冻结 Simon 阈值、阶段 1 数据截止、BICR 状态、不可评价规则和先导并入条件。
分析变量包括 LEADINFL、DOSELVL、RLTFL、SIMONFL、CONFRESP。
用独立程序复算 alpha、power、PET 和期望样本量;逐例核对阶段分母。
阶段性 memo 同时报告疗效数、安全事件、RDI、延迟和方案偏离。
simon_oc <- function(n1, n, r1, r, p) {
xs <- (r1 + 1):n1
reject <- sum(dbinom(xs, n1, p) *
pbinom(r - xs - 1, n - n1, p, lower.tail = FALSE))
pet <- pbinom(r1, n1, p)
c(reject = reject, PET = pet,
EN = n1 + (n - n1) * (1 - pet))
}
simon_oc(16, 47, 10, 34, 0.60) # alpha, PET0, EN0
simon_oc(16, 47, 10, 34, 0.78) # power, PET1, EN1alpha <- 0.05; power <- 0.90; HR <- 0.75
z_alpha <- qnorm(1 - alpha/2)
z_beta <- qnorm(power)
events <- 4 * (z_alpha + z_beta)^2 / log(HR)^2
ceiling(events) # 约 508 个 OS 事件(教学设定)“观察到的确认 ORR 越过预设无效阈值,支持考虑后续随机验证。”
“Simon 设计证明联合方案优于 FOLFOXIRI,且证明依沃西单抗贡献。”
CRF、数据库与样本采集计划
数据库里写着患者“完成影像”和“采集血样”,却没有实际日期、处理延迟、评审来源、检测批次和失败原因。分析时,团队无法判断扫描是否在窗口内,也无法把 ctDNA 结果与正确时间点配对。
研究问题必须在数据库上线前被翻译成字段、日期、主键和允许值。统计模型不能补回从未采集的信息。
每个数据域必须先规定一行代表什么、主键是什么、哪些日期和状态不可缺少。扫描、给药、样本和不良事件的粒度不同,不能为了方便全部压成一张患者级宽表。
本章真正的分界是:每个数据域的一行代表什么,以及哪些时间点不能缺少。先把这个分界说清,CRF、数据库主键、样本台账、数据检查和派生规格才不会各自采用不同口径。
读到这里,先不用判断哪一种分析方法更高级。只要能指出“研究开始前,究竟要收集哪些信息?”中的冲突发生在研究问题、分母、时间顺序或证据责任的哪一处,就已经抓住后续判断的入口;术语会在需要时再出现。
案例 B 需要同时建立临床、给药、影像、手术、样本和 assay 元数据。每张表先说明“一行代表什么”,再确定主键、实际日期、来源、质量标志和失败原因。
样本采集不只是“有或没有”。计划时间、实际时间、处理延迟、批次、检测版本、QC 状态和可分析状态必须分开记录。
每个数据域必须先规定一行代表什么、主键是什么、哪些日期和状态不可缺少。扫描、给药、样本和不良事件的粒度不同,不能为了方便全部压成一张患者级宽表。
只记录“已完成”或“未完成”会丢失实际时间、窗口偏差、失败原因和来源。等到分析阶段再询问这些信息,往往已经无法从源文件可靠重建。
这一小步的落点:先把“每个数据域的一行代表什么,以及哪些时间点不能缺少”作为当前案例的判断基准,再检查结论依赖的条件。
审阅这条结论时,应把适用条件和替代处理放在同一处。尤其当数据粒度、时间窗、检测流程或评审来源改变时,原来的分母、事件规则或解释不能只换一个术语继续使用;需要从研究问题重新推导。
不同域的数据粒度不同:一名患者、一周期、一种给药组分、一次扫描、一个不良事件或一份样本。直接多对多合并会复制记录和计数。
只记录访视名,不记录实际日期,会使时间窗、事件顺序和样本配对无法复核;只写“其他原因”也无法解释缺失机制。
主键用来唯一识别一行记录。分析前必须确认主键唯一、无孤儿记录,并明确多记录怎样聚合到患者级。
数据能够支持结论,取决于字段定义和采集质量。样本可分析集只代表完成采集、QC 和检测的人群,不能自动代表全队列。
这里的基础概念是数据粒度(data grain)。粒度说明一条记录对应一个患者、一次访视、一次给药、一个事件还是一个样本;主键则保证每条事实能够唯一定位。
遇到类似问题,先按时间顺序列出计划、采集、处理、检测、入库和分析,再选择术语和分析方法。这样更容易看出哪一步改变了比较对象、分母或可解释人群。
这一小步的落点:先识别错误做法会怎样扭曲“每个数据域的一行代表什么,以及哪些时间点不能缺少”,再记住本章术语。
从最终要分析的事实倒推数据结构:每个域的一行代表什么,主键如何唯一,哪些日期必须保存实际值,样本失败发生在哪一步,派生变量又来自哪些源字段。
真实文件写法:“影像域每行代表一次实际扫描;至少保存患者、扫描日期、评审来源、评价充分性和不可评价原因。样本域另存实际采集、处理延迟、批次和 QC 状态。”
分析动作:数据检查先验证主键唯一、日期顺序和孤儿记录,再按患者与时间点合并;分析数据规格记录每个派生变量的源字段、算法和用途。
checks$B_sample_duplicate <- sum(
duplicated(bs[c("patient_id", "timepoint")])
)对应下载脚本:R/03_data_checks.R。这里检查教学样本台账的患者—时间点主键;真实项目还需按正式数据规格确定完整主键。结果怎样写:数据漏斗应显示计划、采集、处理、检测和可分析各层人数,使缺失发生在哪一步可以被追溯,而不是只报告最后可分析样本数。
为什么重要: 只保留“最终可分析”状态会把重复、漏采、处理失败和检测失败混在一起。把数据粒度和失败原因结构化,才可能判断缺失发生在哪里、是否与结局有关。
这一小步的落点: 能从一个分析变量退回唯一的源记录、主键和实际日期,数据设计才真正服务研究问题。
案例 A 更强调随机、后续治疗和生存随访;案例 B 同时依赖周期给药、影像和动态样本。两者共享数据原则,但字段和时间粒度不能机械复制。
案例 A 更依赖随机、给药、后续治疗和生存随访;案例 B 还要连接周期给药、影像与动态样本。共同原则是保存真实时间和失败原因,不能把字段集合机械复制。
比较两项研究的数据需求时,先问每条记录代表哪个事实、在哪个时间点产生、缺失后会影响哪个分析。研究问题不同,数据域和时间粒度自然不同。
这一小步的落点: 两项研究可以共用数据治理原则,却不能共用一张不区分临床随访和样本链的“大表”。
从研究问题列出必须观察的事实
确定每个数据域一行代表什么
设计主键、实际日期和允许值
把缺失与失败原因结构化
冻结 CRF、数据库和样本手册
建立源数据到分析变量的追溯
用自动检查发现重复、孤儿和日期错误
先列出必须观察的事实,再为每个数据域规定一行含义、主键、实际日期和允许值;随后把失败原因与派生规格接上,最后用检查程序寻找重复、孤儿和日期冲突。
结论边界:良好数据库设计能够防止结构性缺失,却不能保证现场记录真实或检测可靠。任何变量改名都必须同步更新字典、代码、正文和下载资源。
从一个异常结果往回追时,应能判断问题发生在采集、录入、合并、样本处理还是派生。若所有缺失只剩一个空值,就失去了修复和解释的依据。
临床、影像、给药、不良事件和转化样本的数据粒度不同。直接按 patient_id 多对多合并会复制记录;只记录访视名而不记录实际日期,会使窗口、事件顺序和样本配对无法复核。
核心域包括 DM/RAND、EX、DS、AE、CM、RS/影像、生存状态、实验室、后续治疗和手术。随机化日期是主要时间结局 time zero;安全性暴露则以首次实际用药为参考。
除临床域外,还需要 cycle/component 给药、BICR 影像、手术、组织/血液样本、ctDNA、assay QC 和批次元数据。样本可分析性本身是一个需要解释的结局。
| 域/表 | 一行代表 | 推荐主键 | 关键字段 | 典型检查 |
|---|---|---|---|---|
| DM/RAND | 一名患者 | patient_id | 随机日、组别、分层 | 唯一、日期完整、分层值合法 |
| EX/CYCLE | 一次组分给药 | patient_id+cycle+component | 计划/实际日期和剂量 | 孤儿、重复、延迟和负剂量 |
| RS/RESPONSE | 一次评审时点评价 | patient_id+date+reader | CR/PR/SD/PD/NE、新病灶 | 同日冲突、窗口、reader 来源 |
| AE | 一次不良事件 | patient_id+ae_id | 术语、grade、seriousness、因果 | 开始早于用药、等级非法、重复 |
| SAMPLE | 一次样本采集 | sample_id | 时间点、处理、批次、QC | 计划/实际偏差、重复配对、失败原因 |
| ctDNA | 一次 assay 结果 | sample_id+assay_version | 检出、数值、LOD、批次 | 样本不存在、版本混合、低于 LOD |
| 项目文件 | 本章写入内容 | 最晚决策时间 | 主要责任角色 |
|---|---|---|---|
| CRF/eCRF specification | 域、字段、允许值、日期精度和 query | 数据库上线前 | 数据/临床 |
| Data management plan | 编码、清理、冻结、锁库和审计轨迹 | 首例入组前 | 数据管理 |
| Sample handling manual | 采集、处理、运输、冻存和失败分类 | 首例采样前 | 转化/实验室 |
| Analysis data spec | 源变量、派生、分析标志和追溯 | 编程前 | 统计/程序 |
在 protocol 与实验室手册中写明必须采集的数据和时间窗;不要把关键字段留给“分析时尽量获取”。
定义多记录如何聚合、同日事件优先级、部分日期规则和批次处理。
每个派生变量记录 source、algorithm、analysis purpose 和 review status。
程序主动检查主键唯一、孤儿记录、日期倒置、多对多连接前后行数。
样本 accountability 表分开展示计划、采集、检测、QC 通过和进入分析的人数。
assert_unique(dm, "patient_id", "DM")
stopifnot(!any(!ex$patient_id %in% dm$patient_id))
key <- c("patient_id", "assessment_date", "reader", "visit")
duplicates <- response[duplicated(response[key]) |
duplicated(response[key], fromLast = TRUE), ]
# 不要直接 merge(AE, RESPONSE, by="patient_id"):会形成多对多复制“治疗中组织可分析集占全队列的 42%;失败主要来自临床恶化、拒绝重复活检和样本 QC 失败。”
“我们分析了 42% 的患者,因此这些组织结果代表整个队列。”
SAP、主要分析与敏感性分析
数据库锁定后,主要 Cox 模型的结果不理想,另一个时间点的生存率差和 RMST 看起来更有利。团队能否把后者改成主要结论?
SAP 的作用不是提供许多可选模型,而是在不改变研究问题的前提下,把分析集、变量、模型、缺失、诊断、敏感性和输出冻结成唯一可执行路径。
SAP 要在揭盲或主要分析前,把分析集、派生规则、模型、效应量、缺失处理、敏感性目的和输出形式写成可执行约定。它不是把统计方法名称集中列一次。
本章真正的分界是:主要分析与敏感性分析分别固定或改变了哪些假设。先把这个分界说清,SAP ID、分析集、派生变量、模型程序、诊断和 TFL才不会各自采用不同口径。
读到这里,先不用判断哪一种分析方法更高级。只要能指出“统计分析计划到底在提前约定什么?”中的冲突发生在研究问题、分母、时间顺序或证据责任的哪一处,就已经抓住后续判断的入口;术语会在需要时再出现。
案例 A 预设分层 log-rank 作为主要检验,以分层 Cox 模型给出风险比和置信区间,并结合 Kaplan–Meier 曲线和固定时间生存率解释。比例风险假设异常时,RMST 或时间变化效应可作为预设补充,但不能事后替换主要分析。
敏感性分析用于检验结论对关键假设的依赖,不是结果不理想后的分母或模型购物。
SAP 要在揭盲或主要分析前,把分析集、派生规则、模型、效应量、缺失处理、敏感性目的和输出形式写成可执行约定。它不是把统计方法名称集中列一次。
只写“使用 Cox 模型”或“进行敏感性分析”仍不足以复现结果。分层因子、时间起点、事件规则、协变量、置信区间和模型失败后的处理都可能改变输出。
这一小步的落点:先把“主要分析与敏感性分析分别固定或改变了哪些假设”作为当前案例的判断基准,再检查结论依赖的条件。
审阅这条结论时,应把适用条件和替代处理放在同一处。尤其当研究问题、模型假设、缺失处理或治疗中事件策略改变时,原来的分母、事件规则或解释不能只换一个术语继续使用;需要从研究问题重新推导。
同一数据可以用许多模型、协变量和时间窗分析。若选择发生在看见结果后,名义 p 值和区间不再反映预先计划的不确定性。
把 HR=0.76 解读为每名患者寿命都延长 24%,忽略了 HR 是瞬时风险的相对量,也可能依赖比例风险假设。
主要分析回答预先定义的核心问题;敏感性分析保持核心问题,改变关键未观察假设;补充估计目标则可能主动回答另一个临床问题。
模型结论依赖数据完整性、分层变量、软件选项和假设诊断。即使主要结果成立,也要结合事件数、曲线和绝对时间点差异解释。
这里需要区分估计方法(estimator)与估计结果(estimate)。前者是从数据得到结果的规则,后者是最终数字;SAP 必须说明方法怎样对应估计目标和结论。
遇到类似问题,先按时间顺序列出分析集、事件派生、模型、诊断、敏感性分析和输出,再选择术语和分析方法。这样更容易看出哪一步改变了比较对象、分母或可解释人群。
这一小步的落点:先识别错误做法会怎样扭曲“主要分析与敏感性分析分别固定或改变了哪些假设”,再记住本章术语。
拿一个主要分析逐项核对:SAP 条款是否明确分析集、派生、模型和效应量;数据规格是否给出变量来源;程序是否固定公式和版本;TFL 是否同时呈现估计、不确定性和分母。
真实文件写法:“主要 OS 分析在 ITT 集中采用分层 log-rank 检验,并用分层 Cox 模型估计 HR 及 95% CI;同时报告预设时间点的 KM 生存率。”
分析动作:程序按 SAP ID 调用冻结的分析集和派生变量,保存模型公式、因子水平、软件版本和诊断;敏感性分析只改变预先声明的关键假设。
cox <- survival::coxph(
y ~ arm + strata(strat_ras, region),
data = a, ties = "efron"
)对应下载脚本:R/07_case_A_primary_analysis.R。分组、分层因子和 ties 处理与项目脚本一致。结果怎样写:TFL 同时显示估计值、区间、事件数、风险人数和分析集。p 值不能脱离效应大小、数据成熟度和假设成立情况单独解释。
为什么重要: 若程序能运行却回不到明确的 SAP 条款,分析自由度仍然藏在代码里。把 SAP ID、变量、程序和输出连起来,才能区分预设实现与看见结果后的选择。
这一小步的落点: 每个主要模型和输出都能回指到唯一 SAP 条款,统计分析计划才真正冻结了分析路径。
案例 B 的确认 ORR 主要使用精确二项区间和 Simon 决策,不需要照搬 Cox 模型;但同样要预先冻结分母、确认规则和不可评价处理。
案例 B 不需要照搬案例 A 的 Cox 模型,而要冻结确认 ORR、精确二项区间和 Simon 决策。两者共同之处是先定分母和关键假设,不是共用同一种统计方法。
比较 SAP 时,重点不是模型是否相同,而是主要分析固定了哪些假设、敏感性分析只改变哪一项。若备选分析回答了另一个问题,就不能包装成对主要结论的简单稳健性检查。
这一小步的落点: 方法可以不同;主要路径、分母和每个敏感性分析的角色都必须在结果揭盲前说清。
Protocol 锁定临床承诺
SAP 把承诺细化为唯一规则
数据规格连接源字段和派生
程序按冻结版本运行
诊断和敏感性检验关键假设
TFL 同时呈现估计与不确定性
解释不超出预设问题和设计
Protocol 先锁定临床承诺,SAP 将其细化为分析集、派生和模型,数据规格与程序再实现这些规则,TFL 最后同时呈现估计值、区间和分母。
结论边界:SAP 可以减少分析自由度,但不能把错误的研究问题变正确。若方案发生实质变化,应保留版本、修改理由和盲态状态,而不是静默覆盖。
从一个表格数字回到 SAP ID,检查分析集、变量、模型、软件选项和诊断是否都有记录。找不到唯一条款的结果,不应被当作预设主要分析。
Protocol 决定研究目的、设计和关键终点;SAP 在不改变问题的前提下细化分析集、变量派生、模型、缺失、诊断、敏感性和 TFL。看到治疗效果后选择最有利模型,不是“优化分析”,而是引入选择偏倚。
主要检验为预设分层 log-rank;效应估计为分层 Cox HR 与 CI,同时给 KM 曲线和固定时间差。比例风险诊断异常时,RMST 或时间变化效应作为预设补充,不替换失败的主要分析。
主要分析报告确认响应数、分母、ORR 和精确二项 CI,并应用预设阶段阈值。12 月 PFS、DoR、安全性和历史背景不能被写成随机比较。
| 分析 | 保持不变 | 改变的假设/问题 | 角色 |
|---|---|---|---|
| 案例 A 失访不利情景 | ITT 与 OS treatment-policy estimand | 失访后死亡分布 | 敏感性 |
| 案例 A IPCW/RPSFTM | 人群和原分组 | 假设没有治疗转换的反事实问题 | 补充 estimand |
| 案例 A RMST | OS 数据与随访窗 | 效应汇总尺度,不依赖恒定 HR | 预设补充 |
| 案例 B 无评估计非缓解 | 主要 ORR 分母 | 主要保守规则 | 主要 |
| 案例 B response-evaluable | 响应定义 | 缩小分母,回答条件性问题 | 描述性,不替代主要 |
| 案例 B 降阶并入 | 无 | 改变治疗条件与主要人群 | 通常不允许事后作为主要 |
PARAMCD=OS、ITTFL=Y、AVAL 天、CNSR、分层变量。07_case_A_primary_analysis.R;函数与输入版本写入日志。| 项目文件 | 本章写入内容 | 最晚决策时间 | 主要责任角色 |
|---|---|---|---|
| Protocol | 主要分析原则、终点和关键假设 | 首例入组前 | 临床/统计 |
| SAP | 完整派生、模型、诊断、敏感性和 TFL | 揭盲/主要分析前 | 统计 |
| Analysis data spec | 变量、来源、算法、参数和标志 | 编程前 | 统计/程序 |
| Programming plan | 脚本顺序、日志、版本和 QC | 编程启动前 | 统计编程 |
Protocol 不应塞入所有编程细节,但必须锁定主要问题、终点、设计和关键阶段规则。
主要模型、效应量、检验、CI、诊断、缺失和每个敏感性分析的目的逐项写清。
建立 SAP ID → data spec ID → program → output 的映射表。
代码审阅不仅看语法,还核对分母、日期规则、因子水平和默认软件选项。
输出同时给估计、区间、事件数和分析集,不只给 p 值。
y <- survival::Surv(time = adtte$AVAL, event = 1 - adtte$CNSR)
logrank <- survival::survdiff(
y ~ TRT01P + strata(STRATRAS, REGION), data = adtte)
cox <- survival::coxph(
y ~ TRT01P + strata(STRATRAS, REGION),
data = adtte, ties = "efron")
exp(cbind(HR = coef(cox), confint(cox)))main <- subset(adrs_b, ORR_T_FL == "Y")
x <- sum(main$confirmed_BOR %in% c("CR","PR"))
n <- nrow(main)
ci <- binom.test(x, n)$conf.int
decision <- if (n == 16 && x <= 10) "stop" else
if (n >= 47 && x >= 34) "crosses threshold" else "continue/not final"“主要 HR 与 CI 应结合 KM 曲线、比例风险诊断和固定时间生存差解释。”
“HR=0.76 表示每名患者的寿命都延长 24%,且任何时间都成立。”
期中分析、多重性与阶段性决策
随机试验积累到约七成死亡事件时,非盲报告显示两组有差异。直接套用常规 0.05 阈值看起来很自然,但同一假设已经被提前检验一次。
每次正式查看疗效数据都会影响错误率,也会带来信息泄露和治理风险。期中分析必须按实际信息量、预设边界和委员会权限执行。
期中分析必须事先规定目的、触发条件、可看数据的人、允许采取的行动以及与最终分析的错误率关系。开放结果的传播本身也会影响研究行为。
本章真正的分界是:期中查看的目的、信息量和可见权限是否预先限定。先把这个分界说清,触发条件、冻结快照、边界程序、独立 QC、DMC 纪要和最终分析才不会各自采用不同口径。
读到这里,先不用判断哪一种分析方法更高级。只要能指出“研究进行到一半,什么时候可以继续、停止或调整?”中的冲突发生在研究问题、分母、时间顺序或证据责任的哪一处,就已经抓住后续判断的入口;术语会在需要时再出现。
案例 A 的教学设定在约 70% OS 信息量时进行正式期中分析,并使用 O’Brien–Fleming 类型 alpha spending。疗效边界通常比 0.05 更严格;DMC 根据章程查看开放数据,赞助方盲态团队只接收建议。
非约束性无效性建议可减少无效继续风险,但不应被解释为已证明无效。每次决定都要记录数据快照、实际信息量、边界和未成熟部分。
期中分析必须事先规定目的、触发条件、可看数据的人、允许采取的行动以及与最终分析的错误率关系。开放结果的传播本身也会影响研究行为。
在日常运营报表里顺便查看疗效趋势,可能造成隐性期中分析。团队即使没有正式停止,也可能改变入组、随访或解释,从而破坏盲态和最终检验。
这一小步的落点:先把“期中查看的目的、信息量和可见权限是否预先限定”作为当前案例的判断基准,再检查结论依赖的条件。
审阅这条结论时,应把适用条件和替代处理放在同一处。尤其当查看时间、信息比例、边界或允许采取的行动改变时,原来的分母、事件规则或解释不能只换一个术语继续使用;需要从研究问题重新推导。
期中和最终对同一假设重复检验,会增加至少一次假阳性的概率;多个关键终点和大量亚组还会进一步扩大多重性。
“期中 p<0.05”并不等于越过预设界值。非计划查看或泄露组间结果,也可能改变试验实施和后续判断。
信息量常以累计主要事件数衡量。Alpha spending 根据实际信息比例分配允许使用的Ⅰ类错误,而不是只按日历时间。
期中结论依赖事件核实、数据库清理、开放报告防火墙和边界复算。委员会还需综合安全性、成熟度和外部信息。
这里的核心工具是 alpha 消耗(alpha spending)。它把总体第一类错误率分配到不同信息时间点,使期中和最终检验仍属于同一预先规划的决策体系。
遇到类似问题,先按时间顺序列出事件成熟、数据冻结、非盲分析、独立复核、委员会建议和执行,再选择术语和分析方法。这样更容易看出哪一步改变了比较对象、分母或可解释人群。
这一小步的落点:先识别错误做法会怎样扭曲“期中查看的目的、信息量和可见权限是否预先限定”,再记住本章术语。
期中分析首先是权限与版本问题。先核对触发条件和实际信息量,再确认使用了哪个冻结快照、哪套边界程序、谁完成独立复算、谁能看到开放结果,以及正式决定怎样归档。
真实文件写法:“正式 OS 期中分析在约 70% 信息量触发;非盲统计按实际事件数计算边界,仅向 DMC 提供开放报告,研究团队保持盲态。”
分析动作:程序使用冻结数据快照复算信息比例、疗效边界和无效性规则;独立 QC 用另一实现核对事件数、界值和建议文本。
if (actual_events >= planned_interim_events) {
freeze_snapshot()
apply_pre_specified_boundary()
run_independent_qc()
}这是治理流程伪代码,不是可直接运行的 R。原下载包未包含正式的 group-sequential 边界计算程序;正式项目必须补充经验证的边界程序和独立复算。结果怎样写:会议纪要需区分统计建议与赞助方决定,并记录继续、停止或调整的依据。越过边界仍要结合安全性、数据质量和外部证据解释。
为什么重要: 只要数据被额外查看、边界实现未验证或开放结果越过权限,后续推断就可能受到影响。把“谁在何时看到什么”记录清楚,与计算边界同样重要。
这一小步的落点: 触发条件、冻结数据、边界实现、查看权限和决策纪要能互相对应,期中治理才算完整。
案例 B 的安全先导和 Simon 第一阶段通常按完成观察窗的人数与整数事件决策,不承担随机试验相同的总体 alpha 分配,但仍需冻结分母和权限。
案例 B 的 Simon 第一阶段和安全先导通常按整数人数与事件决策,不承担案例 A 相同的总体 alpha 分配;但同样不能边入组边改变分母,也不能让未授权角色提前看到开放结果。
判断期中规则能否照搬,先区分三件事:查看的目的、触发所依据的信息、谁有权看到结果。统计边界相似并不代表治理权限和最终推断相同。
这一小步的落点: 整数阶段规则与事件驱动边界的统计目标不同,但冻结数据和限制开放结果的治理要求同样不能省略。
达到预设信息量或阶段人数
冻结数据和未解决病例状态
按预设算法计算边界
由授权角色查看开放结果
综合疗效、安全性和成熟度
形成建议与正式决定
继续随访并保存全部版本和理由
达到预设信息量后先冻结数据和未决病例,再按预设程序计算边界,由授权角色查看开放结果并形成建议;研究团队随后按正式决定继续随访并保存全部版本。
结论边界:期中方法只在预定时间、数据成熟度和防火墙成立时有效。额外查看、延迟事件或方案修改都可能要求重新评估推断和报告方式。
从 DMC 纪要往回核对事件数、数据截止、边界版本和访问记录。若无法说明谁在何时获得了哪些信息,就不能把期中查看视为受控过程。
正式期中分析不是提前偷看,Simon 第一阶段也不是随意“看一眼”。二者都要求预设时间点、数据冻结、决策规则、角色权限和记录,但统计目标与治理结构不同。
教学设定总事件约 508,目标期中约 356 事件。采用 O’Brien–Fleming 类型 alpha spending;疗效边界严格,非约束性 futility 可降低无效继续风险。DMC 依据 charter 查看开放报告。
阶段 1 在目标方案可计入患者达到 16 人且主要响应状态冻结后评估:≤10 例确认缓解停止,≥11 例可继续。安全委员会可因硬暂停事件更早介入。
| 来源 | 为什么产生错误率问题 | 预设控制 | 输出要求 |
|---|---|---|---|
| OS 期中+最终 | 同一假设被重复检验 | alpha spending / group sequential boundary | 实际信息、名义边界、累计 alpha |
| OS+关键 PFS | 多个可确认性终点 | 层级、graphical procedure 或 gatekeeping | 每个假设的可用 alpha 和状态 |
| 多亚组 | 大量探索性比较 | 不作确认性声明;交互与区间为主 | 标注探索性和多重性限制 |
| 多次 DMC 审阅 | 非计划疗效查看可能泄露信息 | charter、开放/封闭报告、防火墙 | 访问日志和会议记录 |
| 项目文件 | 本章写入内容 | 最晚决策时间 | 主要责任角色 |
|---|---|---|---|
| Protocol | 期中/阶段分析目的、次数、触发和决策 | 首例入组前 | 统计/临床 |
| DMC/Committee Charter | 角色、开放报告、会议和防火墙 | 首例入组前 | DMC/安全委员会 |
| SAP/Interim SAP | 边界算法、实际信息、数据快照和输出 | 首次分析前 | 非盲统计 |
| Decision memo | 输入、结果、建议、决定和行动 | 每次会议即时归档 | 委员会/赞助方 |
正式期中分析和 Simon 第一阶段分别写清触发、数据成熟、修改限制和后续随访。
案例 A 使用实际信息比例计算边界;案例 B 阶段阈值严格按可计入目标方案人群。
保存 INFOFRAC、BOUNDARY、STAGE、DECISION 与数据快照 ID。
另一个程序/软件复算边界;委员会报告中的事件数与主数据库一致。
阶段性表和 memo 显示未成熟数据、决策不确定性与继续随访要求。
total_events <- 508
observed_events <- 356
information_fraction <- observed_events / total_events
stopifnot(information_fraction > 0, information_fraction <= 1)
# 正式 OBF spending 应用验证过的软件按实际信息比例生成;
# 本课程不提供可用于真实监管试验的最终边界。if (stage == 1L && n_evaluable == 16L) {
decision <- if (confirmed_responses <= 10L) "STOP_FUTILITY" else "CONTINUE"
}
if (stage == 2L && n_evaluable >= 47L) {
decision <- if (confirmed_responses >= 34L) "CROSSES_THRESHOLD" else "NO_GO"
}“DMC 在实际信息比例 0.701 时应用预设 spending 边界;建议基于疗效、成熟安全性和外部信息综合形成。”
“期中 p<0.05,因此试验可以提前宣告成功。”
安全性、剂量强度与方案可实施性
前 12 名患者中,3 人发生方案限制性毒性;没有达到硬暂停边界,但多名患者延迟进入第三周期,伊立替康和 5-FU 的相对剂量强度下降。
安全性不只是数有多少不良事件。团队还要判断目标联合方案能否按计划给出,以及毒性是否迫使患者持续减量、延迟或永久停用关键组分。
安全性与可实施性需要同时观察事件严重程度、医学严重性、发生时间、剂量暴露、周期进入、减量和永久停药。单看 AE 发生率无法判断方案能否按计划交付。
本章真正的分界是:安全事件与实际暴露能否共同说明方案是否可实施。先把这个分界说清,AE、给药记录、组分 RDI、暂停规则、医学审阅和委员会决定才不会各自采用不同口径。
读到这里,先不用判断哪一种分析方法更高级。只要能指出“方案在真实患者中能不能安全地执行?”中的冲突发生在研究问题、分母、时间顺序或证据责任的哪一处,就已经抓住后续判断的入口;术语会在需要时再出现。
案例 B 的安全先导按患者逐例审阅前两个周期的 RLT、严重事件、特别关注事件、周期进入率、各组分相对剂量强度和永久停药。若硬暂停事件出现,立即按章程处理;即使未触发硬停止,黄色可实施性信号也需要预设降阶或扩展评估。
“未触发停止边界”不等于“已经证明安全”。结果只能说明在当前人数、观察窗和支持治疗下,是否有理由按预设路径继续。
安全性与可实施性需要同时观察事件严重程度、医学严重性、发生时间、剂量暴露、周期进入、减量和永久停药。单看 AE 发生率无法判断方案能否按计划交付。
把最高等级、SAE、RLT 和 AESI 混成一个“严重毒性”指标,会掩盖它们不同的决策作用。事件数也不能直接当作发生患者数,因为同一患者可能有多条记录。
这一小步的落点:先把“安全事件与实际暴露能否共同说明方案是否可实施”作为当前案例的判断基准,再检查结论依赖的条件。
审阅这条结论时,应把适用条件和替代处理放在同一处。尤其当观察窗、剂量方案、组分计划或暂停标准改变时,原来的分母、事件规则或解释不能只换一个术语继续使用;需要从研究问题重新推导。
患者发生率、重复事件数、严重程度、seriousness 和因果关系是不同维度;组合方案还需要按组分计算实际暴露。
把重复 AE 当成多名患者会夸大发生率;把所有组分压成一个剂量强度,又会掩盖某一关键药物持续减量。
相对剂量强度(RDI)比较实际给药与计划给药。案例 B 以组分和计划周期为单位,而不是给组合方案一个模糊总值。
可实施性判断依赖完整给药记录、合理观察窗和预先定义的 RLT/硬暂停规则。真实剂量和支持治疗必须由专业团队另行确认。
严重程度等级与严重不良事件(serious adverse event, SAE)是不同维度;相对剂量强度(relative dose intensity, RDI)则衡量实际给药相对于计划给药的程度。
遇到类似问题,先按时间顺序列出给药、毒性、延迟、减量、停药和恢复,再选择术语和分析方法。这样更容易看出哪一步改变了比较对象、分母或可解释人群。
这一小步的落点:先识别错误做法会怎样扭曲“安全事件与实际暴露能否共同说明方案是否可实施”,再记住本章术语。
把“安全性可接受”拆开看:发生了哪些事件、多少患者受影响、各组分实际给了多少、周期是否延迟、是否触发暂停,以及委员会如何结合个案作出继续或降阶决定。
真实文件写法:“安全先导在预设观察窗内逐例审阅 RLT、硬暂停事件、周期 3 按时进入和各组分 RDI;触发红色边界时暂停并由委员会审议。”
分析动作:患者发生率先按患者和术语去重,暴露程序按组分累计计划与实际剂量;仪表盘并列显示 RLT、SAE、延迟、减量、RDI 和停药。
summary_patient <- aggregate(
cbind(any_AE = rep(1, nrow(ae)),
grade3 = as.integer(ae$grade >= 3),
SAE = as.integer(ae$serious == "Y")) ~ patient_id,
data = ae, FUN = max
)对应下载脚本:R/09_safety_and_exposure.R。先把多条事件压到患者级,再计算发生患者数。结果怎样写:报告应区分“发生了毒性”与“方案无法持续实施”。可行性结论需要同时依赖事件模式、暴露下降和方案偏离,而不是单个百分比。
为什么重要: 只数 AE 会忽略方案是否还能按计划实施;只看 RDI 又可能掩盖少数严重事件。患者发生率、事件数、暴露和医学判断必须放在一起,才回答可实施性问题。
这一小步的落点: 事件、患者和给药组分三条线能在同一决策记录中对上,安全先导才不是一张 AE 汇总表。
案例 A 的大样本安全性更适合稳定描述罕见事件和组间差异;案例 B 的先导阶段更强调早期规则和逐例医学判断,阈值不能直接互换。
案例 A 更适合描述随机组间的总体安全性与暴露差异;案例 B 的先导阶段要用预设门槛支持早期继续、暂停或降阶。发生率可以比较,决策阈值不能互换。
比较两项研究时,先明确安全分析是在描述总体风险,还是直接决定目标联合方案能否继续。这个目的差异决定观察窗、阈值、逐例审阅和结论措辞。
这一小步的落点: 随机试验的组间安全性描述不能替代单臂先导的可实施性决策,反之亦然。
出现不良事件、延迟或减量
分别识别患者、事件和给药组分
判断是否属于 RLT/AESI/硬暂停
计算周期进入率与组分 RDI
与预设绿黄红边界比较
委员会记录继续、暂停或降阶理由
报告当前观察窗内能支持和不能支持的结论
出现不良事件或减量后,先区分患者、事件和治疗组分,再判断是否触发 RLT、AESI 或硬暂停,并计算周期进入率与组分 RDI,最后由委员会记录继续、暂停或降阶的理由。
结论边界:安全汇总不能替代个案医学审阅,也不能从小样本排除低频严重风险。剂量、支持治疗或观察窗改变后,原可实施性结论需要重新评估。
从委员会决定往回看,不仅要找到严重事件,还要找到剂量延迟、减量和永久停药。若报告只剩一个发生率,就无法判断方案是否真的按计划实施。
AE、TEAE、TRAE、SAE、AESI、grade 和 seriousness 是不同维度。患者发生率要按患者计数,事件数要保留重复事件;剂量强度要按治疗组分和计划暴露计算。安全先导的核心问题是:目标联合方案 T 在前两个周期是否安全且可实施。
安全性按实际治疗和实际暴露呈现;比较患者发生率、严重程度、SAE/AESI、停药和暴露差异。开放标签下归因判断可能受预期影响,因此全因 TEAE 与治疗相关事件都要透明。
逐例审阅 RLT、治疗相关死亡、骨髓抑制/感染、腹泻、出血、血栓、高血压、蛋白尿、免疫相关 AE,以及依沃西单抗与 FOLFOXIRI 各组分的延迟、减量和永久停药。
| 患者 | RLT/严重事件 | 周期 2/3 | 组分 RDI | 永久停药 | 决策贡献 |
|---|---|---|---|---|---|
| B003 | 3级发热性中性粒细胞减少,SAE | 延迟 7 天;可进入周期 3 | 伊立替康 78% | 否 | RLT 1;感染风险 |
| B006 | 持续 3级腹泻 | 周期 2 延至第 38 天 | 5-FU/伊立替康 <70% | 否 | RLT 2;触发可实施性红/黄审阅 |
| B009 | 3级免疫相关肝炎 | 依沃西单抗永久停用 | 免疫组分低 | 是 | RLT 3;9例时黄色扩展 |
| B013–B015 | 降阶方案 D | 按预设路径 | 化疗组分约 80% | 按实际 | 不混入目标方案 Simon;用于降阶描述 |
| 项目文件 | 本章写入内容 | 最晚决策时间 | 主要责任角色 |
|---|---|---|---|
| Protocol Safety Section | RLT、AESI、硬暂停、降阶和支持治疗 | 首例入组前 | 临床/安全 |
| Safety Committee Charter | 逐例审阅、绿黄红阈值和记录 | 首例入组前 | 安全委员会 |
| CRF/Exposure | 事件、组分给药、延迟、减量、停药 | 数据库上线前 | 数据/临床 |
| SAP/TFL | 患者发生率、事件数、worst grade、RDI | 分析前冻结 | 统计 |
明确安全观察窗、RLT 构成、硬暂停事件和预设降阶;真实剂量须由专业团队另行确认。
患者发生率去重,事件数保留;worst grade、首次发生时间、暴露和停药并列。
RDI 以组分和计划周期为单位;避免把组合方案压成单一“dose intensity”。
SAE 与 grade 逻辑核对;重复事件患者级聚合;给药汇总与源记录累计一致。
TEAE、grade≥3、SAE、AESI、停药、延迟、RDI 和患者 profile。
ae_saf <- subset(ae, patient_id %in% safety_ids)
patient_ae <- aggregate(grade ~ patient_id + term,
data = ae_saf, FUN = max)
any_teae <- length(unique(ae_saf$patient_id))
rate <- any_teae / length(safety_ids)
# 事件数 = nrow(ae_saf);患者发生数 = unique patient_idrdi <- aggregate(cbind(actual_dose_pct, planned_dose_pct) ~
patient_id + component, data = cycle, FUN = sum)
rdi$RDI <- rdi$actual_dose_pct / rdi$planned_dose_pct
# 延迟和永久停药应另列,避免相同 RDI 掩盖不同实施路径“前 12 例中 3 例发生 RLT;目标方案未触及预设硬停止边界,但周期 3 按时进入率与组分 RDI 处于黄色区间,委员会建议按预设降阶路径继续评估。”
“总体 AE 可控,因此联合方案安全。”
转化医学与动态生物标志物
研究中,基线 ctDNA 阳性且第 8 周样本可分析的患者里,很多人出现“清除”,并且后续 PFS 较长。看起来这像是一个很有希望的预测标志物。
但第 8 周样本只来自仍在随访、能够采血且检测通过的人。早期死亡、病情恶化、漏采和 QC 失败者被排除后,分析人群已经发生了选择。
动态生物标志物分析必须先固定样本时间点、基线状态、检测性能、失败原因和可分析人群。样本缺失通常与病情、毒性和现场流程有关,不能当作随机缺失。
本章真正的分界是:样本可用性和 landmark 条件限定了哪一类患者。先把这个分界说清,样本漏斗、检测批次、动态分析集、landmark 数据和关联模型才不会各自采用不同口径。
读到这里,先不用判断哪一种分析方法更高级。只要能指出“生物标志物怎样从“有变化”走到“有解释”?”中的冲突发生在研究问题、分母、时间顺序或证据责任的哪一处,就已经抓住后续判断的入口;术语会在需要时再出现。
案例 B 的 ctDNA 清除只在基线阳性且目标动态样本可分析者中定义;基线阴性不是“清除成功”,漏采和 QC 失败也必须单列。与后续结局的关联应使用预设 landmark 或时间依赖方法,并明确这是探索性结果。
单臂动态标志物通常只能描述预后性或治疗中关联,不能证明它预测了新增药物的特异获益。
动态生物标志物分析必须先固定样本时间点、基线状态、检测性能、失败原因和可分析人群。样本缺失通常与病情、毒性和现场流程有关,不能当作随机缺失。
在所有有结果的样本中比较“清除”与结局,会把基线阴性、未采集、检测失败和早期进展混在一起。漂亮的关联图可能主要反映谁活得足够久并完成采样。
这一小步的落点:先把“样本可用性和 landmark 条件限定了哪一类患者”作为当前案例的判断基准,再检查结论依赖的条件。
审阅这条结论时,应把适用条件和替代处理放在同一处。尤其当采样时间点、检测性能、landmark 时间或缺失机制改变时,原来的分母、事件规则或解释不能只换一个术语继续使用;需要从研究问题重新推导。
从全治疗集到基线样本、基线阳性、动态可分析和 landmark 人群,每一步都会减少分母,而且减少原因可能与预后相关。
排除 landmark 前早死或进展者,会让“有动态样本”的组天然拥有一段必须存活的时间,形成 immortal-time 和选择偏倚。
Landmark 分析在预先指定时间点重新定义风险集,只比较在该时点仍满足纳入条件的人;它不能恢复被排除患者的随机可比性。
结果依赖采样时间、处理延迟、检测下限、assay 版本、批次桥接和缺失机制。Cutpoint 也应有外部或预设依据。
这里需要使用 landmark 分析(landmark analysis)。它在预先指定的时间点,只纳入当时仍符合条件且已有标志物状态的患者,再从该时间点向后观察结局,以减少保证时间偏倚。
遇到类似问题,先按时间顺序列出基线样本、动态样本、检测结果、landmark 和后续结局,再选择术语和分析方法。这样更容易看出哪一步改变了比较对象、分母或可解释人群。
这一小步的落点:先识别错误做法会怎样扭曲“样本可用性和 landmark 条件限定了哪一类患者”,再记住本章术语。
先画出样本漏斗,再谈关联:多少患者计划采样、实际采集、通过 QC、完成检测、基线阳性并有动态样本;随后再核对批次、landmark 条件和模型使用的是哪一层分母。
真实文件写法:“ctDNA 清除仅在基线 ctDNA 阳性且预设动态样本可分析者中定义;landmark 时间、纳入条件、批次和失败原因在分析前冻结。”
分析动作:程序先建立计划—采集—处理—检测—可分析漏斗,再派生 baseline-positive、动态可分析和 landmark 标志;模型同时保存批次与关键临床协变量。
basepos <- unique(ctd$patient_id[
ctd$timepoint == "baseline" & ctd$baseline_positive == "Y"
])
dyn <- subset(ctd, patient_id %in% basepos & timepoint == "C2D1")对应下载脚本:R/10_biomarker_landmark.R。基线阴性患者不进入‘清除’定义,动态样本缺失也不能改写成未清除。结果怎样写:输出先报告每层分母和缺失原因,再给清除率、关联估计及区间。相关性只能支持探索性生物学解释,不能自动写成预测性或替代终点。
为什么重要: 动态分析只覆盖活到采样时点且样本成功的患者。若早期事件和样本失败没有在漏斗中出现,所谓“清除率”或结局关联就可能被选择性分母放大。
这一小步的落点: 每一名被排除的患者都能在样本漏斗中找到原因,动态标志物结果才有可解释的分母。
案例 A 可在随机框架内探索标志物与治疗效应交互,但仍需要预设和外部验证;案例 B 更容易获得动态样本,却更受单臂混杂和选择性缺失限制。
案例 A 的随机框架可以探索标志物与治疗效应交互;案例 B 的动态样本更适合生成机制假设,却更受单臂混杂和存活到采样影响。两类分析不能只因都叫“亚组”或“标志物”而互换结论。
比较标志物结果时,先看是否有对照、谁能进入分析、时间点如何限定。随机交互更接近预测性问题,单臂动态关联通常仍只能支持探索性解释。
这一小步的落点: 动态关联可以生成假设;没有随机对照和独立验证,不能把它写成预测性标志物结论。
提出标志物与临床结局的明确问题
固定样本时间和检测方法
展示从全队列到可分析集的分母漏斗
预设 landmark/时间依赖方法
估计关联并报告不确定性
检查批次、缺失和生存到采样偏倚
把结果标注为探索性并要求独立验证
从明确的生物学问题出发,固定采样时间和检测方法,再展示全队列到可分析集的漏斗;之后才选择 landmark 或时间依赖方法,并检查批次、缺失和存活到采样偏倚。
结论边界:landmark 能减少部分时间偏倚,但不能消除未测量混杂、检测误差或样本选择。时间点、LOD、assay 版本改变后,清除定义和结果不可直接照搬。
从一条“ctDNA 清除与结局相关”的结果往回追,先核对基线阳性和动态样本分母,再看早期死亡、漏采和 QC 失败去了哪里。分母不透明时,模型系数不能单独承担解释。
单臂研究中的标志物分析通常只能描述预后性或治疗中关联,难以区分真正预测性效应。动态标志物还受 baseline positivity、存活到采样时点、样本成功、批次和 landmark 选择影响。
RAS、BRAF、肝转移等亚组用于评估一致性和异质性假设。应报告交互估计和区间,不用“一个显著、一个不显著”证明效应不同。
探索 RAS/BRAF、肝转移、PD-L1、免疫浸润、VEGF/血管生成指标、基线与动态 ctDNA、配对组织变化,以及它们与持续临床获益的关联。
| 层级 | 定义 | 不能混淆的对象 | 输出 |
|---|---|---|---|
| 全治疗集 | 至少一次治疗 | 未治疗患者 | 样本计划完成率 |
| 基线样本集 | 基线血样采集且 QC 通过 | 采集失败/QC 失败 | 基线可测率 |
| 基线 ctDNA 阳性集 | 基线高于预设检测阈值 | 基线阴性者不是“未清除” | 清除可定义分母 |
| 动态可分析集 | 基线阳性+目标动态时间点 QC 通过 | 早死、漏采、QC 失败 | 清除率与缺失原因 |
| Landmark 集 | 在预设 landmark 仍存活/在观察且有分类 | landmark 前事件者 | landmark 后 PFS/DoR 关联 |
| 患者 | 基线 | C2D1/W8 | 归类 | 偏倚提醒 |
|---|---|---|---|---|
| M01 | ctDNA 阳性,QC PASS | 低于 LOD | 清除 | 需报告 assay/LOD 和时间窗 |
| M02 | ctDNA 阴性 | 阴性 | 清除不适用 | 不能记作“清除成功” |
| M03 | 阳性 | 早期死亡未采 | 动态不可评价 | 排除会产生 immortal-time/选择偏倚 |
| M04 | 阳性 | 样本 QC 失败 | 不可评价 | 与临床漏采原因分开 |
| M05 | 组织基线成功 | 仅因获益可重复活检 | 配对组织 | 配对集偏向获益患者 |
| M06 | batch A / v1.0 | batch B / v1.1 | 需桥接或分层 | 不能直接当作同一尺度 |
| 项目文件 | 本章写入内容 | 最晚决策时间 | 主要责任角色 |
|---|---|---|---|
| Biomarker analysis plan | 角色、时间点、分母、模型、多重性 | 数据库锁定/assay 解盲前 | 转化/统计 |
| Sample accountability | 计划、采集、QC、assay 和可分析 | 每次数据冻结 | 实验室/数据 |
| Assay metadata | 版本、批次、LOD/LOQ、桥接和失败 | 检测前/版本切换前 | 实验室 |
| Landmark specification | 时间点、纳入、事件起点和缺失 | 看结局前 | 统计/临床 |
探索终点和样本时间点写入 protocol;预测性/伴随诊断仅作为待验证假设。
连续分析优先;cutpoint 需来源;landmark 和时间依赖方法的风险集明确。
清除变量只在 baseline-positive set 定义;paired set 和全队列分开。
复算分母漏斗;检查 baseline-negative 是否被错误记为未清除/清除;批次与结局是否混杂。
样本 accountability、缺失表、ctDNA 清除、landmark 关联和探索 forest。
basepos_ids <- unique(ctdna$patient_id[
ctdna$timepoint == "baseline" & ctdna$baseline_positive == "Y"])
dynamic <- subset(ctdna,
patient_id %in% basepos_ids & timepoint == "C2D1")
dynamic$clearance <- dynamic$detected == "N"
# baseline-negative patients are outside the clearance estimandlandmark_day <- 56
lm <- subset(patient,
treated == 1 & early_death != "Y")
lm <- merge(lm, dynamic[c("patient_id","clearance")],
by="patient_id", all.x=TRUE)
lm$clearance[is.na(lm$clearance)] <- NA # 不把漏采当未清除
# 从 landmark 后重新定义风险时间;报告被排除的早期事件“在基线 ctDNA 阳性且 C2D1 样本可分析的患者中,清除与 landmark 后持续获益存在探索性关联;该分析受动态样本选择和未测量混杂影响,需要独立验证。”
“ctDNA 清除证明了治疗机制,并可预测哪些患者从依沃西单抗获益。”
TFL、QC、追溯与结果解释
结果报告写着“试验组降低死亡风险”,但审阅者追问:这句话来自哪张表、哪个单元格、哪个分析数据集和哪条 SAP 规则?程序使用了什么版本,关键事件又怎样核对?
完整交付不是把 Protocol、CRF、SAP、代码和表格分别做完,而是让任何重要结论都能沿同一条链反向重建。
可复核结论需要从研究问题一路追到 Protocol、SAP、数据规格、程序、TFL 和解释语句。任何关键数字都应能找到输入版本、算法、日志和独立核对记录。
本章真正的分界是:每个结论能否反查到数据、规则、程序和复核记录。先把这个分界说清,SAP ID、数据版本、程序、TFL、QC 记录和解释 memo才不会各自采用不同口径。
读到这里,先不用判断哪一种分析方法更高级。只要能指出“一项分析怎样变成可复核的结论?”中的冲突发生在研究问题、分母、时间顺序或证据责任的哪一处,就已经抓住后续判断的入口;术语会在需要时再出现。
案例 A 的主要 OS 结论必须与随机化、预设估计目标、期中/最终错误率、数据成熟度、主要模型和敏感性分析一致。论文或 CSR 中的每句话都应指向明确的 TFL 单元格和分析版本。
QC 优先覆盖主要终点、阶段决策、关键安全性和容易改变分母的规则。最终解释同时写明可以支持、仅探索和不能支持的结论。
可复核结论需要从研究问题一路追到 Protocol、SAP、数据规格、程序、TFL 和解释语句。任何关键数字都应能找到输入版本、算法、日志和独立核对记录。
程序能够运行并不等于结果可靠。手工改表、复制旧脚注、包版本变化、随机种子缺失或分析集名单未冻结,都可能让同一代码包无法重建原结果。
这一小步的落点:先把“每个结论能否反查到数据、规则、程序和复核记录”作为当前案例的判断基准,再检查结论依赖的条件。
审阅这条结论时,应把适用条件和替代处理放在同一处。尤其当数据截止、程序版本、派生规则或解释口径改变时,原来的分母、事件规则或解释不能只换一个术语继续使用;需要从研究问题重新推导。
同一数字可能因数据截止、分母、软件版本、默认选项或脚注变化而改变。没有 manifest 和版本记录,重跑结果无法确认是否同一分析。
表格看起来整齐、代码没有报错,并不等于实现正确。最危险的错误通常是分母、日期优先级、重复计数和结论超出设计。
TFL 指表、图和列表。追溯链把 Protocol/SAP 条款、源数据、分析变量、程序、输出单元格和解释语句连接起来。
可复核性依赖稳定文件名、数据冻结 ID、程序版本、输入 hash、日志和独立复算。解释还必须服从设计能够承担的证据强度。
这里的核心概念是追溯性(traceability)。它要求正向说明一个方案承诺怎样变成数据和输出,也要求反向说明报告中的数字来自哪个变量、程序和数据版本。
遇到类似问题,先按时间顺序列出研究问题、文件规则、数据、程序、输出、QC 和文字结论,再选择术语和分析方法。这样更容易看出哪一步改变了比较对象、分母或可解释人群。
这一小步的落点:先识别错误做法会怎样扭曲“每个结论能否反查到数据、规则、程序和复核记录”,再记住本章术语。
从最终报告的一条关键数字开始,依次找到 TFL 单元格、分析数据参数、程序版本、SAP 条款和源记录,再看独立 QC 用什么不同路径完成复算。
真实文件写法:“每个主要和关键次要输出建立唯一 TFL ID;分析包保存输入数据、脚本顺序、软件与包版本、seed、hash、sessionInfo、日志和 QC 结论。”
分析动作:主程序生成结果后,独立或半独立程序复算关键数字;追溯矩阵把 SAP ID、分析变量、程序文件、输出编号和解释 memo 逐项连接。
tab <- table(main$best_confirmed_response)
x2 <- sum(tab[names(tab) %in% c("CR", "PR")])
stopifnot(x1 == x2)对应下载脚本:R/12_qc_checks.R。QC 用不同计数路径复算响应人数,而不是比较两个来源相同的成品对象。结果怎样写:最终结论分成可支持、探索性和不能支持三层,并保留数据截止、分析集、效应量、不确定性与限制。审阅者可以从文字反查到患者级证据。
为什么重要: 把代码、表格和文字分别归档并不等于可复核。只有结论能沿唯一链条退回规则、数据与复算记录,另一名分析者才可能重建它。
这一小步的落点: 一条关键结论能从文字退回 TFL、程序、SAP 和患者级证据,分析交付才算可复核。
案例 A 的确认性包更强调错误率、主要终点和随机化追溯;案例 B 的 IIT 包还要突出阶段边界、目标方案分母和探索标志物限制。QC 原则相同,证据责任不同。
案例 A 的确认性包强调随机化、主要终点和错误率;案例 B 的 IIT 包还要把阶段阈值、目标方案分母、安全可实施性和探索性标志物限制放在一起。追溯方法相同,允许的结论强度不同。
比较两类证据包时,不要只看文件是否齐全。要看每条结论承担什么责任:确认随机治疗策略差异,还是支持进一步随机验证。证据责任决定哪些限制必须写进 interpretation memo。
这一小步的落点: 同样完整的追溯链,可以支持不同强度的结论;设计边界不能被文件数量放大。
从一条拟写的结论出发
定位对应 TFL 单元格和脚注
定位分析数据参数、分母和截止
定位程序版本和 SAP 条款
回到源记录核对关键患者
由独立 QC 复算高风险结果
在 interpretation memo 中限制结论强度
先定位结论对应的 TFL 单元格和脚注,再找到分析参数、分母、数据截止、程序版本与 SAP 条款,最后回到关键患者,并由独立 QC 复算高风险结果。
结论边界:完整追溯能发现和解释错误,却不能替代科学判断。若源数据质量不足或研究设计不能支持某种结论,再完善的程序包也不能扩大证据边界。
真正的验收不是确认“文件都在”,而是让另一名分析者选择一个关键数字后,能够沿追溯矩阵重建并解释它。任何断点都应留下问题记录,而不是靠人工记忆补上。
可审计交付不是把代码、表格和论文分别做完,而是建立反向追溯:论文句子来自哪个 TFL 单元格,单元格来自哪个分析变量,变量来自哪些源记录和 SAP 规则,程序在什么版本和种子下运行,QC 怎样证明实现一致。
主要 OS 结论必须与随机化、预设 estimand、正式期中/最终错误率、数据成熟度和敏感性一致。亚组和非 PH 结果不能事后替代主要分析。
最终包同时展示 ORR/Simon、DoR/PFS、安全先导、组分暴露、样本漏斗和 biomarker 结果。结论应是“是否值得随机验证”,而不是“已证明优于标准”。
ORR_T_FL=Y、CONFIRMED_BOR、RESPFL。| 输出 | 分析集/分母 | 关键脚注 | 核心 QC |
|---|---|---|---|
| Disposition / baseline | 随机/入组、治疗、各分析集 | 排除原因和实际治疗 | 患者数与 ADSL 一致 |
| ORR / DoR | 目标方案;全治疗描述 | BICR、确认、NE、数据截止 | 患者 listing 独立计数 |
| OS/PFS / 12月 PFS | endpoint-specific | 起点、事件、删失、风险人数 | 事件日期与 ADTTE |
| TEAE / SAE / AESI | Safety Set | 患者发生率、版本、worst grade | 患者去重与事件数分开 |
| Exposure / RDI | 按组分治疗者 | 计划周期、延迟、永久停药 | 累计剂量复算 |
| Sample accountability | 全队列→可分析集 | 采集、QC、assay 版本、失败 | 样本台账逐层一致 |
| ctDNA clearance | baseline-positive+动态可分析 | LOD、时间点、缺失 | 基线阴性不进入分母 |
| 项目文件 | 本章写入内容 | 最晚决策时间 | 主要责任角色 |
|---|---|---|---|
| TFL shells/index | 标题、分母、截止、单位、脚注 | 数据库锁定前 | 统计/医学写作 |
| QC plan/log | 关键风险、方法、结果和处理 | 编程启动前持续更新 | 统计编程/QC |
| Analysis package manifest | 数据、程序、版本、输出和 hash | 最终运行前 | 统计编程 |
| Interpretation memo | 可支持/探索/不可支持的结论 | 结果解读前 | 临床/统计/写作 |
Protocol/SAP 的关键句有唯一 ID,方便变更影响评估;每次 amendment 记录哪些数据和输出受影响。
分析运行清单记录脚本顺序、package 版本、seed、输入 hash 和 sessionInfo。
关键 cell 保存源数据范围和派生理由;输出脚注说明分析集和不可评价。
风险导向:主要终点、阶段决策、关键安全性和标志物分母独立复算。
CSR/论文语言由 interpretation memo 约束,避免超出设计。
# 独立方式复算 ORR 响应者数
x_program <- sum(main$confirmed_BOR %in% c("CR","PR"))
x_listing <- sum(table(main$confirmed_BOR)[c("CR","PR")], na.rm=TRUE)
stopifnot(x_program == x_listing)
# 保存可复现环境
writeLines(capture.output(sessionInfo()), "output/sessionInfo.txt")
writeLines("seed=20260805", "output/run_manifest.txt")“结果越过单臂教学阈值,且安全先导未触及硬停止边界;这些发现支持考虑后续随机验证,不能证明联合方案优于 FOLFOXIRI。”
“试验成功证明依沃西单抗显著提高疗效,并确认 ctDNA 清除是预测性标志物。”