Giriş

Bu öğrenme günlüğünde PISA 2022 Türkiye verilerini kullanarak çoklu doğrusal regresyon analizi yapılacaktır. Bu analizde öğrencilerin matematik başarılarını etkileyen faktörler araştırılacaktır. Bu analizde kullanılacak değişkenler ve bu değişkenlerin anlamlılığı test edilecektir.

Veri analizine başlamadan önce uygulanması gereken veri inceleme ve temizleme süreci aşağıdaki başlıklarda yapılandrılmıştır. Bu ilk adım analizlerin geçerliliğini ve güvenilirliğini sağlamak için çok önemdedir.

Bu sefer gerekli paketleri kodlama esnasında gerekli yerlerde çağıracağım. Öncelikle resmi kaynaktan indirilen PISA ham veri setini R ortamına alalım.

library(haven)
pisaham <- read_sav("C:/Users/Lenovo/Desktop/pisaturkiye.sav") 

Veri setinden Türkiye verisini seçip, pisaturkiye ismiyle kaydedelim.

library(dplyr)
library(magrittr)
pisaturkiye <- pisaham %>% filter(CNT == "TUR")

7250 gözlem, 1278 değişken içeren veri setinde, analizde kullanılacak değişkenler Okul dışı deneyimler ile ilgili indexlerdir. Bu indexlerin oluşturulması aşağıda açıklanmıştır.

EXERPRAC

Okuldan önce veya sonra spor yapma ya da egzersiz yapma olaak tanımlanmıştır. Öğrencilerin tipik bir okul haftasında kaç gün spor yaptığı veya egzersiz yaptığı (okula gitmeden önce ve/veya okuldan sonra) sorularına verdikleri yanıtlar, ST294 ve ST295 sorularına verilen cevaplara göre “Okuldan önce veya sonra spor yapma ya da egzersiz yapma” endeksine dönüştürülmüştür. Her bir madde şu yanıt seçeneklerini içermektedir: (“0 gün”, “1 gün”, “2 gün”, “3 gün”, “4 gün”, “5 veya daha fazla gün”). Bu endeksteki değerler, haftada 0’dan (hiç spor veya egzersiz yapmayan) 10’a kadar (haftada 10 veya daha fazla kez spor veya egzersiz yapan) değişmektedir.

STUDYHMW

Okuldan önce veya sonra okul çalışması veya ödev yapma olarak tanımlanmıştır. Öğrencilerin tipik bir okul haftasında kaç gün okul çalışması veya ödev yaptığı (okula gitmeden önce ve/veya okuldan sonra) sorularına verdikleri yanıtlar, ST294 ve ST295 sorularına göre “Okuldan önce veya sonra okul çalışması veya ödev yapma” endeksine dönüştürülmüştür. Her bir madde şu yanıt seçeneklerini içermektedir: (“0 gün”, “1 gün”, “2 gün”, “3 gün”, “4 gün”, “5 veya daha fazla gün”). Bu endeksteki değerler, haftada 0’dan (hiç çalışmayan) 10’a kadar (haftada 10 veya daha fazla kez çalışan) değişmektedir.

WORKPAY

Okuldan önce veya sonra ücretli çalışma olarak tanımlanmıştır. Öğrencilerin tipik bir okul haftasında kaç gün okuldan önce veya sonra ücretli olarak çalıştıkları sorusuna verdikleri yanıtlar, ST294 ve ST295 sorularına göre “Okuldan önce veya sonra ücretli çalışma” endeksine dönüştürülmüştür. Her bir madde şu yanıt seçeneklerini içermektedir: (“0 gün”, “1 gün”, “2 gün”, “3 gün”, “4 gün”, “5 veya daha fazla gün”). Bu endeksteki değerler, haftada 0’dan (hiç ücretli çalışmayan) 10’a kadar (haftada 10 veya daha fazla kez çalışan) değişmektedir.

WORKHOME

