DERS NOTLARI TEKRAR- 7. kısıma kadar

Fonksiyonlar belirli görevleri yerine getiren komut gruplarıdır. Fonksiyonların içerisinde argümanlar bulunur, eğer argüman ismi yazmazsak R varsayılan sırayı kullanır.

Örnekler:

rnorm(n, mean = 0, sd = 1): rastgele sayı üretmeyi sağlar. set.seed() fonksiyonu tekrarlanabilirlik sağlar.

TAB otomatik tamamlamayı sağlar.

Bir fonksiyon oluşturmak için function() fonksiyonu kullanılır. Genel yapısı aşağıdadır.

fonksiyonadi<- function(argumanlar ve olagan degerleri){ kodlar return() }

Argümanlara olağan değerler girilebilir. Argümanları isimleri ile yazmakta fayda vardır. Argümanları isimleri ile yazdığımızda sıralarını değiştirebiliriz ama çok da önerilmez. Bir argümanın değerini NULL olarak da ayarlanabilir. Bir fonksiyon tanımında özel … argümanı kullanılarak değişken sayıda argüman belirtilebilir.

üs_al<-  function(x,us=2){
  return(x^us)
  }
üs_al(3)
## [1] 9

ls() ve objects(): kayıtlı nesneleri konsolda gösterir.

ls.str(): hafızadaki nesneleri ayrıntıları ile gösterir.

rm(): nesneleri tek tek kaldırmak için kullanılır.

rm(list = ls()): konsoldaki tüm nesneleri temizler. Ben süpürge işaretini daha çok seviyorum, temizlik hissi veriyor:)

get() çalışma dizinini sorgularken setwd() yeni çalışma dizini atamamızı sağlar.

R’da çıkış yaparken ben her zaman save tuşuna basarım ama bunun için bir komut var elbette: save.image(“dosyaadi”).

Yapılan işlemleri durdurmak için Stop ikonuna basabiliriz.

cat(): birleştir ve yazdır fonksiyonudur.

seq_along(): içine verdiğiniz vektörün veya listenin her bir elemanına karşılık gelen (1’den başlayıp uzunluğuna kadar giden) sıralı indeks numaralarını oluşturur.

sd(): standart sapmayı hesaplayan fonksiyon ve iki adet argümanı var: x sayı vektörünü gösterir ve na.rm eksik değerlerin kaldırılıp kaldırılmayacağını belirten bir mantıksal ifadedir.

Fonksiyon örneği: Aşağıdaki fonksiyon içi sıfırlarla (0) dolu 5 satırlı ve 10 sütunlu bir tablo oluşturup bunu Excel dosyası olarak kaydeder.

library(writexl)
fonksiyon_adi <- function(sayi=1,satir=c(5),sutun=c(10)){
 df <- data.frame(matrix(0,nrow=satir, ncol=sutun))
 writexl::write_xlsx(df,"veri_1.xlsx")
}
fonksiyon_adi(sayi=1,satir=c(5),sutun=c(10))

Geometrik ortalama için fonksiyon:Normalde psych paketinden geometric.mean() fonksiyonu ile elde edebiliriz. Örnek kişisel fonksiyon ise;

library(psych)
 hesapla_geometrik_ortalama_v2 <- function(x) {
   # Pozitiflik kontrolü
   if (any(x <= 0)) {stop("Geometrik ortalama hesaplanacak tüm değerler pozitif olmalıdır.")}
   n <- length(x) # Gözlem sayısı
 # 1. Doğrudan Çarpım Yöntemi (Kısa formül)
   g_mean_carpim <- prod(x)^(1/n)
 # 2. Logaritmik Yöntem (Kısa formül)
   g_mean_log <- exp(mean(log(x)))
 # 3. psych::geometric.mean()
   g_mean_psych <- psych::geometric.mean(x)
 # Sonuçları düzenli bir veri çerçevesi olarak oluşturma
  sonuclar <- data.frame( Yontem = c("Doğrudan Çarpım", "Logaritmik", "psych::geometric.mean()"),
  Geometrik_Ortalama = c(g_mean_carpim, g_mean_log, g_mean_psych),
  row.names = NULL)

   # Sonuçları yazdırma (Veri çerçevesi formatında)
   cat("--- Geometrik Ortalama Hesaplama Sonuçları (n =", n, ") ---\n")
   print(sonuclar)
   cat("-----------------------------------------------------------\n")

   # Veri çerçevesini görünmez (invisible) olarak döndürme
   return(invisible(sonuclar))
 }


x_test <- 200:250
hesapla_geometrik_ortalama_v2(x_test)
## --- Geometrik Ortalama Hesaplama Sonuçları (n = 51 ) ---
##                    Yontem Geometrik_Ortalama
## 1         Doğrudan Çarpım           224.5172
## 2              Logaritmik           224.5172
## 3 psych::geometric.mean()           224.5172
## -----------------------------------------------------------

Aşağıdaki fonksiyon belirlediğimiz sayıda ve boyutlarda Excel dosyalarını otomatik olarak oluşturup, içlerini rastgele verilerle doldurmak için yazılmıştır.

