Gerekli paketler ve Veri Setlerinin Yüklenmesi

library(broom)
library(DT)
library(dplyr)
library(forcats)
library(ggplot2)
library(haven)
library(interactions)
library(kableExtra)
library(ltm)
library(mirt)
library(mlmRev)
library(knitr)
library(psych)
library(sjlabelled)
library(tidyverse)

load("C:/Users/Lenovo/Desktop/PISA_STU_2022.rda")
data <- PISA_STU_2021
binary_data <- readRDS("C:/Users/Lenovo/Desktop/binary.Rds")   
maddepar <- readRDS("C:/Users/Lenovo/Desktop/maddepar.Rds")
maddepar <- as.data.frame(maddepar)
remove_all_labels(data)

Soru 1

a) Okul Türüne Göre Matematik Başarı Analizi

PISA_STU_2021 <- PISA_STU_2021 %>%
  mutate(STRATUM = as_factor(STRATUM))

mean_math_by_stratum <- PISA_STU_2021 %>%
  group_by(STRATUM) %>%
  summarise(Mean_PV1MATH = mean(PV1MATH, na.rm = TRUE)) %>%
  arrange(desc(Mean_PV1MATH))

ggplot(mean_math_by_stratum, aes(x = fct_reorder(STRATUM, Mean_PV1MATH), y = Mean_PV1MATH)) +
  geom_col(aes(fill = Mean_PV1MATH), width = 0.6) +
  geom_text(aes(label = round(Mean_PV1MATH, 1)),
            hjust = -0.1, size = 2.5) +
  coord_flip(clip = "off") +  
  scale_fill_gradient(low = "#cce5ff", high = "#004c99") +
  labs(
    title = "Okul Türüne Göre Ortalama Matematik Puanı",
    x = NULL,
    y = "Ortalama Matematik Puanı",
    fill = "Ortalama"
  ) +
  theme_minimal(base_size = 10) +
  theme(
    plot.title = element_text(face = "bold", size = 11),
    axis.text.y = element_text(size = 7.5),
    panel.grid.major.y = element_blank(),
    plot.margin = margin(10, 20, 10, 10)  
    ) +
  ylim(0, max(mean_math_by_stratum$Mean_PV1MATH) + 30)

b) Cinsiyet ve Okul Türüne Göre Matematik Başarı Analizi

PISA_STU_2021 <- PISA_STU_2021 %>%
  mutate(
    Gender = case_when(
      ST004D01T == 1 ~ "Erkek",
      ST004D01T == 2 ~ "Kız",
      TRUE ~ NA_character_
    ),
    STRATUM = as_factor(STRATUM)
  )

mean_math_gender_stratum <- PISA_STU_2021 %>%
  group_by(STRATUM, Gender) %>%
  summarise(
    Mean_PV1MATH = mean(PV1MATH, na.rm = TRUE),
    .groups = "drop"
  )

stratum_adlari <- mean_math_gender_stratum %>%
  distinct(STRATUM) %>%
  mutate(stratum_kisa = paste0("S", row_number()))

mean_math_gender_stratum <- mean_math_gender_stratum %>%
  left_join(stratum_adlari, by = "STRATUM")

ggplot(mean_math_gender_stratum, aes(x = fct_reorder(stratum_kisa, Mean_PV1MATH), y = Mean_PV1MATH, fill = Gender)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.6) +
  geom_text(
    aes(label = round(Mean_PV1MATH, 1)),
    position = position_dodge(width = 0.8),
    hjust = -0.1,            
    size = 1.8,
    color = "black"
  ) +
  coord_flip(clip = "off") +  
  scale_fill_manual(values = c("Kız" = "#377eb8", "Erkek" = "#e41a1c")) +
  labs(
    title = "Okul Türü ve Cinsiyete Göre Ortalama Matematik Puanı",
    x = "Okul Türü",
    y = "Ortalama Matematik Puanı",
    fill = "Cinsiyet"
  ) +
  theme_minimal(base_size = 9) +
  theme(
    plot.title = element_text(face = "bold", size = 10),
    axis.text.y = element_text(size = 7),
    legend.position = "bottom" 
  )

c) Matematik Kaygısı ve Matematik Başarısı Arasındaki İlişki

df <- PISA_STU_2021 %>%
  mutate(
    ANXMAT = as.numeric(ANXMAT),
    PV1MATH = as.numeric(PV1MATH)
  ) %>%
  filter(!is.na(ANXMAT), !is.na(PV1MATH))

korelasyon <- cor(df$ANXMAT, df$PV1MATH)
cat("Matematik Kaygısı (ANXMAT) ile Matematik Başarısı (PV1MATH) arasındaki korelasyon katsayısı:", korelasyon, "\n")
## Matematik Kaygısı (ANXMAT) ile Matematik Başarısı (PV1MATH) arasındaki korelasyon katsayısı: -0.118232
ggplot(df, aes(x = ANXMAT, y = PV1MATH)) +
  geom_point(alpha = 0.1, color= "darkblue") +
  geom_smooth(method = "lm", se = FALSE, color = "red") +
  annotate("text", x = Inf, y = Inf, 
           label = paste("r =", round(korelasyon, 3)), 
           hjust = 1.1, vjust = 1.5, size = 5) +
  labs(
    title = "Matematik Kaygısı ile Matematik Başarısı Arasındaki İlişki",
    x = "Matematik Kaygısı (ANXMAT)",
    y = "Matematik Başarısı (PV1MATH)"
  ) +
  theme_minimal()