Ev işlerinde ya da aile bireylerine bakma konusunda çalışma olarak tanımlanmıştır. Öğrencilerin tipik bir okul haftasında kaç gün ev işlerinde veya bir aile bireyine bakım hizmeti sağladıkları (okula gitmeden önce ve/veya okuldan sonra) sorusuna verdikleri yanıtlar, ST294 ve ST295 sorularına göre “Ev işlerinde ya da aile bireylerine bakım konusunda çalışma” endeksine dönüştürülmüştür. Her bir madde şu yanıt seçeneklerini içermektedir: (“0 gün”, “1 gün”, “2 gün”, “3 gün”, “4 gün”, “5 veya daha fazla gün”). Bu endeksteki değerler, haftada 0’dan (hiç ev işi veya bakım yapmayan) 10’a kadar (haftada 10 veya daha fazla kez yapan) değişmektedir.

PVMATH1-10

Bağımlı değişken olarak kullanılacak olan PVMATH1-10 değişkenleri, öğrencilerin matematik başarılarını ölçen 10 farklı sorunun toplam puanını ifade etmektedir.

Sadece kullanılacak değişkenleri seçelim.

pisatur <- pisaturkiye %>% dplyr::select(EXERPRAC, STUDYHMW, WORKPAY, WORKHOME, PV1MATH:PV10MATH)

14 DEĞİŞKEN 7250 GÖZLEMDEN OLUŞAN BİR VERİ SETİ ELDE ETTİM.

Normalde matematik başarısını etkileyen değişkenler incelenirken ortalama alınarak analiz yapılması önerilmez. Ancak bu öğrenme günlüğünde analiz yapılacak olan PV değişkenlerinin ortalaması alınarak analiz yapılmıştır.

PV1MATH:PV10MATH değişkenlerinin ortalamasını alarak yeni bir değişken oluşturalım ve veri setine ekleyelim.

pisatur$PVMATH <- rowMeans(pisatur[,5:14])

Kullanılmayacak olan PV1MATH:PV10MATH değişkenlerini veri setinden çıkaralım.

pisatur <- pisatur %>% dplyr::select(-c(PV1MATH, PV2MATH, PV3MATH, PV4MATH, PV5MATH, PV6MATH, PV7MATH, PV8MATH, PV9MATH, PV10MATH))

Etiketleri temizleyelim.

sjlabelled::remove_all_labels(pisatur)

Veri seti temizlendi ve analiz için hazır hale getirildi.

Kayıp Veri Analizi

Öncelikle veri setinde kaç kayıp veri var ve bunların yüzdesi nedir ona bakalım.

library(naniar)
library(knitr)
library(kableExtra)
pisatur %>% miss_var_summary() %>% kable() %>% kable_styling(full_width = TRUE, position = "center")
variable n_miss pct_miss
WORKPAY 27 0.372
WORKHOME 24 0.331
EXERPRAC 21 0.290
STUDYHMW 20 0.276
PVMATH 0 0

% 0.3 civarı kayıp veri oranı çok düşüktür. Buna rağmen liste basında silme yapabilmek için kayıp verileri desenini görselleştirelim

library(mice)
md.pattern(pisatur)

##      PVMATH STUDYHMW EXERPRAC WORKHOME WORKPAY   
## 7216      1        1        1        1       1  0
## 4         1        1        1        1       0  1
## 3         1        1        1        0       1  1
## 3         1        1        1        0       0  2
## 2         1        1        0        1       1  1
## 2         1        1        0        1       0  2
## 2         1        0        1        1       1  1
## 1         1        0        1        0       0  3
## 17        1        0        0        0       0  4
##           0       20       21       24      27 92

Kayıp verilerin rastgele olup olmadığını test etmek için MCAR testi yapalım.

pisatur %>% naniar::mcar_test() %>% kable() %>% kable_styling(full_width = TRUE, position = "center")
statistic df p.value missing.patterns
74.98975 25 7e-07 9

