首页 > 解决方案 > 对不同的数据框重复使用 Surv 函数

问题描述

我正在运行一些 Surv() 函数,我不喜欢或不理解的一件事是为什么这个函数不采用“data=”参数。这很烦人,因为我想在同一个数据帧上执行相同的 Surv() 函数,但每次都按不同的标准过滤。

因此,例如,我的数据框称为“ikt”,我想按“donor_type2=='LD'”进行过滤,并使用分层变量“plan 2”。我尝试了以下但没有奏效:

library(survival)
library(dplyr)

ikt<-data.frame(organ_yrs=(seq(1,20)),
           organ_status=rep(c(0,0,1,1),each=5),
           plan2=rep(c('A','B','A','B'),each=5),
           donor_type2=rep(c('LD','DD'),each=10) )

organ_surv_func<-function(data,criteria,strata) {
data2<-filter(data,criteria)
Surv(data2$organ_yrs,data2$organ_status)~data2$strata
}

organ_surv_func(ikt,donor_type2=='LD',plan2)

Error in filter_impl(.data, quo) : object 'donor_type2' not found

我来自 SAS 背景,所以这可能就是为什么我认为这应该有效,但它没有......

我查找了一些关于 sapply() 的内容,但我认为当函数没有 data= 选项时它不起作用。

另外,我需要 Surv() 对象而不仅仅是 survfit(Surv()) (这将让我使用 data=)的原因是因为我还使用 survdiff() 进行对数秩测试,它接受了 Surv( ) 对象作为它的主要论点:

lr<-function (surv) {
round(1-pchisq(survdiff(surv)$chisq,length(survfit(surv)$strata)-1),3)
}

感谢您的任何帮助,您可以提供。

标签: rsurvival-analysis

解决方案


我写这个“答案”是为了提醒你不要沿着你似乎正在遵循的道路前进。该Surv函数实际上旨在用作在生存包函数之一中定义的公式的 LHS。您应该避免使用以下结构:

Surv(data2$organ_yrs,data2$organ_status)~data2$strata

一方面它是不必要的冗长,但更重要的是,它会阻止在将predict名称与形式匹配时使用。和survdiff其他生存函数都具有“数据”参数和“子集”参数。子集函数应该允许您避免使用filter.

 organ_surv_func<-function(data, covar) {
      form = as.formula(substitute( Surv(organ_yrs, organ_status) ~ covar, list(covar=covar) ) )
      survdiff(form, data=data)
}
# although I think running surdiff in a for-loop might be easier,
# as it would involve fewer tricky language constructs
organ_surv_func(  subset(ikt, (donor_type2=='LD')), covar=quote(plan2))

如果将 的输出分配给survfit命名变量,您将能够更经济地访问chisqstrata

myfit <- organ_surv_func(  subset(ikt, (donor_type2=='LD')), covar=quote(plan2))
my.lr.test<-function (myfit) {
                round(1-pchisq(myfit$chisq, length(myfit$strata)-1), 3)
                              }
my.lr.test(myfit) # not going to be useful with that dataset.

推荐阅读