如何将临床试验数据与自然史对照进行比较

机器算法验证 生存 临床试验 截断
2022-03-16 09:18:07

背景:我有兴趣了解如何分析来自具有自然历史控制的临床试验的数据,这意味着,临床试验招募了一群人(例如,那些具有疾病遗传风险的人),所有这些人都接受了治疗一种药物,并将它们的存活率(例如,疾病发作时的年龄或因这种疾病导致的死亡)与具有相同遗传风险的未经治疗的历史对照的存活率进行比较。

在开始之前,我只想承认我已经阅读了涉及该主题的 FDA 指导文件(例如罕见病:药物开发中的常见问题),并且我很清楚有许多类型的偏见可以潜入自然历史比较,因此,FDA 很少接受此类试验作为药物疗效的证据,而通常将随机试验视为更有力的证据。如何确定自然史队列是否可以公平地与接受药物治疗的前瞻性队列进行比较是一个重要而复杂的问题。但这不是我今天的问题的主题。相反,我发现我被一个更简单的问题难住了,如果自然历史队列被认为具有可比性和无偏性等等,那么从统计学上讲,如何进行比较?

所以这里有一个场景。

  • 为简单起见,假设我的疾病有一个已知的单一遗传原因,具有这种基因型的人在某个年龄之前都非常健康,然后他们突然病得很重。疾病发作的年龄是高度可变的,并且危险随年龄而变化。下面描述的每个数据集中的每个人都有这种致病基因型。
  • 在数据集 A 中,我有一个假设临床试验中的人的数据。他们在一岁时入组(starting_age),接受了药物治疗,并被跟踪了一段时间,直到第二岁(last_age)他们生病(event == 1)或退出试验(event == 0)。
  • 在“理想的理想”情况下,自然史队列可能是大量具有这种基因型的人,从出生到他们死于这种疾病或死于不相关的原因。那种数据集不存在。相反,考虑两个可能的自然历史队列可能的选择(B 和 C)......
  • 在数据集 B 中,我有一些人的数据,这些人在某个随机年龄starting_agelast_age生病 ( event == 1) 或退出研究 ( event == 0)。不能假设起始年龄和随访年数的分布与数据集 A 中的分布相同。
  • 在数据集 C 中,我有纯粹的回顾性数据;这里没有预期的后续行动。我们只是观察每个人一次。age观察到有些人在某个特定年龄(和)生病了,而另一些人在某个特定年龄(event == 1)被认为仍然健康ageevent == 0

如果我正确理解术语,A 和 B 中的数据将被视为左截断和右删失;C 中的数据仅被视为右删失。根据Cain 2011中使用的术语,我认为数据集 B 是“流行队列”,而数据集 C 是“事件队列”。

我的问题是:

  1. 鉴于数据在每个人的不同年龄被左截断,如何(如果有的话)为数据集 A 或 B 构建生存函数(或危险函数等)?
  2. 将使用什么统计测试(或自举方法)来测试数据集 A 中的人是否比 B 或 C 中的人存活时间更长或风险显着降低?
  3. 如果你只有数据集 B 或 C,并且你想估计一个给定的临床试验的统计功效,其中有N个个体,对于给定的风险比,你会怎么做?
  4. (额外的问题)如果人们也有,比如说,不同的基因突变与不同的危害相关,作为年龄的函数,你将如何将该变量纳入上述答案?