Korelasyon katsayısı (r = -0.118) bu ilişkinin yönünün negatif, grafik eğimi şiddetinin zayıf olduğunu ortaya koymaktadır. Yani matematik kaygısı arttıkça matematik başarısının azalma eğiliminde olduğu görülmektedir; ancak bu etki düşük düzeyde ve istatistiksel olarak sınırlı bir açıklayıcılığa sahiptir.

d) Okul Türlerine Göre Matematik Kaygısı ve Başarı İlişkisi

df <- PISA_STU_2021 %>%
  mutate(
    STRATUM = as_factor(STRATUM),
    ANXMAT = as.numeric(ANXMAT),
    PV1MATH = as.numeric(PV1MATH)
  ) %>%
  filter(!is.na(ANXMAT), !is.na(PV1MATH))

ggplot(df, aes(x = ANXMAT, y = PV1MATH)) +
  geom_point(alpha = 0.1, size = 0.2, color="darkblue") +
  geom_smooth(method = "lm", se = TRUE, color = "red") +
  facet_wrap(~ STRATUM, scales = "free_y") +
  labs(
    title = "Matematik Kaygısı ile Başarı Arasındaki İlişki (Okul Türlerine Göre)",
    x = "Matematik Kaygısı (ANXMAT)",
    y = "Matematik Başarısı (PV1MATH)"
  ) +
  theme_minimal(base_size = 9)

e) Matematik Kaygısı ve Başarı Üzerine Regresyon Analizi

secili_stratumlar <- c("TUR02", "TUR06", "TUR13", "TUR28")

subdata <- PISA_STU_2021 %>%
  filter(STRATUM %in% secili_stratumlar) %>%
  mutate(STRATUM = droplevels(as_factor(STRATUM)))

model_interact <- lm(PV1MATH ~ ANXMAT * STUDYHMW + STRATUM, data = subdata)
summary(model_interact)
## 
## Call:
## lm(formula = PV1MATH ~ ANXMAT * STUDYHMW + STRATUM, data = subdata)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -190.627  -36.434    0.801   36.032  178.785 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      643.0739     8.2634  77.822  < 2e-16 ***
## ANXMAT           -10.7235     4.0038  -2.678  0.00763 ** 
## STUDYHMW          -0.5203     0.8672  -0.600  0.54877    
## STRATUMTUR06     -87.5279     9.0040  -9.721  < 2e-16 ***
## STRATUMTUR13    -142.3080     7.2382 -19.661  < 2e-16 ***
## STRATUMTUR28    -114.5530     9.1434 -12.528  < 2e-16 ***
## ANXMAT:STUDYHMW   -0.1693     0.6531  -0.259  0.79556    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 58.25 on 536 degrees of freedom
##   (9 observations deleted due to missingness)
## Multiple R-squared:  0.4546, Adjusted R-squared:  0.4485 
## F-statistic: 74.46 on 6 and 536 DF,  p-value: < 2.2e-16
reg_apa_table <- tidy(model_interact) %>%
  mutate(
    estimate = round(estimate, 3),
    std.error = round(std.error, 3),
    statistic = round(statistic, 2),
    p.value = ifelse(p.value < 0.001, "< .001", round(p.value, 3))
  ) %>%
  rename(
    Katsayi = estimate,
    Std_Hata = std.error,
    t_degeri = statistic,
    p_degeri = p.value,
    Degisken = term
  )

reg_apa_table %>%
  kable(
    caption = "Matematik Kaygısı, Ders Çalışma Süresi ve Okul Türüne Göre Matematik Başarısı Üzerine Regresyon Analizi",
    align = "lcccc"
  ) %>%
  kable_styling(full_width = TRUE, bootstrap_options = c("striped", "hover")) %>%
  column_spec(1, bold = TRUE)
Matematik Kaygısı, Ders Çalışma Süresi ve Okul Türüne Göre Matematik Başarısı Üzerine Regresyon Analizi
Degisken Katsayi Std_Hata t_degeri p_degeri
(Intercept) 643.074 8.263 77.82 < .001
ANXMAT -10.723 4.004 -2.68 0.008
STUDYHMW -0.520 0.867 -0.60 0.549
STRATUMTUR06 -87.528 9.004 -9.72 < .001
STRATUMTUR13 -142.308 7.238 -19.66 < .001
STRATUMTUR28 -114.553 9.143 -12.53 < .001
ANXMAT:STUDYHMW -0.169 0.653 -0.26 0.796
library(interactions)

interact_plot(model_interact,
              pred = ANXMAT,
              modx = STUDYHMW,
              modx.values = c(0, 1, 2, 3, 4),
              interval = TRUE,
              facet.modx = FALSE,
              main.title = "Düzenleyici Etki",
              x.label = "Matematik Kaygısı",
              y.label = "Matematik Başarısı",
              colors = "blue")