fonksiyon_adi <-function(sayi=3,satir=c(5,5,5),sutun=c(10,10,10)){
  
   df_list <- list() ## her bir veri setinin atanacağı yeni nesne
     
     for( i in 1:sayi){
     df_list[[i]] <- data.frame(matrix(0,nrow=satir[i], ncol=sutun[i])) # veri seti istenilen ozelliklerde olusturulur
      for(j in 1:sutun[i]){
      df_list[[i]][,j] <- round(rnorm(satir[i],0,1),2) #  her bir veri setinin her bir sütunu standart normal dağılıma uygun uretilir
           writexl::write_xlsx(df_list[[i]],paste("veri",i,".xlsx", sep=""))
 
      }}
   
 }
 fonksiyon_adi(sayi=5,satir=c(5,4,3,5,5),sutun=c(10,5,4,3,4))

Kontrol Yapıları

if ve else: bir koşulu test etmek ve ona göre hareket etmek için kullanılır.

Sadece if: Koşul doğruysa kodu çalıştırır, yanlışsa hiçbir şey yapmaz.

if ve else: Koşul doğruysa ilk bloğu, yanlışsa else bloğunu çalıştırır.

else if: Birden fazla koşulu sırayla test etmek için kullanılır.

Örnek:

set.seed(41)
x <- runif(1, 0, 10)
if(x > 3) {
        y <- 10
} else {
        y <- 0
}

R’da if-else bloğunun sonucunu doğrudan bir değişkene eşitleyebilirsiz. Örnek:

 if(x > 3) { y <- 10 } else { y <- 0 } #yerine 

  y <- if(x > 3) { 10 } else { 0 } # de yazılabilir. 

Örnekler;

 x <-75
if(x>=65){print("Basarılı")}
## [1] "Basarılı"
x <-60

if(x>=65){print("Basarılı")} else { print("Basarisiz")}
## [1] "Basarisiz"
x <- 75 # Öğrencinin notu

if (x >= 90) {print("AA") } else 

  if (x >= 80) {print("BA")} else 
    
    if (x >= 70) {print("BB")}  else 
      
      if (x >= 65) {print("CB")} else 
        
        if (x >= 60) {print("CC")} else 
                            
          if (x >= 50) {print("DD")} else 
                      
            if (x >= 30) {print("FD")}  else  {print("FF")}
## [1] "BB"

ÖRNEK 1: a sayısının çarpmaya göre tersi 1/a’dir. Ancak bu durum 0 için tanımsızdır. if() durum cümlesi kullanarak bu durumu kodlayınız. x <- 5 ve x<-0 için için test ediniz.

x <- 5

if (x == 0) {print("Tanımsız")} else {print(1/x)}
## [1] 0.2
x<-0
if(x==0) {print("Tanımsız")} else { print(1/x)}
## [1] "Tanımsız"

ÖRNEK 2:

2 ile 2 arasında sayılar üretip, bunu x değişkenine atayalım.Random olarak üretilen sayının 1’den büyük olması durumunda çıktı “1’den büyük” -1 ile 1 arasında olması durumunda “-1 ile +1 arasında” -1’den küçük olması durumunda ise “-1’den küçük” çıktısı versin.

x <- runif(1, min = -2, max = 2)

if(x>1) { print("1’den büyük")} else 
  
  if ( x >= -1 & x <= 1){ print ("1 ile +1 arasında")} else { print ("-1’den küçük")} 
## [1] "1’den büyük"

if() önermesi içinde kullanılabilen all fonkisyonu ile vektörün tüm elemanları için koşul testi yapılır.

x <- c(1,2,-3,4)

if(all(x>0)){ print("tum sayilar 0'dan buyuktur")} else {print("tum sayilar 0'dan buyuk degildir")}
## [1] "tum sayilar 0'dan buyuk degildir"

Bir vektörde içinde yer alan herhangi bir elemana dair test ise if() fonksiyonu içinde any() fonksiyonu ile yapılır.

x <- c(1,2,-3,4)
if(any(x<0)){ print("nesne en az bir negatif sayi icerir")} else{print("nesne negatif sayi icermez")}
## [1] "nesne en az bir negatif sayi icerir"

if() çoklu işlem:

x <- 2
if(x == 2) { 
   goster3 <- "Dogru"  
   goster3b <- c(1,2,3)
   goster3c <- sample(1:1000,4)} else {
 
  goster3 <- "Yanlis"  
  goster3b <- c(3,2,1)
  goster3c <- 10000 + sample(1:1000,4)}

ifelse() durum cümlesinin genel kullanımı: ifelse(koşul, Doğru İfade, Yanlış İfade)

 x <- 20
 ifelse(x>= 65, "Başarılı" ,"Başarısız")
## [1] "Başarısız"

ÖRNEK: Finalden 50 ve üzeri alan ve en az 11 derse devam edem öğrencilerin geçme notları finalin %60 ve vizenin %40 alınarak hesaplansın, 11’den az derse devam eden öğrencilerin geçme notu final notunun %60’ı olarak alınsın.

vize <- c(60,70,80,90,55)
final <- c(45,65,70,50,80)
devam <- c(14,10,13,12,11)

gecme_notu <- ifelse(final >= 50 & devam >= 11, (vize * 0.40) + (final * 0.60), final * 0.60)                

for: bir döngüyü sabit sayıda çalıştırmak için kullanılır. İndeks değeri başlangıcı 1 olmak zorunda değil, i yerine başka bir harf de yazabiliriz.

Örnek:

for(i in 1:10) {print(i)}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10

