对不同的数据帧重复使用Surv函数

时间:2018-08-02 15:49:29

标签: r survival-analysis

我正在运行一些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)
}

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

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

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

一方面,它很冗长,但更重要的是,当需要将名称与形式匹配时,它将阻止使用predictsurvdiff和其他生存函数都具有“数据”参数和“子集”参数。子集函数应使您避免使用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.