[英]fitting a distribution to survival curve
我有以下表示生存函數的數據。
# 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
估計生存率並繪制估計曲線?
您這里有一個非標准版本的生存分析。 通常,生存分析數據是根據離散事件 (個人死亡的時間)記錄的-這就是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")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.