包装生存中Survfit函数产生的生存曲线

时间:2019-03-11 18:02:21

标签: r survival-analysis survival

我正在使用R包survfit中的survival函数根据survfit.coxph输出的coxph对象创建生存曲线。我有两种创建曲线的方法,它们可以产生不同的结果。我相信第一个是正确的答案,但是我不能说出为什么方法2不起作用。

library(survival)
set.seed(1234)

## generate small data set
n <- 10
z <- rnorm(n,mean=0.4)
x <- rexp(n,exp(z))
y <- pmin(1,x)
del <- 1*(x < 1)
dat <- data.frame(y,del,z)

## fit cox model
fit <- coxph(Surv(y,del)~z,ties="breslow",data=dat)

## method 1
newdata <- dat[1,]
newdata[1,3] <- 0
out <- survfit(fit,newdata=newdata)
out$surv
##[1] 0.9557533 0.9048870 0.8545721 0.7599743 0.6397022 0.4218647 0.4218647


## method 2, why not same as method 1?
dat[1,3] <- 0
out <- survfit(fit,newdata=dat[1,])
out$surv
##[1] 0.9570757 0.9079589 0.8593546 0.7710287 0.6610956 0.4787354 0.4787354

1 个答案:

答案 0 :(得分:1)

在两种方法中,survfit函数都接收两个参数:fitnewdata

在方法1中,行newdata[1,3] <- 0仅更改对象newdata,而对象dat和对象fit不变。

在方法2中,dat[1,3] <- 0更改了对象newdata和对象fit

因此,正如42正确指出的那样,newdata函数所接收的survfit对象在两种方法中都是相同的,但是fit对象却不是。
如果在开始时制作了3个相同的数据帧,则可以看到此内容。

dat1 <- data.frame(y,del,z)
dat2 <- data.frame(y,del,z)
dat3 <- data.frame(y,del,z)

## fit cox model
fit <- coxph(Surv(y,del)~z,ties="breslow",data=dat1)

## method 1
newdata <- dat2[1,]
newdata[1,3] <- 0

out <- survfit(fit,newdata=newdata)
out$surv
##[1] 0.9557533 0.9048870 0.8545721 0.7599743 0.6397022 0.4218647 0.4218647


## method 2, same as method 1
dat3[1,3] <- 0
out <- survfit(fit,newdata=dat3[1,])
out$surv
##[1] 0.9557533 0.9048870 0.8545721 0.7599743 0.6397022 0.4218647 0.4218647