Soru 2

a) orneklem1 fonksiyonunun orneklem2 olarak güncellenmesi

library(mlmRev)   
data(Exam)

orneklem2 <- function(evren, size = 20, iterasyon = 100) {
  ortalamalar <- numeric(iterasyon)
  
  for (i in seq_len(iterasyon)) {
    ornek <- sample(evren, size, replace = TRUE)
    ortalamalar[i] <- mean(ornek)
  }
  
  list(
    ortalamalar = ortalamalar,
    ortalama = mean(ortalamalar),
    standart_sapma = sd(ortalamalar)
  )
}

b) Örneklem büyüklüğü 10 için 5, 30 ve 100 tekrarlı örneklem dağılımları ve histogramları

set.seed(123)
evren <- Exam$normexam

sonuc_10_5 <- orneklem2(evren, size = 10, iterasyon = 5)
sonuc_10_30 <- orneklem2(evren, size = 10, iterasyon = 30)
sonuc_10_100 <- orneklem2(evren, size = 10, iterasyon = 100)

par(mfrow = c(1, 3))

hist(sonuc_10_5$ortalamalar,
     main = "n = 10, iter = 5",
     xlab = "Örneklem Ortalaması", col = "skyblue", border = "white")

hist(sonuc_10_30$ortalamalar,
     main = "n = 10, iter = 30",
     xlab = "Örneklem Ortalaması", col = "lightgreen", border = "white")

hist(sonuc_10_100$ortalamalar,
     main = "n = 10, iter = 100",
     xlab = "Örneklem Ortalaması", col = "salmon", border = "white")

par(mfrow = c(1, 1))

c) Örneklem büyüklüğü 50 için 5, 30 ve 100 tekrarlı örneklem dağılımları ve histogramları

set.seed(123)

sonuc_50_5 <- orneklem2(evren, size = 50, iterasyon = 5)
sonuc_50_30 <- orneklem2(evren, size = 50, iterasyon = 30)
sonuc_50_100 <- orneklem2(evren, size = 50, iterasyon = 100)

par(mfrow = c(1, 3))

hist(sonuc_50_5$ortalamalar,
     main = "n = 50, iter = 5",
     xlab = "Örneklem Ortalaması", col = "skyblue", border = "white")

hist(sonuc_50_30$ortalamalar,
     main = "n = 50, iter = 30",
     xlab = "Örneklem Ortalaması", col = "lightgreen", border = "white")

hist(sonuc_50_100$ortalamalar,
     main = "n = 50, iter = 100",
     xlab = "Örneklem Ortalaması", col = "salmon", border = "white")

par(mfrow = c(1, 1))

d) Örneklem Ortalaması ve Standart Hata Özetleri

ozet_df <- data.frame(
  `n` = c(10, 10, 10, 50, 50, 50),
  `iterasyon` = c(5, 30, 100, 5, 30, 100),
  `Ortalama` = c(
    round(sonuc_10_5$ortalama, 4),
    round(sonuc_10_30$ortalama, 4),
    round(sonuc_10_100$ortalama, 4),
    round(sonuc_50_5$ortalama, 4),
    round(sonuc_50_30$ortalama, 4),
    round(sonuc_50_100$ortalama, 4)
  ),
  `Standart Hata` = c(
    round(sonuc_10_5$standart_sapma, 4),
    round(sonuc_10_30$standart_sapma, 4),
    round(sonuc_10_100$standart_sapma, 4),
    round(sonuc_50_5$standart_sapma, 4),
    round(sonuc_50_30$standart_sapma, 4),
    round(sonuc_50_100$standart_sapma, 4)
  )
)

kable(ozet_df, caption = "Örneklem Ortalamaları ve Standart Hatalar", align = "c") |>
  kable_styling(full_width = TRUE, bootstrap_options = c("striped", "hover", "condensed"))
Örneklem Ortalamaları ve Standart Hatalar
n iterasyon Ortalama Standart.Hata
10 5 0.0305 0.1660
10 30 -0.0405 0.2769
10 100 0.0509 0.3176
50 5 -0.0019 0.0749
50 30 0.0432 0.1397
50 100 0.0070 0.1405

Soru 3

a) MTK Sayıltıları (Tek Boyutluluk ve Yerel Bağımsızlık)

test_verisi <- readRDS("binary.rds")

library(EGAnet)
## 
## EGAnet (version 2.3.0) 
## 
## For help getting started, see <https://r-ega.net> 
## 
## For bugs and errors, submit an issue to <https://github.com/hfgolino/EGAnet/issues>
## 
## Attaching package: 'EGAnet'
## The following object is masked from 'package:ltm':
## 
##     information
EGA(test_verisi, model = "glasso", plot.EGA = TRUE)

