Description
Meta-Analysis of a Single Survival Curve.
Description
To assess a summary survival curve from survival probabilities and number of at-risk patients collected at various points in time in various studies, and to test the between-strata heterogeneity.
README.md
metaSurvival
The goal of metaSurvival is to …
Installation
You can install the released version of metaSurvival from CRAN with:
install.packages("metaSurvival")
And the development version from GitHub with:
# install.packages("devtools")
devtools::install_github("shubhrampandey/metaSurvival")
Example
library(metaSurvival)
First start with loading the example dataset.
data(exampleData)
attach(exampleData)
head(exampleData)
#> Study FirstAuthor YearPub Time Survival NbRisk Location Design
#> 1 1 Lai 1988 1 0.8043 46 Asia Monocentric
#> 2 1 Lai 1988 2 0.4565 37 Asia Monocentric
#> 3 1 Lai 1988 3 0.2609 21 Asia Monocentric
#> 4 1 Lai 1988 4 0.1739 12 Asia Monocentric
#> 5 1 Lai 1988 5 0.1304 8 Asia Monocentric
#> 6 1 Lai 1988 6 0.0870 6 Asia Monocentric
Computation of summary survival with continuity correction.
results<-msurv(Study, Time, NbRisk, Survival, confidence="Greenwood",correctionFlag = T,correctionVal = c(0.25,0.5))
results
#> $verif.data
#> Sstudy check
#> 1 1 1
#> 2 2 1
#> 3 3 1
#> 4 4 1
#> 5 5 1
#> 6 6 1
#> 7 7 1
#> 8 8 1
#> 9 9 1
#> 10 10 1
#> 11 11 1
#> 12 12 1
#> 13 13 1
#> 14 14 1
#> 15 15 1
#> 16 16 1
#> 17 17 1
#> 18 18 1
#> 19 19 1
#> 20 20 1
#> 21 21 1
#> 22 22 1
#> 23 23 1
#> 24 24 1
#> 25 25 1
#> 26 26 1
#> 27 27 1
#>
#> $summary.fixed
#> IndiceTimes PooledSurvivalFE PooledSurvivalICinfFE PooledSurvivalICsupFE
#> [1,] 1 0.94497450 0.93455418 0.95551100
#> [2,] 2 0.84347436 0.82683765 0.86044583
#> [3,] 3 0.73872717 0.71857893 0.75944035
#> [4,] 4 0.66245129 0.64073764 0.68490079
#> [5,] 5 0.58662304 0.56399133 0.61016291
#> [6,] 6 0.52144090 0.49844475 0.54549799
#> [7,] 9 0.40882896 0.38592475 0.43309252
#> [8,] 12 0.32461488 0.30222075 0.34866838
#> [9,] 15 0.26174091 0.23995379 0.28550624
#> [10,] 18 0.21983127 0.19855264 0.24339029
#> [11,] 21 0.18810271 0.16733508 0.21144777
#> [12,] 24 0.16086195 0.14062988 0.18400476
#> [13,] 27 0.13906070 0.11917994 0.16225783
#> [14,] 30 0.12241028 0.10252475 0.14615276
#> [15,] 33 0.09697105 0.07643349 0.12302702
#> [16,] 36 0.08104941 0.06104672 0.10760623
#> [17,] 39 0.07799121 0.05761503 0.10557365
#> [18,] 42 0.06960868 0.04863084 0.09963571
#> [19,] 45 0.06635655 0.04527093 0.09726311
#> [20,] 48 0.06295069 0.04180072 0.09480195
#>
#> $median.fixed
#> 2.5% 97.5%
#> 6.571189 5.969119 7.163636
#>
#> $mean.fixed
#> 2.5% 97.5%
#> 12.06584 11.28009 12.76527
#>
#> $heterogeneity
#> [1] 731.217128 2.521438 60.340098
#>
#> $summary.random
#> IndiceTimes PooledSurvivalRE PooledSurvivalICinfRE PooledSurvivalICsupRE
#> [1,] 1 0.93524921 0.90753843 0.96380610
#> [2,] 2 0.82628083 0.77535470 0.88055185
#> [3,] 3 0.70123428 0.63503595 0.77433335
#> [4,] 4 0.61766270 0.54632825 0.69831133
#> [5,] 5 0.53060766 0.45992592 0.61215181
#> [6,] 6 0.44916320 0.37511275 0.53783184
#> [7,] 9 0.32921715 0.26232834 0.41316134
#> [8,] 12 0.24431166 0.18426527 0.32392532
#> [9,] 15 0.18160515 0.13130502 0.25117417
#> [10,] 18 0.14534074 0.10284269 0.20540041
#> [11,] 21 0.11674507 0.07979975 0.17079517
#> [12,] 24 0.09822802 0.06593733 0.14633204
#> [13,] 27 0.08346181 0.05491511 0.12684802
#> [14,] 30 0.07097460 0.04554526 0.11060193
#> [15,] 33 0.05659698 0.03461920 0.09252720
#> [16,] 36 0.04869511 0.02927924 0.08098617
#> [17,] 39 0.04682745 0.02783640 0.07877493
#> [18,] 42 0.03866701 0.02088712 0.07158177
#> [19,] 45 0.03689963 0.01966964 0.06922256
#> [20,] 48 0.03516081 0.01850465 0.06680927
#>
#> $median.random
#> 2.5% 97.5%
#> 5.375810 4.469860 6.676145
#>
#> $mean.random
#> 2.5% 97.5%
#> 9.554813 7.764589 11.465606
Plot the estimates summary survival
RandomEffectSummary<- results$summary.random
plot(Time, Survival, type="n", col="grey", ylim=c(0,1),xlab="Time",
ylab="Survival")
for (i in unique(sort(Study))){
lines(Time[Study==i], Survival[Study==i], type="l", col="grey")
points(max(Time[Study==i]),
Survival[Study==i & Time==max(Time[Study==i])], pch=15)
}
lines(RandomEffectSummary[,1], RandomEffectSummary[,2], type="l",
col="red", lwd=3)
points(RandomEffectSummary[,1], RandomEffectSummary[,3], type="l",
col="red", lty=3, lwd=3)
points(RandomEffectSummary[,1], RandomEffectSummary[,4], type="l",
col="red", lty=3, lwd=3)
Computation of summary survival without continuity correction.
results<-msurv(Study, Time, NbRisk, Survival, confidence="Greenwood",correctionFlag = F)
results
#> $verif.data
#> Sstudy check
#> 1 1 1
#> 2 2 1
#> 3 3 1
#> 4 4 1
#> 5 5 1
#> 6 6 1
#> 7 7 1
#> 8 8 1
#> 9 9 1
#> 10 10 1
#> 11 11 1
#> 12 12 1
#> 13 13 1
#> 14 14 1
#> 15 15 1
#> 16 16 1
#> 17 17 1
#> 18 18 1
#> 19 19 1
#> 20 20 1
#> 21 21 1
#> 22 22 1
#> 23 23 1
#> 24 24 1
#> 25 25 1
#> 26 26 1
#> 27 27 1
#>
#> $summary.fixed
#> IndiceTimes PooledSurvivalFE PooledSurvivalICinfFE PooledSurvivalICsupFE
#> [1,] 1 0.9508837 0.93115618 0.9710293
#> [2,] 2 0.8542395 0.82202310 0.8877185
#> [3,] 3 0.7529489 0.71356234 0.7945096
#> [4,] 4 0.6801444 0.63752795 0.7256097
#> [5,] 5 0.6081467 0.56352148 0.6563058
#> [6,] 6 0.5449696 0.49936809 0.5947354
#> [7,] 9 0.4303415 0.38446782 0.4816886
#> [8,] 12 0.3452733 0.30011887 0.3972213
#> [9,] 15 0.2814425 0.23729653 0.3338012
#> [10,] 18 0.2411057 0.19773211 0.2939935
#> [11,] 21 0.2109529 0.16828161 0.2644443
#> [12,] 24 0.1858428 0.14380950 0.2401619
#> [13,] 27 0.1671095 0.12528742 0.2228921
#> [14,] 30 0.1549979 0.11269730 0.2131760
#> [15,] 33 0.1322367 0.08722757 0.2004703
#> [16,] 36 0.1201395 0.07462625 0.1934106
#> [17,] 39 0.1201395 0.07462625 0.1934106
#> [18,] 42 0.1144864 0.06665886 0.1966300
#> [19,] 45 0.1144864 0.06665886 0.1966300
#> [20,] 48 0.1144864 0.06665886 0.1966300
#>
#> $median.fixed
#> 2.5% 97.5%
#> 7.176926 5.923614 8.344025
#>
#> $mean.fixed
#> 2.5% 97.5%
#> 13.46370 11.45324 14.73451
#>
#> $heterogeneity
#> [1] 219.6071244 0.7572659 0.0000000
#>
#> $summary.random
#> IndiceTimes PooledSurvivalRE PooledSurvivalICinfRE PooledSurvivalICsupRE
#> [1,] 1 0.94768647 0.91731470 0.9790638
#> [2,] 2 0.84755282 0.78823478 0.9113348
#> [3,] 3 0.73182809 0.65606515 0.8163402
#> [4,] 4 0.65409564 0.56903170 0.7518757
#> [5,] 5 0.57872161 0.49473929 0.6769600
#> [6,] 6 0.50184228 0.41034422 0.6137425
#> [7,] 9 0.38269038 0.29711268 0.4929171
#> [8,] 12 0.29890154 0.22167479 0.4030324
#> [9,] 15 0.23629264 0.16877051 0.3308292
#> [10,] 18 0.20208143 0.14274382 0.2860853
#> [11,] 21 0.17082971 0.11580178 0.2520064
#> [12,] 24 0.15126442 0.10079984 0.2269937
#> [13,] 27 0.13757394 0.09019805 0.2098337
#> [14,] 30 0.12300453 0.07677350 0.1970747
#> [15,] 33 0.10536383 0.06049565 0.1835097
#> [16,] 36 0.10074068 0.05720945 0.1773952
#> [17,] 39 0.10074068 0.05720945 0.1773952
#> [18,] 42 0.08499342 0.03811229 0.1895420
#> [19,] 45 0.08499342 0.03811229 0.1895420
#> [20,] 48 0.08499342 0.03811229 0.1895420
#>
#> $median.random
#> 2.5% 97.5%
#> 6.046385 4.826019 8.540219
#>
#> $mean.random
#> 2.5% 97.5%
#> 11.929471 9.190071 14.485928
Plot the estimates summary survival
RandomEffectSummary<- results$summary.random
plot(Time, Survival, type="n", col="grey", ylim=c(0,1),xlab="Time",
ylab="Survival")
for (i in unique(sort(Study))){
lines(Time[Study==i], Survival[Study==i], type="l", col="grey")
points(max(Time[Study==i]),
Survival[Study==i & Time==max(Time[Study==i])], pch=15)
}
lines(RandomEffectSummary[,1], RandomEffectSummary[,2], type="l",
col="red", lwd=3)
points(RandomEffectSummary[,1], RandomEffectSummary[,3], type="l",
col="red", lty=3, lwd=3)
points(RandomEffectSummary[,1], RandomEffectSummary[,4], type="l",
col="red", lty=3, lwd=3)