我正在运行一些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)
}
感谢您提供的任何帮助。
答案 0 :(得分:1)
我写这个“答案”是为了提醒您不要沿着您似乎遵循的道路前进。 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
的输出分配给命名变量,则可以更经济地访问chisq
和strata
:
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.