我有竞争风险的生存数据(删失0,重复1,死亡2),我想使用Grey检验来检查变量rh(类别0,1和2)组间的差异。这是我的数据:
> surv_data
# A tibble: 344 × 4
ID time_to_event status rh
<dbl> <dbl> <dbl> <fct>
1 1 61.2 0 PHLF 0
2 2 6.53 1 PHLF 0
3 10 109. 0 PHLF 0
4 15 15.5 2 PHLF 2
5 19 4.97 0 PHLF 0
6 20 17.9 1 PHLF 1
7 22 61.7 1 PHLF 0
8 23 74.0 2 PHLF 0
9 26 67.9 2 PHLF 1
10 27 46.8 2 PHLF 0
# ℹ 389 more rows
# ℹ Use `print(n = ...)` to see more rows
字符串
在tidycmprsk::tbl_cuminc和tidycmprsk::cuminc中Gray的测试有什么区别?我得到不同的输出。
我尝试了下面的测试,我不明白为什么我得到了不同的测试结果。我应该解释结果吗?做格雷测试的正确方法是什么?
第一章
tidycmprsk::cuminc(Surv(time_to_event, status) ~ rh, data = surv_data) %>%
tidycmprsk::tbl_cuminc(
times = c(6, 12, 24), label_header = "**Month {time}**"
) %>%
add_p() %>%
add_n()
型
我得到输出:
`
Characteristic N Month 6 Month 12 Month 24 p-value1
rh 399 0.07
rh 0 32% (15%, 33%) 45% (39%, 50%) 62% (36%, 65%)
rh 1 23% (9%, 28%) 37% (21%, 53%) 46% (38%, 68%)
rh 2 28% (12%, 42%) 27% (15%, 63%) 38% (21%, 55%)
1 Gray’s Test
`
型
tidycmprsk::cuminc(ftime=surv_data$time_to_event, fstatus=surv_data$status, group=surv_data$rh, cencode=0)
型
我得到输出:
`
Tests:
stat pv df
Censored 2.20168 1.176649e-01 2
Relapse 5.75114 2.376312e-01 2
Death 28.383626 3.183201e-09 2
`
型
tidycmprsk::cuminc(Surv(time_to_event, status) ~ rh, data = surv_data, cencode=0)
我得到输出:
`
• Tests
outcome statistic df p.value
Relapse 4.31 2.00 0.07
Death 32.3 2.00 <0.001
`
1条答案
按热度按时间ubof19bj1#
你已经把自己陷入了困境,因为你混合了
tidycmprsk
和cmprsk
。这两个包都有一个名为cuminc()
的函数。你的第二个代码片段是:字符串
然而,
tidycmprsk::cuminc()
的docs表示它接受一个公式或一个名为x
的参数。您提供的参数(ftime
,fstatus
等)是cmprsk::cuminc()
的参数。由于所有参数都命名,并且没有一个是x
,因此此代码将生成错误。tidycmprsk::cuminc()
源代码在后台调用cmprsk::cuminc()
,因此一旦解析参数名称,您将获得相同的结果。下面是一个trial
数据内置到tidycmprsk
包的示例,使用两种方法。tidycmprsk
请注意,这里我使用
death_cr
作为状态变量。如文档状态:状态变量必须是因子,其中第一个水平表示观测值已删失,后续水平是竞争事件。
请确保您的数据以这种形式存在。
型
cmprsk
同样,由于我们使用因子变量
death_cr
作为状态,我们可以提供cencode = "censor"
,即一个字符向量,指示与被删失相关的因子水平的标签(而不是您问题中的cencode = 0
)。型
你可以看到p值和统计量是相同的。
命名空间的一般注解
如果包有重叠的函数(这两个包也有共同的
crr()
),有各种方法。在我的例子中,我用library()
加载tidycmprsk
,并用::
显式调用cmprsk
函数。这是在这些情况下你应该做的最低要求。Google R风格指南实际上建议:用户应该显式限定所有外部函数的命名空间。
当然,这个建议对于一个拥有大量代码库的大公司来说,比一个通常不会面临巨大的名称空间冲突风险的研究人员更有意义。
另一种有很多优点的方法是使用
box
包。这允许你从特定的包中显式地导入你想要使用的函数,而不是像library()
那样从一个包中导入所有函数。