Döngülerde bir degişken yeniden tanımlanacak ise mutlaka döngü öncesi o değişken tanımlanmalıdır.

(X <- cbind(a = 1:5, b=2:6))
##      a b
## [1,] 1 2
## [2,] 2 3
## [3,] 3 4
## [4,] 4 5
## [5,] 5 6
Y <- array()
for(i in 1:nrow(X)) {Y[i] <- X[i,1] + X[i,2]}

Y
## [1]  3  5  7  9 11
set.seed(10)
x <- sample(1:10000,100)
sayac <- 0
 for (val in x) {
 if(val %% 2 == 0){
sayac = sayac+1}}
print(sayac)
## [1] 46

cat(), paste() gibi fonksiyonları uzun bir döngüde, döngünün durumunu görmek için de kullanılabilir.

islem.kontrol <- array()
for(i in 1:10){
islem.kontrol[i] <- paste("Islem ", i, " tamamlandi", sep="")}

islem.kontrol
##  [1] "Islem 1 tamamlandi"  "Islem 2 tamamlandi"  "Islem 3 tamamlandi" 
##  [4] "Islem 4 tamamlandi"  "Islem 5 tamamlandi"  "Islem 6 tamamlandi" 
##  [7] "Islem 7 tamamlandi"  "Islem 8 tamamlandi"  "Islem 9 tamamlandi" 
## [10] "Islem 10 tamamlandi"

for() Döngüsü ve Kontrol İşlemi tüm elemanlara uygulamak istemediğizde, akış kontrolü gerekir. Örnekler:

for(i in 1:3){
if (i==2) cat("indeks cift sayidir:","\n")
else cat(i,"\n")}
## 1 
## indeks cift sayidir: 
## 3
for(i in 1:3){if (i==2) {cat("indeks degeri ikidir:",i,"\n") }
  else{cat("indeks degeri iki degildir","\n")}}
## indeks degeri iki degildir 
## indeks degeri ikidir: 2 
## indeks degeri iki degildir

break: bir döngünün yürütülmesini keser.

for(i in 1:12){ if(i==3){break}
   print (i)}
## [1] 1
## [1] 2

next: bir döngü arasını atlamayı sağlar.

for(i in 1:6){if(i==3){next} 
              print (i)}
## [1] 1
## [1] 2
## [1] 4
## [1] 5
## [1] 6

6.7.1.Sıra Sizde Alıştırması

X matrisini kullanarak aşağıdaki çıktıyı elde etmek için gerekli kodu yazınız.

1 satirdaki degerlerin carpimi 21 olarak hesaplanmistir. 2 satirdaki degerlerin carpimi 44 olarak hesaplanmistir. 3 satirdaki degerlerin carpimi 69 olarak hesaplanmistir. 4 satirdaki degerlerin carpimi 96 olarak hesaplanmistir. 5 satirdaki degerlerin carpimi 125 olarak hesaplanmistir.

X <- cbind(1:5, 21:25)
X
##      [,1] [,2]
## [1,]    1   21
## [2,]    2   22
## [3,]    3   23
## [4,]    4   24
## [5,]    5   25
for(i in 1:nrow(X)) {
  carpim <- X[i, 1] * X[i, 2]
  cat(i, "satirdaki degerlerin carpimi", carpim, "olarak hesaplanmistir.\n")
}
## 1 satirdaki degerlerin carpimi 21 olarak hesaplanmistir.
## 2 satirdaki degerlerin carpimi 44 olarak hesaplanmistir.
## 3 satirdaki degerlerin carpimi 69 olarak hesaplanmistir.
## 4 satirdaki degerlerin carpimi 96 olarak hesaplanmistir.
## 5 satirdaki degerlerin carpimi 125 olarak hesaplanmistir.
set.seed(853)
y<-matrix(rnorm(1000000),nrow=1000)
z<-0*y

#  Döngü ile yapılmış işlem:

time2 <- system.time (
  for(i in 1:1000)
    { for(j in 1:1000){z[i,j]<-y[i,j]^2}})
time2
##    user  system elapsed 
##   0.114   0.000   0.116
# Döngüsüz daha pratik yol:
time3 <- system.time(z<-y^2)
time3
##    user  system elapsed 
##   0.001   0.000   0.002

İç içe for döngüleri: for döngüleri iç içe yerleştirilebilir. 2-3 seviyeden fazla iç içe kod yazılması, kodun okunmasını zorlaştırır.

x <- matrix(1:6, 2, 3)
x
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
for(i in seq_len(nrow(x))) {
      for(j in seq_len(ncol(x))) {
      print(x[i, j])}   
        }
## [1] 1
## [1] 3
## [1] 5
## [1] 2
## [1] 4
## [1] 6

6.9.1 SIRA SİZDE ALIŞTIRMASI

Aşağıdaki çıktıyı elde edecek kodu oluşturmaya çalışın. Boş matris için verilen kod: m2 <- matrix(0,nrow=5,ncol=5)

   [,1] [,2] [,3] [,4] [,5]

[1,] 1 2 3 4 5 [2,] 2 4 6 8 10 [3,] 3 6 9 12 15 [4,] 4 8 12 16 20 [5,] 5 10 15 20 25

m2 <- matrix(0,nrow=5,ncol=5)

# Matrisin i numaralı satırına ve j numaralı sütununa git (m2[i,j]). Oraya satır numarası ile sütun numarasının çarpımını (i*j) yaz.