到目前为止我尝试过的一些事情:

  • 我考虑了 Flora 的 Z 统计量 [ Flora 1978 ],有些人已将其应用于类似情况,但我担心它没有考虑用作参考的自然历史队列中的抽样方差。
  • 我用谷歌搜索了一些不同的术语组合,例如具有不同左截断时间的生存分析,并找到了一些讨论类似问题的页面,例如生存分析:左截断数据使用 PROC PHREG 生存左截断,但这些并没有解释底层他们的解决方案的数学。
  • 我终于遇到了Cain 2011 ,它详细讨论了这个问题,并且有用的是,在增补中提供了用于处理左截断的 R 代码他们为包含左截断的 MLE 实现了自己的函数,但声称左截断已经可以使用 Rsurvival库中内置的功能在 Cox 比例风险模型中处理,例如:coxph(Surv(time=agestart,time2=x,event=cx,type='counting')~bmi). 这里Surv创建一个对象time作为起始年龄,以及time2作为event发生或没有发生的年龄。这听起来很明智,尽管 的帮助文件Surv并没有解释它在这里实际做了什么——例如它没有解释counting模型需要什么。我翻到survival说明书并且,作为 的参考counting,指向了Andersen & Gill 1982,这反过来又有点让我头疼,似乎没有讨论左截断,或者至少不是那个名字。一个特点是“计数”模型似乎是为适应个人一生中可能发生多个事件的情况而构建的,在我的示例中并非如此,但也许这并不重要。
  • 基于以上所述,Cox“计数”模型似乎是比较数据集 A 和 B 的正确方法,我能够在 R 中进行这样的比较(参见下面的代码),尽管我仍在努力理解是否我在这里做的是正确的事情,我不确定如何(如果有的话)这种方法可以应用于比较数据集 A 和 C。
  • 最后,我在Cross Validated搜索了生存左截断,并发现大量实例中人们提出了与我所问的问题类似问题1、2、3、4、4、5、6、7 大多数没有得到回答一个指向上面的 Cain 参考文献,另一个指向Klein & Moeschberger 2003这很有帮助(参见 egp 123 和第 312 页),并且似乎支持可以使用相当简单的 Cox 方法比较 A 和 B 的概念,尽管它没有解决 A 与 C 的可比性,也没有解决功率计算问题(不过,如果回答了统计测试问题,我大概可以通过一些引导来获得权力)。

以下是 R 中的一些假设数据,说明了这种情况。我为每个数据集包含了 20 行,但如果它很重要,在我想象的现实生活场景中,数据集 A 和 B 可能大约为 50 或 100 个患者,数据集 C 可能大约为500 或 1,000 名患者。

