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ı:
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:
Derste öğrendiğimiz mlr adımlarını R’ın iris veri setiyle uygulayacağım.
## 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
## '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 ...
##
## 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
## 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:
## (Intercept) Petal.Length Sepal.Width
## versicolor 0.743 0.302 -0.589
## virginica -1.669 0.561 -0.695
## (Intercept) Petal.Length Sepal.Width
## versicolor 0.4574 0.763 0.555
## virginica 0.0951 0.575 0.487
## (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 |
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 %
her gözlem için k adet olasılık tahmini yapılılır ve toplamı 1’e eşit olmalı
| setosa | versicolor | virginica |
|---|---|---|
| 1 | 0 | 0 |
| 1 | 0 | 0 |
| 1 | 0 | 0 |
| 1 | 0 | 0 |
| 1 | 0 | 0 |
| 1 | 0 | 0 |
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.