Bağımlı değişkenin ikili (0/1) olduğu durumlarda kullanılan bir regresyon yöntemidir. Doğrusal regresyondan temel farkı, sürekli bir değer değil olasılık tahmin etmesidir.
Varsayımları: Bağımlı değişken ikili olmalı Gözlemler birbirinden bağımsız olmalı Bağımsız değişkenler ile log-odds arasında doğrusallık olmalı Çoklu doğrusallık olmamalı (birden fazla bağımsız değişken varsa)
library(haven)
library(car)
library(DescTools)
library(pROC)
library(caret)
library(ResourceSelection)##
## 0 1
## 7 4
##
## Kaldı Geçti
## 7 4
##
## Kaldı Geçti
## 7 4
##
## Kaldı Geçti
## 0.6363636 0.3636364
##
## Call:
## glm(formula = pass ~ X, family = binomial(link = "logit"), data = PASS)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -6.3475 3.6336 -1.747 0.0807 .
## X 0.9843 0.5547 1.774 0.0760 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 14.4206 on 10 degrees of freedom
## Residual deviance: 7.6638 on 9 degrees of freedom
## AIC: 11.664
##
## Number of Fisher Scoring iterations: 6
X arttıkça geçme olasılığı artıyor yönünde bir ilişki var ancak örneklem çok küçük (n = 11) olduğu için anlamlılık eşiğine ulaşılamıyor.
X değişkeni tek tek p değerine göre anlamlı görünmese de modeli genel olarak iyileştiriyor. n = 11 çok küçük.
## OR 2.5 % 97.5 %
## (Intercept) 0.002 0.000 0.262
## X 2.676 1.207 13.515
X bir birim arttığında geçme olasılığının kalmama olasılığına oranı 2.676 kat artıyor.
## McFadden CoxSnell Nagelkerke
## 0.4685529 0.4589566 0.6283291
##
## Hosmer and Lemeshow goodness of fit (GOF) test
##
## data: as.numeric(PASS$pass) - 1, fitted(model)
## X-squared = 4.099, df = 6, p-value = 0.6633
Model uyumu oldukça iyi. X değişkeni pass’i açıklamada güçlü bir katkı yapıyor. Ancak n = 11 olduğu için bu değerleri temkinli yorumlamak gerekir.Küçük örneklemlerde psödo R² değerleri şişmeye eğilimlidir.
PASS$prob <- predict(model, type = "response")
PASS$pred <- factor(ifelse(PASS$prob >= 0.5, "Geçti", "Kaldı"),
levels = c("Kaldı", "Geçti"))
cm <- confusionMatrix(PASS$pred, PASS$pass, positive = "Geçti")
print(cm)## Confusion Matrix and Statistics
##
## Reference
## Prediction Kaldı Geçti
## Kaldı 6 1
## Geçti 1 3
##
## Accuracy : 0.8182
## 95% CI : (0.4822, 0.9772)
## No Information Rate : 0.6364
## P-Value [Acc > NIR] : 0.175
##
## Kappa : 0.6071
##
## Mcnemar's Test P-Value : 1.000
##
## Sensitivity : 0.7500
## Specificity : 0.8571
## Pos Pred Value : 0.7500
## Neg Pred Value : 0.8571
## Prevalence : 0.3636
## Detection Rate : 0.2727
## Detection Prevalence : 0.3636
## Balanced Accuracy : 0.8036
##
## 'Positive' Class : Geçti
##
11 gözlemden 9’u doğru sınıflandırılmış, 2’si yanlış.
Model makul bir performans gösteriyor, ancak n = 11 ile bu metriklerin güvenilirliği sınırlı.
roc_obj <- roc(PASS$pass, PASS$prob, levels = c("Kaldı", "Geçti"), direction = "<")
plot(roc_obj, col = "steelblue", lwd = 2, main = "ROC Eğrisi", print.auc = TRUE)## AUC: 0.9107143
AUC değerine göre model mükemmel ayırt edicilik göstermektedir.
Eğrinin sol üst köşeye yakın olması iyi ayırt edicilik gücünün göstergesidir.
library(ggplot2)
ggplot(data = gecme_durumu2, aes(x = X, y = pass)) +
geom_jitter(width = 0, height = 0.05, alpha = 0.5)
Elde edilen grafikten anlaşıldığı üzere lojistik regresyona uygun bir
yapı mevcuttur. X arttıkça geçme olasılığı belirgin şekilde artıyor, iki
grup arasında makul bir ayrışma var.
##
## Pearson's product-moment correlation
##
## data: gecme_durumu2$X and gecme_durumu2$pass
## t = 4.3406, df = 20, p-value = 0.0003173
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.3891341 0.8642937
## sample estimates:
## cor
## 0.696477
X arttıkça geçme olasılığı artıyor, bu lojistik regresyon bulgusunu destekliyor.
data_space2 <- ggplot(data = gecme_durumu2, aes(x = X, y = pass)) +
geom_jitter(width = 0, height = 0.05, alpha = 0.5)
data_space2
Doğru pozitif eğimli (X arttıkça pass artıyor) Korelasyon değeri ile
tutarlı bir görünüm mevcut.
mlbench paketindeki BreastCancer veri setini kullanarak lojistik regresyon analizi yapılmıştır.
Belirli bir örneğin diğer 9 hücre özelliğine dayanarak iyi veya kötü huylu olma durumu modellenmiştir.
## 'data.frame': 699 obs. of 11 variables:
## $ Id : chr "1000025" "1002945" "1015425" "1016277" ...
## $ Cl.thickness : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 5 5 3 6 4 8 1 2 2 4 ...
## $ Cell.size : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 1 1 2 ...
## $ Cell.shape : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 2 1 1 ...
## $ Marg.adhesion : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 5 1 1 3 8 1 1 1 1 ...
## $ Epith.c.size : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 2 7 2 3 2 7 2 2 2 2 ...
## $ Bare.nuclei : Factor w/ 10 levels "1","2","3","4",..: 1 10 2 4 1 10 10 1 1 1 ...
## $ Bl.cromatin : Factor w/ 10 levels "1","2","3","4",..: 3 3 3 3 3 9 3 3 1 2 ...
## $ Normal.nucleoli: Factor w/ 10 levels "1","2","3","4",..: 1 2 1 7 1 7 1 1 1 1 ...
## $ Mitoses : Factor w/ 9 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 5 1 ...
## $ Class : Factor w/ 2 levels "benign","malignant": 1 1 1 1 1 2 1 1 1 1 ...
## Id Cl.thickness Cell.size Cell.shape Marg.adhesion
## Length:699 1 :145 1 :384 1 :353 1 :407
## Class :character 5 :130 10 : 67 2 : 59 2 : 58
## Mode :character 3 :108 3 : 52 10 : 58 3 : 58
## 4 : 80 2 : 45 3 : 56 10 : 55
## 10 : 69 4 : 40 4 : 44 4 : 33
## 2 : 50 5 : 30 5 : 34 8 : 25
## (Other):117 (Other): 81 (Other): 95 (Other): 63
## Epith.c.size Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses
## 2 :386 1 :402 2 :166 1 :443 1 :579
## 3 : 72 10 :132 3 :165 10 : 61 2 : 35
## 4 : 48 2 : 30 1 :152 3 : 44 3 : 33
## 1 : 47 5 : 30 7 : 73 2 : 36 10 : 14
## 6 : 41 3 : 28 4 : 40 8 : 24 4 : 12
## 5 : 39 (Other): 61 5 : 34 6 : 22 7 : 9
## (Other): 66 NA's : 16 (Other): 69 (Other): 69 (Other): 17
## Class
## benign :458
## malignant:241
##
##
##
##
##
# Tüm bağımsız değişkenler factor olarak geliyor. numeric'e çevir.
BC <- BC %>%
mutate(across(-Class, ~ as.numeric(as.character(.))))##
## benign malignant
## 444 239
##
## Call:
## glm(formula = Class ~ ., family = binomial(link = "logit"), data = BC)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -10.10394 1.17488 -8.600 < 2e-16 ***
## Cl.thickness 0.53501 0.14202 3.767 0.000165 ***
## Cell.size -0.00628 0.20908 -0.030 0.976039
## Cell.shape 0.32271 0.23060 1.399 0.161688
## Marg.adhesion 0.33064 0.12345 2.678 0.007400 **
## Epith.c.size 0.09663 0.15659 0.617 0.537159
## Bare.nuclei 0.38303 0.09384 4.082 4.47e-05 ***
## Bl.cromatin 0.44719 0.17138 2.609 0.009073 **
## Normal.nucleoli 0.21303 0.11287 1.887 0.059115 .
## Mitoses 0.53484 0.32877 1.627 0.103788
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 884.35 on 682 degrees of freedom
## Residual deviance: 102.89 on 673 degrees of freedom
## AIC: 122.89
##
## Number of Fisher Scoring iterations: 8
Tüm anlamlı değişkenlerin katsayısı pozitiftir. Bu beklenen yöndedir ve hücresel anormallik arttıkça malignant olasılığı artmaktadır. Cell.size anlamlı değil. Cell.shape ile yüksek korelasyonu olduğu için birinin etkisi diğerini baskılıyor olabilir (çoklu doğrusallık şüphesi).
## OR 2.5 % 97.5 %
## (Intercept) 0.000 0.000 0.000
## Cl.thickness 1.707 1.315 2.311
## Cell.size 0.994 0.674 1.549
## Cell.shape 1.381 0.862 2.156
## Marg.adhesion 1.392 1.097 1.798
## Epith.c.size 1.101 0.805 1.499
## Bare.nuclei 1.467 1.230 1.784
## Bl.cromatin 1.564 1.131 2.225
## Normal.nucleoli 1.237 0.998 1.561
## Mitoses 1.707 0.993 3.024
Cl.thickness: Bir birim artışta malignant olasılığı 1.707 kat artıyor. Bare.nuclei: Bir birim artışta 1.467 kat artıyor. Bl.cromatin: Bir birim artışta 1.564 kat artıyor. Marg.adhesion: Bir birim artışta 1.392 kat artıyor.
Cell.size OR = 0.994 neredeyse 1, yani hiç etkisi yok. Modelden çıkarılabilir.
## McFadden CoxSnell Nagelkerke
## 0.8836567 0.6815090 0.9386555
Nagelkerke R² = 0.939 9 bağımsız değişken, malignant/benign ayrımındaki varyansın %93.9’unu açıklıyor. Gerçek klinik veri için son derece güçlü bir model.
# Hosmer-Lemeshow testi
hl <- hoslem.test(as.numeric(BC$Class) - 1, fitted(model), g = 10)
print(hl)##
## Hosmer and Lemeshow goodness of fit (GOF) test
##
## data: as.numeric(BC$Class) - 1, fitted(model)
## X-squared = 13.941, df = 8, p-value = 0.08331
Gözlenen ve tahmin edilen değerler arasında anlamlı bir fark yok. Model veriye iyi uyuyor.
Her iki uyum iyiliği göstergesi de modelin çok güçlü olduğuna işaret ediyor.
BC$prob <- predict(model, type = "response")
BC$pred <- factor(ifelse(BC$prob >= 0.5, "malignant", "benign"),
levels = c("benign", "malignant"))
cm <- confusionMatrix(BC$pred, BC$Class, positive = "malignant")
print(cm)## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 434 11
## malignant 10 228
##
## Accuracy : 0.9693
## 95% CI : (0.9534, 0.9809)
## No Information Rate : 0.6501
## P-Value [Acc > NIR] : <2e-16
##
## Kappa : 0.9324
##
## Mcnemar's Test P-Value : 1
##
## Sensitivity : 0.9540
## Specificity : 0.9775
## Pos Pred Value : 0.9580
## Neg Pred Value : 0.9753
## Prevalence : 0.3499
## Detection Rate : 0.3338
## Detection Prevalence : 0.3485
## Balanced Accuracy : 0.9657
##
## 'Positive' Class : malignant
##
683 gözlemden 662’si doğru sınıflandırıldı, yalnızca 21 hata var. Tüm metrikler son derece yüksek, model klinik açıdan da güvenilir bir performans sergiliyor.
roc_obj <- roc(BC$Class, BC$prob,
levels = c("benign", "malignant"),
direction = "<")
plot(roc_obj, col = "steelblue", lwd = 2,
main = "ROC Eğrisi — BreastCancer",
print.auc = TRUE)## AUC: 0.9963248
AUC değeri mükemmele çok yakın ayırt edicilik gücünü göstermektedir. Eğrinin şekli ideale yakındır.
Tüm göstergeler tutarlı biçimde çok yüksek. BreastCancer veri seti lojistik regresyon için oldukça uygun bir yapıya sahip. Değişkenler malignant/benign ayrımını güçlü biçimde açıklıyor.
Lojistik regresyon öğrenme sürecinde hem kavramsal hem teknik hem de uygulamalı boyutlarda önemli kazanımlar elde ettim.
Kavramsal açıdan, bağımlı değişkenin ikili olduğu durumlarda doğrusal regresyonun neden yetersiz kaldığını anladım. Doğrusal modelin olasılık tahminlerini 0-1 aralığı dışına taşıyabildiğini, bunun da yorumlanamaz sonuçlar doğurduğunu gördüm. Logit dönüşümü ve sigmoid eğrisinin bu sorunu nasıl çözdüğünü kavradım. Odds ve Odds Ratio kavramlarını yorumlamayı öğrendim; OR’ın 1’den büyük olmasının ilgili değişken arttıkça olayın gerçekleşme şansının arttığını, 1’den küçük olmasının ise azaldığını gösterdiğini anladım.