如何绘制survreg(R的包装存活率)生成的存活曲线?

如何绘制survreg(R的包装存活率)生成的存活曲线?,r,plot,survival-analysis,weibull,R,Plot,Survival Analysis,Weibull,我正试图拟合并绘制一个威布尔模型到生存数据。数据只有一个协变量,即队列,从2006年到2010年。那么,有什么想法可以添加到下面的两行代码中,以绘制2010年队列的生存曲线 library(survival) s <- Surv(subSetCdm$dur,subSetCdm$event) sWei <- survreg(s ~ cohort,dist='weibull',data=subSetCdm) 库(生存) 希望这有帮助,我没有犯一些误导性的错误: 从上面抄袭: #

我正试图拟合并绘制一个威布尔模型到生存数据。数据只有一个协变量,即队列,从2006年到2010年。那么,有什么想法可以添加到下面的两行代码中,以绘制2010年队列的生存曲线

library(survival)
s <- Surv(subSetCdm$dur,subSetCdm$event)
sWei <- survreg(s ~ cohort,dist='weibull',data=subSetCdm)
库(生存)

希望这有帮助,我没有犯一些误导性的错误:

从上面抄袭:

    #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')
#创建一个Surv对象

s另一种选择是使用软件包
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")
#创建一个Surv对象

这只是一个说明,使用以下代码:

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)的分位数,即f(t)的逆CDF值,而生存曲线绘制的是1-(f的CDF)与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")

pct如果有人想在
ggplot2
生态系统中的卡普兰-迈耶曲线中添加威布尔分布,我们可以执行以下操作:

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))
库(survminer)
图书馆(tidyr)

s如果您想使用生存函数本身
s(t)
(而不是其他答案中使用的逆生存函数
s^{-1}(p)
),我已经编写了一个函数来实现Weibull分布的情况(遵循与
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)
}

survreg.predictSurvProb如果你发布一个完整的示例,我会尽力帮你弄清楚。我们需要SubSecDM对象。试试dput(SubSecDM)
?predict.survreg
.Tim,快速提问中有一些例子。如果你想重新创建上述内容,但不是按性别划分的子集…例如,开始时--sWei-Hi-Chris,我很困惑,抱歉,但可能其他回答者之一知道。如果不知道,那么可能是一个新问题。考虑到你的技巧,反转分位数序列(我在这里称之为
q.seq
):如果我理解正确,
predict
期望的是死亡分位数,而不是存活率。因此,我认为最好提供
1-q.seq
,而不是
rev(q.seq)
。在你的情况下,这无关紧要,因为你的
q.seq
是对称的,从0.01死亡概率开始(=0.99生存率)到0.99(=0.01生存率)。但是如果你从,比如说,0.01到0.8死亡概率,这会有不同:你的互补序列应该是0.99…0.2,而不是0.8到0.01。
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")
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))
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')