Brief

Μια κλινική θέλει ένα διαφανές, ελέγξιμο σύστημα υποστήριξης απόφασης που να προτείνει φάρμακο για νέο ασθενή. Επειδή πρόκειται για ιατρική απόφαση, οι γιατροί απαιτούν ένα μοντέλο που να μπορεί να εξηγηθεί ως σαφείς κανόνες «αν–τότε», όχι ως «μαύρο κουτί».

Προκειμένου να μπορέσουμε να καταλήξουμε σε προτεινόμενο φάρμακο από ένα σύνολο πιθανών φαρμάκων με βάση τα χαρακτηριστικά τους και να εξάγουμε σαφείς κανόνες (ύπαρξη αιτιότητας και όχι απλής συσχέστισης), θα επιλέξουμε μία προσέγγιση στηριγμένη σε Δέντρα. Ωστόσο, λόγω του μικρού δείγματος δεδομένων που διαθέτουμε και επειδή θέλουμε να δώσουμε έμφαση στην ερμηνευσιμότητα του μοντέλου που θα κατασκευάσουμε, δεν θα επιλέξουμε Random Forests αλλά ένα απλό δέντρο απόφασης στηριγμένο στον αλγόριθμο CART.



Μέρος Α΄ - Exploratory Data Analysis

Μεταβλητές ανά Θεματική Περιοχή

📊 Γενικά Χαρακτηριστικά

  • age: Η ηλικία του συμμετέχοντα.
  • sex: Το φύλο του συμμετέχοντα.

📊 Ιατρικά Στοιχεία

  • BP: Αρτηριακή Πίεση (χαμηλή - μέτρια - υψηλή)
  • Cholesterol: Επίπεδο Χοληστερόλης (χαμηλό - μέτριο - υψηλό)
  • Na_To_K: Λόγος Νατρίου Προς Κάλιο (σε απόλυτα δεκαδικά)

📊 Μεταβλητή - Στόχος

  • Drug: Το φάρμακο που χορηγήθηκε στον κάθε συμμετέχων


Σημαντική Οπτικοποίηση

Στο dataset που διαθέτουμε, η μοναδική μη κατηγορική μεταβλητή είναι ο λόγος Na_To_K. Ως εκ τούτου θα είχε στατιστικό ενδιαφέρον αν οι τιμές του συσχετίζονται με κάποιο τρόπο με τα φάρμακα που εν τέλει χορηγήθηκαν στους συμμετέχοντες

library(ggplot2)
ggplot(drugs, aes(x = as.factor(drugs$Drug), y = drugs$Na_to_K, fill = as.factor(drugs$Drug))) +
  geom_boxplot(alpha = 0.7) +
  theme_minimal() +
  theme(legend.position = "none") + 
  labs(title = "Εύρη λόγου Na/Κ ανά Φάρμακο", x = "Είδος Φαρμάκου", y = "Λόγος Na/K")

Πόρισμα

  • Το drugY παρατηρούμε ότι χορηγήθηκε σε ασθενείς με τα υψηλότερα Na_To_K, με τα outliers του να βρίσκονται υψηλότερα από κάθε άλλου φαρμάκου. Συνάγεται έτσι αυτομάτως από πολύ νωρίς ένα συμπέρασμα ότι αν ένας ασθενής έχει Na_To_K υψηλότερο από 15, θα του χορηγηθεί το φάρμακο Υ.


Μέρος Β - Ανάλυση μέσω CART Tree

Δημιουργία Μοντέλου

Παρακάτω ακολουθεί η ανάλυση των ιδιοτήτων και των μετρικών του Δέντρου Απόφασης που κατασκευάστηκε με βάση τη μέθοδο CART. Σε αυτό μοντέλο θέσαμε ως ελάχιστο αριθμό παρατηρήσεων για δημιουργία φύλλου τις 8 παρατηρήσεις, καθώς έχουμε μικρό δείγμα και θέλουμε να αποφύγουμε αφενός το overfitting (π.χ. με ένα minbucket 5) αλλά και την υπεραπλούστευση (π.χ. με ένα minbucket 10)

library(rpart)
library(rpart.plot)