MCAR testi sonucunda p değeri 0.05’ten büyük olduğu için veri setinin tamamen rastgele dağılmadığına karar verilmiştir. MNAR ve MAR durumları için veri setindeki kayıp verilerin neden kayıp olduğunu anlamak gerekir. Veri setinin ayrıntılı şekilde incelenmesi gerekir.

Kayıp verilerin dağılımını farklı şekilde görselleştirelim.

pisatur %>% naniar::vis_miss()

Bu görselleştirme pek anlaşılır değil. Bu yüzden kayıp verilerin dağılımını daha iyi görebilmek için eksiklik ile hedef değişken arasında ilişki var mı diye bakacağım. Örneğin PVMATH ile WORKPAY eksikliği arasında fark var mı? Bu fark anlamlı mı? Bunun için t testi yapacağım.

t.test(PVMATH ~ is.na(WORKPAY), data = pisatur)
## 
##  Welch Two Sample t-test
## 
## data:  PVMATH by is.na(WORKPAY)
## t = 8.1608, df = 26.383, p-value = 1.089e-08
## alternative hypothesis: true difference in means between group FALSE and group TRUE is not equal to 0
## 95 percent confidence interval:
##   72.41403 121.12886
## sample estimates:
## mean in group FALSE  mean in group TRUE 
##            452.2455            355.4740

Sonuçlar oldukça ilginç. Grup PVMATH Ortalaması WORKPAY eksik değil iken 452.25, WORKPAY eksik olduğunda 355.47 çıkmıştır. Fark yaklaşık 97 puan, t = 8.16, p < 0.001. Bu fark istatistiksel olarak çok anlamlı. 95% güven aralığı, farkın 72 ile 121 puan arasında olduğu söylenebilir. WORKPAY değişkeni eksik olan öğrencilerin matematik başarıları WORKPAY değişkeni eksik olmayan öğrencilere göre daha düşüktür gibi yorumlanabilir.

Kayıp verilerin dağılımı tamamen rast gele değildir. t testi sonucu da silme ya da ortalama atama gibi basit yöntemlerin yanlılığa sebep olacağını açıkça göstermektedir. Bu yüzden önerilen uygun yöntemlerden biri olan multiple imputation yöntemi uygulanacaktır. Bu sefer sadece 1 impute yapılacaktır.

sjlabelled::remove_all_labels(pisatur) # buna rağmen hala haven labelled gibi davranıyor o yüzden as.numeric ile dönüştüreceğim.
pisatur2 <- pisatur %>%
  dplyr::mutate(across(where(haven::is.labelled), ~as.numeric(as.character(.))))

pisatamtur <- mice(pisatur2, m=1, maxit=50, seed=500)
## 
##  iter imp variable
##   1   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   2   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   3   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   4   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   5   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   6   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   7   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   8   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   9   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   10   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   11   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   12   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   13   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   14   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   15   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   16   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   17   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   18   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   19   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   20   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   21   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   22   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   23   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   24   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   25   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   26   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   27   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   28   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   29   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   30   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   31   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   32   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   33   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   34   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   35   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   36   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   37   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   38   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   39   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   40   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   41   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   42   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   43   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   44   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   45   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   46   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   47   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   48   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   49   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
##   50   1  EXERPRAC  STUDYHMW  WORKPAY  WORKHOME
pisatamtur <- complete(pisatamtur)

Veri setindeki eksik veri sayısına yeniden bakalım.

colSums(is.na(pisatamtur))
## EXERPRAC STUDYHMW  WORKPAY WORKHOME   PVMATH 
##        0        0        0        0        0

Eksik veri kalmadığı için veri seti temizlenmiş ve analiz için hazır hale getirilmiştir.

Uç Değer Analizi

Tek değişkenli uç değer: Z-puanı ±4 (n>100) kriteri ile belirlenmiştir.