## Model: GLASSO (EBIC with gamma = 0.5)
## Correlations: auto
## Lambda: 0.0405940027954225 (n = 100, ratio = 0.1)
## 
## Number of nodes: 25
## Number of edges: 195
## Edge density: 0.650
## 
## Non-zero edge weights: 
##      M    SD    Min   Max
##  0.054 0.043 -0.040 0.218
## 
## ----
## 
## Algorithm:  Walktrap
## 
## Number of communities:  2
## 
##  madde_1  madde_2  madde_3  madde_4  madde_5  madde_6  madde_7  madde_8 
##        1        2        2        1        1        1        1        1 
##  madde_9 madde_10 madde_11 madde_12 madde_13 madde_14 madde_15 madde_16 
##        2        1        2        1        2        2        2        1 
## madde_17 madde_18 madde_19 madde_20 madde_21 madde_22 madde_23 madde_24 
##        1        1        1        1        1        1        1        1 
## madde_25 
##        1 
## 
## ----
## 
## Unidimensional Method: Louvain
## Unidimensional: No
## 
## ----
## 
## TEFI: -13.771
library(mirt)
set.seed(123)
paralel_analiz <- fa.parallel(test_verisi, fa = "pc", n.iter = 1000, plot = TRUE)

## Parallel analysis suggests that the number of factors =  NA  and the number of components =  1
if (paralel_analiz$values[1] > paralel_analiz$values[2]) {
  cat("Veri seti tek boyutlu yapıya sahiptir.\n")
} else {
  cat("Veri seti tek boyutlu yapıya sahip değildir.\n")
}
## Veri seti tek boyutlu yapıya sahip değildir.
model_1pl <- mirt(test_verisi, 1, itemtype = "Rasch", verbose = FALSE)
q3_matris <- residuals(model_1pl, type = "Q3")
## Q3 summary statistics:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  -0.128  -0.059  -0.038  -0.035  -0.012   0.097 
## 
##          madde_1 madde_2 madde_3 madde_4 madde_5 madde_6 madde_7 madde_8
## madde_1    1.000  -0.056  -0.073   0.039   0.038  -0.079  -0.128  -0.029
## madde_2   -0.056   1.000   0.009  -0.059  -0.074  -0.051  -0.055  -0.040
## madde_3   -0.073   0.009   1.000  -0.015  -0.095  -0.074  -0.094  -0.026
## madde_4    0.039  -0.059  -0.015   1.000   0.028   0.003  -0.032  -0.074
## madde_5    0.038  -0.074  -0.095   0.028   1.000   0.027  -0.008  -0.047
## madde_6   -0.079  -0.051  -0.074   0.003   0.027   1.000   0.097  -0.059
## madde_7   -0.128  -0.055  -0.094  -0.032  -0.008   0.097   1.000   0.015
## madde_8   -0.029  -0.040  -0.026  -0.074  -0.047  -0.059   0.015   1.000
## madde_9   -0.082  -0.099  -0.048  -0.020  -0.095  -0.057  -0.091  -0.114
## madde_10   0.057  -0.061  -0.045  -0.038  -0.058  -0.071   0.003   0.034
## madde_11  -0.051   0.004  -0.094  -0.061  -0.055  -0.040  -0.059  -0.044
## madde_12  -0.071  -0.001  -0.075  -0.028  -0.031  -0.092  -0.011   0.001
## madde_13  -0.074  -0.039  -0.023  -0.083  -0.089   0.015  -0.064  -0.033
## madde_14  -0.061  -0.007   0.012  -0.055  -0.037  -0.039  -0.071  -0.094
## madde_15  -0.033  -0.020  -0.067  -0.010  -0.032  -0.069  -0.053  -0.093
## madde_16   0.036  -0.040  -0.095  -0.040   0.055  -0.096   0.019  -0.021
## madde_17  -0.010  -0.024  -0.037  -0.059  -0.091  -0.102  -0.029  -0.053
## madde_18   0.002  -0.069  -0.052  -0.056  -0.018  -0.016  -0.033  -0.021
## madde_19  -0.050  -0.032  -0.072  -0.034  -0.056  -0.024  -0.020  -0.008
## madde_20   0.047  -0.026  -0.029  -0.044  -0.057  -0.024  -0.095  -0.043
## madde_21   0.043  -0.001  -0.040  -0.020  -0.002  -0.029  -0.050   0.015
## madde_22  -0.018  -0.050  -0.066  -0.022  -0.025  -0.063  -0.025  -0.068
## madde_23  -0.014  -0.004  -0.054  -0.017  -0.046  -0.026  -0.035  -0.092
## madde_24  -0.021  -0.082  -0.050  -0.087   0.043   0.012  -0.007  -0.038
## madde_25  -0.034  -0.068  -0.056  -0.009   0.004   0.012  -0.022   0.012
##          madde_9 madde_10 madde_11 madde_12 madde_13 madde_14 madde_15 madde_16
## madde_1   -0.082    0.057   -0.051   -0.071   -0.074   -0.061   -0.033    0.036
## madde_2   -0.099   -0.061    0.004   -0.001   -0.039   -0.007   -0.020   -0.040
## madde_3   -0.048   -0.045   -0.094   -0.075   -0.023    0.012   -0.067   -0.095
## madde_4   -0.020   -0.038   -0.061   -0.028   -0.083   -0.055   -0.010   -0.040
## madde_5   -0.095   -0.058   -0.055   -0.031   -0.089   -0.037   -0.032    0.055
## madde_6   -0.057   -0.071   -0.040   -0.092    0.015   -0.039   -0.069   -0.096
## madde_7   -0.091    0.003   -0.059   -0.011   -0.064   -0.071   -0.053    0.019
## madde_8   -0.114    0.034   -0.044    0.001   -0.033   -0.094   -0.093   -0.021
## madde_9    1.000   -0.058   -0.009   -0.016    0.010   -0.010   -0.026   -0.071
## madde_10  -0.058    1.000   -0.057   -0.081   -0.065   -0.066   -0.058   -0.069
## madde_11  -0.009   -0.057    1.000   -0.057    0.020   -0.073    0.021    0.022
## madde_12  -0.016   -0.081   -0.057    1.000   -0.013   -0.078   -0.026   -0.037
## madde_13   0.010   -0.065    0.020   -0.013    1.000    0.070   -0.028   -0.088
## madde_14  -0.010   -0.066   -0.073   -0.078    0.070    1.000   -0.039   -0.055
## madde_15  -0.026   -0.058    0.021   -0.026   -0.028   -0.039    1.000    0.027
## madde_16  -0.071   -0.069    0.022   -0.037   -0.088   -0.055    0.027    1.000
## madde_17  -0.047   -0.065   -0.047   -0.024   -0.058   -0.019   -0.018    0.001
## madde_18  -0.009    0.060   -0.065   -0.006   -0.062   -0.072   -0.079   -0.049
## madde_19  -0.024   -0.017   -0.056   -0.008   -0.105   -0.025   -0.058    0.023
## madde_20  -0.063    0.018   -0.060    0.018   -0.052   -0.046   -0.053    0.014
## madde_21  -0.050   -0.011   -0.049    0.013   -0.107   -0.102   -0.048   -0.013
## madde_22   0.004    0.009   -0.024   -0.045   -0.057   -0.057   -0.007   -0.018
## madde_23  -0.005   -0.052   -0.044   -0.009   -0.028   -0.064   -0.030   -0.101
## madde_24  -0.026   -0.026   -0.029   -0.075   -0.099   -0.057   -0.056   -0.009
## madde_25  -0.068   -0.031   -0.064   -0.040   -0.044   -0.029    0.008   -0.039
##          madde_17 madde_18 madde_19 madde_20 madde_21 madde_22 madde_23
## madde_1    -0.010    0.002   -0.050    0.047    0.043   -0.018   -0.014
## madde_2    -0.024   -0.069   -0.032   -0.026   -0.001   -0.050   -0.004
## madde_3    -0.037   -0.052   -0.072   -0.029   -0.040   -0.066   -0.054
## madde_4    -0.059   -0.056   -0.034   -0.044   -0.020   -0.022   -0.017
## madde_5    -0.091   -0.018   -0.056   -0.057   -0.002   -0.025   -0.046
## madde_6    -0.102   -0.016   -0.024   -0.024   -0.029   -0.063   -0.026
## madde_7    -0.029   -0.033   -0.020   -0.095   -0.050   -0.025   -0.035
## madde_8    -0.053   -0.021   -0.008   -0.043    0.015   -0.068   -0.092
## madde_9    -0.047   -0.009   -0.024   -0.063   -0.050    0.004   -0.005
## madde_10   -0.065    0.060   -0.017    0.018   -0.011    0.009   -0.052
## madde_11   -0.047   -0.065   -0.056   -0.060   -0.049   -0.024   -0.044
## madde_12   -0.024   -0.006   -0.008    0.018    0.013   -0.045   -0.009
## madde_13   -0.058   -0.062   -0.105   -0.052   -0.107   -0.057   -0.028
## madde_14   -0.019   -0.072   -0.025   -0.046   -0.102   -0.057   -0.064
## madde_15   -0.018   -0.079   -0.058   -0.053   -0.048   -0.007   -0.030
## madde_16    0.001   -0.049    0.023    0.014   -0.013   -0.018   -0.101
## madde_17    1.000   -0.048    0.038   -0.048    0.052   -0.031   -0.028
## madde_18   -0.048    1.000   -0.049   -0.024   -0.054    0.050   -0.025
## madde_19    0.038   -0.049    1.000   -0.069   -0.035   -0.054   -0.066
## madde_20   -0.048   -0.024   -0.069    1.000   -0.031   -0.048    0.002
## madde_21    0.052   -0.054   -0.035   -0.031    1.000   -0.079   -0.031
## madde_22   -0.031    0.050   -0.054   -0.048   -0.079    1.000    0.030
## madde_23   -0.028   -0.025   -0.066    0.002   -0.031    0.030    1.000
## madde_24   -0.032   -0.037   -0.041    0.022   -0.027    0.004   -0.045
## madde_25   -0.012   -0.044    0.003   -0.032   -0.007   -0.028   -0.067
##          madde_24 madde_25
## madde_1    -0.021   -0.034
## madde_2    -0.082   -0.068
## madde_3    -0.050   -0.056
## madde_4    -0.087   -0.009
## madde_5     0.043    0.004
## madde_6     0.012    0.012
## madde_7    -0.007   -0.022
## madde_8    -0.038    0.012
## madde_9    -0.026   -0.068
## madde_10   -0.026   -0.031
## madde_11   -0.029   -0.064
## madde_12   -0.075   -0.040
## madde_13   -0.099   -0.044
## madde_14   -0.057   -0.029
## madde_15   -0.056    0.008
## madde_16   -0.009   -0.039
## madde_17   -0.032   -0.012
## madde_18   -0.037   -0.044
## madde_19   -0.041    0.003
## madde_20    0.022   -0.032
## madde_21   -0.027   -0.007
## madde_22    0.004   -0.028
## madde_23   -0.045   -0.067
## madde_24    1.000   -0.107
## madde_25   -0.107    1.000
q3_degerleri <- as.matrix(q3_matris)
diag(q3_degerleri) <- NA
q3_tablo <- as.data.frame(as.table(q3_degerleri))
q3_tablo <- subset(q3_tablo, !is.na(Freq))
q3_sirali <- q3_tablo[order(-abs(q3_tablo$Freq)), ]
ilk_10_q3 <- head(q3_sirali, 10)