for(i in seq_len(nrow(m2))) {
      for(j in seq_len(ncol(m2))) {
      m2[i, j] <- i * j}   
        }

m2
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    2    3    4    5
## [2,]    2    4    6    8   10
## [3,]    3    6    9   12   15
## [4,]    4    8   12   16   20
## [5,]    5   10   15   20   25

PISA DATASI ÇALIŞMASI

Veri Hazırlığı

Daha önceden .rds dosyası olarak kaydettiğim verileri yükledim. Daha sonra daha önceden seçtiğim değişkenleri select komutu ile seçerek analiz yapacağım veriyi oluşturdum.

library(tidyverse)

tur_ham <- readRDS("pisa_2022_tur_full.rds")
fin_ham <- readRDS("pisa_2022_fin_full.rds")

#  Türkiye İçin Değişkenlerin Seçimi
tur_veri <- tur_ham %>%
  select(
    Y_Kaygi = ANXMAT,        # Bağımlı: Matematik Kaygısı
    X_Destek = TEACHSUP,     # Bağımsız: Öğretmen Desteği
    M_Ozyeterlik = MATHEFF,  # Aracı: Matematik Öz-yeterliği
    Z_Cinsiyet = ST004D01T   # Düzenleyici: Cinsiyet
  )

# Finlandiya İçin Değişkenlerin Seçimi
fin_veri <- fin_ham %>%
  select(
    Y_Kaygi = ANXMAT,
    X_Destek = TEACHSUP,
    M_Ozyeterlik = MATHEFF,
    Z_Cinsiyet = ST004D01T
  )

# Seçimin Kontrol Edilmesi 
glimpse(tur_veri)
## Rows: 7,250
## Columns: 4
## $ Y_Kaygi      <hvn_lbll> 1.1417, 2.6350, 0.4067, NA, 0.1031, -0.1172, -0.0423…
## $ X_Destek     <hvn_lbll> -0.1002, -1.7015, -0.1002, -2.9095, -0.3322, -1.0693…
## $ M_Ozyeterlik <hvn_lbll> -1.0167, -0.2998, -0.1455, -0.0961, -0.0820, -0.1705…
## $ Z_Cinsiyet   <hvn_lbll> 2, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 2, 1, 1, 2, 1, 1, 1…
glimpse(fin_veri)
## Rows: 10,239
## Columns: 4
## $ Y_Kaygi      <hvn_lbll> 0.6566, -0.5191, -1.6741, 1.9159, -0.2758, -0.5080, …
## $ X_Destek     <hvn_lbll> -1.0693, -0.1002, -0.1002, 0.4357, -0.1002, -1.0693,…
## $ M_Ozyeterlik <hvn_lbll> -1.3438, 0.8163, -0.5668, -1.5983, -0.5585, -0.3068,…
## $ Z_Cinsiyet   <hvn_lbll> 1, 2, 1, 1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 2, 2, 1…

Sonra eksik veri temizliği yaptım.

# Türkiye için

colSums(is.na(tur_veri))
##      Y_Kaygi     X_Destek M_Ozyeterlik   Z_Cinsiyet 
##          191          121          161            0
tur_temiz <- na.omit(tur_veri)

# Finlandiya için

colSums(is.na(fin_veri))
##      Y_Kaygi     X_Destek M_Ozyeterlik   Z_Cinsiyet 
##         1789         1145         1529            0
fin_temiz <- na.omit(fin_veri)

Daha sonra betimsel istatistikleri inceledim ve korelasyon analizi yaptım.Önce haven labellardan kurtuldum ve hepsini numeric yaptım.

library(haven) 
library(dplyr)


tur_temiz <- tur_temiz %>% 
  mutate(across(where(is.labelled), as.numeric))

fin_temiz <- fin_temiz %>% 
  mutate(across(where(is.labelled), as.numeric))


glimpse(tur_temiz)
## Rows: 7,008
## Columns: 4
## $ Y_Kaygi      <dbl> 1.1417, 2.6350, 0.4067, 0.1031, -0.1172, -0.0423, -2.3558…
## $ X_Destek     <dbl> -0.1002, -1.7015, -0.1002, -0.3322, -1.0693, -1.3627, -0.…
## $ M_Ozyeterlik <dbl> -1.0167, -0.2998, -0.1455, -0.0820, -0.1705, -1.3282, -3.…
## $ Z_Cinsiyet   <dbl> 2, 1, 1, 1, 2, 2, 2, 2, 2, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, …
glimpse(fin_temiz)
## Rows: 8,280
## Columns: 4
## $ Y_Kaygi      <dbl> 0.6566, -0.5191, -1.6741, 1.9159, -0.2758, -0.5080, -0.50…
## $ X_Destek     <dbl> -1.0693, -0.1002, -0.1002, 0.4357, -0.1002, -1.0693, -2.1…
## $ M_Ozyeterlik <dbl> -1.3438, 0.8163, -0.5668, -1.5983, -0.5585, -0.3068, -1.6…
## $ Z_Cinsiyet   <dbl> 1, 2, 1, 1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1, …
library(psych)
library(GGally)

