32
32
# ' @param data select specific data - for reactive input, Default = NULL
33
33
# ' @param cut.landmark cut-off for landmark analysis, Default = NULL
34
34
# ' @param showpercent Shows the percentages on the right side.
35
+ # ' @param status.cmprsk Status value when competing risk analysis, Default = 2nd level of status variable
35
36
# ' @param ... PARAM_DESCRIPTION
36
37
# ' @return Plot
37
38
# ' @details DETAILS
79
80
jskm <- function (sfit ,
80
81
table = FALSE ,
81
82
xlabs = " Time-to-event" ,
82
- ylabs = " Survival probability " ,
83
+ ylabs = NULL ,
83
84
xlims = c(0 ,max(sfit $ time )),
84
85
ylims = c(0 ,1 ),
85
86
surv.scale = c(" default" , " percent" ),
@@ -107,6 +108,7 @@ jskm <- function(sfit,
107
108
data = NULL ,
108
109
cut.landmark = NULL ,
109
110
showpercent = F ,
111
+ status.cmprsk = NULL ,
110
112
... ) {
111
113
112
114
@@ -148,12 +150,19 @@ jskm <- function(sfit,
148
150
subs3 <- which(regexpr(ssvar ,summary(sfit ,times = times ,extend = TRUE )$ strata , perl = T )!= - 1 )
149
151
}
150
152
151
- if (! is.null(subs )) pval <- FALSE
153
+ if (! is.null(subs ) | ! is.null( sfit $ states ) ) pval <- FALSE
152
154
153
155
# #################################
154
156
# data manipulation pre-plotting #
155
157
# #################################
156
158
159
+ if (is.null(ylabs )){
160
+ if (cumhaz | ! is.null(sfit $ states )){
161
+ ylabs <- " Cumulative incidence"
162
+ } else {
163
+ ylabs <- " Survival probability"
164
+ }
165
+ }
157
166
158
167
159
168
if (length(levels(summary(sfit )$ strata )) == 0 ) {
@@ -171,21 +180,39 @@ jskm <- function(sfit,
171
180
if (length(levels(summary(sfit )$ strata )) == 0 ) {
172
181
Factor <- factor (rep(" All" ,length(subs2 )))
173
182
} else {
174
- Factor <- factor (summary(sfit , censored = T )$ strata [subs2 ])
183
+ Factor <- factor (summary(sfit , censored = T )$ strata [subs2 ], levels = names( sfit $ strata ) )
175
184
}
176
185
177
186
# Data to be used in the survival plot
178
187
179
- df <- data.frame (
180
- time = sfit $ time [subs2 ],
181
- n.risk = sfit $ n.risk [subs2 ],
182
- n.event = sfit $ n.event [subs2 ],
183
- n.censor = sfit $ n.censor [subs2 ],
184
- surv = sfit $ surv [subs2 ],
185
- strata = Factor ,
186
- upper = sfit $ upper [subs2 ],
187
- lower = sfit $ lower [subs2 ]
188
- )
188
+
189
+ if (is.null(sfit $ state )){ # no cmprsk
190
+ df <- data.frame (
191
+ time = sfit $ time [subs2 ],
192
+ n.risk = sfit $ n.risk [subs2 ],
193
+ n.event = sfit $ n.event [subs2 ],
194
+ n.censor = sfit $ n.censor [subs2 ],
195
+ surv = sfit $ surv [subs2 ],
196
+ strata = Factor ,
197
+ upper = sfit $ upper [subs2 ],
198
+ lower = sfit $ lower [subs2 ]
199
+ )
200
+ } else { # cmprsk
201
+ if (is.null(status.cmprsk )){
202
+ status.cmprsk <- sfit $ states [2 ]
203
+ }
204
+ col.cmprsk <- which(sfit $ state == status.cmprsk )
205
+ df <- data.frame (
206
+ time = sfit $ time [subs2 ],
207
+ n.risk = sfit $ n.risk [, 1 ][subs2 ],
208
+ n.event = sfit $ n.event [, col.cmprsk ][subs2 ],
209
+ n.censor = sfit $ n.censor [subs2 ],
210
+ surv = sfit $ pstate [, col.cmprsk ][subs2 ],
211
+ strata = Factor ,
212
+ upper = sfit $ upper [, col.cmprsk ][subs2 ],
213
+ lower = sfit $ lower [, col.cmprsk ][subs2 ]
214
+ )
215
+ }
189
216
190
217
form <- sfit $ call $ formula
191
218
@@ -210,24 +237,45 @@ jskm <- function(sfit,
210
237
sfit1 <- survfit(as.formula(form ), data1 )
211
238
sfit2 <- survfit(as.formula(form ), data [data [[var.time ]] > = cut.landmark , ])
212
239
213
- if (length(levels(Factor )) == 1 ){
214
- df2 <- merge(subset(df , time > = cut.landmark )[, c(" time" , " n.risk" , " n.event" , " n.censor" , " strata" )],
215
- data.frame (time = sfit2 $ time , surv = sfit2 $ surv , strata = " All" , upper = sfit2 $ upper , lower = sfit2 $ lower ),
216
- by = c(" time" , " strata" ))
240
+ if (is.null(sfit $ states )){
241
+ if (length(levels(Factor )) == 1 ){
242
+ df2 <- merge(subset(df , time > = cut.landmark )[, c(" time" , " n.risk" , " n.event" , " n.censor" , " strata" )],
243
+ data.frame (time = sfit2 $ time , surv = sfit2 $ surv , strata = " All" , upper = sfit2 $ upper , lower = sfit2 $ lower ),
244
+ by = c(" time" , " strata" ))
245
+
246
+ } else {
247
+ df2 <- merge(subset(df , time > = cut.landmark )[, c(" time" , " n.risk" , " n.event" , " n.censor" , " strata" )],
248
+ data.frame (time = sfit2 $ time , surv = sfit2 $ surv , strata = rep(names(sfit2 $ strata ), sfit2 $ strata ), upper = sfit2 $ upper , lower = sfit2 $ lower ),
249
+ by = c(" time" , " strata" ))
250
+ }
251
+
252
+ df11 <- rbind(subset(df , time < cut.landmark ), df2 [, names(df )])
253
+ df <- rbind(df11 , data.frame (time = cut.landmark , n.risk = summary(sfit , times = cut.landmark )$ n.risk [[1 ]], n.event = 0 , n.censor = 0 , surv = 1 , strata = factor (ystratalabs , levels = levels(df $ strata )), upper = 1 , lower = 1 ))
217
254
} else {
218
- df2 <- merge(subset(df , time > = cut.landmark )[, c(" time" , " n.risk" , " n.event" , " n.censor" , " strata" )],
219
- data.frame (time = sfit2 $ time , surv = sfit2 $ surv , strata = rep(names(sfit2 $ strata ), sfit2 $ strata ), upper = sfit2 $ upper , lower = sfit2 $ lower ),
220
- by = c(" time" , " strata" ))
221
- }
222
-
255
+ if (is.null(status.cmprsk )){
256
+ status.cmprsk <- sfit $ states [2 ]
257
+ }
258
+ col.cmprsk <- which(sfit $ state == status.cmprsk )
259
+
260
+ if (length(levels(Factor )) == 1 ){
261
+ df2 <- merge(subset(df , time > = cut.landmark )[, c(" time" , " n.risk" , " n.event" , " n.censor" , " strata" )],
262
+ data.frame (time = sfit2 $ time , surv = sfit2 $ pstate [, col.cmprsk ], strata = " All" , upper = sfit2 $ upper [, col.cmprsk ], lower = sfit2 $ lower [, col.cmprsk ]),
263
+ by = c(" time" , " strata" ))
264
+
265
+ } else {
266
+ df2 <- merge(subset(df , time > = cut.landmark )[, c(" time" , " n.risk" , " n.event" , " n.censor" , " strata" )],
267
+ data.frame (time = sfit2 $ time , surv = sfit2 $ pstate [, col.cmprsk ], strata = rep(names(sfit2 $ strata ), sfit2 $ strata ), upper = sfit2 $ upper [, col.cmprsk ], lower = sfit2 $ lower [, col.cmprsk ]),
268
+ by = c(" time" , " strata" ))
269
+ }
270
+ df11 <- rbind(subset(df , time < cut.landmark ), df2 [, names(df )])
271
+ df <- rbind(df11 , data.frame (time = cut.landmark , n.risk = summary(sfit , times = cut.landmark )$ n.risk [[1 ]], n.event = 0 , n.censor = 0 , surv = 0 , strata = factor (ystratalabs , levels = levels(df $ strata )), upper = 0 , lower = 0 ))
272
+ }
223
273
224
274
225
- df11 <- rbind(subset(df , time < cut.landmark ), df2 )
226
- df <- rbind(df11 , data.frame (time = cut.landmark , n.risk = summary(sfit , times = cut.landmark )$ n.risk , n.event = 0 , n.censor = 0 , surv = 1 , strata = factor (ystratalabs , levels = levels(df $ strata )), upper = 1 , lower = 1 ))
227
275
}
228
276
229
277
230
- if (cumhaz ){
278
+ if (cumhaz & is.null( sfit $ states ) ){
231
279
upper.new <- 1 - df $ lower
232
280
lower.new <- 1 - df $ upper
233
281
df $ surv = 1 - df $ surv
@@ -241,10 +289,10 @@ jskm <- function(sfit,
241
289
zeros <- data.frame (time = 0 , n.risk = NA , n.event = NA , n.censor = NA , surv = 1 ,
242
290
strata = factor (ystratalabs , levels = levels(df $ strata )),
243
291
upper = 1 , lower = 1 )
244
- if (cumhaz ){
245
- zeros $ surv = 0
246
- zeros $ lower = 0
247
- zeros $ upper = 0
292
+ if (cumhaz | ! is.null( sfit $ states ) ){
293
+ zeros $ surv <- 0
294
+ zeros $ lower <- 0
295
+ zeros $ upper <- 0
248
296
}
249
297
250
298
df <- rbind(zeros , df )
@@ -326,15 +374,22 @@ jskm <- function(sfit,
326
374
p <- p + geom_vline(xintercept = cut.landmark , lty = 2 )
327
375
}
328
376
329
- if (showpercent == TRUE ){
377
+ if (showpercent == T ){
330
378
if (is.null(cut.landmark )){
331
379
y.percent <- summary(sfit , times = xlims [2 ], extend = T )$ surv
332
- if (cumhaz == TRUE ) y.percent <- 1 - y.percent
380
+ if (! is.null(sfit $ states )){
381
+ y.percent <- summary(sfit , times = xlims [2 ], extend = T )$ pstate [, col.cmprsk ]
382
+ }
383
+ if (cumhaz == T & is.null(sfit $ states )) y.percent <- 1 - y.percent
333
384
p <- p + annotate(geom = " text" , x = xlims [2 ], y = y.percent , label = paste0(round(100 * y.percent , 1 ), " %" ), color = " black" )
334
385
} else {
335
386
y.percent1 <- summary(sfit , times = cut.landmark , extend = T )$ surv
336
387
y.percent2 <- summary(sfit2 , times = xlims [2 ], extend = T )$ surv
337
- if (cumhaz == TRUE ) {y.percent1 <- 1 - y.percent1 ;y.percent2 <- 1 - y.percent2 }
388
+ if (! is.null(sfit $ states )){
389
+ y.percent1 <- summary(sfit , times = cut.landmark , extend = T )$ pstate [, col.cmprsk ]
390
+ y.percent2 <- summary(sfit2 , times = xlims [2 ], extend = T )$ pstate [, col.cmprsk ]
391
+ }
392
+ if (cumhaz == T & is.null(sfit $ states )) {y.percent1 <- 1 - y.percent1 ;y.percent2 <- 1 - y.percent2 }
338
393
p <- p + annotate(geom = " text" , x = cut.landmark , y = y.percent1 , label = paste0(round(100 * y.percent1 , 1 ), " %" ), color = " black" ) +
339
394
annotate(geom = " text" , x = xlims [2 ], y = y.percent2 , label = paste0(round(100 * y.percent2 , 1 ), " %" ), color = " black" )
340
395
}
0 commit comments