我得到了以下代表生存函数的数据。
# A tibble: 53 x 2
month survival
<int> <dbl>
1 0 1.00
2 1 1.00
3 2 1.00
4 3 1.00
5 4 1.00
6 5 1.00
7 6 0.999
8 7 0.998
9 8 0.997
10 9 0.993
11 10 0.984
12 11 0.976
13 12 0.973
14 13 0.971
15 14 0.969
16 15 0.969
17 16 0.969
18 17 0.969
19 18 0.968
20 19 0.968
21 20 0.968
22 21 0.968
23 22 0.968
24 23 0.968
25 24 0.967
26 25 0.966
27 26 0.966
28 27 0.962
29 28 0.957
30 29 0.952
31 30 0.948
32 31 0.944
33 32 0.942
34 33 0.941
35 34 0.941
36 35 0.941
37 36 0.941
38 37 0.940
39 38 0.939
40 39 0.938
41 40 0.938
42 41 0.938
43 42 0.935
44 43 0.934
45 44 0.930
46 45 0.920
47 46 0.910
48 47 0.895
49 48 0.884
50 49 0.881
51 50 0.879
52 51 0.878
53 52 0.878
我想将分布拟合到生存曲线。为此,我首先绘制与月相关的生存。然后我使用fitdist
函数来适应一些发行版。
library('fitdistrplus')
library('flexsurv')
data <- tibble(month = 0:52, survival = c(1, 1, 1, 1, 1, 1, 0.999, 0.998,
0.997, 0.993, 0.984, 0.976, 0.973, 0.971, 0.969, 0.969, 0.969, 0.969, 0.968,
0.968, 0.968, 0.968, 0.968, 0.968,
0.967, 0.966, 0.966, 0.962, 0.957, 0.952, 0.948, 0.944,
0.942, 0.941, 0.941, 0.941, 0.941, 0.940, 0.939, 0.938,
0.938, 0.938, 0.935, 0.934, 0.930, 0.920, 0.910, 0.895,
0.884, 0.881, 0.879, 0.878, 0.878))
data %>% ggplot(aes(month, survival)) + geom_line()
fit_weibull <- fitdist(data[['survival']], 'weibull')
fit_llogis <- fitdist(data[['survival']], "llogis")
fit_log <- fitdist(data[['survival']], "logis")
fit_weibull$aic
fit_llogis$aic
fit_log$aic
根据AIC,我应该使用shape = 34.6167936
和scale = 0.9695298
进行Weibull分发。但是我理解我应该如何使用这个分布来计算我的估计生存率时遇到了问题。我有信心因为S(t) = 1 - F(t)
我应该只计算1 -pweibull(data[['month']], fit_weibull$estimate[['shape']], fit_weibull$estimate[['scale']])
,但它会产生以下向量:
[1] 1.00000000 0.05399642 0.00000000 0.00000000 0.00000000 0.00000000
0.00000000 0.00000000
[9] 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000
0.00000000 0.00000000
[17] 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000
0.00000000 0.00000000
[25] 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000
0.00000000 0.00000000
[33] 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000
0.00000000 0.00000000
[41] 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000
0.00000000 0.00000000
[49] 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000
所以我的理解似乎非常错误。我应该如何使用fit_weibull
估算生存率并绘制估计曲线?
答案 0 :(得分:4)
您已经在这里处理了非标准版的生存分析。通常情况下,生存分析数据是根据离散事件(个体死亡的时间)记录的 - 这是flexsurv
包裹(你加载的但是我能看到的)没有用的)会期待。
不幸的是,fitdistrplus::fitdist
不会为您的数据工作 - 这会分发生存时间。此外,即使您确实拥有独立生存时间的数据,您的数据也会被审查(在此期间结束时,只有12%的人死亡/失败);我不知道fitdist
是否允许审查。
你可能无法对曲线之间的差异做出非常强有力的统计结论,因为你不知道(至少你还没有说过)实际代表了多少独立试验通过这种生存曲线 - 例如是由10,100或10 ^ 6个人组成的初始队列......?
但是,您可以按如下方式拟合曲线:
dat <- data.frame(month = 0:52,
survival = c(1, 1, 1, 1, 1, 1, 0.999, 0.998,
0.997, 0.993, 0.984, 0.976, 0.973, 0.971, 0.969, 0.969, 0.969, 0.969, 0.968,
0.968, 0.968, 0.968, 0.968, 0.968,
0.967, 0.966, 0.966, 0.962, 0.957, 0.952, 0.948, 0.944,
0.942, 0.941, 0.941, 0.941, 0.941, 0.940, 0.939, 0.938,
0.938, 0.938, 0.935, 0.934, 0.930, 0.920, 0.910, 0.895,
0.884, 0.881, 0.879, 0.878, 0.878))
适合非线性最小二乘(不是一个很好的统计模型,但足够)。另外:需要良好的起始值。
n1 <- nls(survival~pweibull(month,exp(logshape),exp(logscale),
lower.tail=FALSE),
start=list(logshape=0,logscale=log(20)),data=dat)
n2 <- nls(pmin(survival,0.999)~plogis(month,location,exp(logscale),
lower.tail=FALSE),
start=list(location=40,logscale=log(20)),data=dat)
绘制结果:
par(bty="l",las=1)
plot(survival~month,data=dat,type="l")
lines(dat$month,predict(n1),col="red")
lines(dat$month,predict(n2),col="blue")