kable(ilk_10_q3,
      caption = "En Yüksek 10 Q3 Değeri (Yerel Bağımsızlık Testi)",
      align = "c") |>
  kable_styling(full_width = TRUE, bootstrap_options = c("striped", "hover", "condensed"))
En Yüksek 10 Q3 Değeri (Yerel Bağımsızlık Testi)
Var1 Var2 Freq
7 madde_7 madde_1 -0.1280048
151 madde_1 madde_7 -0.1280048
184 madde_9 madde_8 -0.1136453
208 madde_8 madde_9 -0.1136453
600 madde_25 madde_24 -0.1068850
624 madde_24 madde_25 -0.1068850
321 madde_21 madde_13 -0.1067722
513 madde_13 madde_21 -0.1067722
319 madde_19 madde_13 -0.1045923
463 madde_13 madde_19 -0.1045923

b) Madde ve Birey Parametreleri (Model Karşılaştırması)

test_verisi <- readRDS("binary.rds")

model_1pl <- mirt(test_verisi, 1, itemtype = "Rasch", verbose = FALSE)
model_2pl <- mirt(test_verisi, 1, itemtype = "2PL", verbose = FALSE)
model_3pl <- mirt(test_verisi, 1, itemtype = "3PL", verbose = FALSE)

get_aic_bic <- function(model) {
  c(
    AIC = extract.mirt(model, "AIC"),
    BIC = extract.mirt(model, "BIC")
  )
}

