我正在尝试将Weibull模型拟合并绘制成生存数据。该数据只有一个协变量,一组,从2006年到2010年。所以,任何关于如何添加到两行代码的想法,以绘制2010年队列的生存曲线?
library(survival)
s <- Surv(subSetCdm$dur,subSetCdm$event)
sWei <- survreg(s ~ cohort,dist='weibull',data=subSetCdm)
使用Cox PH模型完成相同操作非常简单,具有以下几行。问题是survfit()不接受类型为幸存的对象。
sCox <- coxph(s ~ cohort,data=subSetCdm)
cohort <- factor(c(2010),levels=2006:2010)
sfCox <- survfit(sCox,newdata=data.frame(cohort))
plot(sfCox,col='green')
使用数据肺(来自生存包),这是我正在努力实现的目标。
#create a Surv object
s <- with(lung,Surv(time,status))
#plot kaplan-meier estimate, per sex
fKM <- survfit(s ~ sex,data=lung)
plot(fKM)
#plot Cox PH survival curves, per sex
sCox <- coxph(s ~ as.factor(sex),data=lung)
lines(survfit(sCox,newdata=data.frame(sex=1)),col='green')
lines(survfit(sCox,newdata=data.frame(sex=2)),col='green')
#plot weibull survival curves, per sex, DOES NOT RUN
sWei <- survreg(s ~ as.factor(sex),dist='weibull',data=lung)
lines(survfit(sWei,newdata=data.frame(sex=1)),col='red')
lines(survfit(sWei,newdata=data.frame(sex=2)),col='red')
答案 0 :(得分:22)
希望这有帮助,我没有犯错误:
从上面复制:
#create a Surv object
s <- with(lung,Surv(time,status))
#plot kaplan-meier estimate, per sex
fKM <- survfit(s ~ sex,data=lung)
plot(fKM)
#plot Cox PH survival curves, per sex
sCox <- coxph(s ~ as.factor(sex),data=lung)
lines(survfit(sCox,newdata=data.frame(sex=1)),col='green')
lines(survfit(sCox,newdata=data.frame(sex=2)),col='green')
对于Weibull,使用预测,来自Vincent的评论:
#plot weibull survival curves, per sex,
sWei <- survreg(s ~ as.factor(sex),dist='weibull',data=lung)
lines(predict(sWei, newdata=list(sex=1),type="quantile",p=seq(.01,.99,by=.01)),seq(.99,.01,by=-.01),col="red")
lines(predict(sWei, newdata=list(sex=2),type="quantile",p=seq(.01,.99,by=.01)),seq(.99,.01,by=-.01),col="red")
这里的技巧是逆转绘图与预测的分位数顺序。可能有更好的方法来做到这一点,但它在这里工作。祝你好运!
答案 1 :(得分:15)
另一种选择是使用包flexsurv
。这提供了survival
包之外的一些附加功能 - 包括参数回归函数flexsurvreg()
有一个很好的绘图方法,可以满足您的要求。
如上所述使用肺;
#create a Surv object
s <- with(lung,Surv(time,status))
require(flexsurv)
sWei <- flexsurvreg(s ~ as.factor(sex),dist='weibull',data=lung)
sLno <- flexsurvreg(s ~ as.factor(sex),dist='lnorm',data=lung)
plot(sWei)
lines(sLno, col="blue")
您可以使用type
参数绘制累积危险或危险等级,并使用ci
参数添加置信区间。
答案 2 :(得分:7)
这只是澄清Tim Riffe's answer的注释,它使用以下代码:
lines(predict(sWei, newdata=list(sex=1),type="quantile",p=seq(.01,.99,by=.01)),seq(.99,.01,by=-.01),col="red")
lines(predict(sWei, newdata=list(sex=2),type="quantile",p=seq(.01,.99,by=.01)),seq(.99,.01,by=-.01),col="red")
两个镜像序列seq(.01,.99,by=.01)
和seq(.99,.01,by=-.01)
的原因是因为predict()方法为事件分布f(t)赋予分位数 - 即,反向CDF为f(t) - 而生存曲线绘制1-(CDF为f)对t。换句话说,如果你绘制p与预测(p),你将获得CDF,如果你绘制1-p与预测(p),你将获得生存曲线,即1-CDF 。以下代码更透明,并推广到p值的任意向量:
pct <- seq(.01,.99,by=.01)
lines(predict(sWei, newdata=list(sex=1),type="quantile",p=pct),1-pct,col="red")
lines(predict(sWei, newdata=list(sex=2),type="quantile",p=pct),1-pct,col="red")
答案 3 :(得分:2)
如果有人想向ggplot2
生态系统的Kaplan-Meyer曲线添加Weibull分布,我们可以执行以下操作:
library(survminer)
library(tidyr)
s <- with(lung,Surv(time,status))
fKM <- survfit(s ~ sex,data=lung)
sWei <- survreg(s ~ as.factor(sex),dist='weibull',data=lung)
pred.sex1 = predict(sWei, newdata=list(sex=1),type="quantile",p=seq(.01,.99,by=.01))
pred.sex2 = predict(sWei, newdata=list(sex=2),type="quantile",p=seq(.01,.99,by=.01))
df = data.frame(y=seq(.99,.01,by=-.01), sex1=pred.sex1, sex2=pred.sex2)
df_long = gather(df, key= "sex", value="time", -y)
p = ggsurvplot(fKM, data = lung, risk.table = T)
p$plot = p$plot + geom_line(data=df_long, aes(x=time, y=y, group=sex))
答案 4 :(得分:0)
如果您想使用生存函数本身S(t)
(而不是此处其他答案中使用的逆生存函数S^{-1}(p)
),我已经编写了一个函数来实现威布尔分布(遵循与pec::predictSurvProb
函数族相同的输入:
survreg.predictSurvProb <- function(object, newdata, times){
shape <- 1/object$scale # also equals 1/exp(fit$icoef[2])
lps <- predict(object, newdata = newdata, type = "lp")
surv <- t(sapply(lps, function(lp){
sapply(times, function(t) 1 - pweibull(t, shape = shape, scale = exp(lp)))
}))
return(surv)
}
您可以执行以下操作:
sWei <- survreg(s ~ as.factor(sex),dist='weibull',data=lung)
times <- seq(min(lung$time), max(lung$time), length.out = 1000)
new_dat <- data.frame(sex = c(1,2))
surv <- survreg.predictSurvProb(sWei, newdata = new_dat, times = times)
lines(times, surv[1, ],col='red')
lines(times, surv[2, ],col='red')