tree <- rpart(Drug ~ Age + Sex + BP + Cholesterol + Na_to_K, data = drugs, method="class", minbucket=8)
summary(tree)
## Call:
## rpart(formula = Drug ~ Age + Sex + BP + Cholesterol + Na_to_K, 
##     data = drugs, method = "class", minbucket = 8)
##   n= 200 
## 
##          CP nsplit rel error     xerror       xstd
## 1 0.4954128      0 1.0000000 1.00000000 0.06460892
## 2 0.2110092      1 0.5045872 0.51376147 0.05825507
## 3 0.1467890      2 0.2935780 0.35779817 0.05140481
## 4 0.0733945      3 0.1467890 0.17431193 0.03804299
## 5 0.0100000      5 0.0000000 0.02752294 0.01577075
## 
## Variable importance
##     Na_to_K          BP         Age Cholesterol 
##          48          23          17          11 
## 
## Node number 1: 200 observations,    complexity param=0.4954128
##   predicted class=DrugY  expected loss=0.545  P(node) =1
##     class counts:    23    16    16    54    91
##    probabilities: 0.115 0.080 0.080 0.270 0.455 
##   left son=2 (109 obs) right son=3 (91 obs)
##   Primary splits:
##       Na_to_K     < 14.8285 to the left,  improve=66.1127500, (0 missing)
##       BP          splits as  LRR,         improve=16.3840700, (0 missing)
##       Age         < 50.5    to the left,  improve= 3.8444080, (0 missing)
##       Cholesterol splits as  LR,          improve= 2.4284570, (0 missing)
##       Sex         splits as  RL,          improve= 0.3933333, (0 missing)
##   Surrogate splits:
##       Age < 16.5    to the right, agree=0.555, adj=0.022, (0 split)
## 
## Node number 2: 109 observations,    complexity param=0.2110092
##   predicted class=drugX  expected loss=0.5045872  P(node) =0.545
##     class counts:    23    16    16    54     0
##    probabilities: 0.211 0.147 0.147 0.495 0.000 
##   left son=4 (39 obs) right son=5 (70 obs)
##   Primary splits:
##       BP          splits as  LRR,         improve=29.1397400, (0 missing)
##       Age         < 50.5    to the left,  improve= 7.0423030, (0 missing)
##       Cholesterol splits as  LR,          improve= 4.4277060, (0 missing)
##       Na_to_K     < 9.444   to the right, improve= 2.1769230, (0 missing)
##       Sex         splits as  RL,          improve= 0.3958872, (0 missing)
##   Surrogate splits:
##       Age < 69.5    to the right, agree=0.651, adj=0.026, (0 split)
## 
## Node number 3: 91 observations
##   predicted class=DrugY  expected loss=0  P(node) =0.455
##     class counts:     0     0     0     0    91
##    probabilities: 0.000 0.000 0.000 0.000 1.000 
## 
## Node number 4: 39 observations,    complexity param=0.146789
##   predicted class=drugA  expected loss=0.4102564  P(node) =0.195
##     class counts:    23    16     0     0     0
##    probabilities: 0.590 0.410 0.000 0.000 0.000 
##   left son=8 (23 obs) right son=9 (16 obs)
##   Primary splits:
##       Age         < 50.5    to the left,  improve=18.871790000, (0 missing)
##       Na_to_K     < 12.9925 to the left,  improve= 0.928246500, (0 missing)
##       Cholesterol splits as  LR,          improve= 0.008636977, (0 missing)
##       Sex         splits as  LR,          improve= 0.005128205, (0 missing)
##   Surrogate splits:
##       Na_to_K < 13.197  to the left,  agree=0.667, adj=0.187, (0 split)
## 
## Node number 5: 70 observations,    complexity param=0.0733945
##   predicted class=drugX  expected loss=0.2285714  P(node) =0.35
##     class counts:     0     0    16    54     0
##    probabilities: 0.000 0.000 0.229 0.771 0.000 
##   left son=10 (34 obs) right son=11 (36 obs)
##   Primary splits:
##       BP          splits as  -LR,         improve=7.74453800, (0 missing)
##       Cholesterol splits as  LR,          improve=6.90793700, (0 missing)
##       Na_to_K     < 9.7105  to the right, improve=0.78354040, (0 missing)
##       Age         < 49.5    to the left,  improve=0.36571430, (0 missing)
##       Sex         splits as  RL,          improve=0.06806723, (0 missing)
##   Surrogate splits:
##       Na_to_K     < 10.1085 to the right, agree=0.643, adj=0.265, (0 split)
##       Age         < 49.5    to the left,  agree=0.586, adj=0.147, (0 split)
##       Sex         splits as  RL,          agree=0.543, adj=0.059, (0 split)
##       Cholesterol splits as  RL,          agree=0.543, adj=0.059, (0 split)
## 
## Node number 8: 23 observations
##   predicted class=drugA  expected loss=0  P(node) =0.115
##     class counts:    23     0     0     0     0
##    probabilities: 1.000 0.000 0.000 0.000 0.000 
## 
## Node number 9: 16 observations
##   predicted class=drugB  expected loss=0  P(node) =0.08
##     class counts:     0    16     0     0     0
##    probabilities: 0.000 1.000 0.000 0.000 0.000 
## 
## Node number 10: 34 observations,    complexity param=0.0733945
##   predicted class=drugX  expected loss=0.4705882  P(node) =0.17
##     class counts:     0     0    16    18     0
##    probabilities: 0.000 0.000 0.471 0.529 0.000 
##   left son=20 (16 obs) right son=21 (18 obs)
##   Primary splits:
##       Cholesterol splits as  LR,          improve=1.694118e+01, (0 missing)
##       Age         < 33      to the left,  improve=1.633484e+00, (0 missing)
##       Na_to_K     < 10.6885 to the left,  improve=1.412605e+00, (0 missing)
##       Sex         splits as  RL,          improve=8.255934e-04, (0 missing)
##   Surrogate splits:
##       Age     < 30      to the left,  agree=0.647, adj=0.25, (0 split)
##       Na_to_K < 10.6885 to the left,  agree=0.647, adj=0.25, (0 split)
## 
## Node number 11: 36 observations
##   predicted class=drugX  expected loss=0  P(node) =0.18
##     class counts:     0     0     0    36     0
##    probabilities: 0.000 0.000 0.000 1.000 0.000 
## 
## Node number 20: 16 observations
##   predicted class=drugC  expected loss=0  P(node) =0.08
##     class counts:     0     0    16     0     0
##    probabilities: 0.000 0.000 1.000 0.000 0.000 
## 
## Node number 21: 18 observations
##   predicted class=drugX  expected loss=0  P(node) =0.09
##     class counts:     0     0     0    18     0
##    probabilities: 0.000 0.000 0.000 1.000 0.000