# Türkiye
describe(tur_temiz)
##              vars    n  mean   sd median trimmed  mad   min  max range  skew
## Y_Kaygi         1 7008  0.59 1.22   0.60    0.63 0.98 -2.39 2.63  5.03 -0.19
## X_Destek        2 7008 -0.25 1.13  -0.33   -0.22 1.09 -2.91 1.56  4.47 -0.11
## M_Ozyeterlik    3 7008 -0.47 1.26  -0.38   -0.44 0.89 -3.51 2.36  5.86 -0.22
## Z_Cinsiyet      4 7008  1.51 0.50   2.00    1.51 0.00  1.00 2.00  1.00 -0.03
##              kurtosis   se
## Y_Kaygi          0.12 0.01
## X_Destek        -0.15 0.01
## M_Ozyeterlik     0.67 0.02
## Z_Cinsiyet      -2.00 0.01
ggpairs(tur_temiz, title = "Türkiye: Değişkenler Arası İlişkiler ve Dağılımlar")

# Finlandiya
describe(fin_temiz)
##              vars    n  mean   sd median trimmed  mad   min  max range  skew
## Y_Kaygi         1 8280 -0.25 1.15  -0.28   -0.25 0.91 -2.39 2.63  5.03  0.06
## X_Destek        2 8280  0.00 1.02  -0.10    0.04 1.05 -2.91 1.56  4.47 -0.28
## M_Ozyeterlik    3 8280 -0.33 1.20  -0.30   -0.34 0.91 -3.49 2.36  5.85 -0.07
## Z_Cinsiyet      4 8280  1.50 0.50   1.00    1.50 0.00  1.00 2.00  1.00  0.02
##              kurtosis   se
## Y_Kaygi          0.34 0.01
## X_Destek         0.12 0.01
## M_Ozyeterlik     0.78 0.01
## Z_Cinsiyet      -2.00 0.01
ggpairs(fin_temiz, title = "Finlandiya: Değişkenler Arası İlişkiler ve Dağılımlar")

# YORUM

# Bağımsız değişken (Destek) ile Aracı (Öz-yeterlik) ve Bağımlı (Kaygı) değişken arasında anlamlı ilişkiler var. Yani X -> M -> Y zinciri istatistiksel olarak test edilebilir.

# Cinsiyet, hem kaygı hem de öz-yeterlik ile ilişkili olduğu için modelde  düzenleyici (moderator) değişken olarak kullanılabilir.

Cinsiyet değişkenini dummy kodlama için faktör haline getirdim.

tur_temiz$Z_Cinsiyet<- as.factor(tur_temiz$Z_Cinsiyet)
fin_temiz$Z_Cinsiyet<- as.factor(fin_temiz$Z_Cinsiyet)

Artıklar, Aykırı Değerler ve Kaldıraç Etkisi Değerlendirilmesi

Bunun için önce çoklu regresyon modeli kurdum.

# Türkiye için regresyon modeli
model_tur <- lm(Y_Kaygi ~ X_Destek + M_Ozyeterlik + Z_Cinsiyet, data = tur_temiz)

# Finlandiya için regresyon modeli
model_fin <- lm(Y_Kaygi ~ X_Destek + M_Ozyeterlik + Z_Cinsiyet, data = fin_temiz)
library(ggfortify)

# Türkiye Modeli Grafikler
autoplot(model_tur)

# Finlandiya Modeli Grafikler
autoplot(model_fin)

# Her iki ülke içinde grafiklerde hemen hemen yatay noktaları takip etmektedir.
library(olsrr)

# Cook's D Bar Plot 
ols_plot_cooksd_bar(model_tur)

# Eşik değerin üzerindekileri görmek için
d <- cooks.distance(model_tur)
etkili_gozlemler <- which(d > 4/nrow(tur_temiz)) 
head(etkili_gozlemler) # İlk birkaç sorunlu satır numarası
##  7  9 42 69 80 97 
##  7  9 42 69 80 97
# Cook's D Bar Plot 
ols_plot_cooksd_bar(model_fin)

# Eşik değerin üzerindekileri görmek için
d2 <- cooks.distance(model_fin)
etkili_gozlemler_f <- which(d2 > 4/nrow(fin_temiz)) 
head(etkili_gozlemler_f) # İlk birkaç sorunlu satır numarası
##   8  10  24  25  46 109 
##   8  10  24  25  46 109
# Sonuç:
# Türkiye: 7, 9, 42, 69, 80 ve 97. satırlardaki öğrenciler "etkili gözlem" olarak işaretlendi.
# Finlandiya: Veri setindeki 8, 10, 24, 25, 46 ve 109. satırlardaki öğrenciler "etkili gözlem" olarak işaretlendi.

Daha önce kurduğum çoklu regresyon modeli sonuçları:

Türkiye için: Model istatistikleri incelendiğinde, kurulan regresyon modelinin istatistiksel olarak anlamlı olduğu görülmektedir (F(3, 7004) = 364.7, p < .001). Modele dahil edilen bağımsız değişkenler (öğretmen desteği, öz-yeterlik ve cinsiyet), matematik kaygısındaki varyansın yaklaşık %14’ünü açıklamaktadır (R^2 = .14).