model_karsilastirma_df <- rbind(
  model_1pl = get_aic_bic(model_1pl),
  model_2pl = get_aic_bic(model_2pl),
  model_3pl = get_aic_bic(model_3pl)
)

model_karsilastirma_df <- round(model_karsilastirma_df, 2)

kable(model_karsilastirma_df,
      caption = "Model Karsilastirmasi: AIC ve BIC",
      align = "c") |>
  kable_styling(full_width = TRUE,
                bootstrap_options = c("striped", "hover", "condensed"))
Model Karsilastirmasi: AIC ve BIC
AIC BIC
model_1pl 46644.17 46781.80
model_2pl 46470.65 46735.33
model_3pl 46305.94 46702.97

Model karşılaştırmasına ilişkin AIC ve BIC değerleri incelendiğinde, en düşük değerlerin 3PL modeline ait olduğu görülmektedir. AIC değeri, modelin veriye uyumunu ve karmaşıklığını birlikte değerlendirir; bu açıdan 3PL modeli diğer modellere kıyasla daha iyi bir uyum sağlamaktadır. Benzer şekilde, BIC değeri de 3PL modelinde en düşüktür ve bu da modelin hem açıklayıcılığının yüksek olduğunu hem de kullanılan parametre sayısının uygun olduğunu göstermektedir.

madde_parametreleri_3pl <- coef(model_3pl, IRTpars = TRUE, simplify = TRUE)$items
madde_3pl_df <- as.data.frame(madde_parametreleri_3pl)
madde_3pl_df$madde <- rownames(madde_3pl_df)

kable(madde_3pl_df[, c("a", "b", "g")],
      caption = "3PL Modeli Madde Parametreleri",
      digits = 3,
      align = "c") |>
  kable_styling(full_width = TRUE,
                bootstrap_options = c("striped", "hover", "condensed"))
