Setting

rm(list=ls(all=TRUE))
setwd('C:/Users/sitdo/Documents/GitHub/IBD-EDA/paper1/')

Loading Data

library(dplyr)

载入程辑包:‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
data <- read.csv("./data_preprocessed/data.csv") %>% select(-1)

Installing Packages

library(e1071)

Method I: Splitting Data

set.seed(123)
splitting_ratio <- 0.7

indices <- 1:nrow(data)
shuffled_indices <- sample(indices) 
train_size <- floor(splitting_ratio * length(indices))

train_indices <- shuffled_indices[1:train_size]
test_indices <- shuffled_indices[(train_size + 1):length(indices)]

train_data <- data[train_indices, ]
test_data <- data[test_indices, ]

Building Model

cubic_svm_model <- svm(dod ~ ., data = train_data, kernel = "polynomial", degree = 3)

predictions <- predict(cubic_svm_model, newdata = test_data)

Performance

Confusion Matrix

confusion_matrix <- table(
  as.numeric(test_data$dod), as.numeric(ifelse(predictions > 0.5, 1, 0))
)

TP <- confusion_matrix[1, 1]
TN <- confusion_matrix[2, 2]
FP <- confusion_matrix[2, 1]
FN <- confusion_matrix[1, 2]

## Calculate Accuracy
accuracy <- (TP + TN) / (TP + FP + TN + FN)
cat("Accuracy:", accuracy, "\n")
Accuracy: 0.8526171 
## Calculate Recall
recall <- TP / (TP + FN)
cat("Recall:", recall, "\n")
Recall: 0.97557 
## Calculate Precision
precision <- TP / (TP + FP)
cat("Precision:", precision, "\n")
Precision: 0.8668596 
## Calculate Specificity
specificity <- TN / (TN + FP)
cat("Specificity:", specificity, "\n")
Specificity: 0.1785714 
## Calculate F1 Score
f1_score <- 2 * (precision * recall) / (precision + recall)
cat("F1 Score:", f1_score, "\n")
F1 Score: 0.9180077 

ROC Curve

library(pROC)
Type 'citation("pROC")' for a citation.

载入程辑包:‘pROC’

The following objects are masked from ‘package:stats’:

    cov, smooth, var
# Calculate ROC curve using the actual values and predictions
roc_obj <- roc(
  as.numeric(test_data$dod), predictions
)
Setting levels: control = 0, case = 1
Setting direction: controls < cases
# Plot the ROC curve
plot(
  roc_obj,
  col = "blue",
  main = "ROC Curve - Cubic SVM",
  legacy.axes = TRUE,
  print.auc = TRUE,
  print.thres = TRUE,
  grid = c(0.2, 0.2),
  grid.col = c("green", "orange")
)

Method II: Cross Validation

# Perform 10-fold cross-validation
num_folds <- 10
folds <- cut(seq(1, nrow(data)), breaks = num_folds, labels = FALSE)

# Create empty vectors to store the predictions and actual values
all_predictions <- vector()
all_actuals <- vector()

for (i in 1:num_folds) {
  # Split the data into training and test sets for the current fold
  train_data <- data[folds != i, ]
  test_data <- data[folds == i, ]
  
  train_X <- as.matrix(train_data[, -1])
  train_y <- train_data[, 1]
  test_X <- as.matrix(test_data[, -1])
  test_y <- test_data[, 1]
  
  cubic_svm_model <- svm(dod ~ ., data = train_data, kernel = "polynomial", degree = 3)

  predictions <- predict(cubic_svm_model, newdata = test_data)
  
  # Append the predictions and actual values to the vectors
  all_predictions <- c(all_predictions, predictions)
  all_actuals <- c(all_actuals, test_y)
}

Performance

Confusion Matrix

confusion_matrix <- table(
  as.numeric(all_actuals), 
  as.numeric(ifelse(all_predictions > 0.5, 1, 0))
)

TP <- confusion_matrix[1, 1]
TN <- confusion_matrix[2, 2]
FP <- confusion_matrix[2, 1]
FN <- confusion_matrix[1, 2]

## Calculate Accuracy
accuracy <- (TP + TN) / (TP + FP + TN + FN)
cat("Accuracy:", accuracy, "\n")
Accuracy: 0.8638808 
## Calculate Recall
recall <- TP / (TP + FN)
cat("Recall:", recall, "\n")
Recall: 0.9774178 
## Calculate Precision
precision <- TP / (TP + FP)
cat("Precision:", precision, "\n")
Precision: 0.8755497 
## Calculate Specificity
specificity <- TN / (TN + FP)
cat("Specificity:", specificity, "\n")
Specificity: 0.2552632 
## Calculate F1 Score
f1_score <- 2 * (precision * recall) / (precision + recall)
cat("F1 Score:", f1_score, "\n")
F1 Score: 0.9236836 