library(outliers)
z.scores <- pisatamtur %>%  
scores(type = "z") %>%
 round(2)
library(DT)
datatable(z.scores)

Tüm değişkenlerin z skorları -4 ile +4 arasında olduğu için veri setinde tek değişkenli uç değer yoktur.

Çok değişkenli uç değerler için doğruluğundan şüphe duyduğum ancak denemek istediğim bir kodu kullanacağım. Cook distance kullanarak çok değişkenli uç değerleri belirleyeceğim. Bunun için olsrr paketini kullanacağım.

library(olsrr)
## Warning: package 'olsrr' was built under R version 4.4.3
## 
## Attaching package: 'olsrr'
## The following object is masked from 'package:datasets':
## 
##     rivers
reg.fit <- lm(PVMATH ~ ., data = pisatamtur)

cooksd <- cooks.distance(reg.fit)
leverage <- hatvalues(reg.fit)

#Eşikler
n <- nrow(pisatamtur)
p <- length(coefficients(reg.fit))
cooks_cutoff <- 4 / n
lev_cutoff <- 2 * p / n

Çok değişkenli uç değerlerin belirlenmesi ve silinmesi

outlier_index <- which(cooksd > cooks_cutoff | leverage > lev_cutoff)

pisatamtur_clean <- pisatamtur[-outlier_index, ]

Çok değişkenli uç değerler silindiğinde kaç gözlem ve değişken kaldığını kontrol edelim.

nrow(pisatamtur_clean)
## [1] 6597

Çok değişkenli uç değerler silindiğinde 6597 gözlem kaldı.

Derste konuştuğumuzda etkili gözlem kavramından bahsetmiştik. Ekstrapolasyona sebep olan bu verileri görselleştirdiğini düşündüğüm bir fonksiyon buldum.

library(olsrr)
reg.fit <- lm(PVMATH ~ ., data = pisatamtur)
ols_plot_resid_lev(reg.fit)

ols_plot_cooksd_chart(reg.fit)

Bu analiz çıktısında;
- Mavi (normal): Hem residual’ları hem de leverage’ları normal düzeyde.
- Kırmızı (leverage): Modelin tahminlerine büyük etkisi olan ama residual’ı düşük olan gözlemler.
- Yeşil (outlier): Model tahmininden büyük sapması olan gözlemler.
- Mor (outlier & leverage): Hem modelden büyük sapması var, hem de model üzerinde yüksek etkisi var (en riskli tür).

Bu analizde mor renkli gözlemler silinecektir. 60 saniyelik video linki için tıklayınız

Normallik varsayımı

skewness ve kurtosis değerlerinin -1 ile +1 arasında olması gerekmektedir.

library(moments)
pisatamtur_clean %>% 
  dplyr::select(-PVMATH) %>% 
  sapply(moments::skewness) %>% 
  kable() %>% 
  kable_styling(full_width = TRUE, position = "center")
x
EXERPRAC 0.3945490
STUDYHMW -0.2799403
WORKPAY 3.2690802
WORKHOME 0.3775976
pisatamtur_clean %>% 
  dplyr::select(-PVMATH) %>% 
  sapply(moments::kurtosis) %>% 
  kable() %>% 
  kable_styling(full_width = TRUE, position = "center")
x
EXERPRAC 1.897881
STUDYHMW 1.962491
WORKPAY 13.166035
WORKHOME 1.799322

WORKPAY değikşeni kurtosis değeri 13 civarı olarak hesaplandı. Bu değer çok yüksektir. Bu değişkenin dönüşümü gerekmektedir. Yorumlaması zor olacak ancak dönüştürmek sonuçların güvenirliği açısından iyi olacaktır. Bunun için en fazla kullanılan yöntem olan log dönüşümü yapılacaktır.

pisatamtur_clean$WORKPAY <- log(pisatamtur_clean$WORKPAY + 1)

WORKPAY için tekrar skewness ve kurtosis değerlerine bakalım.

