Bu öğrenme günlüğünde, çoklu regresyon, dummy (yapay) kodlama ve etkileşim (düzenleyici / moderatör etki) gibi çok değişkenli istatistiksel konuları R içerisinde adım adım ele alacağım. Burada kullandığım örneklerde, derste bahsedilen temel prensipleri R ortamında pratiğe dökmeyi amaçladım. Verilerin nasıl keşfedildiğini, çoklu regresyonun nasıl kurulduğunu, varsayımların nasıl test edilebileceğini, moderatör bir etki olduğunda modelin nasıl yorumlanacağını vb. göstermeye çalıştım.
Son haftalardaki derslerde özetle şu konuların üzerinde duruldu:
Bu sefer, mtcars
veri seti üzerinden örnek bir analiz
sürecini anlatacağım. mtcars
veri setinde otomobillere ait
özellikler (mpg, cyl, hp, wt vb…) yer almaktadır.
Öncelikle mtcars
veri setini inceleyelim ve bazı
değişkenleri kısaca açıklayalım:
Öncelikle veri setini çağıralım
Veri setinin ilk 5 satırını inceleyelim
Temel betimleyici istatistikler ve veri yapısını inceleyelim
No | Variable | Stats / Values | Freqs (% of Valid) | Graph | Valid | Missing | ||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | mpg [numeric] |
|
25 distinct values | 32 (100.0%) | 0 (0.0%) | |||||||||||||||||||||||||||||||||||||||||
2 | cyl [numeric] |
|
|
32 (100.0%) | 0 (0.0%) | |||||||||||||||||||||||||||||||||||||||||
3 | disp [numeric] |
|
27 distinct values | 32 (100.0%) | 0 (0.0%) | |||||||||||||||||||||||||||||||||||||||||
4 | hp [numeric] |
|
22 distinct values | 32 (100.0%) | 0 (0.0%) | |||||||||||||||||||||||||||||||||||||||||
5 | drat [numeric] |
|
22 distinct values | 32 (100.0%) | 0 (0.0%) | |||||||||||||||||||||||||||||||||||||||||
6 | wt [numeric] |
|
29 distinct values | 32 (100.0%) | 0 (0.0%) | |||||||||||||||||||||||||||||||||||||||||
7 | qsec [numeric] |
|
30 distinct values | 32 (100.0%) | 0 (0.0%) | |||||||||||||||||||||||||||||||||||||||||
8 | vs [numeric] |
|
|
32 (100.0%) | 0 (0.0%) | |||||||||||||||||||||||||||||||||||||||||
9 | am [numeric] |
|
|
32 (100.0%) | 0 (0.0%) | |||||||||||||||||||||||||||||||||||||||||
10 | gear [numeric] |
|
|
32 (100.0%) | 0 (0.0%) | |||||||||||||||||||||||||||||||||||||||||
11 | carb [numeric] |
|
|
32 (100.0%) | 0 (0.0%) |
Generated by summarytools 1.1.2 (R version 4.4.2)
2025-04-09
Çoklu regresyona geçmeden önce, değişkenler arasındaki korelasyonları
incelemek çoğunlukla faydalıdır. Burada mpg (bağımlı),
wt, hp, ve am
değişkenlerini alalım. am
kategoriktir (Automatic, Manuel).
İleride dummy kodlama örneği yapmak için am
’yi ele
alacağım.
Önce basitçe korelasyon matrisine bakalım (kategorik değişkenleri korelasyona dahil etmek her zaman uygun değildir ama fikir vermek açısından göstermiş olalım):
df <- mtcars[, c("mpg","wt","hp","am")]
library(ggcorrplot)
df <- mtcars[, c("mpg", "wt", "hp", "am")]
df$am <- as.numeric(df$am)
cor_matrix <- cor(df, use = "complete.obs")
pmat <- cor_pmat(df, method = "pearson")
ggcorrplot(cor_matrix,
method = "circle",
lab = TRUE,
type = "upper",
title = "Değişkenler Arasındaki Korelasyon",
p.mat = pmat,
tl.cex = 15,
lab_size = 3,
colors = c("blue", "white", "red")) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, size = 10, face = "bold"))
Not:
am
aslında kategorik bir değişken olduğu için burada sayısal olarak yer alması tam bir “korelasyon” yorumu vermeyebilir. Fakatwt
vehp
ilempg
arasındaki ilişkiyi görmek için bu tabloyu incelemek yararlı olacaktır.
Bu aşamada bağımlı değişken olarak mpg’yi; bağımsız değişkenler olarak wt (ağırlık) ve hp (beygir gücü)’yi kullanacağım. Modeli şu şekilde tanımladım:
\[ \text{mpg} = \beta_0 + \beta_1(\text{wt}) + \beta_2(\text{hp}) + \varepsilon \]
Çoklu regresyon modeli
model1 <- lm(mpg ~ wt + hp, data = mtcars)
library(sjPlot)
tab_model(model1,
show.ci = FALSE,
show.se = TRUE,
show.stat = TRUE,
dv.labels = "Yakıt Tüketimi",
title = "Ağırlık ve Beygir Gücünün Yakıt Tüketimine Etkisi")
Yakıt Tüketimi | ||||
---|---|---|---|---|
Predictors | Estimates | std. Error | Statistic | p |
(Intercept) | 37.23 | 1.60 | 23.28 | <0.001 |
wt | -3.88 | 0.63 | -6.13 | <0.001 |
hp | -0.03 | 0.01 | -3.52 | 0.001 |
Observations | 32 | |||
R2 / R2 adjusted | 0.827 / 0.815 |
R çıktısında: - Estimate
kısmında kesişim (Intercept),
wt
ve hp
katsayılarını, -
Std. Error
kısmında bu katsayıların standart hatalarını, -
t value
ve p değeri
kısmında katsayıların
anlamlılık testini, - R2 / R2 adjusted
kısmında modelin
açıklayıcılığını - F-statistic
kısmında modelin genel
anlamlılık testini (ANOVA tablosu benzeri) görebiliriz.
Derste, çoklu regresyonun birtakım varsayımları olduğunu gördük (normallik, çoklu doğrusallık, uç değer, vb.). R’de bu varsayımları kısmen gözden geçirelim.
4.1 Artıkların (Hataların) İncelenmesi
Çoklu regresyonda hataların normal ve sabit varyansa
(homoskedastisite) sahip olduğu varsayılır. Önce
plot(model1)
komutu ile çeşitli grafikleri
inceleyebiliriz.
Bu grafiklerdeki Residuals vs Fitted (Artıklar vs Tahmin Edilen Değerler) lineerlik ve homoskedastisite (sabit varyans) varsayımını kontrol eder. Noktalar yatay bir bant içinde dağılmalı. Ancak bu grafikte eğri çizgi belirgin bir U şekli çiziyor, bu da lineer olmayan bir ilişki olabileceğini gösteriyor. Modelde lineerlik varsayımı zayıf olabilir. Q-Q Plot artıkların normal dağılıma sahip olup olmadığını kontrol eder. Noktalar teorik doğrultunun üzerinde ve altında sapmalar gösteriyor. Özellikle uçlarda (kuyruklarda) sapma var. Artıklar tam olarak normal dağılmıyor olabilir. Bu durum özellikle küçük örneklemde sorun yaratabilir. Scale-Location artıkların standart sapmasının sabit olup olmadığını kontrol eder. Noktalar belli bir düzende artıyor gibi görünüyor. Hafif bir heteroskedastisite (değişen varyans) olabilir. Bu, modelin tahmin güvenilirliğini etkileyebilir. Residuals vs Leverage aykırı ve etkili gözlemleri belirlemek içindir. “Maserati Bora”, “Toyota Corolla” ve “Chrysler Imperial” etkili gözlemler olarak öne çıkıyor. Bu gözlemler model sonuçlarını orantısız biçimde etkileyebilir. Bu noktaları dikkatle incelemek gerekebilir.
4.2 Çoklu Bağlantı (Multicollinearity)
Bağımsız değişkenlerin birbiriyle yüksek korelasyonda olması,
katsayıların güvenirliğini azaltır. car
paketindeki
vif()
fonksiyonunu kullanarak VIF (Variance Inflation
Factor) değerlerine bakalım.
library(car)
library(formattable)
library(dplyr)
vif_df <- as.data.frame(vif(model1)) |>
tibble::rownames_to_column("Predictor") |>
rename(VIF = 2)
formattable(vif_df, list(
VIF = color_tile("black", "lightgreen")
))
Predictor | VIF |
---|---|
wt | 1.766625 |
hp | 1.766625 |
Derste Cook’s Distance gibi istatistiklere değinilmişti. Aşağıdaki kod ile Cook’s mesafesini görebiliriz. gt ile tabloyu renki ve daha anlaşılır hale de getirelim.
library(dplyr)
library(gt)
cooks_values <- cooks.distance(model1)
n <- nrow(mtcars)
limit <- 4 / n
cooks_df <- data.frame(
Observation = names(cooks_values),
Cooks_Distance = cooks_values
) %>%
mutate(
Above_Limit = ifelse(Cooks_Distance > limit, "Evet", "Hayir")
)
cooks_df %>%
gt() %>%
tab_header(
title = "Her değişken için Cook's Distance"
) %>%
fmt_number(columns = "Cooks_Distance", decimals = 4) %>%
data_color(
columns = "Cooks_Distance",
colors = scales::col_numeric(
palette = c("white", "orange", "red"),
domain = NULL
)
) %>%
tab_spanner(label = "Cook's Distance", columns = c("Cooks_Distance", "Above_Limit")) %>%
tab_footnote(
footnote = paste
("Cook's Distance, her gözlemin model üzerindeki etkisini ölçer. 4/n kuralı, etkili gözlemleri belirlemek için kullanılır."),
locations = cells_column_labels(columns = "Cooks_Distance")
)
Her değişken için Cook's Distance | ||
Observation |
Cook's Distance
|
|
---|---|---|
Cooks_Distance1 | Above_Limit | |
Mazda RX4 | 0.0159 | Hayir |
Mazda RX4 Wag | 0.0055 | Hayir |
Datsun 710 | 0.0207 | Hayir |
Hornet 4 Drive | 0.0000 | Hayir |
Hornet Sportabout | 0.0003 | Hayir |
Valiant | 0.0216 | Hayir |
Duster 360 | 0.0126 | Hayir |
Merc 240D | 0.0168 | Hayir |
Merc 230 | 0.0022 | Hayir |
Merc 280 | 0.0016 | Hayir |
Merc 280C | 0.0122 | Hayir |
Merc 450SE | 0.0014 | Hayir |
Merc 450SL | 0.0001 | Hayir |
Merc 450SLC | 0.0063 | Hayir |
Cadillac Fleetwood | 0.0000 | Hayir |
Lincoln Continental | 0.0178 | Hayir |
Chrysler Imperial | 0.4236 | Evet |
Fiat 128 | 0.1574 | Evet |
Honda Civic | 0.0094 | Hayir |
Toyota Corolla | 0.2084 | Evet |
Toyota Corona | 0.0279 | Hayir |
Dodge Challenger | 0.0209 | Hayir |
AMC Javelin | 0.0275 | Hayir |
Camaro Z28 | 0.0099 | Hayir |
Pontiac Firebird | 0.0144 | Hayir |
Fiat X1-9 | 0.0006 | Hayir |
Porsche 914-2 | 0.0000 | Hayir |
Lotus Europa | 0.0735 | Hayir |
Ford Pantera L | 0.0089 | Hayir |
Ferrari Dino | 0.0057 | Hayir |
Maserati Bora | 0.2720 | Evet |
Volvo 142E | 0.0056 | Hayir |
1 Cook's Distance, her gözlemin model üzerindeki etkisini ölçer. 4/n kuralı, etkili gözlemleri belirlemek için kullanılır. |
Bu şekilde 4/n değerinden büyük Cook’s D değerine sahip gözlemler var mı kontrol ederiz. Gözlemin veriye etkisi büyükse, o gözlemi ayrıca inceleyip, veri girişi hatası mı diye bakmamız gerekir. Sonuçlara göre etkili gözlemler bulunmakta. Bunları veri setinden çıkarığ analizi o şekilde tekrarlamayı deneyeceğim.
Limiti aşan indeksler ve bu indekslerin çıkarılması
Yeni Model ve Sonuçları
model2 <- lm(mpg ~ wt + hp, data = mtcars_clean)
library(sjPlot)
tab_model(model2,
show.ci = FALSE,
show.se = TRUE,
show.stat = TRUE,
dv.labels = "Yakıt Tüketimi",
title = "Ağırlık ve Beygir Gücünün Yakıt Tüketimine Etkisi (Etkili Gözlemler Çıkarıldı)")
Yakıt Tüketimi | ||||
---|---|---|---|---|
Predictors | Estimates | std. Error | Statistic | p |
(Intercept) | 36.34 | 1.25 | 28.96 | <0.001 |
wt | -3.75 | 0.50 | -7.48 | <0.001 |
hp | -0.03 | 0.01 | -4.23 | <0.001 |
Observations | 28 | |||
R2 / R2 adjusted | 0.892 / 0.883 |
library(stargazer)
stargazer(model1, model2,
type = "text",
title = "Model 1 ve Model 2 Karsilastirmasi",
dep.var.labels = c("mpg"),
covariate.labels = c("Agirlik (wt)", "Beygir Gucu (hp)"),
omit.stat = c("f", "ser", "adj.rsq"),
star.char = c("*", "**", "***"),
star.cutoffs = c(0.05, 0.01, 0.001),
digits = 3)
##
## Model 1 ve Model 2 Karsilastirmasi
## ===============================================
## Dependent variable:
## ------------------------------
## mpg
## (1) (2)
## -----------------------------------------------
## Agirlik (wt) -3.878*** -3.752***
## (0.633) (0.501)
##
## Beygir Gucu (hp) -0.032** -0.033***
## (0.009) (0.008)
##
## Constant 37.227*** 36.338***
## (1.599) (1.255)
##
## -----------------------------------------------
## Observations 32 28
## R2 0.827 0.892
## ===============================================
## Note: *p<0.05; **p<0.01; ***p<0.001
Çıktısını tablolaştıramadım
İki modelde de bağımsız değişkenler olan araç ağırlığı (wt) ve beygir gücü (hp), yakıt verimliliği (mpg) üzerinde negatif yönlü ve istatistiksel olarak anlamlı bir etkiye sahiptir. Ağırlık katsayısı Model 1’de -3.878 iken, Model 2’de -3.752 olarak hesaplanmıştır. Benzer şekilde, beygir gücü değişkeninin katsayısı da sırasıyla -0.032 ve -0.033’tür. Katsayıların yönü ve büyüklüğündeki bu tutarlılık, çıkarılan gözlemlerin modelin yapısal ilişkilerini bozmadığını, ancak sonuçların güvenilirliğini artırdığını göstermektedir.
En dikkat çekici fark, modellerin açıklayıcılık düzeylerinde ortaya çıkmaktadır. Model 1’in R² değeri 0.827 iken, Model 2’de bu oran 0.892’ye yükselmiştir. Bu artış, aykırı gözlemlerin modelin genel varyans açıklama kapasitesini düşürdüğünü ve modelin genellenebilirliğini sınırladığını ortaya koymaktadır. Ayrıca, beygir gücü değişkeninin p-değerinde gözlenen düşüş (Model 2’de p<0.001), bu değişkenin Model 2’de daha anlamlı hale geldiğini ve aykırı değerlerin modelin istatistiksel gücünü zayıflatabildiğini göstermektedir.
Sonuç olarak, bu karşılaştırma, etkili gözlemlerin belirlenmesi ve gerektiğinde model dışına alınmasının regresyon analizinde ne kadar kritik olduğunu bir kez daha ortaya koymuştur. Etkili gözlemlerin modelden çıkarılması, modelin istikrarını ve açıklayıcılığını artırmış, standart hataları düşürmüş ve tahminlerin daha güvenilir hale gelmesini sağlamıştır.
Derste dummy (yapay) değişkenlerden bahsedildi.
mtcars
veri setinde am (0 = otomatik, 1 =
manuel) değişkeni dummy olarak kodlanabilir. Bunu doğrudan faktör haline
getirerek modele ekleyebiliriz. R, am
değişkenini otomatik
şekilde dummy olarak modele ekleyecektir. Çıkan regresyon katsayısı,
“Manuel” ile “Otomatik” arabaların mpg değerleri arasındaki farkı (diğer
değişkenler sabit tutulduğunda) gösterir.
mtcars_clean$am <- factor(mtcars_clean$am,
levels = c(0,1),
labels = c("Otomatik", "Manuel"))
model3 <- lm(mpg ~ wt + hp + am, data = mtcars_clean)
tab_model(model3,
show.ci = FALSE,
show.se = TRUE,
show.stat = TRUE,
dv.labels = "Yakıt Tüketimi",
title = "Ağırlık, Beygir Gücü ve Vites Türünin Tüketimine Etkisi")
Yakıt Tüketimi | ||||
---|---|---|---|---|
Predictors | Estimates | std. Error | Statistic | p |
(Intercept) | 35.92 | 2.07 | 17.34 | <0.001 |
wt | -3.62 | 0.71 | -5.11 | <0.001 |
hp | -0.03 | 0.01 | -4.06 | <0.001 |
am [Manuel] | 0.27 | 1.04 | 0.26 | 0.798 |
Observations | 28 | |||
R2 / R2 adjusted | 0.892 / 0.878 |
Model çıktısına göre, ağırlık ve beygir gücü değişkenleri beklendiği gibi negatif katsayılara sahiptir ve istatistiksel olarak yüksek düzeyde anlamlıdır (p < 0.001). Bu, aracın hem ağırlığı hem de motor gücü arttıkça yakıt verimliliğinin (mpg) düştüğünü göstermektedir. Her iki değişkenin de regresyon katsayıları güçlüdür ve modelde belirleyici rol oynamaktadır.
Vites tipi için kullanılan amManuel dummy değişkeninin katsayısı 0.269’dur. Bu, manuel vitesli araçların, otomatik olanlara göre ortalama olarak yaklaşık 0.27 birim daha fazla mpg değerine sahip olduğunu öne sürmektedir. Ancak bu fark istatistiksel olarak anlamlı değildir (p = 0.798). Yani, veri seti bağlamında manuel ya da otomatik vitesli olmanın yakıt verimliliği üzerinde anlamlı bir fark yaratmadığı sonucuna varılabilir.
Modelin genel uyumu oldukça yüksektir: R² = 0.892 ve düzeltilmiş R² = 0.878. Bu değerler, modelin bağımlı değişken olan mpg’deki varyansın yaklaşık %89’unu açıkladığını ve güçlü bir açıklayıcılık düzeyine sahip olduğunu göstermektedir. Ayrıca, modelin F-istatistiği anlamlı çıkmış (p < 0.001), bu da modelin genel olarak anlamlı olduğunu ortaya koymaktadır.
Derste iki yönlü etkileşim (interaction) konusuna değinildi. Mesela, vties tipinin (am), ağırlık (wt) ile mpg arasındaki ilişkiyi değiştirdiğini (düzenlediğini) düşünelim. Bu durumda, modele bir etkileşim terimi eklemeyi deneyelim.
\[ \text{mpg} = \beta_0 + \beta_1(\text{wt}) + \beta_2(\text{am}) + \beta_3(\text{wt} \times \text{am}) + \varepsilon \]
model4 <- lm(mpg ~ wt * am, data = mtcars_clean)
tab_model(model4,
show.ci = FALSE,
show.se = TRUE,
show.stat = TRUE,
dv.labels = "Yakıt Tüketimi",
title = "Moderatör değişkenin eklenmesi")
Yakıt Tüketimi | ||||
---|---|---|---|---|
Predictors | Estimates | std. Error | Statistic | p |
(Intercept) | 33.83 | 2.65 | 12.76 | <0.001 |
wt | -4.50 | 0.71 | -6.34 | <0.001 |
am [Manuel] | 9.64 | 3.96 | 2.43 | 0.023 |
wt × am [Manuel] | -3.88 | 1.40 | -2.77 | 0.011 |
Observations | 28 | |||
R2 / R2 adjusted | 0.862 / 0.845 |
Model sonuçlarına göre, ağırlık arttıkça yakıt verimliliği anlamlı ve güçlü bir şekilde azalmaktadır. Ağırlığın katsayısı -4.495 olup p-değeri 0.00000147’dir, bu da istatistiksel olarak son derece anlamlı olduğunu gösterir. Ayrıca, manuel vitesli araçlar ortalama olarak otomatiklere göre yaklaşık 9.64 birim daha fazla mpg değerine sahiptir ve bu fark da istatistiksel olarak anlamlıdır (p = 0.0228). Yani manuel vitesin yakıt verimliliği açısından avantajlı olabileceğini göstermektedir. “wt:amManuel” etkileşim terimi anlamlı çıkmıştır (p = 0.0106) ve katsayısı -3.88’dir. Bu, manuel vitesli araçlarda ağırlığın yakıt verimliliği üzerindeki olumsuz etkisinin daha da arttığını göstermektedir. Başka bir deyişle, manuel araçlar hafifken daha verimliyken, ağırlaştıkça mpg değerinde daha keskin bir düşüş yaşamaktadırlar.
Modelin R² değeri 0.862 olup, bu modelin mpg’deki varyansın yaklaşık %86’sını açıkladığını gösterir. Bu oldukça yüksek bir açıklama gücüdür. Ayrıca modelin genel geçerliliği F-testi sonucuna göre anlamlıdır (p < 0.001).
Sonuç olarak, bu günlükte dummy değişkenlerin ve etkileşim terimlerinin regresyon modellerine nasıl entegre edilebileceğini ve yorumlanabileceğini göstermeye çalıştım. Çıkan sonuçlara göre, manuel vitesli araçlar genel olarak daha verimli olsa da, bu verimlilik ağırlık arttıkça daha hızlı azalmaktadır. Bu durum, modelin hem ana etkileri hem de etkileşimleri dikkate alarak daha gerçekçi sonuçlar sunabildiğini göstermektedir.
Ek Not: Böyle bir modelde yorum yaparken,
wt
’nin etkisinin “Otomatik” arabalar için farklı, “Manuel” arabalar için farklı olabileceğini göz önünde bulundurmak gerekir.
Ek Not2: Ödev Süresi yaklaşık 2,5 saattir.