# Sensitivity, Specificity, and ROC Curve ###### tags: `R` `Statistics` `Sensitivity` `Specificity` `Predictive Value` `ROC curve` ## Dataset **Data Set Information:** ** This dataset contains the medical records of **229 geriatric patients who visited WF ER**. Each patient profile has **22 clinical variables**. <br/> **Attribute Information:** * Age: year * Sex: male = 1 * Admission: admitted = 1 * ICU: ICU admission; admitted = 1 * LOS: length of stay; day * DEMENTIA: dementia (+) = 1 * CVA: CVA (+) =1 * Liver_d: liver disease (+) = 1 * DM: DM (+) =1 * CKD: CKD (+) = 1 * tumor: any cancer (+) = 1 * ISAR: Identification of Seniors At Risk (ISAR) * score * CCI: The Charlson Comorbidity Index * Katz: Katz Index of Independence * AD8: Dementia Screening Interview * SOF: The study of osteoporotic fractures (SOF) index * MNA: The Mini Nutritional Assessment (MNA) * BSRS-5: The 5-item Brief Symptom Rating Scale * x72hrs_return: 72 hours ER return * x30D: 30 days mortality * x30R: 30 days ER return * x30A: 30 days hospital admission ## Sensitivity, Specificity, and Predictive Value ```r= install.packages("caret") install.packages("pROC") # Load library library(caret) library(pROC) library("PerformanceAnalytics") # import geriatric.txt file and name it data data <- read.table("data/geriatric_2.txt", header = T, sep = "\t") str(data) # Transform data data$Sex <- as.factor(data$Sex) data$Admission <- as.factor(data$Admission) data$x72hrs_return <- as.factor(data$x72hrs_return) data$x30D <- as.factor(data$x30D) data$x30R <- as.factor(data$x30R) data$x30A <- as.factor(data$x30A) str(data) all_index <- data %>% select(ISAR, CCI, Katz, SPSMQ, SOF, MNA, BSRS.5) # Correlation MAtrix chart.Correlation(all_index, histogram=TRUE, pch=40) # use MNA < 7 as a cut off for admission prediction data$predit_adm <- as.integer(data$MNA < 7) ### make a two way table for analysis ### table(vertical, Horizontal) table <- table(data$predit_adm,data$Admission) table table <- table(factor(data$predit_adm,levels = c("1","0")),factor(data$Admission,levels = c("1","0"))) table # rename the column and row colnames(table) <- c("ADM","Non-ADM") #predit rownames(table) <- c("ADM","Non-ADM") # true table # calculate the Sensitivity, Specificity, and Predictive Value confusionMatrix(table) ``` ##ROC Curve and AUC ``` # Create ROC model myroc <- roc(data$Admission, data$MNA,levels=c( "1","0"), percent = TRUE, ci = TRUE, of = "se", ci.type="shape" ) myroc # Plot ROC curve plot.roc(myroc, print.thres="best", print.thres.best.method="youden", print.auc=TRUE ) plot.roc(myroc, print.thres="best", print.thres.best.method="youden", print.auc=TRUE, legacy.axes= T ) # change the setting myroc1 <- roc(data$Admission, data$MNA,levels=c( "1","0"), of = "se", ci.type="shape" ) myroc1 plot.roc(myroc1, print.thres="best", print.thres.best.method="youden", print.auc=TRUE, legacy.axes= T ) #Use cutoff value = 10 data$predit_adm <- as.integer(data$MNA < 10) table2 <- table(factor(data$predit_adm,levels = c("1","0")),factor(data$Admission,levels = c("1","0"))) colnames(table2) <- c("ADM","Non-ADM") #predit rownames(table2) <- c("ADM","Non-ADM") # true confusionMatrix(table2) ```