Bu çalışmada kaynakçada sunulan kaynaklar detaylı bir şekilde incelenerek HLM konusunda ayrıntılı bir ders notu özeti hazırlamak amaçlanmıştır. Not hazırlanırken kaynaklar Notebook LM’e yüklenmiş ve aklıma gelen sorular sorularak alınan cevaplardan dağınık bir ders notu çıkmıştır. Daha sonra ders notu okunarak mantıksal bir bütünlük olacak şekilde düzenlenmeye çalışılmıştır. Belgenin ayarları ve kod blokları için ise Claude Opus 4.6’dan destek alınmıştır.
Sosyal bilimlerde ve eğitim araştırmalarında karşılaşılan verilerin önemli bir kısmı yuvalanmış (nested) bir yapıya sahiptir. Öğrenciler sınıflarda, sınıflar okullarda, okullar illerde; hastalar kliniklerde; çalışanlar firmalarda; tekrarlı ölçümler bireylerin içinde yuvalanır. Bu yapının en kritik istatistiksel sonucu tek bir cümlede özetlenebilir: aynı kümeye ait gözlemler, farklı kümelerdeki gözlemlere kıyasla birbirine daha çok benzer.
set.seed(12)
okullar <- c("Okul A", "Okul B", "Okul C")
ogrenciler <- expand.grid(ogrenci = 1:4, okul = okullar)
ogrenciler$x <- as.numeric(factor(ogrenciler$okul)) * 3 +
(ogrenciler$ogrenci - 2.5) * 0.6
ogrenciler$y <- 1
okul_df <- data.frame(okul = okullar,
x = seq_along(okullar) * 3,
y = 2.6)
toplum_df <- data.frame(x = mean(okul_df$x), y = 4.2)
ggplot() +
# çizgiler: okul -> toplum
geom_segment(data = okul_df,
aes(x = x, y = y + 0.25, xend = toplum_df$x[1],
yend = toplum_df$y[1] - 0.25),
color = "#6a7490", linewidth = 0.6) +
# çizgiler: öğrenci -> okul
geom_segment(data = ogrenciler,
aes(x = x, y = y + 0.25,
xend = as.numeric(factor(okul)) * 3,
yend = 2.6 - 0.25),
color = "#6a7490", linewidth = 0.6) +
# Noktalar
geom_point(data = ogrenciler, aes(x = x, y = y, color = okul),
size = 9) +
geom_point(data = okul_df, aes(x = x, y = y),
size = 17, color = renk_vurgu, shape = 15) +
geom_point(data = toplum_df, aes(x = x, y = y),
size = 23, color = renk_mor, shape = 18) +
# Etiketler
geom_text(data = ogrenciler, aes(x = x, y = y, label = ogrenci),
color = "#1a1e2e", fontface = "bold", size = 3.8) +
geom_text(data = okul_df, aes(x = x, y = y, label = okul),
color = "#1a1e2e", fontface = "bold", size = 4.2) +
geom_text(data = toplum_df, aes(x = x, y = y, label = "Toplum"),
color = "#1a1e2e", fontface = "bold", size = 4.2) +
# Düzey etiketleri (sol taraf)
annotate("text", x = 0.5, y = 1, label = "Düzey 1\n(öğrenci)",
color = renk_ana, fontface = "bold", size = 4.3, hjust = 0) +
annotate("text", x = 0.5, y = 2.6, label = "Düzey 2\n(okul)",
color = renk_vurgu, fontface = "bold", size = 4.3, hjust = 0) +
annotate("text", x = 0.5, y = 4.2, label = "Popülasyon",
color = renk_mor, fontface = "bold", size = 4.3, hjust = 0) +
scale_color_manual(values = renk_grup[1:3], guide = "none") +
xlim(0, 11) + ylim(0.5, 4.8) +
theme_void() +
theme(plot.background = element_rect(fill = "#1a1e2e", color = NA),
plot.title = element_text(color = "#9ecbe6", face = "bold",
hjust = 0.5, size = 15,
margin = margin(b = 12)),
plot.caption = element_text(color = "#9ecbdc", size = 10,
face = "italic", hjust = 0)) +
labs(title = "Yuvalanmış (hiyerarşik) veri yapısı",
caption = "Aynı okulun öğrencileri paylaşılan bir çevre nedeniyle birbirine benzer.")Şekil 1. İki düzeyli yuvalanmış yapı — öğrenciler okulların içinde yuvalanır. Aynı okuldaki öğrenciler paylaşılan bir çevre nedeniyle birbirine benzer; bu benzerlik bağımsızlık varsayımını ihlal eder.
Standart Sıradan En Küçük Kareler (OLS) regresyonunun en temel varsayımlarından biri olan hataların bağımsızlığı, yuvalanmış verilerde doğrudan ihlal edilir. Bu ihlal yalnızca “teknik bir detay” değildir; parametre kestiriminin geçerliliğini kökünden sarsan bir sorundur.
Yuvalanmış veriye standart OLS uygulandığında üç temel sorun ortaya çıkar:
Standart hatalarda aşağı yönlü yanlılık. OLS, gözlemlerin bağımsız olduğunu varsaydığı için kümelenmeyi yok sayar. Bu, regresyon katsayılarının standart hatalarının olması gerekenden daha küçük hesaplanmasına yol açar.
Tip I hata enflasyonu. Standart hataların küçümsenmesi \(t\) ve \(z\) istatistiklerinin yapay olarak büyümesine; dolayısıyla aslında anlamsız olan etkilerin “anlamlı” gözükmesine neden olur. Yanlış pozitif bulgu oranı artar.
Bilgi kaybı ve yanlılık. Sorunu “çözmek” için yapılan iki klasik hamle de başka yanlılıklar doğurur:
Toplama (aggregation): Grup ortalamalarıyla çalışmak — grup içi varyansı tamamen atar; serbestlik derecesi çöker, güç düşer ve ekolojik yanılgıya (grup düzeyindeki ilişkiyi bireye yorumlamak) yol açar.
Alt düzeye yayma (disaggregation): Grup özelliklerini her bireye kopyalamak — bağımsızlık varsayımını daha da ağır ihlal eder ve atomistik yanılgıya (bireysel bulguları gruba yorumlamak) kapı açar.
Kümelenmenin standart hatalar üzerindeki bozucu etkisinin büyüklüğü Dizayn Etkisi (Design Effect — DEFF) ile nicelenir:
DİZAYN ETKİSİ \[ \mathrm{DEFF} = 1 + (\bar{n} - 1)\,\rho \]
Burada \(\bar{n}\) küme başına ortalama gözlem sayısı, \(\rho\) ise Sınıfiçi Korelasyon Katsayısı (ICC)’dır. DEFF değeri \(1\)’den ne kadar büyükse, OLS’nin hesapladığı standart hatalar gerçek değerinden o kadar sapmalıdır.
Bu formülün can alıcı sonucu şudur: Literatürde sık sık dile getirilen “ICC < .05 ise HLM’ye gerek yok” tarzı eşik değerler yanıltıcıdır. Çünkü DEFF yalnızca ICC’ye değil, küme büyüklüğüne de bağlıdır.
df_deff <- expand.grid(rho = seq(0.01, 0.3, length.out = 60),
n = seq(5, 500, length.out = 60))
df_deff$deff <- 1 + (df_deff$n - 1) * df_deff$rho
ggplot(df_deff, aes(x = n, y = rho, fill = deff)) +
geom_raster(interpolate = TRUE) +
geom_contour(aes(z = deff), color = "#ffffff",
breaks = c(1.5, 2, 3, 5, 10, 20, 50), linewidth = 0.4,
alpha = 0.55) +
scale_fill_gradientn(
colors = c("#1a2340", "#2e4a7a", "#4dc4ff", "#7ee787",
"#ffd866", "#ffb347", "#ff7b7b"),
values = scales::rescale(c(1, 2, 4, 8, 20, 50, 150)),
name = "DEFF",
trans = "log",
breaks = c(1, 2, 5, 10, 30, 100)
) +
labs(
title = "Dizayn etkisi (DEFF): ICC × küme büyüklüğü",
subtitle = "DEFF = 1 + (n̄ − 1) · ρ · Beyaz konturlar DEFF düzey eğrileridir",
x = "Küme başına ortalama gözlem sayısı (n̄)",
y = expression(paste("ICC (", rho, ")"))
) +
tema_hlm +
theme(legend.position = "right",
legend.key.height = unit(1.2, "cm"))Şekil 2. Dizayn etkisinin ICC ve küme büyüklüğüne göre değişimi. Koyu kırmızı-turuncu alanlar OLS’nin standart hataları ciddi oranda yanlış hesapladığı bölgelere karşılık gelir. ICC = .01 gibi ‘küçük’ bir değerde bile küme büyüklüğü 200’ü aşınca standart hatalar yarıya düşer — yani güven aralıkları yapay daralır, Tip I hata enflasyonu doğar.
Veride kümelenme yapısı varsa, ICC ne kadar küçük olursa olsun çok düzeyli modellemeyi tercih etmek güvenli yoldur. HLM’yi atlamanın tek meşru gerekçesi, verinin yapısal olarak yuvalanmamış olmasıdır.
Hiyerarşik Doğrusal Modeller
Çok düzeyli bir yapıda birimler bulundukları seviyeye göre adlandırılır:
| Terim | Düzey | Anlamı |
|---|---|---|
| Gözlemsel birim | Düzey 1 (L1) | En alt seviye — öğrenci, hasta, ölçüm zamanı |
| Deneysel birim | Düzey 2 (L2) | Kümeleme faktörü — okul, klinik, birey (boylamsal) |
İki düzeyli bağlamsal modellerde standart notasyon şudur:
Finch, Bolin ve Kelley iki temel yapıyı birbirinden ayırır:
Bağlamsal (Contextual) Modeller. Bireyler gruplar içinde yuvalanmıştır. Düzey 1 = birey, Düzey 2 = grup. Örnek: öğrencilerin okullarda yuvalanması.
Büyüme (Growth) Modelleri. Tekrarlı ölçümler bireyler içinde yuvalanmıştır. Düzey 1 = zaman/ölçüm, Düzey 2 = birey. Boylamsal tasarımlar için kullanılır.
Bağımlı değişken her zaman en alt düzeyde (Düzey 1) bulunmalıdır. Düzey 2’de bir bağımlı değişken tanımlamak analizin doğasını değiştirir ve mikro-makro modelleri gerektirir.
Hiyerarşi daha derin olabilir:
Genel prensip aynıdır: her düzey kendi hata terimini ve varyans bileşenini üretir; model her seviyede ayrı bir denklem olarak yazılır ve sonra birleştirilir.
Bu bölüm, ileride sürekli başvurulacak terimlerin yoğun tanımlarını içerir.
ICC (Intraclass Correlation Coefficient). Bağımlı değişkendeki toplam varyansın ne kadarının kümeler arasındaki farktan kaynaklandığını gösteren oran. Eşdeğer yorumu: aynı kümeden rastgele çekilen iki bireyin bağımlı değişken skorları arasındaki beklenen korelasyon. \(\rho = \tau_{00} / (\tau_{00} + \sigma^2)\)
Sabit Etki (Fixed Effect). Popülasyondaki tüm gruplar için ortak olduğu varsayılan, evren ortalamasını temsil eden değişmeyen regresyon katsayısı. Notasyonda \(\gamma\) ile gösterilir.
Rastgele Etki (Random Effect). Kümeler arasında değişkenlik gösterdiği varsayılan, sıfır ortalamalı ve belirli bir varyansa sahip gruba özgü sapma. Notasyonda \(u\) ile gösterilir.
Deviance (−2LL). Modelin verilere uyumsuzluğunun ölçüsü; \(-2 \times \ln(L)\) ile hesaplanır. Küçük değer daha iyi uyum demektir.
Merkezleme (Centering). Bir yordayıcının her değerinden sabit bir ortalamanın (genel ortalama veya grup ortalaması) çıkarılması. Kesişimin yorumlanabilirliğini, çoklu bağlantının azalmasını ve çapraz düzey etkileşimlerin netliğini sağlar.
BLUP (Best Linear Unbiased Predictors). Rastgele etkiler için kullanılan “en iyi doğrusal yansız yordayıcılar”. Bireysel grupların kesişim ve eğim kestirimlerini verir; shrinkage özelliği sayesinde küçük örneklemli gruplarda OLS’nin verdiği gürültülü kestirimlerden kaçınmayı sağlar.
Shrinkage (Küçültme). BLUP kestirimlerinin, grup örneklemi küçüldükçe genel ortalamaya doğru çekilmesi özelliği. Empirical Bayes mantığının doğrudan sonucudur.
Plausible Value (Olası Değer — PV). IRT tabanlı ölçeklendirmelerde (PISA, TIMSS, PIRLS gibi), öğrencinin gizil yetenek dağılımından çekilen çoklu (genellikle 5 veya 10) olası puan. Ölçüm belirsizliğini analize taşır.
Olası Değerler Aralığı (Plausible Values Range). Rastgele bir katsayının (örn. L1 eğiminin) L2 birimlerinin %95’inde hangi aralıkta bulunmasının beklendiğini gösteren tanımlayıcı aralık: \(\hat{\gamma} \pm 1.96 \sqrt{\hat{\tau}}\).
Dizayn Etkisi (DEFF). Kümelenmenin OLS standart hatalarını ne kadar yanlı hesaplattığını gösteren çarpan: \(1 + (\bar{n} - 1)\rho\).
HLM’de bir parametrenin sabit mi rastgele mi olduğu ayrımı son derece önemlidir.
Bir parametre sabit kabul edildiğinde, o parametrenin tüm kümeler için aynı olduğu varsayılır. Yordayıcı değişkenin bağımlı değişken üzerindeki etkisi, grubun kimliğinden bağımsız evrensel bir büyüklüktür. Sabit etki standart regresyon katsayısına en yakın kavramdır.
Bir parametre rastgele kabul edildiğinde, bu parametrenin değeri gruptan gruba değişir ve bu değişim rastgeledir. Değerler, ortalaması genel etki (\(\gamma\)) olan bir dağılımdan çekilmiş gibi düşünülür. Rastgele etki doğrudan bir katsayı değil, varyans bileşenidir (ve varyans sıfırdan farklıysa grup farklılaşması vardır).
RASTGELE KESİŞİMİN YAPISI \[ \beta_{0j} = \gamma_{00} + u_{0j}, \qquad u_{0j} \sim \mathcal{N}(0,\;\tau_{00}) \]
Burada \(\gamma_{00}\) sabit etkidir (tüm okullar için ortak kesişim ortalaması); \(u_{0j}\) ise \(j.\) okulun bu ortalamadan ne kadar saptığını gösteren rastgele etkidir. Modelin tahmin ettiği asıl yeni parametre \(\tau_{00}\) — yani \(u_{0j}\)’lerin varyansıdır.
Kümelenmiş veriye bakıldığında üç temel yaklaşım vardır, ve HLM bunlar arasındaki en dengeli orta yolu oluşturur.
set.seed(7)
n_grup <- 6
n_ici <- c(30, 25, 20, 8, 5, 4)
genel_int <- 50
genel_eg <- 2
tau00 <- 25; tau11 <- 0.6; sig <- 4
ver <- do.call(rbind, lapply(seq_len(n_grup), function(j) {
u0 <- rnorm(1, 0, sqrt(tau00))
u1 <- rnorm(1, 0, sqrt(tau11))
x <- runif(n_ici[j], 0, 10)
y <- (genel_int + u0) + (genel_eg + u1) * x + rnorm(n_ici[j], 0, sig)
data.frame(grup = factor(j), x = x, y = y)
}))
cp <- coef(lm(y ~ x, data = ver))
np <- ver %>% group_by(grup) %>%
group_modify(~ as.data.frame(t(coef(lm(y ~ x, data = .x)))))
ver_s <- ver %>% group_by(grup) %>% summarise(n = n(),
xb = mean(x),
yb = mean(y))
agirlik <- sig^2 / (sig^2 + ver_s$n * tau00)
ver_s$int_np <- np$`(Intercept)`
ver_s$eg_np <- np$x
ver_s$int_pp <- (1 - agirlik) * ver_s$int_np + agirlik * cp[1]
ver_s$eg_pp <- (1 - agirlik) * ver_s$eg_np + agirlik * cp[2]
x_grid <- seq(0, 10, length.out = 50)
cizgi_df <- function(ints, egs, tur) {
do.call(rbind, lapply(seq_along(ints), function(j) {
data.frame(grup = factor(j), x = x_grid,
y = ints[j] + egs[j] * x_grid, tur = tur)
}))
}
np_l <- cizgi_df(ver_s$int_np, ver_s$eg_np, "No pooling")
pp_l <- cizgi_df(ver_s$int_pp, ver_s$eg_pp, "Partial pooling (HLM)")
cp_l <- do.call(rbind, lapply(seq_len(n_grup), function(j) {
data.frame(grup = factor(j), x = x_grid,
y = cp[1] + cp[2] * x_grid, tur = "Complete pooling")
}))
ver$tur <- "Complete pooling"
veri_3 <- do.call(rbind, lapply(c("Complete pooling",
"No pooling",
"Partial pooling (HLM)"),
function(t) { v <- ver; v$tur <- t; v }))
cizgiler <- rbind(cp_l, np_l, pp_l)
cizgiler$tur <- factor(cizgiler$tur,
levels = c("Complete pooling","No pooling",
"Partial pooling (HLM)"))
veri_3$tur <- factor(veri_3$tur, levels = levels(cizgiler$tur))
ggplot() +
geom_point(data = veri_3, aes(x, y, color = grup),
alpha = 0.65, size = 1.9) +
geom_line(data = cizgiler, aes(x, y, color = grup, group = grup),
linewidth = 1.1) +
facet_wrap(~ tur) +
scale_color_manual(values = renk_grup[1:6], name = "Grup") +
labs(title = "Complete / No / Partial pooling: üç yaklaşımın karşılaştırması",
x = "X", y = "Y") +
tema_hlm +
theme(legend.position = "bottom")Şekil 3. Üç havuzlama stratejisi. Sol: Complete pooling — gruplar göz ardı edilir, tek çizgi çizilir. Orta: No pooling — her grup kendi OLS’sine sahip olur, hiçbir bilgi paylaşılmaz, örneklemi az olan gruplarda aşırı gürültü üretir. Sağ: Partial pooling (HLM) — her grup kendi çizgisine sahip olur ama grup çizgileri genel eğilime doğru ‘çekilir’. Küçük örneklemli gruplarda bu çekilme daha belirgindir.
Partial pooling HLM’nin teknik adıdır. Her grubun ilişkisini ayrı modeller ama grup kestirimlerini “genel eğilime doğru” çeker (shrinkage). Bu, özellikle küçük örneklemli gruplarda OLS’nin aşırı gürültülü kestirimlerinden kaçınmanın yolu — ve HLM’nin neden bu kadar güvenilir olduğunun temel gerekçelerinden biridir.
Model kurma sürecinde temel soru: “Bu parametrenin gruptan gruba farklılaşmasına izin vermek için kuramsal gerekçem var mı?”
Fully Unconditional Model veya Intercept-Only Model olarak da bilinir. Hiçbir yordayıcı içermez; amaç toplam varyansı düzeylere ayrıştırmaktır.
Düzey 1 (Öğrenci düzeyi):
\[ Y_{ij} = \beta_{0j} + r_{ij}, \qquad r_{ij} \sim \mathcal{N}(0,\;\sigma^2) \]
Düzey 2 (Okul düzeyi):
\[ \beta_{0j} = \gamma_{00} + u_{0j}, \qquad u_{0j} \sim \mathcal{N}(0,\;\tau_{00}) \]
Birleşik (karma) model:
\[ Y_{ij} = \gamma_{00} + u_{0j} + r_{ij} \]
Standart ANOVA’nın \(Y_{ij} = \mu + \alpha_j + \varepsilon_{ij}\) gösterimi akılda tutulabilir. Temel fark: HLM’de \(u_{0j}\) sabit grup etkileri değil, bir dağılımdan çekilmiş rastgele sapmalar olarak modellenir.
ICC yalnızca bir rakam değildir; verinin nasıl göründüğünü doğrudan belirler.
set.seed(42)
senaryo <- function(rho) {
sig_b <- sqrt(rho); sig_w <- sqrt(1 - rho)
ort <- rnorm(8, 0, sig_b)
do.call(rbind, lapply(seq_along(ort), function(j) {
data.frame(grup = factor(j),
y = rnorm(25, ort[j], sig_w))
}))
}
icc_ler <- c(0.02, 0.15, 0.40, 0.70)
veri_icc <- do.call(rbind, lapply(icc_ler, function(r) {
s <- senaryo(r); s$icc <- paste0("ICC = ", r); s
}))
veri_icc$icc <- factor(veri_icc$icc, levels = paste0("ICC = ", icc_ler))
ort_df <- veri_icc %>% group_by(icc, grup) %>%
summarise(ort = mean(y), .groups = "drop")
ggplot(veri_icc, aes(x = grup, y = y, color = grup)) +
geom_jitter(width = 0.22, alpha = 0.65, size = 1.8) +
geom_point(data = ort_df, aes(x = grup, y = ort),
color = "#ffffff", size = 3.6, shape = 18) +
facet_wrap(~ icc, nrow = 1) +
scale_color_manual(values = renk_grup, guide = "none") +
labs(title = "ICC'nin görsel anlamı",
subtitle = "ICC büyüdükçe gruplar arası ayrışma belirginleşir",
x = "Grup", y = "Y") +
tema_hlm +
theme(axis.text.x = element_blank())Şekil 4. Aynı marjinal ortalama ve varyansa sahip dört farklı küme yapısı, farklı ICC değerlerinde. ICC arttıkça gruplar arasındaki ayrışma belirginleşir; ICC = 0’a yakınken gruplar iç içe geçer, ICC yüksekken gruplar birbirinden kopar. Beyaz elmas grubun ortalaması.
ICC yorumu. \(\rho = 0{,}15\) olan bir modelde: “Bağımlı değişkendeki toplam varyansın %15’i gruplar arası farklılıklardan, %85’i grup içi (bireyler arası) farklılıklardan kaynaklanmaktadır.”
Ancak unutmayın: küçük ICC, HLM’ye gerek olmadığı anlamına gelmez. Dizayn etkisi formülü devreye girer.
Bu modelde Düzey 1’e en az bir yordayıcı eklenir ve hem kesişimin hem de eğimin gruplar arasında rastgele değişmesine izin verilir.
Düzey 1:
\[ Y_{ij} = \beta_{0j} + \beta_{1j} X_{ij} + r_{ij} \]
Düzey 2:
\[ \beta_{0j} = \gamma_{00} + u_{0j}, \qquad \beta_{1j} = \gamma_{10} + u_{1j} \]
Birleşik:
\[ Y_{ij} = \gamma_{00} + \gamma_{10} X_{ij} + u_{0j} + u_{1j} X_{ij} + r_{ij} \]
Rastgele etkiler artık iki boyutlu bir dağılımdan gelir:
\[ \begin{pmatrix} u_{0j} \\ u_{1j} \end{pmatrix} \sim \mathcal{N}\!\left(\mathbf{0},\; \begin{pmatrix} \tau_{00} & \tau_{01} \\ \tau_{01} & \tau_{11} \end{pmatrix}\right) \]
set.seed(3)
x <- seq(0, 10, length.out = 80)
# Sadece rastgele kesişim
int1 <- c(40, 48, 55, 62)
eg1 <- rep(3, 4)
# Rastgele kesişim + eğim
int2 <- c(40, 48, 55, 62)
eg2 <- c(1.2, 2.4, 3.6, 4.8)
df1 <- do.call(rbind, lapply(1:4, function(j) {
data.frame(okul = factor(paste("Okul", j)), x = x,
y = int1[j] + eg1[j] * x, tur = "Rastgele kesişim (paralel)")
}))
df2 <- do.call(rbind, lapply(1:4, function(j) {
data.frame(okul = factor(paste("Okul", j)), x = x,
y = int2[j] + eg2[j] * x, tur = "Rastgele kesişim + eğim")
}))
ggplot(rbind(df1, df2), aes(x, y, color = okul)) +
geom_line(linewidth = 1.3) +
facet_wrap(~ tur) +
scale_color_manual(values = renk_grup[1:4], name = NULL) +
labs(title = "İki farklı rastgele-etki yapısı",
x = "X (öğrenci düzeyi yordayıcı)",
y = "Y (yordanan)") +
tema_hlm +
theme(legend.position = "bottom")Şekil 5. Rastgele kesişim yalnız (solda) ile rastgele kesişim + rastgele eğim (sağda) modellerinin görsel farkı. Solda tüm okulların eğimi aynıdır, kesişimler paraleldir. Sağda hem seviye hem de X-Y ilişkisinin gücü okuldan okula değişir.
\(\tau_{01}\) kesişim ile eğim arasındaki kovaryanstır:
set.seed(11)
yap_kov <- function(kov_isaret) {
n_o <- 12
u0 <- rnorm(n_o, 0, sqrt(20))
u1 <- kov_isaret * 0.35 * u0 + rnorm(n_o, 0, 0.3)
do.call(rbind, lapply(seq_len(n_o), function(j) {
data.frame(okul = factor(j),
x = seq(0, 10, length.out = 30),
y = (50 + u0[j]) + (2 + u1[j]) * seq(0, 10, length.out = 30))
}))
}
df_kov <- rbind(
cbind(yap_kov(+1), tur = "Pozitif kovaryans (τ₀₁ > 0)"),
cbind(yap_kov( 0), tur = "Sıfıra yakın (τ₀₁ ≈ 0)"),
cbind(yap_kov(-1), tur = "Negatif kovaryans (τ₀₁ < 0)")
)
df_kov$tur <- factor(df_kov$tur,
levels = c("Pozitif kovaryans (τ₀₁ > 0)",
"Sıfıra yakın (τ₀₁ ≈ 0)",
"Negatif kovaryans (τ₀₁ < 0)"))
ggplot(df_kov, aes(x, y, color = okul, group = okul)) +
geom_line(alpha = 0.85, linewidth = 0.9) +
facet_wrap(~ tur) +
scale_color_manual(values = rep(renk_grup, 2)[1:12], guide = "none") +
labs(title = "Kesişim-eğim kovaryansının (τ₀₁) üç tipi",
x = "X", y = "Y") +
tema_hlmŞekil 6. Pozitif (solda), sıfıra yakın (ortada) ve negatif (sağda) kesişim-eğim kovaryansının görünümü. Pozitif kovaryans: yüksek ortalamalı okullarda eğim dik — Matthew etkisi. Negatif kovaryans: yüksek ortalamalı okullarda eğim yumuşak — yakınsama / tavan etkisi.
DÜZEY-1 PSEUDO R² \[ R^2_1 = \frac{\sigma^2_{\text{boş}} - \sigma^2_{\text{dolu}}} {\sigma^2_{\text{boş}}} \]
Intercepts and Slopes as Outcomes Model veya Full Model. Düzey 2’ye yordayıcı eklenerek, L1 kesişim ve eğimlerinin gruplar arası varyansı açıklanmaya çalışılır.
Düzey 1: \[ Y_{ij} = \beta_{0j} + \beta_{1j} X_{ij} + r_{ij} \]
Düzey 2: \[ \beta_{0j} = \gamma_{00} + \gamma_{01} W_j + u_{0j} \] \[ \beta_{1j} = \gamma_{10} + \gamma_{11} W_j + u_{1j} \]
Birleşik:
\[ Y_{ij} = \gamma_{00} + \gamma_{01} W_j + \gamma_{10} X_{ij} + \gamma_{11}(W_j \cdot X_{ij}) + u_{0j} + u_{1j} X_{ij} + r_{ij} \]
| Parametre | Anlamı |
|---|---|
| \(\gamma_{00}\) | \(W = 0\) olan bir grupta, \(X = 0\) olan bireyin yordanan \(Y\)’si |
| \(\gamma_{01}\) | \(W\)’nin L1 kesişimi üzerindeki ana etkisi |
| \(\gamma_{10}\) | \(W = 0\) olan grupta \(X\)’in \(Y\) üzerindeki eğimi |
| \(\gamma_{11}\) | \(W\)’nin \(X\)–\(Y\) eğimi üzerindeki etkisi — çapraz düzey etkileşimi |
| \(u_{0j}\) | \(W\) kontrol edildikten sonra kesişimde kalan grup-spesifik sapma |
| \(u_{1j}\) | \(W\) kontrol edildikten sonra eğimde kalan grup-spesifik sapma |
\(\gamma_{11}\), HLM’nin gücünü en belirgin gösteren parametredir: “Bir üst düzey değişken (\(W\)), alt düzey bir ilişkinin (\(X \rightarrow Y\)) gücünü nasıl düzenliyor?”
set.seed(20)
x <- seq(0, 10, length.out = 100)
deneyim <- c("Az deneyim (W düşük)",
"Orta deneyim (W orta)",
"Çok deneyim (W yüksek)")
egimler <- c(0.8, 2.2, 4.0)
kesisimler <- c(45, 50, 55)
df_cl <- do.call(rbind, lapply(seq_along(deneyim), function(j) {
data.frame(Deneyim = deneyim[j], x = x,
y = kesisimler[j] + egimler[j] * x)
}))
df_cl$Deneyim <- factor(df_cl$Deneyim, levels = deneyim)
ggplot(df_cl, aes(x, y, color = Deneyim)) +
geom_line(linewidth = 1.6) +
scale_color_manual(values = c(renk_kirmizi, renk_vurgu, renk_yesil)) +
labs(title = "Çapraz düzey etkileşim: W öğrenci-level eğimi moderatör eder",
subtitle = "γ₁₁: W'nin L1 eğimi üzerindeki etkisi",
x = "X (öğrenci motivasyonu, L1)",
y = "Y (yordanan başarı)") +
tema_hlm +
theme(legend.position = "bottom")Şekil 7. Çapraz düzey etkileşim: öğretmen deneyimi (L2 değişkeni, W) öğrencinin motivasyonu (L1 değişkeni, X) ile başarı (Y) arasındaki eğimi moderatör eder. Düşük deneyimli öğretmenlerde motivasyonun etkisi sınırlı; yüksek deneyimli öğretmenlerde eğim çok daha dik. Bu γ₁₁ katsayısının işaretidir.
\[ R^2_{\text{Intercept}} = \frac{\tau_{00, \text{(rastgele-katsayı)}} - \tau_{00, \text{(bu model)}}} {\tau_{00, \text{(rastgele-katsayı)}}} \]
\[ R^2_{\text{Slope}} = \frac{\tau_{11, \text{(rastgele-katsayı)}} - \tau_{11, \text{(bu model)}}} {\tau_{11, \text{(rastgele-katsayı)}}} \]
Merkezleme yalnızca teknik bir önceden-işleme adımı değildir; kesişimin ve eğimlerin ne anlama geldiğini köklü biçimde değiştirir.
Ham değerlerde kesişim \(\beta_0\), tüm yordayıcıların \(0\) olduğu noktadaki yordanan değerdir. SES, zeka, yaş gibi değişkenlerde \(0\) değeri çoğu zaman anlamsızdır veya ölçüm aralığı dışındadır. Merkezleme, kesişime anlamlı bir referans noktası kazandırır.
Tüm veri seti üzerinden hesaplanan genel ortalama çıkarılır:
\[X^{CGM}_{ij} = X_{ij} - \overline{X}_{..}\]
Kesişim yorumu: *“Evrenin genel ortalama değerine sahip bir bireyin yordanan* \(Y\) değeri.”
Özellik: CGM, eğim katsayılarının büyüklüğünü değiştirmez ama yorumlarını etkiler. Tahmin edilen eğim, grup içi ve gruplar arası etkilerin karışımıdır (blended / conflated effect).
Her gözlem kendi grubunun ortalamasından çıkarılır:
\[X^{CWC}_{ij} = X_{ij} - \overline{X}_{.j}\]
Kesişim yorumu: *“Kendi okulunun ortalama* \(X\) düzeyine sahip bir bireyin yordanan \(Y\) değeri.”
Özellik: CWC, yordayıcıdaki tüm gruplar-arası varyansı atar ve değişkeni saf bir grup içi (within) etki hâline getirir.
set.seed(5)
n <- 20; J <- 4
okul_ort <- c(-3, -1, 2, 5)
df_m <- do.call(rbind, lapply(seq_len(J), function(j) {
data.frame(okul = factor(paste("Okul", j)),
x = rnorm(n, okul_ort[j], 1.2))
}))
genel <- mean(df_m$x)
df_m <- df_m %>% group_by(okul) %>%
mutate(grup_ort = mean(x)) %>% ungroup()
df_m$ham <- df_m$x
df_m$cgm <- df_m$x - genel
df_m$cwc <- df_m$x - df_m$grup_ort
df_long <- df_m %>%
select(okul, ham, cgm, cwc) %>%
pivot_longer(-okul, names_to = "tur", values_to = "deger") %>%
mutate(tur = case_when(tur == "ham" ~ "Ham (merkezlenmemiş)",
tur == "cgm" ~ "CGM (genel ortalama = 0)",
tur == "cwc" ~ "CWC (grup ortalaması = 0)"),
tur = factor(tur,
levels = c("Ham (merkezlenmemiş)",
"CGM (genel ortalama = 0)",
"CWC (grup ortalaması = 0)")))
ggplot(df_long, aes(deger, okul, color = okul)) +
geom_vline(xintercept = 0, color = renk_vurgu,
linetype = "dashed", linewidth = 0.7) +
geom_jitter(height = 0.15, size = 2, alpha = 0.8) +
stat_summary(geom = "point", fun = mean,
shape = 18, size = 5, color = "#ffffff") +
facet_wrap(~ tur, nrow = 1) +
scale_color_manual(values = renk_grup[1:4], guide = "none") +
labs(title = "Üç merkezleme türünün görsel karşılaştırması",
subtitle = "Kesik amber çizgi: sıfır noktası. Beyaz elmas: grup ortalaması.",
x = "X değeri", y = NULL) +
tema_hlmŞekil 8. Üç merkezleme yaklaşımının görsel karşılaştırması. Üstte ham skorlar; altta CGM ve CWC uygulandığında aynı verinin nasıl göründüğü. CGM’de tüm okullar beraber genel ortalamaya kaydırılır (dağılım korunur). CWC’de her okul kendi ortalamasına sıfırlanır (gruplar-arası varyans atılır). Kesişimin yorumu her durumda değişir.
Ham skordan teorik olarak anlamlı sabit bir değer çıkarılır (örn. \(X = 100\) için IQ ölçeği). Tam anlamıyla “merkezleme” sayılmaz çünkü değişkenin ortalamasını sıfıra eşitlemez; ancak kesişim yorumunu anlamlı hâle getirir.
Hangi yaklaşım doğru? Cevap araştırmanın sorusuna bağlıdır.
Çapraz düzey etkileşim test ediliyorsa (bir L2 değişkeninin bir L1 eğimini nasıl moderatör ettiği soruluyorsa), L1 yordayıcısı için CWC kullanılmalı ve grup ortalamaları ayrı bir L2 yordayıcısı olarak modele eklenmelidir.
Gerekçe: CWC, L1 değişkenini gruplar-arası varyansından arındırır; böylece gruplar-arası etki ayrı bir değişkenle (grup ortalaması) temsil edilebilir. Aksi takdirde çapraz düzey etkileşim, within ve between etkilerin karışımıyla bulanıklaşır (conflation).
| Değişken türü | Önerilen merkezleme |
|---|---|
| L1 sürekli yordayıcı — çapraz düzey etkileşim var | CWC + grup ortalamasını L2’ye ekle |
| L1 sürekli yordayıcı — yalnızca within etki ilgi çekiyor | CWC |
| L1 sürekli yordayıcı — between etki ilgi çekiyor | CGM (veya CWC + grup ortalaması) |
| L1 ikili kategorik yordayıcı | Genellikle merkezlenmez (0/1 korunur) |
| L2 sürekli yordayıcı | Merkezlenmez veya CGM |
| L2 sürekli yordayıcı (gruplar arası fark yorumu) | CGM |
library(dplyr)
# library(MLMusingR) # group_center() ve group_mean() fonksiyonları için
# 1) GENEL ORTALAMA MERKEZLEME (CGM)
veri$X_cgm <- veri$X - mean(veri$X, na.rm = TRUE)
# 2) GRUP ORTALAMASI MERKEZLEME (CWC) — Base R
veri$X_grup_ort <- ave(veri$X, veri$okul,
FUN = function(z) mean(z, na.rm = TRUE))
veri$X_cwc <- veri$X - veri$X_grup_ort
# 3) dplyr ile CWC (daha okunaklı)
veri <- veri %>%
group_by(okul) %>%
mutate(X_grup_ort = mean(X, na.rm = TRUE),
X_cwc = X - X_grup_ort) %>%
ungroup()
# 4) MLMusingR paketiyle tek adımda
# veri$X_cwc <- MLMusingR::group_center(veri$X, veri$okul)
# ÖNEMLİ: Çapraz düzey etkileşim test edilecekse grup ortalaması da
# L2 yordayıcısı olarak modele eklenmeli.HLM’de varyans bileşenleri ve sabit etkiler Maksimum Olabilirlik (ML) veya Kısıtlanmış Maksimum Olabilirlik (REML) ile kestirilir.
Tam ML (Full Maximum Likelihood). Varyans bileşenlerini kestirirken sabit etkilerin kestiriminde harcanan serbestlik derecelerini dikkate almaz. Sonuç: varyans bileşenleri yanlı (olması gerekenden küçük) kestirilir. Özellikle küçük örneklemlerde bu yanlılık ciddi boyutlara ulaşır.
REML. Sabit etkileri kısıtlı bir dönüşümle çıkararak yalnızca varyans bileşenlerine ait olabilirliği maksimize eder. Serbestlik derecesi kaybını hesaba kattığı için varyans kestirimleri yansız ve daha doğrudur.
J_grid <- seq(5, 100, by = 5)
ml_bias <- -1 / (J_grid) # kavramsal eğri
reml_bias <- 0 * J_grid # REML ~ yansız
df_mlreml <- data.frame(
J = rep(J_grid, 2),
yanlik = c(ml_bias, reml_bias),
yontem = rep(c("ML", "REML"), each = length(J_grid))
)
ggplot(df_mlreml, aes(J, yanlik, color = yontem)) +
geom_hline(yintercept = 0, color = "#e8e8e8",
linetype = "dashed", linewidth = 0.5) +
geom_line(linewidth = 1.6) +
geom_point(size = 2.6) +
scale_color_manual(values = c(ML = renk_kirmizi, REML = renk_yesil)) +
labs(title = "ML ve REML'nin küme sayısına bağlı yanlılığı (kavramsal)",
subtitle = "REML yansız; ML küçük J'de varyansı olduğundan küçük kestirir",
x = "Küme sayısı (J)",
y = "Varyans kestiriminde yanlılık",
color = NULL) +
tema_hlm +
theme(legend.position = "bottom")Şekil 9. ML ile REML arasındaki varyans kestirimi farkının küme sayısına bağlı yanlılığı. Küçük J’de ML’nin varyans kestirimi gerçek değerin altında kalır; REML bu yanlılığı düzeltir. J büyüdükçe fark önemsizleşir.
| Amaç | Önerilen yöntem |
|---|---|
| Varyans bileşenlerini (rastgele etkileri) kestirmek | REML (varsayılan) |
| Rastgele etkileri farklı olan modelleri LRT ile karşılaştırmak | REML |
| Sabit etkileri farklı olan modelleri LRT ile karşılaştırmak | ML (zorunlu) |
| AIC/BIC hesaplamak (sabit etkiler aynı değilse) | ML |
| Nihai raporlama | REML |
Altın kural: Sabit etki yapısı farklı olan modelleri REML ile karşılaştırmayın — LRT geçerli olmaz. ML ile karşılaştırıp, nihai modelin raporlanacak kestirimlerini REML ile yeniden hesaplayın.
library(lme4)
# REML (varsayılan) — nihai kestirim için
model_reml <- lmer(Y ~ X1 + X2 + (1 | okul), data = veri)
# ML — sabit etki yapısı farklı modelleri karşılaştırmak için
model_ml_1 <- lmer(Y ~ X1 + (1 | okul), data = veri, REML = FALSE)
model_ml_2 <- lmer(Y ~ X1 + X2 + (1 | okul), data = veri, REML = FALSE)
anova(model_ml_1, model_ml_2) # LRT — sabit etki farkı testiHLM, standart regresyonun varsayımlarını miras alır ve yuvalanmış yapıya özgü yeni kısıtlamalar ekler.
Düzey-1 kalıntılarının normalliği, bağımsızlığı ve homoscedasticity’si. \(r_{ij} \sim \mathcal{N}(0, \sigma^2)\); bağımsızlık yalnızca grup içi düzeyde geçerlidir (gruplar arası bağımlılık zaten modellenmektedir).
Düzey-2 rastgele etkilerinin çok değişkenli normalliği. \(u_{0j}, u_{1j}, \dots \sim \mathcal{N}(\mathbf{0}, \mathbf{T})\); kesişim ve eğim sapmaları birlikte çok değişkenli normal dağılımdan gelmelidir.
Düzeyler arası bağımsızlık. L1 kalıntıları (\(r_{ij}\)), L2 rastgele etkileriyle (\(u_{qj}\)) ilişkisiz olmalıdır.
Yordayıcı-kalıntı bağımsızlığı. L1 yordayıcıları L1 kalıntılarıyla; L2 yordayıcıları L2 rastgele etkileriyle ilişkisiz olmalıdır. Endojenlik bu varsayımın ihlalidir.
Doğrusallık. Yordayıcılar ile bağımlı değişken arasındaki ilişki doğrusal olmalıdır.
Çoklu bağlantı olmaması. Hem aynı düzey içinde hem de düzeyler arası değişkenlerin birbirleriyle aşırı yüksek korelasyonlu olmaması gerekir.
| Varsayım | Kontrol araçları |
|---|---|
| Doğrusallık | Saçılım grafikleri + lowess eğrileri |
| Homoscedasticity | Kalıntı-tahmin değeri grafikleri; H istatistiği |
| L1 normalliği | Q-Q grafiği, histogram, yoğunluk eğrisi |
| L2 çok değişkenli normallik | Mahalanobis uzaklık grafiği |
| Çoklu bağlantı | VIF (\(>5\) veya \(>10\) sorunludur) |
| Aykırı değerler | Boxplot, standartlaştırılmış kalıntılar |
| Etkili gözlemler | Cook’s D, MDFFITS, COVRATIO, leverage |
library(lme4)
library(performance) # check_model() tüm tanıları tek grafikte sunar
library(HLMdiag) # hiyerarşik tanı araçları
library(influence.ME) # etkili gözlemler
# Hızlı genel bakış
performance::check_model(model)
# Düzey-1 kalıntıları
r1 <- HLMdiag::hlm_resid(model, level = 1)
# Düzey-2 (grup düzeyi) kalıntılar
r2 <- HLMdiag::hlm_resid(model, level = "okul")
# Etkili gözlemler — Cook's Distance
infl <- influence.ME::influence(model, group = "okul")
plot(infl, which = "cook")İç içe (nested) modellerin karşılaştırmasında temel araç. Deviance farkı yaklaşık olarak \(\chi^2\) dağılımına uyar; serbestlik derecesi = parametre sayısı farkı:
LRT FORMÜLÜ \[ \chi^2_{LRT} = D_{\text{basit}} - D_{\text{karmaşık}}, \quad df = p_{\text{karmaşık}} - p_{\text{basit}} \]
Anlamlı düşüş (\(p < 0.05\)) → karmaşık model tercih edilir.
Uyarı 1. Sabit etki farkı içeren karşılaştırmalarda ML kullanın; REML geçersizdir.
Uyarı 2. Varyans bileşeni testleri (örn. rastgele eğim eklemek) \(\chi^2\) dağılımına tam uymayan sınır (boundary) testleridir. Daha kesin sonuç için karma \(\chi^2\) dağılımı veya bootstrap LRT kullanılmalıdır.
Hem iç içe hem de iç içe olmayan modellerin karşılaştırmasında kullanılır. Temel mantık: veri uyumu + model sadeliği (parsimony).
\[ \mathrm{AIC} = D + 2q \] \[ \mathrm{BIC} = D + q \cdot \ln(N) \] \[ \mathrm{aBIC} = D + q \cdot \ln\!\left(\frac{N+2}{24}\right) \]
Burada \(q\) tahmin edilen parametre sayısı, \(N\) örneklem büyüklüğüdür. Daha küçük değer daha iyi model. BIC, AIC’den daha ağır parsimony cezası uygular; karmaşık modeller AIC’ye göre BIC’de genellikle daha geç tercih edilir.
df_prog <- data.frame(
Adim = factor(c("Boş model","+ L1 sabit","+ L2 sabit",
"+ Rastgele eğim","+ Çapraz düzey"),
levels = c("Boş model","+ L1 sabit","+ L2 sabit",
"+ Rastgele eğim","+ Çapraz düzey")),
Deviance = c(5112, 4336, 4280, 4268, 4258),
AIC = c(5118, 4346, 4294, 4288, 4282)
)
df_long <- df_prog %>% pivot_longer(-Adim, names_to = "Olcum",
values_to = "Deger")
ggplot(df_long, aes(Adim, Deger, color = Olcum, group = Olcum)) +
geom_line(linewidth = 1.3) +
geom_point(size = 4.2) +
geom_text(aes(label = Deger), vjust = -1.4,
size = 3.8, color = "#ffffff", fontface = "bold") +
scale_color_manual(values = c(Deviance = renk_ana, AIC = renk_vurgu)) +
coord_cartesian(ylim = c(4180, 5250)) +
labs(title = "Bottom-up model kurma: deviance ve AIC eğrileri",
subtitle = "Her adımda model uyumu iyileşir ama marjinal fayda azalır",
x = NULL, y = "Değer", color = NULL) +
tema_hlm +
theme(legend.position = "top",
axis.text.x = element_text(angle = 15, hjust = 1))Şekil 10. Beş adımlı model kurma stratejisinde deviance düşüşünün tipik görünümü. Her yeni adım model uyumunu artırır (deviance düşer) ama marjinal fayda azalır. Son adımlarda düşüşün durması — yani platoya ulaşmak — modelin maksimum bilgiyi çıkardığını gösterir.
Tek düzeyli \(R^2\) kavramının HLM’deki karşılıkları birden fazladır. Her yaklaşımın farklı bir kuramsal dayanağı vardır.
Düzeylere özgü hesaplanır. “Bir önceki modelin kalıntı varyansında ne kadar düşüş oldu?” sorusunun cevabı:
\[ R^2_{\text{L1}} = \frac{\sigma^2_{\text{boş}} - \sigma^2_{\text{dolu}}} {\sigma^2_{\text{boş}}} \]
\[ R^2_{\text{L2 (intercept)}} = \frac{\tau_{00, \text{boş}} - \tau_{00, \text{dolu}}} {\tau_{00, \text{boş}}} \]
Problem: Rastgele eğimler eklendiğinde kalıntı varyansının yapay olarak artabileceği, hatta negatif \(R^2\)’ye yol açabileceği durumlar vardır. Bu, R&B formülünün bilinen sınırlılığıdır.
Sadece tek bir düzeyin varyansını değil, toplam varyansı kullanarak daha tutarlı bir kestirim sunar. Rastgele eğim problemlerine daha dayanıklıdır.
Genel bir toplam \(R^2\) sunar. İki ölçü verir:
Marjinal \(R^2\): Yalnızca sabit etkilerin açıkladığı varyans oranı.
Koşullu (Conditional) \(R^2\): Sabit + rastgele etkilerin birlikte açıkladığı toplam varyans oranı.
GLMM’lerde (lojistik, Poisson vb.) özellikle kullanışlıdır. R’da
performance::r2() veya MuMIn::r.squaredGLMM()
ile hesaplanır.
En ayrıntılı ve modern yaklaşım. Toplam açıklanan varyansı şu bileşenlere ayrıştırır:
R’da r2mlm paketiyle hesaplanır.
MCMC tabanlı kestirimlerde (örn. MCMCglmm,
brms):
loo paketi).Çok düzeyli faktör analizi veya MSEM yapıldığında:
| İndeks | İyi uyum | Yeterli uyum |
|---|---|---|
| \(\chi^2\) | \(p > 0.05\) (büyük N’de duyarsız) | — |
| RMSEA | \(\leq 0.05\) | \(0.05\)–\(0.08\) |
| CFI / TLI | \(\geq 0.95\) | \(\geq 0.90\) |
| SRMR | \(\leq 0.08\) | — |
MSEM’de genel uyum indeksleri L1’in büyük gözlem sayısı nedeniyle alt düzeye dominated olur. SRMR\(_{\text{within}}\) ve SRMR\(_{\text{between}}\) ayrı ayrı incelenmelidir.
Etki büyüklüğü, istatistiksel anlamlılık ötesinde pratik önem sorusuna yanıt arar. HLM’de üç ana çerçeve kullanılır.
Yukarıda ayrıntıyla işlendi — düzeye özgü, toplam, marjinal/koşullu biçimleri vardır.
Özellikle küme-randomize müdahale çalışmalarında (CRT):
\[ d = \frac{\bar{Y}_T - \bar{Y}_C}{s} \]
Yorum:
HLM’de standart sapma olarak hangi bileşenin (L1, L2, toplam) kullanılacağı literatürde tartışmalıdır. Hedges’in CRT için önerdiği formüller vardır.
Farklı ölçekteki yordayıcıların göreli önemini karşılaştırmak için:
\[ \beta^* = \beta \cdot \frac{s_X}{s_Y} \]
HLM’de \(s_X\) ve \(s_Y\) olarak hangi düzeyin standart sapması kullanılmalı sorusu karmaşıktır. En pratik yaklaşım: tüm değişkenleri modele sokmadan önce \(z\)-skoruna dönüştürmek — ancak bu rastgele etki yapısını etkileyebileceğinden dikkatle uygulanmalıdır.
Lojistik veya Poisson gibi genelleştirilmiş çok düzeyli modellerde (HGLM):
PISA, TIMSS, PIRLS gibi büyük ölçekli değerlendirmelerde karmaşık örnekleme tasarımları kullanılır: çok aşamalı küme örneklemesi, orantısız tabakalama, küçük alt grupların aşırı örneklenmesi (oversampling).
Ağırlık kullanılmazsa:
HLM’de ağırlıklar düzeylere göre ayrı sağlanır:
R’da WeMix, survey,
BIFIEsurvey gibi paketler bu yapıyı destekler.
Bu bölüm özellikle büyük ölçekli değerlendirme verileriyle çalışan araştırmacılar için kritiktir.
Madde Tepki Kuramı (IRT), gözlemlenen yanıtları gizil bir yeteneğe (\(\theta\)) bağlar. Öğrencinin gerçek yeteneği hiçbir zaman sıfır hatayla ölçülemez; her kestirimde ölçüm belirsizliği vardır.
Sadece tek bir nokta tahmini (örn. tek bir \(\hat{\theta}\)) kullanılırsa bu belirsizlik yok sayılır ve standart hatalar yapay biçimde küçük hesaplanır. Yanıltıcı derecede “kesin” sonuçlar üretilir.
Çözüm: Her öğrenci için tek puan yerine, gizil yetenek dağılımından çoklu olası değerler (genellikle 5 veya 10 tane) çekilir. Bu, eksik veri analizindeki Çoklu Atama (Multiple Imputation — MI) mantığının psikometrik uygulamasıdır.
df_pv <- data.frame(
x = c(1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 5, 7),
y = c(5, 4, 3, 2, 1, 5, 4, 3, 2, 1, 3, 3),
etiket = c("PV1","PV2","PV3","PV4","PV5",
"Model 1","Model 2","Model 3","Model 4","Model 5",
"Rubin\nBirleştirme",
"Nihai\nsonuç"),
renk = c(rep("veri", 5), rep("model", 5), "rubin", "nihai")
)
oklar1 <- data.frame(x = 1.45, xend = 2.55,
y = 1:5, yend = 1:5)
oklar2 <- data.frame(x = 3.45, xend = 4.55,
y = 1:5, yend = 3)
ok3 <- data.frame(x = 5.5, xend = 6.55, y = 3, yend = 3)
ggplot() +
geom_segment(data = oklar1, aes(x, y, xend = xend, yend = yend),
arrow = arrow(length = unit(0.18, "cm")),
color = "#6a7490", linewidth = 0.55) +
geom_segment(data = oklar2, aes(x, y, xend = xend, yend = yend),
arrow = arrow(length = unit(0.18, "cm")),
color = "#6a7490", linewidth = 0.55) +
geom_segment(data = ok3, aes(x, y, xend = xend, yend = yend),
arrow = arrow(length = unit(0.28, "cm")),
color = renk_vurgu, linewidth = 1) +
geom_tile(data = df_pv, aes(x, y, fill = renk),
width = 0.85, height = 0.78, color = "#1a1e2e",
linewidth = 1) +
geom_text(data = df_pv, aes(x, y, label = etiket),
color = "#1a1e2e", fontface = "bold", size = 3.9) +
scale_fill_manual(values = c(veri = renk_ana,
model = renk_yesil,
rubin = renk_mor,
nihai = renk_vurgu),
guide = "none") +
annotate("text", x = 1, y = 5.95,
label = "1. Öğrencinin 5 PV'si",
color = renk_ana, fontface = "bold", size = 4.3) +
annotate("text", x = 3, y = 5.95,
label = "2. Her PV için ayrı HLM",
color = renk_yesil, fontface = "bold", size = 4.3) +
annotate("text", x = 5, y = 5.95,
label = "3. Rubin kuralları",
color = renk_mor, fontface = "bold", size = 4.3) +
annotate("text", x = 7, y = 5.95,
label = "4. Tek birleşik\nraporlama",
color = renk_vurgu, fontface = "bold", size = 4.3) +
xlim(0.3, 7.7) + ylim(0.3, 6.4) +
theme_void() +
theme(plot.background = element_rect(fill = "#1a1e2e", color = NA),
plot.title = element_text(color = "#9ecbe6", face = "bold",
hjust = 0.5, size = 15,
margin = margin(b = 12)),
plot.caption = element_text(color = "#9ecbdc", size = 10,
face = "italic", hjust = 0)) +
labs(title = "Plausible Values ile HLM — dört adımlı iş akışı",
caption = "Ölçüm belirsizliği 5 farklı veri setinin modellemesiyle nihai standart hatalara taşınır.")Şekil 11. Plausible Values (PV) iş akışı. Her öğrenci için IRT posterior dağılımından 5 PV çekilir; 5 ayrı tam veri seti oluşturulur; HLM her biri üzerinde ayrı çalıştırılır; sonuçlar Rubin kuralları ile birleştirilir. Böylece ölçüm belirsizliği nihai standart hatalara yansır.
Nokta tahminlerin birleştirilmesi — basit aritmetik ortalama:
\[ \hat{\theta}_{\text{pool}} = \frac{1}{M} \sum_{m=1}^{M} \hat{\theta}_m \]
Varyansın birleştirilmesi — iki bileşen toplamı:
Atama içi varyans (Within-imputation variance): Standart hataların karelerinin ortalaması. \[\bar{U} = \frac{1}{M} \sum_{m=1}^{M} \widehat{SE}^2_m\]
Atamalar arası varyans (Between-imputation variance): Nokta tahminlerinin kendi aralarındaki varyansı. \[B = \frac{1}{M-1} \sum_{m=1}^{M} (\hat{\theta}_m - \hat{\theta}_{\text{pool}})^2\]
TOPLAM VARYANS \[ T = \bar{U} + \left(1 + \tfrac{1}{M}\right) B \] \[ SE_{\text{pool}} = \sqrt{T} \]
Böylece gizil özellikleri tahmin ederken taşınan ölçüm belirsizliği, nihai HLM modelinin standart hatalarına ve güven aralıklarına yansıtılmış olur.
library(mitml) # MI birleştirme
library(lme4)
library(BIFIEsurvey) # büyük ölçekli sınav verileri
# 5 PV için 5 model kur
modeller <- lapply(1:5, function(m) {
lmer(as.formula(paste0("PV", m, " ~ X + (1 | okul)")),
data = veri)
})
# Rubin kurallarıyla birleştir
birlestirilmis <- mitml::testEstimates(modeller,
extra.pars = TRUE)
summary(birlestirilmis)Bu bölüm, farklı paketlerin güçlü ve zayıf yönlerini tanıtır; problem türüne uygun aracı seçmek böylece kolaylaşır.
lme4 +
lmerTest — Temel İkililibrary(lme4)
library(lmerTest) # mutlaka lme4'ten SONRA yüklenmeli — p-değerleri için
# Boş model (Random ANOVA)
m0 <- lmer(Y ~ 1 + (1 | okul), data = veri)
# Rastgele kesişim, sabit eğim
m1 <- lmer(Y ~ X + (1 | okul), data = veri)
# Rastgele kesişim + rastgele eğim (korelasyonlu)
m2 <- lmer(Y ~ X + (1 + X | okul), data = veri)
# Rastgele kesişim + rastgele eğim (korelasyonsuz)
m3 <- lmer(Y ~ X + (1 | okul) + (0 + X | okul), data = veri)
# Çapraz düzey etkileşim
m4 <- lmer(Y ~ X * W + (1 + X | okul), data = veri)
# Üç düzeyli yuvalama (öğrenci < okul < bölge)
m5 <- lmer(Y ~ X + (1 | bolge / okul), data = veri)
# Çapraz sınıflandırma (öğrenci hem okul hem mahalle içinde)
m6 <- lmer(Y ~ X + (1 | okul) + (1 | mahalle), data = veri)Avantajlar: Hızlı, büyük veri setlerinde kararlı, karmaşık rastgele etki yapılarını destekler.
Dezavantajlar: lme4’ün varsayılan
çıktısında p-değerleri yoktur (serbestlik derecesi tartışmaları
nedeniyle). Çözüm: lmerTest (Satterthwaite) veya
parameters::model_parameters() (Kenward-Roger). Ayrıca L1
hata kovaryans yapısını özelleştirmeye izin vermez; sıralı (ordinal) çok
düzeyli lojistik regresyonu desteklemez.
nlme —
L1 Hata Yapısı Gereken DurumlardaBoylamsal verilerde AR(1) gibi otoregresif hata yapısı modellenmek istendiğinde tercih edilir.
ordinal
— Çok Düzeyli Sıralı LojistikBağımlı değişken 3+ sıralı kategoriden oluşuyor (örn. “Başarısız, Geçti, Üstün Başarı”).
MCMCglmm / brms — Bayesçi ÇerçeveÖnsel bilgi dahil edilmek istendiğinde; aşırı karmaşık rastgele etki yapılarında; tam posterior dağılım gerektiğinde.
library(brms)
m_brm <- brm(Y ~ X + (1 + X | okul),
data = veri, family = gaussian(),
chains = 4, iter = 2000)MCMCglmm eksik veriyle çalışmaz — na.omit()
zorunlu. MCMC iterasyonlarının yakınsadığını doğrulamak (trace plot,
Rhat kontrolü) kullanıcının sorumluluğudur.
lavaan
— Çok Düzeyli SEM ve Faktör AnaliziGizil yapılar, ölçüm hatası modelleme, çok düzeyli CFA için.
library(lavaan)
model <- '
level: 1
F1 =~ x1 + x2 + x3
Y ~ F1
level: 2
F2 =~ x1 + x2 + x3
Y ~ F2
'
fit <- sem(model, data = veri, cluster = "okul")Avantaj: FIML ile eksik veri çözümü. Dezavantaj: Genellikle 2 düzeyle sınırlı; rastgele eğimleri henüz desteklemez.
| Paket | İşlev |
|---|---|
performance |
check_model(), r2(), icc() —
tanı ve metrikler |
parameters |
Model parametrelerini Kenward-Roger df ile raporlama |
sjPlot |
tab_model() — yayın kalitesinde HTML/Word
tabloları |
broom.mixed |
Model çıktılarını tidy formatına çevirir |
HLMdiag |
Hiyerarşik modeller için özelleşmiş tanı |
influence.ME |
Etkili gözlem analizi |
r2mlm |
Rights ve Sterba (2019) varyans ayrıştırması |
MuMIn |
Marjinal/Koşullu \(R^2\) |
mitml |
Çoklu atama / PV birleştirme (Rubin kuralları) |
jomo |
Çok düzeyli çoklu atama |
MLMusingR |
Merkezleme fonksiyonları (Huang kitabı eki) |
geepack |
GEE — sabit etki odaklı alternatif |
gamm4 |
Doğrusal olmayan çok düzeyli modeller (GAMM) |
glmmLasso |
Yüksek boyutlu verilerde değişken seçimi |
WeMix |
Örneklem ağırlıklı HLM |
Güçlü bir teorik model yoksa, aşağıdan yukarıya (bottom-up) yaklaşım önerilir [@hox2018; @finch2024].
adim_df <- data.frame(
adim = 1:5,
isim = c("Boş model\n(Null)",
"L1 sabit\netkiler",
"L2 sabit\netkiler",
"Rastgele\neğim",
"Çapraz düzey\netkileşim"),
elde = c("ICC\nbaseline deviance",
"L1 R²\nL1 yordayıcı anlamlılığı",
"L2 R²_intercept\nana etkiler",
"τ₁₁\ngrup-grup farkı",
"γ₁₁\nmoderasyon, R²_slope")
)
ggplot(adim_df) +
geom_segment(aes(x = adim, xend = adim + 1, y = 1, yend = 1),
data = adim_df[-5, ],
arrow = arrow(length = unit(0.3, "cm")),
color = renk_vurgu, linewidth = 0.9) +
geom_point(aes(adim, 1), size = 28, color = renk_ana, shape = 21,
fill = "#242a40", stroke = 2.5) +
geom_text(aes(adim, 1, label = adim),
color = renk_ana, fontface = "bold", size = 6.5) +
geom_text(aes(adim, 1.5, label = isim),
color = "#ffffff", fontface = "bold", size = 4.2) +
geom_text(aes(adim, 0.45, label = elde),
color = "#bcd4e6", size = 3.5, fontface = "italic") +
xlim(0.3, 5.7) + ylim(0.1, 1.95) +
theme_void() +
theme(plot.background = element_rect(fill = "#1a1e2e", color = NA),
plot.title = element_text(color = "#9ecbe6", face = "bold",
hjust = 0.5, size = 15,
margin = margin(b = 12))) +
labs(title = "Bottom-up beş adımlı model kurma stratejisi")Şekil 12. Beş adımlı model kurma akışı. Her adım bir önceki modele yeni parametre ekler; LRT/AIC/BIC ile uyum iyileşmesi test edilir. Adım 5’e geçiş yalnızca Adım 4’te rastgele eğim anlamlı çıkarsa mantıklıdır.
Yap: Hiçbir yordayıcı olmadan yalnızca kesişim.
Elde et: ICC, baseline deviance, L1 ve L2 varyansları (\(\sigma^2, \tau_{00}\)).
Yap: L1 yordayıcılarını sabit etki olarak ekle; eğimler henüz rastgele değil.
Elde et: L1 değişkenlerinin anlamlılığı, L1 Pseudo \(R^2\) (sığ varyans düşüşü).
Yap: L2 yordayıcılarını ekle. “Varyans bileşeni modeli” oluşur.
Elde et: L2 yordayıcılarının anlamlılığı, L2 Pseudo \(R^2\) (kesişim varyansındaki düşüş).
Yap: Kuramsal olarak gruplar arası değişmesi beklenen L1 eğimlerini rastgele tut.
Elde et: Eğim varyansının (\(\tau_{11}\)) anlamlılığı, kesişim-eğim kovaryansı, uyum iyileşmesi.
Yap: Adım 4’te anlamlı rastgele eğim bulduysan, bu varyansı L2 değişkenleriyle açıkla.
Elde et: Moderasyon etkisinin anlamlılığı (\(\gamma_{11}\)), eğim varyansında düşüş (\(R^2_{\text{slope}}\)).
m4 <- lmer(Y ~ X1 * W1 + X2 + W2 + (1 + X1 | okul),
data = veri, REML = FALSE)
anova(m3, m4)
# Nihai modelde raporlama için REML'e geçin:
m4_final <- update(m4, REML = TRUE)
summary(m4_final)Dedrick ve arkadaşları (2009), HLM raporlarındaki sistematik eksiklikleri belgelemişlerdir. İyi bir rapor şu bileşenleri eksiksiz içermelidir.
lme4 1.1-34”)Raporlanan HLM tablosu genellikle sütunlarda farklı modelleri, satırlarda parametre gruplarını gösterir:
| Parametre | Boş Model | Koşullu L1 | Koşullu L1+L2 | Tam Model |
|---|---|---|---|---|
| Sabit Etkiler | ||||
| \(\gamma_{00}\) | ||||
| \(\gamma_{10}\) | ||||
| \(\gamma_{01}\) | ||||
| \(\gamma_{11}\) | ||||
| Rastgele Etkiler | ||||
| \(\sigma^2\) (L1) | ||||
| \(\tau_{00}\) | ||||
| \(\tau_{11}\) | ||||
| \(\tau_{01}\) | ||||
| Uyum | ||||
| Deviance | ||||
| AIC | ||||
| BIC | ||||
| Türetilmiş | ||||
| ICC | ||||
| \(R^2_{\text{L1}}\) | ||||
| \(R^2_{\text{L2}}\) |
R’da bu tablo sjPlot::tab_model() veya
modelsummary::modelsummary() ile otomatik üretilebilir.
Katsayıların yorumu merkezleme seçimine sıkıca bağlıdır:
1. ICC küçük diye HLM’yi atlamak. Dizayn etkisi formülü asıl kılavuzdur.
2. Sabit etki farkı olan modelleri REML ile LRT ile karşılaştırmak. Geçersizdir; ML kullanın.
3. Rastgele eğim varyans testlerini klasik \(\chi^2\) ile değerlendirmek. Bu sınır testleridir; sonuç muhafazakârdır.
4. Gereksiz rastgele etki eklemek. Kuramsal gerekçe
yoksa model yakınsamaz veya singular fit verir.
isSingular(model) kontrolü yapın.
5. Çapraz düzey etkileşimde CGM kullanmak. Within ve between etkiler karışır (conflation); CWC + grup ortalaması doğru yaklaşımdır.
6. PV’leri ortalamasını alıp tek puan olarak kullanmak. Ölçüm belirsizliği kaybolur; standart hatalar yanlı olur. Rubin kurallarını uygulayın.
7. Örneklem ağırlıklarını göz ardı etmek. Büyük ölçekli veri setlerinde popülasyon temsiliyeti kaybolur; yanlı kestirim ve Tip I hata enflasyonu ortaya çıkar.
8. Yetersiz L2 birimi ile çalışmak. \(J < 30\) olduğunda varyans bileşeni kestirimleri güvenilmez. Tercihen \(J \geq 50\), ideal olarak \(J \geq 100\).
9. Kesişim yorumunu merkezleme olmaksızın yapmak. \(X = 0\) anlamsız bir durumsa, kesişim raporu okuyucuyu yanıltır.
10. Farklı \(N\) değerli modelleri bilgi kriterleriyle karşılaştırmak. Listwise deletion yapan modeller farklı N üretiyorsa AIC/BIC karşılaştırılamaz.
1. Veri yuvalanmış mı? → Evet → HLM düşün.
2. Boş model kur, ICC hesapla. → Sadece ICC’ye değil, DEFF’e bak.
3. L1 yordayıcılarını ekle (sabit). → LRT ile (ML) anlamlı mı?
4. L2 yordayıcılarını ekle. → LRT ile (ML) anlamlı mı? L2 varyansı azaldı mı?
5. Kuramsal gerekçeli L1 eğimleri için rastgele eğim dene. → \(\tau_{11}\) anlamlı mı? Varyans aralığı sıfırı içeriyor mu?
6. Rastgele eğim anlamlıysa çapraz düzey etkileşim ekle. → Moderasyon anlamlı mı? \(\tau_{11}\) ne kadar azaldı?
7. Nihai modelde REML ile kestirimleri yeniden hesapla. → Raporlama için.
8. Varsayım tanıları. →
performance::check_model(), L2 normalliği için
Mahalanobis.
9. Etki büyüklüğü. → Marjinal/Koşullu \(R^2\), düzeye özgü Pseudo \(R^2\), gerekiyorsa Cohen’s d.
10. Raporla. → Dedrick et al. önerileri + merkezleme + kestirim yöntemi + kayıp veri stratejisi.
Enders, C. K. ve Tofighi, D. (2007). Centering predictor variables in cross-sectional multilevel models: A new look at an old issue. Psychological Methods, 12(2), 121–138.
Finch, W. H. ve Bolin, J. E. (2017). Multilevel modeling using Mplus. CRC Press.
Finch, W. H., Bolin, J. E. ve Kelley, K. (2024). Multilevel modeling using R (3. baskı). CRC Press.
Heck, R. H., Thomas, S. L. ve Tabata, L. N. (2014). Multilevel and longitudinal modeling with IBM SPSS (2. baskı). Routledge.
Hox, J. J., Moerbeek, M. ve van de Schoot, R. (2018). Multilevel analysis: Techniques and applications (3. baskı). Routledge.
Huang, F. L. (2022). Practical multilevel modeling using R. SAGE Publications.
Raudenbush, S. W. ve Bryk, A. S. (2002). Hierarchical linear models: Applications and data analysis methods (2. baskı). Sage Publications.