134 |
147 |
|
#' \code{\link[stats]{confint}} |
135 |
148 |
|
#' \code{\link[data.table]{data.table}} |
136 |
149 |
|
#' @rdname timeROC_table |
137 |
|
- |
#' @importFrom stats confint |
|
150 |
+ |
#' @importFrom stats confint qnorm |
138 |
151 |
|
#' @importFrom data.table data.table |
|
152 |
+ |
#' @importFrom survival concordance |
139 |
153 |
|
|
140 |
154 |
|
timeROC_table <- function(ListModel, dec.auc =3, dec.p = 3){ |
141 |
|
- |
auc <- round(sapply(ListModel, function(x){x$AUC[[2]]}), dec.auc) |
142 |
|
- |
if (all(sapply(ListModel, `[[`, "iid"))){ |
143 |
|
- |
auc.ci <- sapply(ListModel, function(x){ifelse(is.na(x$AUC[[2]]), NA, paste(round(stats::confint(x)$CI_AUC/100, dec.auc), collapse = "-"))}) |
144 |
|
- |
|
145 |
|
- |
if (length(ListModel) == 1){ |
146 |
|
- |
out <- data.table::data.table(paste0("Model ", seq_along(ListModel)), auc, auc.ci) |
147 |
|
- |
names(out) <- c("Prediction Model", "AUC", "95% CI") |
148 |
|
- |
} else{ |
149 |
|
- |
auc.pdiff <- c(NA, sapply(seq_along(ListModel)[-1], |
150 |
|
- |
function(x){ |
151 |
|
- |
p <- timeROC::compare(ListModel[[x]], ListModel[[x-1]])$p_values_AUC[2] |
152 |
|
- |
p <- ifelse(p < 0.001, "< 0.001", round(p, dec.p)) |
153 |
|
- |
return(p) |
154 |
|
- |
})) |
155 |
|
- |
|
156 |
|
- |
out <- data.table::data.table(paste0("Model ", seq_along(ListModel)), auc, auc.ci, auc.pdiff) |
157 |
|
- |
names(out) <- c("Prediction Model", "AUC", "95% CI", "P-value for AUC Difference") |
158 |
|
- |
} |
|
155 |
+ |
res.roc <- eval(parse(text = paste0("survival::concordance(", paste(paste0("lapply(ListModel, `[[`, 'coxph')[[", seq_along(ListModel), "]]"), collapse = ", "), ")"))) |
|
156 |
+ |
auc <- res.roc$concordance |
|
157 |
+ |
se1.96 <- stats::qnorm(0.975) * sqrt(ifelse(length(ListModel) == 1, res.roc$var, diag(res.roc$var))) |
|
158 |
+ |
auc.ci <- paste0(round(auc - se1.96, dec.auc), "-", round(auc + se1.96, dec.auc)) |
|
159 |
+ |
auc <- round(auc, dec.auc) |
|
160 |
+ |
|
|
161 |
+ |
if (length(ListModel) == 1){ |
|
162 |
+ |
out <- data.table::data.table(paste0("Model ", seq_along(ListModel)), auc, auc.ci) |
|
163 |
+ |
names(out) <- c("Prediction Model", "AUC", "95% CI") |
159 |
164 |
|
} else{ |
160 |
|
- |
out <- data.table::data.table(paste0("Model ", seq_along(ListModel)), auc) |
161 |
|
- |
names(out) <- c("Prediction Model", "AUC") |
|
165 |
+ |
auc.pdiff <- c(NA, sapply(seq_along(ListModel)[-1], |
|
166 |
+ |
function(x){ |
|
167 |
+ |
contr <- c(-1, 1) |
|
168 |
+ |
dtest <- contr %*% res.roc$concordance[(x-1):x] |
|
169 |
+ |
dvar <- contr %*% res.roc$var[(x-1):x, (x-1):x] %*% contr |
|
170 |
+ |
p <- 2 * pnorm(abs(dtest/sqrt(dvar)), lower.tail = F) |
|
171 |
+ |
p <- ifelse(p < 0.001, "< 0.001", round(p, dec.p)) |
|
172 |
+ |
return(p) |
|
173 |
+ |
})) |
|
174 |
+ |
|
|
175 |
+ |
out <- data.table::data.table(paste0("Model ", seq_along(ListModel)), auc, auc.ci, auc.pdiff) |
|
176 |
+ |
names(out) <- c("Prediction Model", "AUC", "95% CI", "P-value for AUC Difference") |
162 |
177 |
|
} |
163 |
178 |
|
|
164 |
179 |
|
|