随机化(Randomization)是临床试验的基石。
这句话我在面试里说了不下十遍。每次说的时候底气都很足——直到面试官开始往下挖。
上统计课的时候,老师讲得轻描淡写:随机化就是让混杂变量在组间均匀分布。掷硬币,分两组,完事。我当时觉得,这有什么难的?
rand = rand("uniform");
group = if rand < 0.5 then "Treatment" else "Control";
一行代码。大样本下组间基线特征自然均衡。简单随机化(Simple Randomization)操作起来也确实这么痛快——每个受试者扔一次骰子,去哪组全凭运气。
问题出在小样本上。
四十个人的试验,随机下来可能是 24 比 16。理论上不偏,但统计效能(power)被削了一块——你本来算好需要二十个对照,实际只拿到十六个,power 就缩水了。
面试官问我小样本用什么方法。
我说分层随机化。
(现在回头想,这个回答不对。应该先想到区组随机化。)
每个区块都是一个小平衡
区组随机化(Block Randomization)是我准备面试的时候啃得最细的一个点。
道理不复杂。把受试者切分成若干"区块",每个区块内部按固定比例分。比如区块大小是 4,比例 1:1——每四个人里一定有两个试验、两个对照。区块内部严格对称。
这个设计在多中心试验(multi-center trial)里特别好用。A 中心招了三十个人,B 中心只有十个——简单随机化可能让 A 中心变成 20:10,B 中心变成 8:2,摆在一起虽然整体是 1:1,但每个中心内部歪得离谱。区组随机化让每个中心各自维持内部平衡。
前提是区块大小不被猜到。
如果区块固定为 4,研究者看到前三个人的分组就能反推第四个。盲法(blinding)原地作废。
解法:把区块大小也随机化。可以是 4,也可以是 6,随机抽。
面试官追着这个点问。
“区组大小固定的话,会有什么后果?”
我顿了三秒。说,可能造成选择偏倚——研究者会看前面几个人的分组,决定要不要让下一个人入组。
他没接话。
(后来我琢磨,我的方向大概对了一半。猜到分组确实会打穿盲法。但"决定是否入组"这个说法不准确——入组标准是写死的,研究者不应该有裁量空间。真正怕的是他通过控制入组节奏来影响分组:预测下一个会进试验组,就稍微拖一拖。这更接近实施偏倚而不是选择偏倚。)
按特征分堆
分层随机化(Stratified Randomization)解决另一件事。
有些变量对结局影响很大——年龄、性别、疾病分期。小样本里,纯随机可能让这些变量在组间歪掉。分层做法的思路是:先按重要特征切层(60 岁以下/60 岁以上、男/女),然后在每一层内部再做随机。保证每个分层因素在两组之间是平衡的。
面试题经常问:“分层和区组有什么区别?”
分层按受试者特征来,区组按入组先后来。分层管协变量的平衡,区组管各时间点样本量的平衡。两者不互斥——可以先分层,再在层内跑区组随机化。面试的时候如果能说出这个组合用法,大概能加点分。
一时语塞
那场面试没有后续。
我猜是因为答得太虚。概念头头是道,落地一问就露馅。
面试官最后抛了一个开放式结尾:“如果一个中心招募速度特别慢,怎么处理?”
我说,跟中心研究者沟通,了解原因。如果是患者来源问题,调整招募策略或者增加中心。
他说了一句让我记到现在的话。
“CRO 行业现在收缩得很厉害。很多中心不是招不到患者,是申办方没钱了,主动暂停试验。”
我当场石化。
背了那么多术语、方法、最佳实践,到头来被一个行业事实干翻了。统计方法能解决的问题是有边界的——资金、政策、市场周期,这些东西不在任何一本 GCP 教材里。
后来我查了一下,CRO 确实在过冬。不是哪个公司的原因,是整个赛道都在缩。
但这不是我放弃的理由。用代码处理临床数据这件事,在药企可以做,在别的地方也可以做。盒子里的是工具,盒子外的才是问题。