背景:我有兴趣了解如何分析来自具有自然历史控制的临床试验的数据,这意味着,临床试验招募了一群人(例如,那些具有疾病遗传风险的人),所有这些人都接受了治疗一种药物,并将它们的存活率(例如,疾病发作时的年龄或因这种疾病导致的死亡)与具有相同遗传风险的未经治疗的历史对照的存活率进行比较。
在开始之前,我只想承认我已经阅读了涉及该主题的 FDA 指导文件(例如罕见病:药物开发中的常见问题),并且我很清楚有许多类型的偏见可以潜入自然历史比较,因此,FDA 很少接受此类试验作为药物疗效的证据,而通常将随机试验视为更有力的证据。如何确定自然史队列是否可以公平地与接受药物治疗的前瞻性队列进行比较是一个重要而复杂的问题。但这不是我今天的问题的主题。相反,我发现我被一个更简单的问题难住了,如果自然历史队列被认为具有可比性和无偏性等等,那么从统计学上讲,如何进行比较?
所以这里有一个场景。
- 为简单起见,假设我的疾病有一个已知的单一遗传原因,具有这种基因型的人在某个年龄之前都非常健康,然后他们突然病得很重。疾病发作的年龄是高度可变的,并且危险随年龄而变化。下面描述的每个数据集中的每个人都有这种致病基因型。
- 在数据集 A 中,我有一个假设临床试验中的人的数据。他们在一岁时入组(
starting_age),接受了药物治疗,并被跟踪了一段时间,直到第二岁(last_age)他们生病(event == 1)或退出试验(event == 0)。 - 在“理想的理想”情况下,自然史队列可能是大量具有这种基因型的人,从出生到他们死于这种疾病或死于不相关的原因。那种数据集不存在。相反,考虑两个可能的自然历史队列可能的选择(B 和 C)......
- 在数据集 B 中,我有一些人的数据,这些人在某个随机年龄
starting_age(last_age生病 (event == 1) 或退出研究 (event == 0)。不能假设起始年龄和随访年数的分布与数据集 A 中的分布相同。 - 在数据集 C 中,我有纯粹的回顾性数据;这里没有预期的后续行动。我们只是观察每个人一次。
age观察到有些人在某个特定年龄(和)生病了,而另一些人在某个特定年龄(和event == 1)被认为仍然健康。ageevent == 0
如果我正确理解术语,A 和 B 中的数据将被视为左截断和右删失;C 中的数据仅被视为右删失。根据Cain 2011中使用的术语,我认为数据集 B 是“流行队列”,而数据集 C 是“事件队列”。
我的问题是:
- 鉴于数据在每个人的不同年龄被左截断,如何(如果有的话)为数据集 A 或 B 构建生存函数(或危险函数等)?
- 将使用什么统计测试(或自举方法)来测试数据集 A 中的人是否比 B 或 C 中的人存活时间更长或风险显着降低?
- 如果你只有数据集 B 或 C,并且你想估计一个给定的临床试验的统计功效,其中有N个个体,对于给定的风险比,你会怎么做?
- (额外的问题)如果人们也有,比如说,不同的基因突变与不同的危害相关,作为年龄的函数,你将如何将该变量纳入上述答案?
到目前为止我尝试过的一些事情:
- 我考虑了 Flora 的 Z 统计量 [ Flora 1978 ],有些人已将其应用于类似情况,但我担心它没有考虑用作参考的自然历史队列中的抽样方差。
- 我用谷歌搜索了一些不同的术语组合,例如具有不同左截断时间的生存分析,并找到了一些讨论类似问题的页面,例如生存分析:左截断数据,使用 PROC PHREG 生存左截断,但这些并没有解释底层他们的解决方案的数学。
- 我终于遇到了Cain 2011 ,它详细讨论了这个问题,并且有用的是,在增补中提供了用于处理左截断的 R 代码。他们为包含左截断的 MLE 实现了自己的函数,但声称左截断已经可以使用 R
survival库中内置的功能在 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 并更新了这篇文章以包含链接。