绘制简单的 survreg Weibull 生存拟合
Plotting a simple survreg Weibul survivall fit
这是已在 How to plot the survival curve generated by survreg (package survival of R)?
回答的问题的更简单变体
# Create simple Weibull survival fit using library(survival)
surmo<-survreg( Surv(validtimes, status)~1, dist="weibull")
# Getting Kaplan-Meier
fKM<-survfit( Surv(validtimes, status)~1)
# Plot Kaplan-Meier
plot(fKM,xlab="Time,Days",conf.int=TRUE,mark.time=TRUE,ylab="Fraction",main="Kaplan-Meier Plot")
到目前为止一切正常,没有任何问题。
当我想在数据上叠加预测的 Weibull 拟合时出现了问题。基于我使用的示例。
pct <- seq(.01,.99,by=.01)
maxvalidtimes<-max(validtimes)
# Getting the Weibull lines to overlay
lines(predict(surmo,newdata=list(1:maxvalidtimes),type="quantile",p=pct),1-pct,col="red")
我收到一个错误
Error in xy.coords(x, y) : 'x' and 'y' lengths differ
我认为问题出在以下术语:
newdata=list(1:maxvalidtimes)
我尝试删除 newdata 项并设置 newdata=list(1:99) 也无济于事。
我在 flexsurv 包中尝试了同样的事情,我得到了我想要的精确图,不费吹灰之力。
# Using flexsurv package here
surmof <- flexsurvreg( Surv(validtimes, status)~1,dist='weibull')
plot(surmof,mark.time=TRUE,xlab="Time,Days",ylab="Fraction",main="FlexSurv Plot")
由于您没有提供任何数据,我将修改 ?predict.survreg
页面中最后一个使用 lung
数据集的示例。您不需要任何新数据,因为您只需要一个分位数类型的图,并且需要给 p
.
一个矢量参数
lfit <- survreg(Surv(time, status) ~ 1, data=lung)
pct <- 1:98/100 # The 100th percentile of predicted survival is at +infinity
ptime <- predict(lfit, type='quantile',
p=pct, se=TRUE)
str(ptime)
#------------
List of 2
$ fit : num [1:228, 1:98] 12.7 12.7 12.7 12.7 12.7 ...
$ se.fit: num [1:228, 1:98] 2.89 2.89 2.89 2.89 2.89 ...
所以你实际上有太多的数据点,如果你查看 ptime
中的 228 行数据,你会发现每一行都是相同的,所以只使用第一行。
identical( ptime$fit[1,], ptime$fit[2,])
#[1] TRUE
str(ptime$fit[1,])
# num [1:98] 12.7 21.6 29.5 36.8 43.8 ...
所以你有每个分位数的预测时间,记住生存函数只是 1 减去分位数函数,y 值是给定的分位数,而它是形成 x 值的时间:
plot(x=ptime$fit[1,], y=1-pct, type="l")
这是已在 How to plot the survival curve generated by survreg (package survival of R)?
回答的问题的更简单变体# Create simple Weibull survival fit using library(survival)
surmo<-survreg( Surv(validtimes, status)~1, dist="weibull")
# Getting Kaplan-Meier
fKM<-survfit( Surv(validtimes, status)~1)
# Plot Kaplan-Meier
plot(fKM,xlab="Time,Days",conf.int=TRUE,mark.time=TRUE,ylab="Fraction",main="Kaplan-Meier Plot")
到目前为止一切正常,没有任何问题。
当我想在数据上叠加预测的 Weibull 拟合时出现了问题。基于我使用的示例。
pct <- seq(.01,.99,by=.01)
maxvalidtimes<-max(validtimes)
# Getting the Weibull lines to overlay
lines(predict(surmo,newdata=list(1:maxvalidtimes),type="quantile",p=pct),1-pct,col="red")
我收到一个错误
Error in xy.coords(x, y) : 'x' and 'y' lengths differ
我认为问题出在以下术语: newdata=list(1:maxvalidtimes)
我尝试删除 newdata 项并设置 newdata=list(1:99) 也无济于事。
我在 flexsurv 包中尝试了同样的事情,我得到了我想要的精确图,不费吹灰之力。
# Using flexsurv package here
surmof <- flexsurvreg( Surv(validtimes, status)~1,dist='weibull')
plot(surmof,mark.time=TRUE,xlab="Time,Days",ylab="Fraction",main="FlexSurv Plot")
由于您没有提供任何数据,我将修改 ?predict.survreg
页面中最后一个使用 lung
数据集的示例。您不需要任何新数据,因为您只需要一个分位数类型的图,并且需要给 p
.
lfit <- survreg(Surv(time, status) ~ 1, data=lung)
pct <- 1:98/100 # The 100th percentile of predicted survival is at +infinity
ptime <- predict(lfit, type='quantile',
p=pct, se=TRUE)
str(ptime)
#------------
List of 2
$ fit : num [1:228, 1:98] 12.7 12.7 12.7 12.7 12.7 ...
$ se.fit: num [1:228, 1:98] 2.89 2.89 2.89 2.89 2.89 ...
所以你实际上有太多的数据点,如果你查看 ptime
中的 228 行数据,你会发现每一行都是相同的,所以只使用第一行。
identical( ptime$fit[1,], ptime$fit[2,])
#[1] TRUE
str(ptime$fit[1,])
# num [1:98] 12.7 21.6 29.5 36.8 43.8 ...
所以你有每个分位数的预测时间,记住生存函数只是 1 减去分位数函数,y 值是给定的分位数,而它是形成 x 值的时间:
plot(x=ptime$fit[1,], y=1-pct, type="l")