Multinominal Lojistik Regresyon(MLR) bağımlı değişkenin 3 veya daha fazla kategoriye sahip olduğu durumlarda kullanılır. MLR’de amaç bağımlı değişkenin kategorilerinin olasılıklarını bağımsız değişkenlerle açıklamaktır. Basit lojistik regresyon yetersiz kaldığında, çok kategorili sonuçları modellemek için MLR kullanılır.
MLR’de bağımlı değişkenin en az 3 kategorili olduğu bir veri seti bulmak için yapay zekadan destek aldım. Bunun sonucunda R’da yer alan ve daha önce R’a giriş dersinde de kullandığımız Iris veri setini kullanmaya karar verdim. Iris veri setinde bağımlı değişken Species; Setosa, Versicolor, Virginica olmak üzere 3 kategoriden oluşmaktadır. Bağımsız değişkenler ise Sepal.Length, Sepal.Width, Petal.Length, Petal.Width.’ten meydana gelmektedir.
library(dplyr)
iris %>% group_by(Species) %>%
summarise(n=n(),
ort=mean(Petal.Length),
sd=sd(Petal.Length))
## # A tibble: 3 × 4
## Species n ort sd
## <fct> <int> <dbl> <dbl>
## 1 setosa 50 1.46 0.174
## 2 versicolor 50 4.26 0.470
## 3 virginica 50 5.55 0.552
levels(iris$Species) <- c("Setosa", "Versicolor", "Virginica")
iris$Species <- relevel(iris$Species, ref = "Setosa")
library(nnet)
model1 <- multinom(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, data = iris)
## # weights: 18 (10 variable)
## initial value 164.791843
## iter 10 value 16.177348
## iter 20 value 7.111438
## iter 30 value 6.182999
## iter 40 value 5.984028
## iter 50 value 5.961278
## iter 60 value 5.954900
## iter 70 value 5.951851
## iter 80 value 5.950343
## iter 90 value 5.949904
## iter 100 value 5.949867
## final value 5.949867
## stopped after 100 iterations
summary(model1)
## Call:
## multinom(formula = Species ~ Sepal.Length + Sepal.Width + Petal.Length +
## Petal.Width, data = iris)
##
## Coefficients:
## (Intercept) Sepal.Length Sepal.Width Petal.Length Petal.Width
## Versicolor 18.69037 -5.458424 -8.707401 14.24477 -3.097684
## Virginica -23.83628 -7.923634 -15.370769 23.65978 15.135301
##
## Std. Errors:
## (Intercept) Sepal.Length Sepal.Width Petal.Length Petal.Width
## Versicolor 34.97116 89.89215 157.0415 60.19170 45.48852
## Virginica 35.76649 89.91153 157.1196 60.46753 45.93406
##
## Residual Deviance: 11.89973
## AIC: 31.89973
library(sjPlot)
tab_model(model1, show.ci = FALSE, show.se = FALSE, show.p = TRUE)
| Species | |||
|---|---|---|---|
| Predictors | Odds Ratios | p | Response |
| (Intercept) | 130956302.52 | 0.594 | Versicolor |
| Sepal Length | 0.00 | 0.952 | Versicolor |
| Sepal Width | 0.00 | 0.956 | Versicolor |
| Petal Length | 1536119.71 | 0.813 | Versicolor |
| Petal Width | 0.05 | 0.946 | Versicolor |
| (Intercept) | 0.00 | 0.506 | Virginica |
| Sepal Length | 0.00 | 0.930 | Virginica |
| Sepal Width | 0.00 | 0.922 | Virginica |
| Petal Length | 18850009278.07 | 0.696 | Virginica |
| Petal Width | 3742635.30 | 0.742 | Virginica |
| Observations | 150 | ||
| R2 / R2 adjusted | 0.964 / 0.958 | ||
library(parameters)
model_parameters(model1)
## # Response level: versicolor
##
## Parameter | Log-Odds | SE | 95% CI | z | p
## --------------------------------------------------------------------
## (Intercept) | 18.69 | 34.97 | [ -49.85, 87.23] | 0.53 | 0.593
## Sepal Length | -5.46 | 89.89 | [-181.64, 170.73] | -0.06 | 0.952
## Sepal Width | -8.71 | 157.04 | [-316.50, 299.09] | -0.06 | 0.956
## Petal Length | 14.24 | 60.19 | [-103.73, 132.22] | 0.24 | 0.813
## Petal Width | -3.10 | 45.49 | [ -92.25, 86.06] | -0.07 | 0.946
##
## # Response level: virginica
##
## Parameter | Log-Odds | SE | 95% CI | z | p
## --------------------------------------------------------------------
## (Intercept) | -23.84 | 35.77 | [ -93.94, 46.26] | -0.67 | 0.505
## Sepal Length | -7.92 | 89.91 | [-184.15, 168.30] | -0.09 | 0.930
## Sepal Width | -15.37 | 157.12 | [-323.32, 292.58] | -0.10 | 0.922
## Petal Length | 23.66 | 60.47 | [ -94.85, 142.17] | 0.39 | 0.696
## Petal Width | 15.14 | 45.93 | [ -74.89, 105.16] | 0.33 | 0.742
library(pscl)
pR2(model1)
## fitting null model for pseudo-r2
## # weights: 6 (2 variable)
## initial value 164.791843
## final value 164.791843
## converged
## llh llhNull G2 McFadden r2ML r2CU
## -5.9498671 -164.7918433 317.6839523 0.9638947 0.8797152 0.9896796
0.964 McFadden pseudo-R² değeri için; 0.2–0.4 arası “iyi uyum” kabul edilirken, 0.96 olağanüstü yüksek bir değer. Yorum olarak Model, bağımlı değişkeni açıklamada çok güçlü diyebiliriz.
r2ML = 0.880 Maksimum likelihood tabanlı pseudo-R². r2CU = 0.990 Nagelkerke pseudo-R². Her ikisi de 0.8–0.9’un üzerinde olduğundan modelin açıklayıcılığı çok yüksek diyebiliriz.
exp(coef(model1))
## (Intercept) Sepal.Length Sepal.Width Petal.Length Petal.Width
## Versicolor 1.309563e+08 0.0042602646 1.653575e-04 1536120 4.515366e-02
## Virginica 4.446690e-11 0.0003620841 2.111348e-07 18850009278 3.742635e+06
Yorumlama
Odds ratio > 1 olduğunda ilgili değişken arttığında kategoriye girme olasılığı referansa göre katlanarak artar. Odds ratio < 1 olduğunda ilgili değişken arttığında kategoriye girme olasılığı referansa göre katlanarak azalır. Odds ratio ≈ 1 olduğunda değişkenin etkisi yok denecek kadar azdır.
Versicolor vs Setosa Sepal.Length (0.00426) odds ratio değeri yaklaşık 1.004. Sepal uzunluğu 1 birim arttığında, Versicolor olma oddsunu Setosa’ya göre 1.004 katına çıkar. - Sepal.Width (0.000165) odds ratio değeri yaklaşık 1.00016. Sepal genişliği 1 birim arttığında, Versicolor olma oddsunu Setosa’ya göre 1.00016 katına çıkar (neredeyse değişmez). - Petal.Length (1,536,120) odds ratio değeri yaklaşık çok büyük. Petal uzunluğu 1 birim arttığında, Versicolor olma oddsunu Setosa’ya göre astronomik katlara çıkar. - Petal.Width (0.045) odds ratio değeri yaklaşık 1.046. Petal genişliği 1 birim arttığında, Versicolor olma oddsunu Setosa’ya göre 1.046 katına çıkar.
pred_probs <- fitted(model1)
head(pred_probs)
## Setosa Versicolor Virginica
## 1 1.0000000 1.526406e-09 2.716417e-36
## 2 0.9999996 3.536476e-07 2.883729e-32
## 3 1.0000000 4.443506e-08 6.103424e-34
## 4 0.9999968 3.163905e-06 7.117010e-31
## 5 1.0000000 1.102983e-09 1.289946e-36
## 6 1.0000000 3.521573e-10 1.344907e-35
Modelde Versicolor ve Virginica olasılıkları sıfıra çok yakın olduğu için model, bu gözlemin neredeyse kesinlikle Setosa olduğunu tahmin ediyor yorumu yapılabilir. DEğerler 0’a yakın olduğundan aynı şekilde Veriscolor ve Virginica için de aynı yorumlar yapılabilir.
library(sjPlot)
plot_model(model1, show.values = TRUE, show.p = TRUE)
pred_class <- predict(model1, type="class")
table(pred_class, iris$Species)
##
## pred_class Setosa Versicolor Virginica
## Setosa 50 0 0
## Versicolor 0 49 1
## Virginica 0 1 49
Toplam 150 gözlemden 148’i doğru tahmin edilmiştir.(yaklaşık %98,7)