Survdiff(包生存)带频率权重(Coarsened Exact Matching-包matchit后得到)

Survdiff (package survival) with frequency weights (obtained after Coarsened Exact Matching - package matchit)

我正在对生存数据进行反事实影响评估。更准确地说,我试图评估职业培训对失业时间的影响。我使用 Kaplan Meier 估计生存曲线(包生存)。

在做 Kaplan Meier 之前,我使用粗化的精确匹配(目标是 ATT)来使对照组和治疗组在预处理协变量(包 MatchIt)方面接近。

对于 Kaplan Meier 估计器,我必须使用匹配形成的权重,使用权重选项和 survfit 的稳健标准误差效果很好:

library(survival)
library(survminer)

kp_cem <- survfit(Surv(time=time_cem,event=status_cem)~treatment_cem, data=data_impact_cem,robust =TRUE,weights =weights)

虽然,当我尝试使用对数秩检验来检验治疗组和对照组之间生存曲线的差异时,我无法考虑匹配的频率权重,因此检验统计数据不正确。

log_rank <- survdiff(Surv(time=time_cem,event=status_cem)~treatment_cem, data=data_impact_cem,rho=0)

我尝试了ggsurvplot(package survminer)的选项“pval = TRUE”,但问题是一样的,没有考虑频率权重。

如何在 survdiff 中包含频率权重?是否有其他包来计算考虑频率权重(匹配后获得)的对数秩检验?

至少有两种方法可以做到这一点:

首先,您可以按照@IRTFM 的建议使用survey::svylogrank 函数。这会将权重视为采样权重,但我认为 svylogrank 使用的稳健标准误差是可以的。

其次,可以使用survival::coxph。 logrank检验是Cox模型中的分数检验,coxph取频数权重。如果您想要一个稳健的分数测试,请使用 robust=TRUE:它将位于 summary(your_cox_model) 输出的底部,您可以将其提取为 summary(your_cox_model)$robscore

非常感谢@Thomas Lumley 和@IRTFM 的回答。 以下是我应用您的 2 条建议的方式(我添加了一些评论 + 参考)。

1.使用 survey::svylogrank

我觉得使用采样权重不太舒服,但我确实有频率权重。

我应该如何指定调查设计?权重来自 Coarsened Exact Matching (matchit with method = "cem"),这是一个 class 的层匹配。 我应该在调查设计中指定阶层和权重吗?在此小插图形式 Matchit Estimating Effects After Matching 中,建议在生存分析(而不是分层)中仅使用权重和稳健标准误差(第 27 页)。

以下是我如何指定设计以及如何使用包调查获得 log-rank 测试,同时考虑匹配的权重:

library(survey)
design_weights <- svydesign(id=~ibis, strata=~subclass, weights=~weights, data=data_impact_cem)
log_rank <- svylogrank(Surv(time=time_cem,event=status_cem)~treatment_cem, design=design_weights, rho=0)

2。使用 survival::coxph

感谢您提供这条信息,作为生存分析的新手,我忽略了来自 cox 模型的分数测试和 log-rank 测试的等价性这一很好的 属性。对于希望获得有关此主题的更多信息的人们,我发现这本书很有启发性:Moore, D. (2016)。使用 R. New York 的应用生存分析:NY : Springer (p 58).

我发现这个 2d 选项比第一个涉及调查的选项更有吸引力。以下是我的应用方式:

library(survival)
cox_cem <-coxph(Surv(time=time_cem,event=status_cem)~treatment_cem, data=data_impact_cem,robust =TRUE,weights =weights)
sum_cox_cem <-summary(cox_cem)
score_test <-sum_cox_month[[13]][[1]]
score_test <- round(score_test,3) 
pvalue <- sum_cox_month[[13]][[3]]
pvalue <-if(pvalue<0.001){"<0.001"} else{round(pvalue,3)}
  

这是2个测试统计数据之间的差异(最后非常接近)。 enter image description here

尽管如此,我仍然想知道为什么 weights 选项在 survdiff 中不存在。