pisatamtur_clean %>% 
  dplyr::select(-PVMATH) %>% 
  sapply(moments::skewness) %>% 
  kable() %>% 
  kable_styling(full_width = TRUE, position = "center")
x
EXERPRAC 0.3945490
STUDYHMW -0.2799403
WORKPAY 2.6805332
WORKHOME 0.3775976
pisatamtur_clean %>% 
  dplyr::select(-PVMATH) %>% 
  sapply(moments::kurtosis) %>% 
  kable() %>% 
  kable_styling(full_width = TRUE, position = "center")
x
EXERPRAC 1.897881
STUDYHMW 1.962491
WORKPAY 8.736165
WORKHOME 1.799322

log dönüşümü de işe yaramadığı için diğer değişkenlerde dönüşüm uygulamadı.

Bu gibi durumlarda bootstrapping yöntemi ile regrsyon analizi yapılması önerilmektedir. Yine de değişkenlerin histogramlarını görselleştirelim.

library(ggplot2)
library(tidyr)
## 
## Attaching package: 'tidyr'
## The following object is masked from 'package:magrittr':
## 
##     extract
pisatamtur_clean %>% 
  gather() %>% 
  ggplot(aes(value)) +
  geom_histogram(bins = 30) +
  facet_wrap(~key, scales = "free") +
  theme_minimal()

Doğrusallık

Saçılma grafikleriyle incelenecek ve doğrusal ilişki aranacaktır.

library(ggplot2)
pisatamtur_clean %>% 
  ggplot(aes(x = WORKPAY, y = PVMATH)) +
  geom_point() +
  geom_smooth(method = "lm") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

pisatamtur_clean %>% 
  ggplot(aes(x = STUDYHMW, y = PVMATH)) +
  geom_point() +
  geom_smooth(method = "lm") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

pisatamtur_clean %>% 
  ggplot(aes(x = EXERPRAC, y = PVMATH)) +
  geom_point() +
  geom_smooth(method = "lm") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

pisatamtur_clean %>% 
  ggplot(aes(x = WORKHOME, y = PVMATH)) +
  geom_point() +
  geom_smooth(method = "lm") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Negatif yönlü ve eğimi az da olsa değişkenler arasında doğrusallık vardır denilebilir.

Varyansların Homojenliği

Varyansların farklı gruplar arasında benzer olup olmadığı kontrol edilir. Bunu için en sık kullanılan yöntem Q-Q plot yöntemidir.

library(ggplot2)
pisatamtur_clean %>% 
  gather() %>% 
  ggplot(aes(sample = value)) +
  stat_qq() +
  stat_qq_line() +
  facet_wrap(~key, scales = "free") +
  theme_minimal()

Q-Q plotlar incelendiğinde varyansların homojen olmadığı söylenebilir.

Multicollinearity ve Singularity

Kontrolü için en sık kullanılan yöntem VIF (Variance Inflation Factor) yöntemidir.

library(car)
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.4.3
## 
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
vif(reg.fit) %>% kable() %>% kable_styling(full_width = TRUE, position = "center")
x
EXERPRAC 1.033376
STUDYHMW 1.065774
WORKPAY 1.046362
WORKHOME 1.083661

VIF değerleri 1 ile 10 arasında olduğu için çoklu doğrusal bağlantı sorunu yoktur. Değişkenler arası korelasyonların da incelenmesi gerekir (r > 0.90 olursa sorun olabilir).

