Nik,
我知道你的问题是一个老问题,但是请看下面我是如何通过一种方法来解决它的。它涉及到从测试数据的拟合中检索形状和速率参数,然后不使用predict,而是使用flexsurv中的qgompertz()函数。请原谅我使用了自己封装的示例代码,但你应该能够跟上。
require(survival)
lung$yrs <- lung$time/365
lung1 <- lung[c("status", "yrs")]
lung1$status[ lung1$yrs >2] <- 1
lung1$yrs[ lung1$yrs >2] <- 2
s <- Surv(time=lung1$yrs, event=lung1$status)
km.lung <- survfit(s ~ 1, data=lung1)
plot(km.lung)
cut.length <- sum((km.lung$time <= 2))
test.data <- data.frame(yrs = km.lung$time[1:cut.length] , surv=round(km.lung$surv[1:cut.length], 3))
require(flexsurv)
s <- Surv(time=lung1$yrs, event=lung1$status)
gomp <- flexsurvreg(s ~ 1, data=lung1, dist="gompertz")
gomp
g.shape <- 0.5866
g.rate <- 0.5816
df1 <- test.data
xvar <- "yrs"
yvar <- "surv"
extendedtime <- 3
ylim1 <- c(0,1)
xlim1 <- c(0, extendedtime)
plot(df1[,yvar]~df1[,xvar], type="S", ylab="", xlab="", lwd=3, xlim=xlim1, ylim=ylim1)
lines (qgompertz(seq(.01,.99,by=.01), shape=0.58656, rate = .5816) , seq(.99,.01,by=-.01) , col="red", lwd=2, lty=2 )
s <- Surv(time=lung$yrs, event=lung$status)
km.lung <- survfit(s ~ 1, data=lung)
par(new=T)
plot(km.lung$surv[(cut.length+1):length(km.lung$time)]~km.lung$time[(cut.length+1):length(km.lung$time)], type="S", col="blue", ylab="", xlab="", lwd=3, xlim=xlim1, ylim=ylim1)