3PL Modeli Madde Parametreleri
a b g
madde_1 1.521 -0.222 0.065
madde_2 1.777 1.025 0.282
madde_3 1.690 1.542 0.382
madde_4 1.274 0.481 0.106
madde_5 1.272 -0.259 0.040
madde_6 1.236 0.544 0.149
madde_7 1.752 0.761 0.234
madde_8 1.422 0.688 0.240
madde_9 1.574 1.355 0.277
madde_10 1.606 0.261 0.236
madde_11 1.390 0.857 0.276
madde_12 2.159 0.760 0.264
madde_13 2.460 1.520 0.297
madde_14 1.430 1.910 0.191
madde_15 1.403 0.676 0.189
madde_16 1.569 0.326 0.089
madde_17 2.532 0.597 0.387
madde_18 1.704 0.632 0.213
madde_19 1.599 0.801 0.195
madde_20 1.983 0.372 0.266
madde_21 2.277 0.728 0.177
madde_22 2.826 1.094 0.168
madde_23 2.029 0.799 0.299
madde_24 1.645 0.652 0.239
madde_25 1.801 0.753 0.183
theta_3pl <- fscores(model_3pl, method = "EAP")
theta_3pl_df <- data.frame(birey = 1:nrow(theta_3pl), theta = theta_3pl)

datatable(
  theta_3pl_df,
  colnames = c("Birey No", "Theta"),
  caption = "3PL Modeline Göre Tüm Bireylerin Yetenek (Theta) Tahminleri",
  options = list(
    pageLength = 25,        
    scrollX = TRUE,       
    autoWidth = TRUE        
  )
)

Yetenek (theta) tahminleri -1,58 ile 2,46 arasında değişmektedir. Bu aralık, bireylerin başarı düzeylerinin geniş bir yelpazede dağıldığını göstermektedir. Negatif theta değerleri, bireyin ortalamanın altında bir yetenek düzeyine sahip olduğunu; pozitif değerler ise ortalamanın üzerinde bir yetenek düzeyine sahip olduğunu ifade eder. Theta değerinin sıfıra yakın olması ise bireyin ortalama düzeyde bir başarı gösterdiğini işaret eder. Bu bulgular, testin farklı başarı seviyelerini ayırt etme konusunda işlevsel olduğunu ve ölçüm aralığının yeterince kapsayıcı olduğunu ortaya koymaktadır.

c) Madde Karakteristik ve Test Karakteristik Eğrileri

plot(model_3pl, type = "trace", facet_items = TRUE)

plot(model_3pl, type = "score")

d) KTK–MTK Parametrelerinin İlişkisi

ktk_guculuk <- colMeans(test_verisi)

alpha_sonuclari <- psych::alpha(test_verisi)
ktk_korelasyon <- alpha_sonuclari$item.stats$r.drop

mtk_zorluk <- coef(model_3pl, IRTpars = TRUE, simplify = TRUE)$items[, "b"]

ktk_mtk_df <- data.frame(
  madde = paste0("madde_", 1:25),
  toplam_korelasyon = round(ktk_korelasyon, 3),
  ktk_guculuk = round(ktk_guculuk, 3),
  mtk_zorluk = round(mtk_zorluk, 3)
)

korelasyon_sonuc <- cor(ktk_mtk_df$ktk_guculuk, ktk_mtk_df$mtk_zorluk)

kable(ktk_mtk_df,
      caption = "KTK ve MTK (3PL) Madde Parametreleri Karsilastirmasi",
      align = "c") |>
  kable_styling(full_width = TRUE,
                bootstrap_options = c("striped", "hover", "condensed"))
KTK ve MTK (3PL) Madde Parametreleri Karsilastirmasi
madde toplam_korelasyon ktk_guculuk mtk_zorluk
madde_1 madde_1 0.420 0.587 -0.222
madde_2 madde_2 0.313 0.447 1.025
madde_3 madde_3 0.180 0.469 1.542
madde_4 madde_4 0.376 0.450 0.481
madde_5 madde_5 0.383 0.580 -0.259
madde_6 madde_6 0.357 0.466 0.544
madde_7 madde_7 0.355 0.458 0.761
madde_8 madde_8 0.322 0.489 0.688
madde_9 madde_9 0.254 0.407 1.355
madde_10 madde_10 0.378 0.564 0.261
madde_11 madde_11 0.301 0.488 0.857
madde_12 madde_12 0.378 0.467 0.760
madde_13 madde_13 0.239 0.373 1.520
madde_14 madde_14 0.214 0.282 1.910
madde_15 madde_15 0.352 0.458 0.676
madde_16 madde_16 0.436 0.464 0.326
madde_17 madde_17 0.358 0.577 0.597
madde_18 madde_18 0.379 0.470 0.632
madde_19 madde_19 0.356 0.430 0.801
madde_20 madde_20 0.397 0.551 0.372
madde_21 madde_21 0.427 0.408 0.728
madde_22 madde_22 0.387 0.314 1.094
madde_23 madde_23 0.350 0.489 0.799
madde_24 madde_24 0.345 0.486 0.652
madde_25 madde_25 0.389 0.421 0.753
cat("KTK gucluk ile 3PL zorluk parametresi arasindaki korelasyon:",
    round(korelasyon_sonuc, 3), "\n")
## KTK gucluk ile 3PL zorluk parametresi arasindaki korelasyon: -0.789

Soru 4

2PL Model Simülasyon ve Parametre Kestirimi

madde_param <- readRDS("maddepar.Rds")
madde_param <- as.data.frame(madde_param)
uretim_fonksiyonu <- function(theta, madde_param) {
  a <- madde_param$a
  b <- madde_param$b
  prob <- 1 / (1 + exp(-outer(theta, a) * (a * (theta - b))))
  response <- matrix(rbinom(length(prob), 1, prob), nrow = length(theta))
  colnames(response) <- paste0("madde_", seq_len(ncol(response)))
  return(response)
}

