回读拟合生存模型的输出

Read back the output from fitted survival model

我正在使用生存数据来拟合灵活的生存模型(如下例)。我可以将拟合模型的输出捕获为 *.txt 文件并将其保存在我的目录中。我的问题是如何将输出读回 r 中的对象并使用它来绘制拟合模型并进行预测(不需要数据再次重新 运行 模型)。

我想要这个的原因是因为我在服务器上工作并且只能导出输出而不是数据并且想在我个人计算机上的 shinyapp 中使用拟合模型。

library(data.table)
library(flexsurv)
#load some data
data(pbc, package="randomForestSRC")
data <- as.data.table(na.omit(pbc))
data[, years := days/365.25]

fit <- flexsurvspline(Surv(years, status) ~ albumin, data=data, k=1, scale='hazard')
fit
capture.output(fit, file='fit.txt')

ndata <- data.frame(albumin = 3)

#plot
plot(fit, est=FALSE, ci=FALSE, col.obs = 'white')
lines(fit, newdata = ndata, ci=FALSE, col = 'green')

#predict
prob=summary(fit,type='survival',newdata=ndata, t=12)
prob

#how can I read the model output saved in .txt file and use  

#read .txt model output
fit2 <- read #???
fit2
plot(fit2, est=FALSE, ci=FALSE, col.obs = 'white')
lines(fit2, newdata = ndata, ci=FALSE, col = 'green')

prob=summary(fit2,type='survival',newdata=ndata, t=12)
prob 

@MrFlick推荐的方法示例:

library(data.table)
#install.packages("flexsurv")
library(flexsurv)
#> Loading required package: survival

#load some data
data(pbc, package="randomForestSRC")
data <- as.data.table(na.omit(pbc))
data[, years := days/365.25]

set.seed(123)
fit <- flexsurvspline(Surv(years, status) ~ albumin, data=data, k=1, scale='hazard')
saveRDS(fit, "fit_object.rds")

ndata <- data.frame(albumin = 3)

#plot
plot(fit, est=FALSE, ci=FALSE, col.obs = 'white')
lines(fit, newdata = ndata, ci=FALSE, col = 'green')

#predict
set.seed(234)
prob=summary(fit,type='survival',newdata=ndata, t=12)
prob
#> albumin=3 
#>   time        est        lcl       ucl
#> 1   12 0.06864802 0.02431122 0.1567719

fit2 <- readRDS(file = "fit_object.rds")
fit2
#> Call:
#> flexsurvspline(formula = Surv(years, status) ~ albumin, data = data, 
#>     k = 1, scale = "hazard")
#> 
#> Estimates: 
#>          data mean  est      L95%     U95%     se       exp(est)  L95%   
#> gamma0        NA     2.7412   1.2590   4.2235   0.7563       NA        NA
#> gamma1        NA     0.9900   0.5100   1.4701   0.2449       NA        NA
#> gamma2        NA    -0.0342  -0.0869   0.0186   0.0269       NA        NA
#> albumin   3.5168    -1.6959  -2.1481  -1.2436   0.2307   0.1834    0.1167
#>          U95%   
#> gamma0        NA
#> gamma1        NA
#> gamma2        NA
#> albumin   0.2883
#> 
#> N = 276,  Events: 111,  Censored: 165
#> Total time at risk: 1495.551
#> Log-likelihood = -374.4158, df = 4
#> AIC = 756.8316

identical(fit, fit2, ignore.environment = TRUE)
#> [1] FALSE

plot(fit2, est=FALSE, ci=FALSE, col.obs = 'white')
lines(fit2, newdata = ndata, ci=FALSE, col = 'green')

set.seed(234)
prob=summary(fit2,type='survival',newdata=ndata, t=12)
prob
#> albumin=3 
#>   time        est        lcl       ucl
#> 1   12 0.06864802 0.02431122 0.1567719

reprex package (v2.0.0)

于 2021-08-25 创建

更新:如果您使用相同的种子(通过 set.seed()),“fit”和“fit2”会得到相同的 est/lcl/ucl。此外,根据 MrFlick 的评论,即使对象不相同,我相信使用相同的种子获得相同的输出表明它们在功能上是相同的(即 'good enough')。您可以使用您的实际数据对此进行进一步测试,并比较服务器与本地的结果。