Samet EKER 08.05.2025
Bu öğrenme günlüğünde Rasch dersinde üzerinde çalıştığımız bir veri setini kullanarak Madde Tepki Kuramı (MTK) çerçevesinde analizler gerçekleştirmeye çalıştım. Analizler şu aşamaları kapsamaktadır:
Tek boyutluluk testleri (PCA, EFA, EGA)
Yerel bağımsızlık testi (Yen’s Q3)
Rasch, 2PL, 3PL model karşılaştırmaları
Uygun modelin belirlenmesi
Seçilen modelde parametre kestirimleri
Madde bilgi fonksiyonları ve yetenek kestirimleri
library(readxl)
library(mirt)
veri <- read_excel("C:/Users/Lenovo/Desktop/dmfveri.xlsx")
Sadece maddeleri içeren veri setini alıp
summary
fonksiyonu ile özetleyelim.
cevaplar <- veri[, grep("^m_", names(veri))]
summary(cevaplar)
## m_1 m_2 m_3 m_4
## Min. :0.0000 Min. :0.000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.0000 1st Qu.:0.000 1st Qu.:0.0000 1st Qu.:0.0000
## Median :0.0000 Median :0.000 Median :0.0000 Median :0.0000
## Mean :0.2251 Mean :0.173 Mean :0.4533 Mean :0.3864
## 3rd Qu.:0.0000 3rd Qu.:0.000 3rd Qu.:1.0000 3rd Qu.:1.0000
## Max. :1.0000 Max. :1.000 Max. :1.0000 Max. :1.0000
## m_5 m_6 m_7 m_8
## Min. :0.0000 Min. :0.0000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.0000
## Median :0.0000 Median :0.0000 Median :0.0000 Median :0.0000
## Mean :0.4979 Mean :0.4607 Mean :0.2665 Mean :0.2346
## 3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.:0.0000
## Max. :1.0000 Max. :1.0000 Max. :1.0000 Max. :1.0000
## m_9 m_10 m_11 m_12
## Min. :0.0000 Min. :0.0000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.0000
## Median :0.0000 Median :0.0000 Median :0.0000 Median :0.0000
## Mean :0.3599 Mean :0.2633 Mean :0.2357 Mean :0.1794
## 3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.:0.0000 3rd Qu.:0.0000
## Max. :1.0000 Max. :1.0000 Max. :1.0000 Max. :1.0000
## m_13 m_14 m_15 m_16
## Min. :0.0000 Min. :0.0000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.0000
## Median :0.0000 Median :1.0000 Median :0.0000 Median :0.0000
## Mean :0.2845 Mean :0.5297 Mean :0.2229 Mean :0.4268
## 3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.:0.0000 3rd Qu.:1.0000
## Max. :1.0000 Max. :1.0000 Max. :1.0000 Max. :1.0000
## m_17 m_18 m_19
## Min. :0.0000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.0000
## Median :0.0000 Median :0.0000 Median :0.0000
## Mean :0.3631 Mean :0.3344 Mean :0.1391
## 3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.:0.0000
## Max. :1.0000 Max. :1.0000 Max. :1.0000
Veri seti, 942 bireyin 19 maddeye verdikleri yanıtları içermektedir. Her bir madde için bireylerin yanıtları 0 (yanlış) veya 1 (doğru) şeklinde kodlanmıştır.
Temel bileşenler analizi ile verinin tek boyutlu olup olmadığını kontrol edelim. Plot fonksiyonu diğer maddelerden ayrılan madde var mı diye bakmak için kullanılabilir.
library(Gifi)
cevaplar_faktor <- data.frame(lapply(cevaplar, factor))
pca <- princals(cevaplar_faktor)
summary(pca)
##
## Loadings (cutoff = 0.1):
## Comp1 Comp2
## m_4 -0.544 0.214
## m_5 -0.543
## m_9 -0.537
## m_8 -0.370 -0.530
## m_1 -0.459
## m_2 -0.341 -0.150
## m_3 -0.428 0.284
## m_6 -0.490 0.332
## m_7 -0.391 0.240
## m_10 -0.483 -0.285
## m_11 -0.397 0.315
## m_12 -0.438
## m_13 -0.401 0.332
## m_14 -0.385 -0.307
## m_15 -0.398 -0.418
## m_16 -0.487 0.119
## m_17 -0.452
## m_18 -0.405 -0.170
## m_19 -0.464 -0.310
##
## Importance (Variance Accounted For):
## Comp1 Comp2
## Eigenvalues 3.7900 1.3084
## VAF 19.9473 6.8861
## Cumulative VAF 19.9500 26.8300
plot(pca)
Sonuçlar tek boyutluluğun sağlanamadığını gösterir gibi gözüküyor.
Ek kanıt için EFA yapalım. Hem 1 faktör hem iki faktörlü modelin uyumunu ANOVA ile karşılaştıralım.
library(mirt)
library(knitr)
efa1 <- mirt(cevaplar, 1)
efa2 <- mirt(cevaplar, 2)
karsilastirma <- anova(efa1, efa2)
library(knitr)
kable(karsilastirma)
AIC | SABIC | HQ | BIC | logLik | X2 | df | p | |
---|---|---|---|---|---|---|---|---|
efa1 | 19839.03 | 19902.57 | 19909.25 | 20023.25 | -9881.515 | NA | NA | NA |
efa2 | 19773.89 | 19867.52 | 19877.37 | 20045.38 | -9830.943 | 101.1437 | 18 | 0 |
Analiz sonuçlarına göre, iki faktörlü modelin log-likelihood değeri (-9830.94) tek faktörlü modele (-9881.51) göre daha yüksektir ve bu durum modele daha iyi bir uyumu işaret eder. Ayrıca, AIC ve BIC bilgi kriterleri de iki faktörlü model lehine daha düşüktür. Bu da modelin daha ekonomik ve açıklayıcı olduğunu gösterir.
ANOVA testi sonucunda elde edilen model karşılaştırma istatistiği anlamlıdır (χ² = 101.144, df = 18, p < .001). Bu da iki faktörlü modelin veriyle anlamlı biçimde daha iyi uyum sağladığını ortaya koyar.
Sonuç olarak, tek boyutluluk varsayımı zayıf kalmakta, çok boyutlu yapının veri açısından daha uygun olduğu görülmektedir.
Son olarak EGA (Exploratory Graph Analysis) ile tek boyutluluk varsayımını test edelim.
library(EGAnet)
plot(EGA(cevaplar))
Neden iki görsel çıktı, nerede hata yaptım bulamadım.
EGA sonuçlarına göre de tek boyutluluk kesinlikle sağlanamadı.
Öğrenme günlüğüme devam edebilmek adına madde seçimi yapıp en uygun maddelerden oluşan veri seti seçeceğim. Yeni veri seti için 1. faktörde yüksek faktör yüküne sahip olan maddeleri tercih ettim.
secilen_maddeler <- c("m_1", "m_2", "m_5", "m_7", "m_9", "m_12", "m_13", "m_18")
alt_veri <- cevaplar[, secilen_maddeler]
efa_alt <- mirt(alt_veri, 1)
efa_alt2 <- mirt(alt_veri, 2)
karsilastirma_alt <- anova(efa_alt, efa_alt2)
kable(karsilastirma_alt)
AIC | SABIC | HQ | BIC | logLik | X2 | df | p | |
---|---|---|---|---|---|---|---|---|
efa_alt | 8322.464 | 8349.217 | 8352.030 | 8400.032 | -4145.232 | NA | NA | NA |
efa_alt2 | 8311.341 | 8349.798 | 8353.843 | 8422.845 | -4132.670 | 25.12301 | 7 | 0.0007216 |
TEK BOYUTLULUK VARSAYIMI ZORLANARAK SAĞLANMIŞTIR :)
mod_1pl <- mirt(alt_veri, 1, itemtype = "Rasch")
mod_2pl <- mirt(alt_veri, 1, itemtype = "2PL")
mod_3pl <- mirt(alt_veri, 1, itemtype = "3PL")
kable(anova(mod_1pl, mod_2pl, mod_3pl))
AIC | SABIC | HQ | BIC | logLik | X2 | df | p | |
---|---|---|---|---|---|---|---|---|
mod_1pl | 8331.542 | 8346.591 | 8348.173 | 8375.174 | -4156.771 | NA | NA | NA |
mod_2pl | 8322.464 | 8349.217 | 8352.030 | 8400.032 | -4145.232 | 23.07826 | 7 | 0.0016519 |
mod_3pl | 8327.186 | 8367.316 | 8371.536 | 8443.538 | -4139.593 | 11.27787 | 8 | 0.1864463 |
En düşük AIC değeri 2PL modeline (8322.464) aittir, bu da veriyle en iyi uyumun 2PL modelinde olduğunu gösterir.
Log-likelihood değerleri de yine 2PL modelinde daha yüksektir (−4145.232), bu da daha iyi model uyumuna işaret eder.
BIC kriteri açısından ise en düşük değer Rasch modelindedir (8375.174), bu da daha basit modeli tercih eden BIC’in sadelikten yana olduğunu gösterir.
3PL modeli, en karmaşık yapıya sahip olmasına rağmen, X² değeri açısından iyi bir uyum gösterse de (p = 0.186), bilgi kriterlerinde 2PL kadar güçlü değildir.
Özetle, 2PL modeli istatistiksel olarak en iyi uyumu verirken, BIC açısından Rasch modeli daha uygun görünmektedir. Bu durumda, model seçimi analiz amacına göre belirlemek lazım. Eğer sadelik ve yorumlanabilirlik önemliyse Rasch modeli, model uyumu öncelikliyse 2PL modeli tercih edilebilir.
Ben Mimar Selim Bey’in yaşlı müşterisi gibi sadelikten yanayım, bu yüzden Rasch modelini tercih edeceğim :) Ancak, 2PL modelini de başka bir öğrenme günlüğünde mutlaka deneyeceğim.
Maddelerin modele iyi uyum gösterip göstermediğini kontrol etmek için madde uyum analizi yapacağım.
mirt::itemfit(mod_1pl, method = "S-X2")
## item S_X2 df.S_X2 RMSEA.S_X2 p.S_X2
## 1 m_1 2.902 5 0.000 0.715
## 2 m_2 9.128 5 0.030 0.104
## 3 m_5 9.231 4 0.037 0.056
## 4 m_7 5.315 5 0.008 0.379
## 5 m_9 17.952 5 0.052 0.003
## 6 m_12 6.883 5 0.020 0.229
## 7 m_13 3.096 5 0.000 0.685
## 8 m_18 6.877 5 0.020 0.230
coef(mod_1pl, IRTpars = TRUE, simplify = TRUE)$items
## a b g u
## m_1 1 1.487268322 0 1
## m_2 1 1.868884040 0 1
## m_5 1 0.008435991 0 1
## m_7 1 1.222773149 0 1
## m_9 1 0.698691293 0 1
## m_12 1 1.818221874 0 1
## m_13 1 1.115032274 0 1
## m_18 1 0.834471919 0 1
library(knitr)
kable(coef(mod_1pl, IRTpars = TRUE, simplify = TRUE))
|
|
|
Elde edilen bu parametreler, her maddenin güçlük düzeyini (b) ifade ederken, ayırt edicilikler (a) sabit olarak 1 alınmıştır. Güçlük değerleri pozitif oldukça madde daha zor kabul edilir.
En zor maddeler arasında m_2 (1.87) ve m_12 (1.82) öne çıkarken, en kolay madde m_5 (0.01) olarak görünmektedir.
Analiz sonuçlarına göre testin farklı yetenek düzeylerinde iyi ayrım yaptığı söylenebilir.
Madde karakteristik eğrilerini interaktif bir grafikle göstermek istiyorum.
library(plotly)
b_values <- c(
m_1 = 1.5158,
m_2 = 2.2711,
m_5 = 0.0037,
m_7 = 1.2453,
m_9 = 0.7093,
m_12 = 1.7531,
m_13 = 1.2565,
m_18 = 0.9515
)
theta <- seq(-4, 4, length.out = 500)
plot_data <- do.call(rbind, lapply(names(b_values), function(item) {
prob <- 1 / (1 + exp(-(theta - b_values[item])))
data.frame(theta = theta, probability = prob, item = item)
}))
plot_ly(data = plot_data, x = ~theta, y = ~probability, color = ~item, type = 'scatter', mode = 'lines') %>%
layout(title = "Interaktif ICC Grafiği - Rasch Modeli",
xaxis = list(title = "Yetenek (θ)"),
yaxis = list(title = "Doğru Cevap Olasılığı"))
Çok güzel oldu.
Madde karakteristik eğrileri (ICC) her bir maddenin yetenek düzeyine göre doğru cevap olasılığını göstermektedir.
Örneğin, m_5 maddesi düşük yetenek düzeylerinde bile yüksek olasılıkla doğru cevap verirken, m_2 ve m_12 maddeleri yüksek yetenek düzeylerinde bile düşük olasılıkla doğru cevap vermektedir.
-> NOT: İnteraktif grafikte, sağ tarafta maddelerin üzerine tıklayarak eğrileri yok edip geri getirebilirsiniz. İki madde grafik üzerinden daha kolay yorumlanabiliyor.
theta_degerleri <- fscores(mod_1pl)
library(DT)
datatable(theta_degerleri, options = list(pageLength = 10))
Theta puanları -1.09 ile +2.29 arasında değişmektedir.
Bu, bireyler arasında bilgi düzeyinde anlamlı bir farklılık olduğunu gösterir. Daha yüksek theta değeri, bireyin teste konu olan özelliğe (muhtemelen bilgi, beceri ya da tutum) daha fazla sahip olduğunu gösterir.
Örneğin:
. -1.09 civarı değerler, düşük yetenek düzeyini,
. 0 civarındaki değerler, ortalama yetenek düzeyini,
. +2 ve üzeri değerler, yüksek yetenek düzeyini ifade eder.
Genel olarak, theta dağılımı dengeli görünmekte, bu da testin bireyleri ayırt etme gücünün yeterli olduğunu düşündürmektedir.
Madde bilgi fonksiyonları, her bir maddenin yetenek düzeyine göre sağladığı bilginin miktarını gösterir. Test bilgi fonksiyonu ise tüm maddelerin bir araya gelerek sağladığı toplam bilgiyi ifade eder.
Madde bilgi fonksiyonlarını da interaktif bir grafikle göstermek istiyorum.
library(plotly)
theta <- seq(-4, 4, 0.1)
a <- 1
maddeler <- rownames(coef(mod_1pl, IRTpars = TRUE, simplify = TRUE)$items)
b_degerleri <- coef(mod_1pl, IRTpars = TRUE, simplify = TRUE)$items[, "b"]
p <- plot_ly()
for (i in seq_along(maddeler)) {
b <- b_degerleri[i]
bilgi <- a^2 * dnorm(theta) * (1 / (1 + exp(-(a * (theta - b))))^2)
p <- add_trace(p, x = theta, y = bilgi, type = "scatter", mode = "lines", name = maddeler[i])
}
p <- layout(p,
title = "Tüm Maddeler için Madde Bilgi Fonksiyonları",
xaxis = list(title = "Theta"),
yaxis = list(title = "Bilgi"))
p
m_5, yaklaşık θ = 1 civarında en fazla bilgi sağlayan maddedir. Bu da bu maddenin ayırt ediciliğinin diğerlerine göre daha yüksek olduğunu gösterir. Madde karakteristik eğirilerinden de bu görülebilir.
Diğer maddeler daha düşük ya da daha dar bilgi aralıklarına sahiptir. Bu da bu maddelerin daha dar bir yetenek aralığında etkili olduğunu gösterir.
Test bilgi fonksiyonunu da aynı şekilde interaktif bir grafikle göstermek istiyorum.
library(plotly)
theta <- seq(-4, 4, 0.1)
b_values <- coef(mod_1pl, IRTpars = TRUE, simplify = TRUE)$items[, "b"]
a <- 1
madde_bilgi_fonksiyonlari <- function(b, theta) {
p <- 1 / (1 + exp(-a * (theta - b)))
bilgi <- a^2 * p * (1 - p)
return(bilgi)
}
test_bilgi <- sapply(theta, function(th) {
sum(madde_bilgi_fonksiyonlari(b_values, th))
})
plot_ly(x = ~theta, y = ~test_bilgi, type = "scatter", mode = "lines") %>%
layout(title = "Test Bilgi Fonksiyonu",
xaxis = list(title = "Theta"),
yaxis = list(title = "Bilgi (Information)"))
Madde bilgi fonksiyonuna göre, testin en fazla bilgi sağladığı nokta yaklaşık θ = 1.5 civarındadır. Bu, testin özellikle ortalamanın biraz üzerindeki yetenek düzeyindeki bireyler için daha duyarlı ve güvenilir sonuçlar verdiğini gösterir.
Bilgi miktarı en yüksek noktada yaklaşık 1.85 seviyesindedir. Bu, hata varyansının (standard error) düşük olduğu ve yetenek tahminlerinin bu bölgede daha hassas yapıldığını ifade eder.
Düşük (θ < -1) veya yüksek (θ > 3) yetenek düzeylerinde testin bilgi seviyesi belirgin şekilde azalır. Bu da uçlardaki bireyler için testin daha az duyarlı olduğunu gösterir.
NOT: Başka bir günlükte eRm paketini de kullanacağım.
NOT2: Günlük yaklaşık 4 saat sürdü.