ROC Curve

# Calculate ROC curve using the actual values and predictions
roc_obj <- roc(
  as.numeric(all_actuals), all_predictions
)
Setting levels: control = 0, case = 1
Setting direction: controls < cases
# Plot the ROC curve
plot(
  roc_obj,
  col = "blue",
  main = "ROC Curve - Cubic SVM (Cross Validation)",
  legacy.axes = TRUE,
  print.auc = TRUE,
  print.thres = TRUE,
  grid = c(0.2, 0.2),
  grid.col = c("green", "orange")
)

LS0tDQp0aXRsZTogIkN1YmljU1ZNIg0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazogDQogICAgdG9jOiB0cnVlDQogICAgdGhlbWU6IGNvc21vDQotLS0NCg0KIyBTZXR0aW5nDQoNCmBgYHtyfQ0Kcm0obGlzdD1scyhhbGw9VFJVRSkpDQpzZXR3ZCgnQzovVXNlcnMvc2l0ZG8vRG9jdW1lbnRzL0dpdEh1Yi9JQkQtRURBL3BhcGVyMS8nKQ0KYGBgDQoNCiMgTG9hZGluZyBEYXRhDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCg0KZGF0YSA8LSByZWFkLmNzdigiLi9kYXRhX3ByZXByb2Nlc3NlZC9kYXRhLmNzdiIpICU+JSBzZWxlY3QoLTEpDQpgYGANCg0KIyBJbnN0YWxsaW5nIFBhY2thZ2VzDQoNCmBgYHtyfQ0KbGlicmFyeShlMTA3MSkNCmBgYA0KDQojIE1ldGhvZCBJOiBTcGxpdHRpbmcgRGF0YQ0KDQpgYGB7cn0NCnNldC5zZWVkKDEyMykNCnNwbGl0dGluZ19yYXRpbyA8LSAwLjcNCg0KaW5kaWNlcyA8LSAxOm5yb3coZGF0YSkNCnNodWZmbGVkX2luZGljZXMgPC0gc2FtcGxlKGluZGljZXMpIA0KdHJhaW5fc2l6ZSA8LSBmbG9vcihzcGxpdHRpbmdfcmF0aW8gKiBsZW5ndGgoaW5kaWNlcykpDQoNCnRyYWluX2luZGljZXMgPC0gc2h1ZmZsZWRfaW5kaWNlc1sxOnRyYWluX3NpemVdDQp0ZXN0X2luZGljZXMgPC0gc2h1ZmZsZWRfaW5kaWNlc1sodHJhaW5fc2l6ZSArIDEpOmxlbmd0aChpbmRpY2VzKV0NCg0KdHJhaW5fZGF0YSA8LSBkYXRhW3RyYWluX2luZGljZXMsIF0NCnRlc3RfZGF0YSA8LSBkYXRhW3Rlc3RfaW5kaWNlcywgXQ0KYGBgDQoNCiMjIEJ1aWxkaW5nIE1vZGVsDQoNCmBgYHtyfQ0KY3ViaWNfc3ZtX21vZGVsIDwtIHN2bShkb2QgfiAuLCBkYXRhID0gdHJhaW5fZGF0YSwga2VybmVsID0gInBvbHlub21pYWwiLCBkZWdyZWUgPSAzKQ0KDQpwcmVkaWN0aW9ucyA8LSBwcmVkaWN0KGN1YmljX3N2bV9tb2RlbCwgbmV3ZGF0YSA9IHRlc3RfZGF0YSkNCmBgYA0KDQojIyBQZXJmb3JtYW5jZQ0KDQojIyMgQ29uZnVzaW9uIE1hdHJpeA0KDQpgYGB7cn0NCmNvbmZ1c2lvbl9tYXRyaXggPC0gdGFibGUoDQogIGFzLm51bWVyaWModGVzdF9kYXRhJGRvZCksIGFzLm51bWVyaWMoaWZlbHNlKHByZWRpY3Rpb25zID4gMC41LCAxLCAwKSkNCikNCg0KVFAgPC0gY29uZnVzaW9uX21hdHJpeFsxLCAxXQ0KVE4gPC0gY29uZnVzaW9uX21hdHJpeFsyLCAyXQ0KRlAgPC0gY29uZnVzaW9uX21hdHJpeFsyLCAxXQ0KRk4gPC0gY29uZnVzaW9uX21hdHJpeFsxLCAyXQ0KDQojIyBDYWxjdWxhdGUgQWNjdXJhY3kNCmFjY3VyYWN5IDwtIChUUCArIFROKSAvIChUUCArIEZQICsgVE4gKyBGTikNCmNhdCgiQWNjdXJhY3k6IiwgYWNjdXJhY3ksICJcbiIpDQoNCiMjIENhbGN1bGF0ZSBSZWNhbGwNCnJlY2FsbCA8LSBUUCAvIChUUCArIEZOKQ0KY2F0KCJSZWNhbGw6IiwgcmVjYWxsLCAiXG4iKQ0KDQojIyBDYWxjdWxhdGUgUHJlY2lzaW9uDQpwcmVjaXNpb24gPC0gVFAgLyAoVFAgKyBGUCkNCmNhdCgiUHJlY2lzaW9uOiIsIHByZWNpc2lvbiwgIlxuIikNCg0KIyMgQ2FsY3VsYXRlIFNwZWNpZmljaXR5DQpzcGVjaWZpY2l0eSA8LSBUTiAvIChUTiArIEZQKQ0KY2F0KCJTcGVjaWZpY2l0eToiLCBzcGVjaWZpY2l0eSwgIlxuIikNCg0KIyMgQ2FsY3VsYXRlIEYxIFNjb3JlDQpmMV9zY29yZSA8LSAyICogKHByZWNpc2lvbiAqIHJlY2FsbCkgLyAocHJlY2lzaW9uICsgcmVjYWxsKQ0KY2F0KCJGMSBTY29yZToiLCBmMV9zY29yZSwgIlxuIikNCmBgYA0KDQojIyMgUk9DIEN1cnZlDQoNCmBgYHtyfQ0KbGlicmFyeShwUk9DKQ0KIyBDYWxjdWxhdGUgUk9DIGN1cnZlIHVzaW5nIHRoZSBhY3R1YWwgdmFsdWVzIGFuZCBwcmVkaWN0aW9ucw0Kcm9jX29iaiA8LSByb2MoDQogIGFzLm51bWVyaWModGVzdF9kYXRhJGRvZCksIHByZWRpY3Rpb25zDQopDQoNCiMgUGxvdCB0aGUgUk9DIGN1cnZlDQpwbG90KA0KICByb2Nfb2JqLA0KICBjb2wgPSAiYmx1ZSIsDQogIG1haW4gPSAiUk9DIEN1cnZlIC0gQ3ViaWMgU1ZNIiwNCiAgbGVnYWN5LmF4ZXMgPSBUUlVFLA0KICBwcmludC5hdWMgPSBUUlVFLA0KICBwcmludC50aHJlcyA9IFRSVUUsDQogIGdyaWQgPSBjKDAuMiwgMC4yKSwNCiAgZ3JpZC5jb2wgPSBjKCJncmVlbiIsICJvcmFuZ2UiKQ0KKQ0KYGBgDQoNCiMgTWV0aG9kIElJOiBDcm9zcyBWYWxpZGF0aW9uDQoNCmBgYHtyfQ0KIyBQZXJmb3JtIDEwLWZvbGQgY3Jvc3MtdmFsaWRhdGlvbg0KbnVtX2ZvbGRzIDwtIDEwDQpmb2xkcyA8LSBjdXQoc2VxKDEsIG5yb3coZGF0YSkpLCBicmVha3MgPSBudW1fZm9sZHMsIGxhYmVscyA9IEZBTFNFKQ0KDQojIENyZWF0ZSBlbXB0eSB2ZWN0b3JzIHRvIHN0b3JlIHRoZSBwcmVkaWN0aW9ucyBhbmQgYWN0dWFsIHZhbHVlcw0KYWxsX3ByZWRpY3Rpb25zIDwtIHZlY3RvcigpDQphbGxfYWN0dWFscyA8LSB2ZWN0b3IoKQ0KDQpmb3IgKGkgaW4gMTpudW1fZm9sZHMpIHsNCiAgIyBTcGxpdCB0aGUgZGF0YSBpbnRvIHRyYWluaW5nIGFuZCB0ZXN0IHNldHMgZm9yIHRoZSBjdXJyZW50IGZvbGQNCiAgdHJhaW5fZGF0YSA8LSBkYXRhW2ZvbGRzICE9IGksIF0NCiAgdGVzdF9kYXRhIDwtIGRhdGFbZm9sZHMgPT0gaSwgXQ0KICANCiAgdHJhaW5fWCA8LSBhcy5tYXRyaXgodHJhaW5fZGF0YVssIC0xXSkNCiAgdHJhaW5feSA8LSB0cmFpbl9kYXRhWywgMV0NCiAgdGVzdF9YIDwtIGFzLm1hdHJpeCh0ZXN0X2RhdGFbLCAtMV0pDQogIHRlc3RfeSA8LSB0ZXN0X2RhdGFbLCAxXQ0KICANCiAgY3ViaWNfc3ZtX21vZGVsIDwtIHN2bShkb2QgfiAuLCBkYXRhID0gdHJhaW5fZGF0YSwga2VybmVsID0gInBvbHlub21pYWwiLCBkZWdyZWUgPSAzKQ0KDQogIHByZWRpY3Rpb25zIDwtIHByZWRpY3QoY3ViaWNfc3ZtX21vZGVsLCBuZXdkYXRhID0gdGVzdF9kYXRhKQ0KICANCiAgIyBBcHBlbmQgdGhlIHByZWRpY3Rpb25zIGFuZCBhY3R1YWwgdmFsdWVzIHRvIHRoZSB2ZWN0b3JzDQogIGFsbF9wcmVkaWN0aW9ucyA8LSBjKGFsbF9wcmVkaWN0aW9ucywgcHJlZGljdGlvbnMpDQogIGFsbF9hY3R1YWxzIDwtIGMoYWxsX2FjdHVhbHMsIHRlc3RfeSkNCn0NCg0KYGBgDQoNCiMjIFBlcmZvcm1hbmNlDQoNCiMjIyBDb25mdXNpb24gTWF0cml4DQoNCmBgYHtyfQ0KY29uZnVzaW9uX21hdHJpeCA8LSB0YWJsZSgNCiAgYXMubnVtZXJpYyhhbGxfYWN0dWFscyksIA0KICBhcy5udW1lcmljKGlmZWxzZShhbGxfcHJlZGljdGlvbnMgPiAwLjUsIDEsIDApKQ0KKQ0KDQpUUCA8LSBjb25mdXNpb25fbWF0cml4WzEsIDFdDQpUTiA8LSBjb25mdXNpb25fbWF0cml4WzIsIDJdDQpGUCA8LSBjb25mdXNpb25fbWF0cml4WzIsIDFdDQpGTiA8LSBjb25mdXNpb25fbWF0cml4WzEsIDJdDQoNCiMjIENhbGN1bGF0ZSBBY2N1cmFjeQ0KYWNjdXJhY3kgPC0gKFRQICsgVE4pIC8gKFRQICsgRlAgKyBUTiArIEZOKQ0KY2F0KCJBY2N1cmFjeToiLCBhY2N1cmFjeSwgIlxuIikNCg0KIyMgQ2FsY3VsYXRlIFJlY2FsbA0KcmVjYWxsIDwtIFRQIC8gKFRQICsgRk4pDQpjYXQoIlJlY2FsbDoiLCByZWNhbGwsICJcbiIpDQoNCiMjIENhbGN1bGF0ZSBQcmVjaXNpb24NCnByZWNpc2lvbiA8LSBUUCAvIChUUCArIEZQKQ0KY2F0KCJQcmVjaXNpb246IiwgcHJlY2lzaW9uLCAiXG4iKQ0KDQojIyBDYWxjdWxhdGUgU3BlY2lmaWNpdHkNCnNwZWNpZmljaXR5IDwtIFROIC8gKFROICsgRlApDQpjYXQoIlNwZWNpZmljaXR5OiIsIHNwZWNpZmljaXR5LCAiXG4iKQ0KDQojIyBDYWxjdWxhdGUgRjEgU2NvcmUNCmYxX3Njb3JlIDwtIDIgKiAocHJlY2lzaW9uICogcmVjYWxsKSAvIChwcmVjaXNpb24gKyByZWNhbGwpDQpjYXQoIkYxIFNjb3JlOiIsIGYxX3Njb3JlLCAiXG4iKQ0KDQpgYGANCg0KIyMjIFJPQyBDdXJ2ZQ0KDQpgYGB7cn0NCiMgQ2FsY3VsYXRlIFJPQyBjdXJ2ZSB1c2luZyB0aGUgYWN0dWFsIHZhbHVlcyBhbmQgcHJlZGljdGlvbnMNCnJvY19vYmogPC0gcm9jKA0KICBhcy5udW1lcmljKGFsbF9hY3R1YWxzKSwgYWxsX3ByZWRpY3Rpb25zDQopDQoNCiMgUGxvdCB0aGUgUk9DIGN1cnZlDQpwbG90KA0KICByb2Nfb2JqLA0KICBjb2wgPSAiYmx1ZSIsDQogIG1haW4gPSAiUk9DIEN1cnZlIC0gQ3ViaWMgU1ZNIChDcm9zcyBWYWxpZGF0aW9uKSIsDQogIGxlZ2FjeS5heGVzID0gVFJVRSwNCiAgcHJpbnQuYXVjID0gVFJVRSwNCiAgcHJpbnQudGhyZXMgPSBUUlVFLA0KICBncmlkID0gYygwLjIsIDAuMiksDQogIGdyaWQuY29sID0gYygiZ3JlZW4iLCAib3JhbmdlIikNCikNCmBgYA0K