library(PerformanceAnalytics)
## Warning: package 'PerformanceAnalytics' was built under R version 4.4.3
## Loading required package: xts
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.4.3
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## ######################### Warning from 'xts' package ##########################
## #                                                                             #
## # The dplyr lag() function breaks how base R's lag() function is supposed to  #
## # work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or       #
## # source() into this session won't work correctly.                            #
## #                                                                             #
## # Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
## # conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop           #
## # dplyr from breaking base R's lag() function.                                #
## #                                                                             #
## # Code in packages is not affected. It's protected by R's namespace mechanism #
## # Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning.  #
## #                                                                             #
## ###############################################################################
## 
## Attaching package: 'xts'
## The following objects are masked from 'package:dplyr':
## 
##     first, last
## 
## Attaching package: 'PerformanceAnalytics'
## The following objects are masked from 'package:moments':
## 
##     kurtosis, skewness
## The following object is masked from 'package:graphics':
## 
##     legend
df <- pisatamtur_clean[, c("EXERPRAC", "STUDYHMW", "WORKPAY", "WORKHOME", "PVMATH")]
chart.Correlation(df, histogram=TRUE, pch=19)

Değişkenler arasında yüksek korelasyon olmadığı için çoklu doğrusal bağlantı sorunu yoktur.

Heteroscedasticity

Heteroscedasticity, hata terimlerinin varyansının sabit olmadığı durumdur. Bu durumda hata terimlerinin varyansı bağımsız değişkenlerin değerlerine bağlı olarak değişmektedir.

Heteroscedasticity kontrolü için en sık kullanılan yöntemlerden biri Breusch-Pagan testidir.

library(lmtest)
pagan <- bptest(reg.fit)
pagan
## 
##  studentized Breusch-Pagan test
## 
## data:  reg.fit
## BP = 67.231, df = 4, p-value = 8.714e-14

Analiz sonuçlarına göre, modelde heteroskedastisite var. Bu, hata terimlerinin varyansı sabit değil demek. Yani, regresyon katsayıları hala doğru olabilir, ama standart hatalar güvenilmez (t-testleri ve p-değerleri sapabilir).

Regresyon Analizi

SAYILTILARI TAM OLARAK KARŞILAYAMADIĞIM İÇİN BOOTSTRAPPING YÖNTEMİNİ KULLANACAĞIM.

library(car)
model_r <- lm(PVMATH ~ ., data = pisatamtur_clean)

fit_r <- Boot(model_r, R = 2000)

summary(fit_r)
## 
## Number of bootstrap replications R = 2000 
##                original    bootBias  bootSE     bootMed
## (Intercept) 476.8230009  0.07782005 2.53160 476.8964545
## EXERPRAC     -0.8398032 -0.00681588 0.27194  -0.8482580
## STUDYHMW     -0.0031781 -0.00470283 0.31490  -0.0051113
## WORKPAY     -30.7202201  0.00398984 1.82322 -30.7007850
## WORKHOME     -3.2770756 -0.00087618 0.27829  -3.2756974
confint(fit_r, level = 0.95)
## Warning in confint.boot(fit_r, level = 0.95): BCa method fails for this
## problem.  Using 'perc' instead
## Bootstrap percent confidence intervals
## 
##                   2.5 %      97.5 %
## (Intercept) 472.0312832 481.7785182
## EXERPRAC     -1.3616515  -0.3069399
## STUDYHMW     -0.6250802   0.6050477
## WORKPAY     -34.3477371 -27.1763027
## WORKHOME     -3.8330696  -2.7432359

fit_ summary ve confint fonksiyonları ile modelin özetini ve güven aralıklarını tablo şeklinde gösterelim.

kable(summary(fit_r), format = "html") %>% 
  kable_styling(full_width = TRUE, position = "center")
R original bootBias bootSE bootMed
(Intercept) 2000 476.8230009 0.0778200 2.5316048 476.8964545
EXERPRAC 2000 -0.8398032 -0.0068159 0.2719385 -0.8482580
STUDYHMW 2000 -0.0031781 -0.0047028 0.3148951 -0.0051113
WORKPAY 2000 -30.7202201 0.0039898 1.8232156 -30.7007850
WORKHOME 2000 -3.2770756 -0.0008762 0.2782938 -3.2756974
kable(confint(fit_r, level = 0.95), format = "html") %>% 
  kable_styling(full_width = TRUE, position = "center")