summary(model_tur)
## 
## Call:
## lm(formula = Y_Kaygi ~ X_Destek + M_Ozyeterlik + Z_Cinsiyet, 
##     data = tur_temiz)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.3032 -0.6327 -0.0499  0.6783  3.2248 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   0.61733    0.02010  30.719  < 2e-16 ***
## X_Destek     -0.08539    0.01205  -7.087 1.51e-12 ***
## M_Ozyeterlik -0.30608    0.01078 -28.400  < 2e-16 ***
## Z_Cinsiyet2  -0.36875    0.02711 -13.601  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.132 on 7004 degrees of freedom
## Multiple R-squared:  0.1351, Adjusted R-squared:  0.1347 
## F-statistic: 364.7 on 3 and 7004 DF,  p-value: < 2.2e-16

Finlandiya için: Finlandiya veri seti için kurulan regresyon modelinin istatistiksel olarak anlamlı olduğu görülmektedir (F(3, 8276) = 670.2, p < .001). Modele dahil edilen bağımsız değişkenler (öğretmen desteği, öz-yeterlik ve cinsiyet), matematik kaygısındaki varyansın yaklaşık %20’sini (R^2 = .196) açıklamaktadır.

summary(model_fin)
## 
## Call:
## lm(formula = Y_Kaygi ~ X_Destek + M_Ozyeterlik + Z_Cinsiyet, 
##     data = fin_temiz)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.6771 -0.5207  0.0247  0.5588  4.0958 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -0.180020   0.016547 -10.879  < 2e-16 ***
## X_Destek     -0.081890   0.011236  -7.288 3.42e-13 ***
## M_Ozyeterlik -0.356934   0.009672 -36.905  < 2e-16 ***
## Z_Cinsiyet2  -0.381914   0.022807 -16.745  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.031 on 8276 degrees of freedom
## Multiple R-squared:  0.1955, Adjusted R-squared:  0.1952 
## F-statistic: 670.2 on 3 and 8276 DF,  p-value: < 2.2e-16

Etkileşim Analizi

Özellikle, çoklu bağlantıyı azaltmak ve yorumlamayı kolaylaştırmak için hem düzenleyici hem de bağımsız değişkenleri merkezlemek gereklidir.

# scale(..., scale = FALSE) fonksiyonu sadece ortalamayı çıkartır (Mean Centering)

# Türkiye için merkezileştirme
tur_temiz <- tur_temiz %>%
  mutate(
    X_Destek_c = as.numeric(scale(X_Destek, scale = FALSE)),     # Destek (Merkezilenmiş)
    M_Ozyeterlik_c = as.numeric(scale(M_Ozyeterlik, scale = FALSE)) # Öz-yeterlik (Merkezilenmiş)
  )

# Finlandiya için merkezileştirme
fin_temiz <- fin_temiz %>%
  mutate(
    X_Destek_c = as.numeric(scale(X_Destek, scale = FALSE)),
    M_Ozyeterlik_c = as.numeric(scale(M_Ozyeterlik, scale = FALSE))
  )

Modelde Destek ve Cinsiyet etkileşimine bakacağız.

# TÜRKİYE: DÜZENLEYİCİLİK MODELİ 
# Formül: Kaygı ~ Destek + Cinsiyet + (Destek x Cinsiyet)
mod_moderasyon_tur <- lm(Y_Kaygi ~ X_Destek_c * Z_Cinsiyet, data = tur_temiz)

# Sonuçları Görüntüle
summary(mod_moderasyon_tur)
## 
## Call:
## lm(formula = Y_Kaygi ~ X_Destek_c * Z_Cinsiyet, data = tur_temiz)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.5951 -0.7066 -0.0803  0.6312  2.3744 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)             0.79792    0.02035  39.202  < 2e-16 ***
## X_Destek_c             -0.15166    0.01849  -8.202  2.8e-16 ***
## Z_Cinsiyet2            -0.39646    0.02859 -13.865  < 2e-16 ***
## X_Destek_c:Z_Cinsiyet2  0.07387    0.02540   2.909  0.00364 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.195 on 7004 degrees of freedom
## Multiple R-squared:  0.03666,    Adjusted R-squared:  0.03625 
## F-statistic: 88.85 on 3 and 7004 DF,  p-value: < 2.2e-16
#  FİNLANDİYA: DÜZENLEYİCİLİK MODELİ 
mod_moderasyon_fin <- lm(Y_Kaygi ~ X_Destek_c * Z_Cinsiyet, data = fin_temiz)

# Sonuçları Görüntüle
summary(mod_moderasyon_fin)
## 
## Call:
## lm(formula = Y_Kaygi ~ X_Destek_c * Z_Cinsiyet, data = fin_temiz)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.9452 -0.5486  0.0421  0.6105  3.2959 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            -0.02199    0.01722  -1.277 0.201673    
## X_Destek_c             -0.19929    0.01699 -11.729  < 2e-16 ***
## Z_Cinsiyet2            -0.47049    0.02445 -19.239  < 2e-16 ***
## X_Destek_c:Z_Cinsiyet2  0.09086    0.02387   3.806 0.000142 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.111 on 8276 degrees of freedom
## Multiple R-squared:  0.0647, Adjusted R-squared:  0.06436 
## F-statistic: 190.8 on 3 and 8276 DF,  p-value: < 2.2e-16

Türkiye için sonuç: Modelimiz, öğretmen desteği (X_Destek_c) ile cinsiyet arasında kaygı düzeyleri (Y_Kaygi) üzerinde anlamlı bir etkileşim olduğunu göstermektedir (b = .07, SE = .03, p = .001). Öğretmen desteği ve cinsiyet değişkenleri, kaygı üzerindeki değişkenliğin %3.7’sini açıklamaktadır.

