6. HAFTANIN TEKRARI

Bağımlı değişkenin ikiden fazla kategoriye sahip olduğu durumlar için multinomial lojistik regresyon (MLR) konusunu işledik. Geçen hafta öğrendiğimiz ikili lojistik regresyonun genişletilmesiyle, nominal çok kategorili bağımlı değişkenlerin yordanmasını öğrendik. LR’da bağımlı değişken iki kategorili olduğundan tek bir lojit denklemi yetiyordu ama bağımlı değişkenin üç veya daha fazla kategorisi olduğunda ikili LR yetersiz kalıyor. Çözüm yolları:

  • Kategorileri ikiye indirmek: Ciddi bilgi kaybına neden olur, araştırma sorusunu değiştirir. Tavsiye edilmez.
  • Her çift için ayrı ikili LR: Olasılıklar toplamı 1’i aşabilir, farklı alt örneklemler kullanılır. Her hipotez farklı veri seti ile çalışır ve yorumlamada sorun yaratıur. (Kayıp veride ikili silmeler gibi…)
  • Ordinal LR: Bağımlı değişken sıralıysa ve orantılı odds varsayımı sağlanıyorsa uygundur.
  • MLR: Bağımlı değişken nominal ve 3ve 3ten fazla kategorili olduğunda en uygun yöntemdir.

MLR’da k kategorili bir bağımlı değişken için k-1 adet lojit denklemi kurulur. Her denklem, bir kategorinin referans kategoriye göre log-odds’unu modeller. Derste 3 kategorili progr değişkeni (General, Academic, Vocation) için referans Academic seçildi ve 2 denklem kuruldu:

  • General vs Academic
  • Vocation vs Academic

FARKLI VERİ SETİ İLE UYGULAMA: iris

Derste öğrendiğimiz mlr adımlarını R’ın iris veri setiyle uygulayacağım.

library(nnet)
library(dplyr)
library(knitr)
library(ggplot2)

data(iris)
head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
str(iris)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
table(iris$Species)
## 
##     setosa versicolor  virginica 
##         50         50         50
iris %>%
  group_by(Species) %>%
  summarise(n = n(),
            ort_petal = round(mean(Petal.Length), 2),
            sd_petal = round(sd(Petal.Length), 2),
            ort_sepal_w = round(mean(Sepal.Width), 2)) %>%
  kable()
Species n ort_petal sd_petal ort_sepal_w
setosa 50 1.46 0.17 3.43
versicolor 50 4.26 0.47 2.77
virginica 50 5.55 0.55 2.97

Önce referans kategoriyi belirliyorum. setosa’yı referans alacağım çünkü setosada taç yaprak uzunluğu belirgin şekilde kısa.

iris$Species <- relevel(iris$Species, ref = "setosa")

model_mlr <- multinom(Species ~ Petal.Length + Sepal.Width, data = iris)
## # weights:  12 (6 variable)
## initial  value 164.791843 
## iter  10 value 27.458393
## iter  20 value 16.323670
## iter  30 value 15.804032
## iter  40 value 15.773169
## iter  50 value 15.765030
## iter  60 value 15.763657
## iter  70 value 15.761105
## iter  80 value 15.759926
## iter  90 value 15.758010
## final  value 15.757878 
## converged
summary(model_mlr)
## Call:
## multinom(formula = Species ~ Petal.Length + Sepal.Width, data = iris)
## 
## Coefficients:
##            (Intercept) Petal.Length Sepal.Width
## versicolor        11.2         10.6       -13.8
## virginica        -26.3         19.8       -16.3
## 
## Std. Errors:
##            (Intercept) Petal.Length Sepal.Width
## versicolor        15.0         35.1        23.5
## virginica         15.7         35.2        23.5
## 
## Residual Deviance: 31.5 
## AIC: 43.5

Derste gördüğümüz gibi multinom() otomatik p-değeri vermiyor, Wald z testi ile hesaplıyoruz:

z <- summary(model_mlr)$coefficients / summary(model_mlr)$standard.errors