a) Madde Parametrelerinin Kestirimi ve RMSE

replikasyonlar <- c(10, 30, 50, 100)
sonuclar_a <- list()
sonuclar_b <- list()
set.seed(42)

for (r in replikasyonlar) {
  rmse_a_vec <- numeric(r)
  rmse_b_vec <- numeric(r)
  
  for (i in seq_len(r)) {
    theta_true <- rnorm(1000)
    yanit_verisi <- uretim_fonksiyonu(theta_true, madde_param)
    model <- mirt(yanit_verisi, model = 1, itemtype = "2PL", verbose = FALSE)
    tahmin <- coef(model, IRTpars = TRUE, simplify = TRUE)$items
    
    rmse_a_vec[i] <- sqrt(mean((madde_param$a - tahmin[, "a"])^2))
    rmse_b_vec[i] <- sqrt(mean((madde_param$b - tahmin[, "b"])^2))
  }
  
  sonuclar_a[[as.character(r)]] <- rmse_a_vec
  sonuclar_b[[as.character(r)]] <- rmse_b_vec
}
rmse_df <- tibble(
  rep = rep(replikasyonlar, each = 1),
  a_rmse = sapply(sonuclar_a, mean),
  b_rmse = sapply(sonuclar_b, mean)
)

kable(rmse_df, caption = "Replikasyon Sayısına Göre Madde Parametresi RMSE", digits = 5) %>%
  kable_styling(full_width = TRUE)
Replikasyon Sayısına Göre Madde Parametresi RMSE
rep a_rmse b_rmse
10 0.18652 1.31003
30 0.19427 1.31006
50 0.18485 1.31308
100 0.19898 1.31400
rmse_long <- bind_rows(
  tibble(rep = rep(replikasyonlar, times = lengths(sonuclar_a)),
         log_rmse = log(unlist(sonuclar_a)), param = "a"),
  tibble(rep = rep(replikasyonlar, times = lengths(sonuclar_b)),
         log_rmse = log(unlist(sonuclar_b)), param = "b")
)

ggplot(rmse_long, aes(x = rep, y = log_rmse, color = param)) +
  geom_boxplot() +
  labs(title = "Replikasyon Sayısına Göre log(RMSE) (Madde Parametreleri)",
       x = "Replikasyon Sayısı", y = "log(RMSE)", color = "Parametre") +
  theme_minimal()

b) Yetenek (Theta) Parametresinin Kestirimi

ggplot(rmse_long, aes(x = factor(rep), y = log_rmse, fill = param)) +
  geom_col(position = position_dodge(width = 0.7), width = 0.6) +
  scale_fill_manual(values = c("a" = "steelblue", "b" = "darkorange")) +
  labs(
    title = "Log(RMSE) vs Replikasyon Sayısı (Madde Parametreleri)",
    x = "Replikasyon Sayısı",
    y = "log(RMSE)",
    fill = "Parametre"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    legend.position = "bottom"
  )

Simülasyon Sonuçlarının İncelenmesi

theta_gercek_listesi <- list()

yontemler <- c("EAP", "MAP", "ML")

rmse_theta_listesi <- list()

set.seed(42)
for (r in replikasyonlar) {
  theta_true <- rnorm(1000)  
  theta_gercek_listesi[[as.character(r)]] <- theta_true
  
  veri <- uretim_fonksiyonu(theta_true, madde_param)
  model <- mirt(data = veri, model = 1, itemtype = "2PL", verbose = FALSE)
  
  rmse_vec <- c()
  for (y in yontemler) {
    tahmin_theta <- fscores(model, method = y)
    rmse <- sqrt(mean((theta_true - tahmin_theta[,1])^2))
    rmse_vec <- c(rmse_vec, rmse)
  }
  
  rmse_theta_listesi[[as.character(r)]] <- rmse_vec
}

theta_rmse_df <- bind_rows(rmse_theta_listesi, .id = "replikasyon")
colnames(theta_rmse_df) <- c("replikasyon", yontemler)
theta_rmse_df$replikasyon <- as.integer(theta_rmse_df$replikasyon)

theta_long_df <- theta_rmse_df |>
  pivot_longer(cols = all_of(yontemler),
               names_to = "yontem",
               values_to = "rmse") |>
  mutate(log_rmse = log(rmse))

Grafik: log(RMSE) vs replikasyon sayısı

ggplot(theta_long_df, aes(x = yontem, y = log_rmse, fill = yontem)) +
  geom_boxplot(alpha = 0.7, outlier.color = "black", outlier.shape = 16) +
  scale_fill_manual(
    values = c("EAP" = "#66c2a5", "MAP" = "#fc8d62", "ML" = "#8da0cb")
  ) +
  labs(
    title = "Yetenek Tahmini Yöntemlerine Göre log(RMSE) Dağılımı",
    x = "Tahmin Yöntemi",
    y = "log(RMSE)"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    legend.position = "none"
  )