Finlandiya için sonuç: Modelimiz, öğretmen desteği (X_Destek_c) ile cinsiyet arasında kaygı düzeyi (Y_Kaygi) üzerinde anlamlı bir etkileşim olduğunu göstermektedir (b = .09, SE = .02, p < .001). Öğretmen desteği ve cinsiyet değişkenleri, kaygı üzerindeki değişkenliğin %6.5’ini açıklamaktadır.

#Plotting
library(rockchalk)

#TÜRKİYE GRAFİĞİ
plotSlopes(mod_moderasyon_tur, 
           plotx = "X_Destek_c",   # X ekseni
           modx  = "Z_Cinsiyet",   # Grupları ayıran (Moderatör)
           xlab  = "Öğretmen desteği", 
           ylab  = "Kaygı Düzeyi", 
           main  = "Türkiye: Destek ve Cinsiyet Etkileşimi")

#FİNLANDİYA GRAFİĞİ
plotSlopes(mod_moderasyon_fin, 
           plotx = "X_Destek_c", 
           modx  = "Z_Cinsiyet", 
           xlab  = "Öğretmen desteği", 
           ylab  = "Kaygı Düzeyi", 
           main  = "Finlandiya: Destek ve Cinsiyet Etkileşimi")

Türkiye için yorum: Eğimler arasında belirgin bir fark vardır; bu durum cinsiyetin öğretmen desteği ile kaygı arasındaki ilişkiyi anlamlı düzeyde düzenlediğini (modere ettiğini) göstermektedir. Öğretmen desteğinin matematik kaygısını azaltmadaki rolü, kadın öğrencilerde erkek öğrencilere göre daha güçlüdür.

Finlandiya için yorum: Eğimler arasında gözlemlenen bu fark, cinsiyetin öğretmen desteği ile kaygı arasındaki ilişkiyi anlamlı düzeyde düzenlediğini (modere ettiğini) göstermektedir. Öğretmen desteğinin matematik kaygısını azaltmadaki rolü, Finlandiya örnekleminde de Türkiye örnekleminde olduğu gibi kadın öğrencilerde erkek öğrencilere göre daha güçlüdür.

library(effectsize)
cohens_f_squared(mod_moderasyon_tur)
## # Effect Size for ANOVA (Type I)
## 
## Parameter             | Cohen's f2 (partial) |      95% CI
## ----------------------------------------------------------
## X_Destek_c            |             9.45e-03 | [0.01, Inf]
## Z_Cinsiyet            |                 0.03 | [0.02, Inf]
## X_Destek_c:Z_Cinsiyet |             1.21e-03 | [0.00, Inf]
## 
## - One-sided CIs: upper bound fixed at [Inf].
cohens_f_squared(mod_moderasyon_fin)
## # Effect Size for ANOVA (Type I)
## 
## Parameter             | Cohen's f2 (partial) |      95% CI
## ----------------------------------------------------------
## X_Destek_c            |                 0.02 | [0.02, Inf]
## Z_Cinsiyet            |                 0.04 | [0.04, Inf]
## X_Destek_c:Z_Cinsiyet |             1.75e-03 | [0.00, Inf]
## 
## - One-sided CIs: upper bound fixed at [Inf].
# Sonuç: etki büyüklüğü her iki grup için de çok düşük.

Mediation Analizi