## Warning in confint.boot(fit_r, level = 0.95): BCa method fails for this
## problem.  Using 'perc' instead
2.5 % 97.5 %
(Intercept) 472.0312832 481.7785182
EXERPRAC -1.3616515 -0.3069399
STUDYHMW -0.6250802 0.6050477
WORKPAY -34.3477371 -27.1763027
WORKHOME -3.8330696 -2.7432359

Ayrı ayrı regresyon katsayıları için grafik çizen car paketinin avPlots fonksiyonunu kullanalım.

library(car)
avPlots(model_r)

Sonuçlar

Bu haftaki öğrenme günlüğünde, çoklu regresyon modeline ilişkin katsayıların hesaplanması amacıyla 2000 yeniden örnekleme ve % 95 güven aralıkları ile bootstrap yöntemi uygulanmıştır. Bu analizde, öğrencilerin matematik başarılarını etkileyen faktörler araştırılmıştır. Modelin sabit teriminin ortalama 476.82 civarında olduğunu göstermektedir. Bootstrap yanlılık değeri oldukça küçüktür (0.11), bu da tahminin istikrarlı olduğunu göstermektedir. %95 güven aralığı [472.09, 481.84] olup, sıfırı içermemesi ve aralığın dar olması modelin güvenilirliğini desteklemektedir.

EXERPRAC (Okuldan önce veya sonra egzersiz pratiği) katsayısı -0.84 olarak tahmin edilmiştir. %95 güven aralığı [-1.39, -0.30] arasında olup, bu aralık sıfırı içermemektedir. Bu durum, değişkenin istatistiksel olarak anlamlı bir negatif etkisi olduğunu göstermektedir. Öğrencinin egzersiz pratiği arttıkça PVMATH puanı azalmaktadır. Ancak bu negatif ilişki dikkat çekicidir ve nedensel yorumlar için ek analizler gerekir.

STUDYHMW öğrencilerin tipik bir okul haftasında kaç gün okul çalışması veya ödev yaptığı (okula gitmeden önce ve/veya okuldan sonra) ile ilgili değişkendi. Tahmin edilen katsayı -0.003 olup oldukça küçüktür. %95 güven aralığı [-0.61, 0.62] sıfırı içermektedir, dolayısıyla değişkenin modele anlamlı bir katkısı olmadığı görülmektedir.

WORKPAY öğrencilerin okuldan önce veya sonra haftada kaç gün ücretli bir işte çalıştıkları ile ilgili olan değişkendi. Bu değişkenin katsayısı -30.72 olup, öğrencinin ücretli işte çalışmasının PVMATH puanı üzerinde anlamlı ve güçlü bir negatif etkisi olduğunu göstermektedir. %95 güven aralığı [-34.26, -27.15] sıfırı içermediği için etki istatistiksel olarak anlamlıdır. Bu durum, işte çalışan öğrencilerin akademik performanslarının düştüğünü göstermektedir.

WORKHOME okuldan önce ya da sonra ev işlerinde ya da aile bireylerine bakma konusunda çalışma ile ilgili değişkendi. Bu değişkenin katsayısı -3.28 olup, evde yardım yükü arttıkça öğrencinin matematik başarısında düşüş yaşandığını göstermektedir. %95 güven aralığı [-3.81, -2.77] sıfırı içermemektedir. Bu da evde yardım yükü arttıkça öğrencinin matematik başarısında düşüş yaşandığını göstermektedir.

Bootstrap analizi, katsayı tahminlerinin güvenilirliğini artırarak modelin sağlamlığını ortaya koymaktadır. Özellikle EXERPRAC, WORKPAY ve WORKHOME değişkenlerinin PVMATH puanı üzerinde istatistiksel olarak anlamlı ve negatif etkileri olduğu görülmüştür. Öte yandan, STUDYHMW değişkeni anlamlı bir etki göstermemektedir.