z
##            (Intercept) Petal.Length Sepal.Width
## versicolor       0.743        0.302      -0.589
## virginica       -1.669        0.561      -0.695
p <- (1 - pnorm(abs(z), 0, 1)) * 2
round(p, 4)
##            (Intercept) Petal.Length Sepal.Width
## versicolor      0.4574        0.763       0.555
## virginica       0.0951        0.575       0.487

Odds Oranları

exp(coef(model_mlr)) %>% round(3)
##            (Intercept) Petal.Length Sepal.Width
## versicolor       69719     4.00e+04           0
## virginica            0     3.83e+08           0
koef <- summary(model_mlr)$coefficients
se <- summary(model_mlr)$standard.errors
or <- exp(koef)

sonuc <- data.frame(
  Karsilastirma = rep(c("versicolor vs setosa", "virginica vs setosa"), each = ncol(koef)),
  Degisken = rep(colnames(koef), 2),
  b = round(as.vector(t(koef)), 3),
  SE = round(as.vector(t(se)), 3),
  z = round(as.vector(t(z)), 3),
  p = round(as.vector(t(p)), 4),
  OR = round(as.vector(t(or)), 3)
)

kable(sonuc)
Karsilastirma Degisken b SE z p OR
versicolor vs setosa (Intercept) 11.2 15.0 0.743 0.457 6.97e+04
versicolor vs setosa Petal.Length 10.6 35.1 0.302 0.763 4.00e+04
versicolor vs setosa Sepal.Width -13.8 23.5 -0.589 0.555 0.00e+00
virginica vs setosa (Intercept) -26.3 15.7 -1.669 0.095 0.00e+00
virginica vs setosa Petal.Length 19.8 35.2 0.561 0.575 3.83e+08
virginica vs setosa Sepal.Width -16.3 23.5 -0.695 0.487 0.00e+00

Sınıflandırma Tablosu

iris$tahmin <- predict(model_mlr, type = "class")

sinif_tablo <- table(Gercek = iris$Species, Tahmin = iris$tahmin)
sinif_tablo
##             Tahmin
## Gercek       setosa versicolor virginica
##   setosa         50          0         0
##   versicolor      0         47         3
##   virginica       0          4        46
dogruluk <- sum(diag(sinif_tablo)) / sum(sinif_tablo)
cat("Doğru sınıflandırma yüzdesi:", round(dogruluk * 100, 1), "%\n")
## Doğru sınıflandırma yüzdesi: 95.3 %

Olasılık

her gözlem için k adet olasılık tahmini yapılılır ve toplamı 1’e eşit olmalı

head(predict(model_mlr, type = "probs")) %>% round(3) %>% kable()
setosa versicolor virginica
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0
1 0 0

Görselleştirme

ggplot(iris, aes(x = Petal.Length, y = Sepal.Width, color = Species, shape = Species)) +
  geom_point(size = 2.5, alpha = 0.7) +
  theme_minimal() +
  labs(title = "Türe göre dağılım",
       x = "Taç Yaprak", y = "Çanak Yaprak")

YANSITMA

MLR aslında LR’nin doğal bir türetilmiş genişletilmiş hali. İkili LR’de tek bir lojit denklemi kurarken, MLR’da k-1 adet denklem kuruluyor. Her denklem, bir kategorinin referans kategoriye göre log-odds’unu modelliyor. Referans kategori seçiminin sonuçları doğrudan etkilediği için stratejik seçilmesi lazım. Katsayılar ve OR’ler hep referansa göre yorumlanıyor referans değiştirilirse katsayılar da değişir ama modelin genel uyumu değişmez. Bağımlı değişken sıralıysa ordinal LR daha tutumlu ve güçlü, ama nominal ise MLR kullanılmalı. LR öğrdnikren sonra daha analışılır bir konuydu. Vizeden sonra olduğu için LR daha çok kavradıktan sonra çlaıştığım için görece daha kolay anladığımı düşünüyoruym.