Bunu, sizin konu anlatımı referansınızdaki (https://rpubs.com/cbwin/r4ps8_med-and-mod) Rpubs dosyasındaki anlatıma göre yapmaya çalıştım. Öncelikle orda ne anlatıldığının özeti:

Bootstrapping yöntemini kullanarak mediation paketi ile daha sağlam bir aracılık analizi yapılır.Amaç,veriler normal dağılmadığında ortaya çıkabilecek sorunlardan kaçınmak ve daha az varsayımla sonuçların anlamlılığını test etmektir.

Veri setinden yerine koyma (replacement) yöntemiyle rastgele 1000 (veya daha fazla) örneklem alınır. Her örneklem için regresyon katsayıları hesaplanır ve dağılımına bakılır.

Hesaplanan %95 Güven Aralığı (Confidence Interval) “0” değerini içermiyorsa, etkinin istatistiksel olarak anlamlı olduğu söylenir.

Uygulama Adımları Analiz için iki ayrı regresyon modeli kurulmalı ve ardından mediate fonksiyonu çalıştırılmalıdır:

Aracı Model (Mediator Model): Bağımsız değişkenin (X) aracı değişkeni (M) yordadığı model (m ~ x).

Sonuç Modeli (Outcome Model): Bağımsız değişken (X) ve aracı değişkenin (M) birlikte bağımlı değişkeni (Y) yordadığı model (y ~ x + m).

Hesaplama: mediate() fonksiyonu kullanılarak, boot = TRUE ve sims = 1000 parametreleriyle analiz gerçekleştirilir.

Çıktıların Yorumlanması summary(mediation) komutu ile elde edilen tabloda şu değerlere bakılır:

ACME (Average Causal Mediation Effects): Dolaylı Etki. Bağımsız değişkenin (X), aracı (M) üzerinden bağımlı değişkeni (Y) ne kadar etkilediğini gösterir.

ADE (Average Direct Effect): Doğrudan Etki. Aracı değişken denklemde varken, X’in Y üzerindeki kalan etkisidir

Total Effect (Toplam Etki): ACME ve ADE’nin toplamıdır.

Prop. Mediated: Toplam etkinin yüzde kaçının aracı değişken tarafından açıklandığını gösterir.

Sonuç: Tablodaki güven aralıkları (Lower ve Upper CI) 0’ı kapsamıyorsa (örneğin ikisi de negatif veya ikisi de pozitifse) ve p-değeri < .05 ise, anlamlı bir aracılık etkisi vardır.

library(mediation)

# TÜRKİYE ARACILIK ANALİZİ

# Modeller kurulur.
library(mediation)

b_mod <- lm(M_Ozyeterlik ~ X_Destek, data = tur_temiz)
c_mod <- lm(Y_Kaygi ~ X_Destek + M_Ozyeterlik, data = tur_temiz)

# Bootstrapped mediation
med_tur <- mediate(
  model.m = b_mod,
  model.y = c_mod,
  sims = 1000,
  boot = TRUE,
  treat = "X_Destek",
  mediator = "M_Ozyeterlik"
)

summary(med_tur)
## 
## Causal Mediation Analysis 
## 
## Nonparametric Bootstrap Confidence Intervals with the Percentile Method
## 
##                 Estimate 95% CI Lower 95% CI Upper   p-value    
## ACME           -0.026902    -0.036577    -0.017634 < 2.2e-16 ***
## ADE            -0.076063    -0.102418    -0.049857 < 2.2e-16 ***
## Total Effect   -0.102965    -0.131441    -0.075829 < 2.2e-16 ***
## Prop. Mediated  0.261276     0.177602     0.382255 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Sample Size Used: 7008 
## 
## 
## Simulations: 1000
plot(med_tur)

# Sonuç
# ACME = –0.0269
# Güven aralığı: [–0.0366, –0.0176] p < 0.001

# Bu değer, öğretmen desteğinin (X) matematik öz-yeterlik (M) üzerinden matematik kaygısını (Y) azalttığını gösteriyor.

# Güven aralığı tamamen sıfırın altında, aracılık etkisi kesin olarak anlamlı. Toplam etkinin %26’sı aracılık yolundan geçiyor.
# Finlandiya için Aracılık Analizi
library(mediation)
d_mod <- lm(M_Ozyeterlik ~ X_Destek, data = fin_temiz)
e_mod <- lm(Y_Kaygi ~ X_Destek + M_Ozyeterlik, data = fin_temiz)

# Bootstrapped mediation
med_fin <- mediate(
  model.m = d_mod,
  model.y = e_mod,
  sims = 1000,
  boot = TRUE,
  treat = "X_Destek",
  mediator = "M_Ozyeterlik"
)

summary(med_fin)
## 
## Causal Mediation Analysis 
## 
## Nonparametric Bootstrap Confidence Intervals with the Percentile Method
## 
##                 Estimate 95% CI Lower 95% CI Upper   p-value    
## ACME           -0.076769    -0.088054    -0.064881 < 2.2e-16 ***
## ADE            -0.086601    -0.113436    -0.061044 < 2.2e-16 ***
## Total Effect   -0.163370    -0.192923    -0.135063 < 2.2e-16 ***
## Prop. Mediated  0.469910     0.395296     0.564423 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Sample Size Used: 8280 
## 
## 
## Simulations: 1000
plot(med_fin)

# Sonuç

# ACME = –0.0768
# Güven aralığı: [–0.0883, –0.0658] p < 0.001

# Öğretmen desteği, matematik öz-yeterlik üzerindeki etkisi yoluyla kaygıyı azaltıyor.

# Güven aralığı tamamen sıfırın altında, aracılık etkisi anlamlı.Toplam etkinin %47’si aracı değişken üzerinden geçiyor. Türkiye'ye göre, aracı değişken etkisi daha güçlü.

ÖĞRENME GÜNLÜĞÜM

Bu zamana kadar değişik fonksiyonları zaten derslerimizde sürekli kullandık, bu dersimizde de bir kısmını hatırladık ve yenilerini öğrendik. Fonksiyon oluşturma konusunu genel olarak daha iyi anlamaya başladım diyebilirim. For döngüsü de biraz daha anlaşır olmaya başladı.Pisa çalışmasını yaparken, etkili gözlem olarak bulduklarımı çıkarmam gerekiyor mu bilemedim ben de öylece bıraktım. Dummy kodlamada biraz kafam karıştı. Pisa verisi orjinalde 1: kadın 2: erkek olarak geliyor. R sıralı olarak atıyorsa eğer kadın referans grup, erkek dummy grup olur ki o zaman çıktıdaki Z_Cinsiyet2’yi erkek grup olarak değerlendirmem gerekiyor diye düşünmekle beraber emin değilim. Mediation analizi için referanstaki kaynağa bakarak yapmaya çalıştım ama ne kadar doğru yaptım ve yorumladım bilmiyorum. Datacamp çalışmalarını tamamladım, mantıksal operatörler, döngüler,ve fonksiyonlar konusunda biraz daha pratik yapmış oldum. Apply ailesinden lapply, sapply ve vapply fonksiyonlarını öğrenmiş oldum, zaman formatlama ile ilgili kısım biraz karışıktı.