# A) hypothetical data from clinical trial
data_a = read.table(sep='|',header=T,textConnection("
indiv_id|starting_age|last_age|event
1|33|42|0
2|45|49|0
3|47|52|1
4|30|34|0
5|37|44|0
6|34|37|0
7|29|34|0
8|58|66|0
9|58|60|0
10|66|75|0
11|37|41|0
12|37|46|0
13|58|62|0
14|44|48|1
15|45|50|0
16|56|65|0
17|54|63|0
18|36|41|0
19|47|55|1
20|45|55|0
"))

# B) hypothetical data from a prospective natural history study
data_b = read.table(sep='|',header=T,textConnection("
indiv_id|starting_age|last_age|event
101|19|28|0
102|39|52|0
103|38|41|1
104|18|27|0
105|20|24|0
106|16|20|0
107|39|41|0
108|48|50|0
109|40|50|0
110|38|41|1
111|40|43|1
112|26|29|0
113|37|39|0
114|21|30|0
115|36|41|1
116|46|48|0
117|27|32|0
118|26|29|0
119|29|38|0
120|47|58|0
"))


# C) hypothetical data from a retrospective natural history study
data_c = read.table(sep='|',header=T,textConnection("
indiv_id|age|event
201|43|1
202|53|1
203|64|1
204|45|1
205|88|1
206|70|1
207|66|1
208|55|1
209|51|1
210|48|1
211|63|1
212|36|0
213|61|0
214|63|1
215|63|1
216|57|1
217|74|0
218|63|1
219|59|1
220|57|1
"))


# one possible approach to compare A and B using Cox counting model
data_a$drug = TRUE
data_b$drug = FALSE
nh_compare = rbind(data_a, data_b)
m = survfit(Surv(time=starting_age,time2=last_age,event=event,type='counting')~drug, data=nh_compare)
summary(m)
coxph(Surv(time=starting_age,time2=last_age,event=event,type='counting')~drug, data=nh_compare)

最后说明:因为在 Cross Validated 上发布 >2 个链接需要 10 的声誉,所以我已经删除了所有应该出现在上面的(许多)超链接。我的博客上提供了带有链接的这篇文章的版本,如果或当我被允许这样做时,我将更新这篇文章以包含链接。 更新:感谢所有投票的人!我现在的声誉 >10 并更新了这篇文章以包含链接。

2个回答

多年后,我得到了一个令人满意的答案。这确实证明是使用Cox 比例风险计数模型,除了不同的右删失时间外,它还允许您考虑不同的左截断时间(您开始关注个人的年龄)。如问题中所述,这是在R中的survivalcoxph函数中实现的,其中time左截断时间time2是右删失时间,是event右手时间发生的事情,您可以使用它type='counting'来指定Cox计数模型.

我的帖子中提出的具体问题的答案是:

1. 确实可以计算生存率survfit——该模型解释了随着时间的推移,随着人们进入和退出他们所关注的年龄范围,高危人群的数量如何随着时间的推移而增长和缩小。上面发布的玩具数据集的一个示例是plot(survfit(Surv(time=starting_age,time2=last_age,event=event,type='counting')~1, data=data_a))

2、模型可以比较左截断的前瞻性数据和非左截断的回顾性数据,如果你简单地假设回顾性数据相当于从出生开始就跟随人。这个假设可能并不完美,但这是数据集的固有限制,没有模型可以解决。上面的玩具数据集的示例代码是:

data_c$starting_age = 0
data_c$last_age = data_c$age
data_c$drug = FALSE
nh_compare = rbind(data_a, data_c[,c('indiv_id','starting_age','last_age','event','drug')])
coxph(Surv(time=starting_age,time2=last_age,event=event,type='counting')~drug, data=nh_compare)

3. 似乎没有封闭形式的功率计算,而是我们通过自举来做到这一点。我们为特定数据集执行此操作的代码出现在此处

4.coxph允许协变量,例如在我们的代码中,我们使用coxph(Surv(time=ascertainment_age,time2=surv_age,event=surv_status,type='counting')~asc+family_mutation,data=prore)wherefamily_mutation是协变量。

我们发表了一篇论文,使用这种方法来计算遗传性朊病毒病预防性临床试验的功效。你可以阅读bioRxiv的详细信息,我们的 R 代码都在一个公共的 GitHub 存储库中:

https://github.com/ericminikel/prnp_onset/

引文:

Minikel EV、Vallabh SM、Orseth MC、Brandel JP、Haïk S、Laplanche JL、Zerr I、Parchi P、Capellari S、Safar J、Kenny J、Fong JC、Takada LT、Ponto C、Hermann P、Knipper T、Stehmann C , Kitamoto T, Ae R, Hamaguchi T, Sanjo N, Tsukamoto T, Mizusawa H, Collins SJ, Chiesa R, Roiter I, de Pedro-Cuesta J, Calero M, Geschwind MD, Yamada M, Nakamura Y, Mead S. Age遗传性朊病毒病的发病和预防性临床试验的设计神经病学2019 年 6 月 6 日。pii:10.1212/WNL.0000000000007745。doi: 10.1212/WNL.0000000000007745。PubMed PMID:31171647。

埃里克,从广义上讲,您的问题听起来很严重,以至于寻找现成的解决方案似乎被误导了。相反,您几乎肯定需要求助于定制建模来利用您关于疾病病理生理学的特殊领域知识。除非您使用能够让您运用这些知识的建模方法,否则您可能没有机会对抗您所面临的强大“对手”!

您最好的第一步可能是弄清楚您实际拥有的“特殊领域知识”。您能否模拟生成数据的过程(即数据生成过程DGP ),包括控制个人进入数据集的(左截断)过程?一旦你可以模拟 DGP,贝叶斯方法应该能让你用数据“挑战”你的模拟模型——例如,估计你的模型的参数。尽管Odd Aalen对用于生存分析的贝叶斯方法持怀疑态度 [1],但我注意到现在至少有一篇关于此类方法的文本 [2]。

如果我遇到这样的问题,我会倾向于先通过模拟和贝叶斯推理来探索它。也许我会在这个过程中学到足够的知识来制定更简单的过程模型,这些模型可能会屈服于更传统的频率估计方法。更简单的模型和更丰富的模拟之间的相互作用可能确实会产生其自己有价值的洞察力和理解形式。

我希望您最终会在这里向我们所有人介绍您最终采用的方法以及效果如何!

  1. 艾伦OO。医学统计——没有时间自满。统计方法医学研究。2000;9(1):31-40。doi: 10.1177/096228020000900105

  2. Ibrahim JG、Chen MH、Sinha D. 贝叶斯生存分析。纽约:斯普林格;2010 年。