Προκειμένου να δούμε πόσο καθοριστικές ήταν οι μεταβλητές μας, αξίζει να ρίξουμε μια ματιά στο δέντρο απόφασης

Οδηγός Επιλογής Φαρμάκου

Ο λόγος για τον οποίο ένα μεμονωμένο δέντρο και όχι ένα.. “δάσος” ήταν πολύ πιο χρήσιμο, είναι διότι μπορούμε να εξάγουμε με πολλή ευκολία έναν οδηγό επιλογής φαρμάκου για έναν γιατρό που καλείται να λάβει απόφαση χορήγησης.

prp(tree) 

Με βάση το παραπάνω γράφημα Σημαντικότητας, παρατηρούμε ότι καθοριστικότερος παράγοντας είναι η μεταβλητή Na_To_K, καθώς βλέπουμε ότι βρίσκεται στη ρίζα του δέντρου. Αυτό το υποψιαστήκαμε και εξ αρχής όταν είδαμε το BoxPlot εύρους Na_To_K ανά φάρμακο


Με βάση το δέντρο εξάγουμε τους ακόλουθους κανόνες απόφασης

  1. Αν Na_To_K < 15 τότε ο ασθενής θα πάρει το drugY (όπως είδαμε και στην EDA)

  2. Aν ο ασθενής έχει Na_To_K πάνω από 15, υψηλή πίεση και είναι άνω των 51 θα πάρει το φάρμακο Β

  3. Αν έχει Na_To_K > 15, υψηλή πίεση και είναι κάτω των 51 ετών θα πάρει το φάρμακο A


Στο δέντρο απόφασης που βλέπουμε είναι εμφανές ότι για το drugΧ έχουμε παρατηρήσεις σε δύο διακριτά σημεία. Αυτό μας κάνει να υποψιαστούμε ότι είναι αρκετά δύσκολο να προβλεφθεί πότε θα πρέπει να χορηγηθεί το εν λόγω φάρμακο, καθώς μπορεί να χορηγηθεί και σε ασθενείς με χαμηλή πίεση αλλά και με υψηλή.