Bu çalışmada, AFAV10N200.sav veri seti
üzerinde Açımlayıcı Faktör Analizi (AFA) uygulaması yapılacaktır. Veri
seti 200 bireyden toplanmış, davranışsal problem maddelerini ölçen 10
değişkenden oluşmaktadır.
Veri yapısı:
Toplam gözlem: 200 birey
Madde sayısı: 10 davranışsal problem maddesi
Birey/madde oranı: 20 (Gorsuch’un madde başına 5 birey ve toplam 100 birey kuralının üzerinde)
Beklenen yapı: İçselleştirici (internalizing) ve dışsallaştırıcı (externalizing) problem davranışı boyutları — kuramsal beklenti
Veri setindeki orijinal değişken isimleri x1, x2, …, x10
biçimindedir; içerik etiketleri İngilizce olarak verilmiştir. Raporun
anlaşılırlığını artırmak için her madde Türkçe karşılığıyla birlikte
sunulacak, ancak kodda madde isimleri (x1–x10)
korunacaktır.
| Madde | İçerik (İngilizce) | Türkçe Karşılık | Beklenen Boyut |
|---|---|---|---|
x1 |
Feel worthless | Kendini değersiz hissetme | İçselleştirici |
x2 |
Mind off | Aklından çıkaramama | İçselleştirici |
x3 |
Feel sad | Üzgün hissetme | İçselleştirici |
x4 |
Feel worries | Endişeli hissetme | İçselleştirici |
x5 |
Hear things | Bazı şeyler duyma | Düşünce / Psikotik (?) |
x6 |
Run away | Kaçma | Dışsallaştırıcı |
x7 |
Feel unloved | Sevilmediğini hissetme | İçselleştirici |
x8 |
Strange ideas | Garip fikirler | Düşünce / Psikotik (?) |
x9 |
Truant | Kaçak / aylak | Dışsallaştırıcı |
x10 |
Getting many fights | Birçok kavgaya karışma | Dışsallaştırıcı |
psych AFA çekirdek paketidir;
fa(), KMO(), cortest.bartlett(),
fa.parallel(), vss(), scree(),
omega() fonksiyonlarını içerir.
GPArotation Promax/Oblimin gibi eğik
döndürme algoritmalarını sağlar. EGAnet
ağ-temelli boyutsallık tahmini için; mirt
IRT-AFA köprüsü (Item Factor Analysis) için;
nFactors çoklu faktör sayısı kriterlerinin
karşılaştırılması için; corrplot
korelasyon matrisi görselleştirmesi için kullanılacaktır.
gt ile
kableExtra profesyonel tablolar için,
ggplot2 ve
patchwork görselleştirmeler için
kullanılacaktır.
# Veri işleme
library(haven) # SPSS (.sav) dosyası okuma
library(dplyr) # Veri manipülasyonu
library(tidyr) # Veri yeniden şekillendirme
library(tibble) # Veri çerçevesi yardımcıları
# Faktör analizi
library(psych) # AFA çekirdek paketi (fa, KMO, omega, vss)
library(GPArotation) # Promax / Oblimin döndürme algoritmaları
library(nFactors) # Çoklu faktör sayısı kriterleri
# Modern eklentiler
library(EGAnet) # Ağ-temelli boyutsallık (EGA, bootEGA, UVA)
library(mirt) # IRT-AFA köprüsü (Item Factor Analysis)
# Çıktı düzenleme
library(broom) # tidy() fonksiyonu
library(gt) # Profesyonel tablolar
library(kableExtra) # Alternatif tablo paketi
# Görselleştirme
library(corrplot) # Korelasyon matrisi görselleştirmesi
library(ggplot2)
library(ggrepel) # Üst üste binmeyen etiket yerleşimi
library(patchwork) # Çoklu grafik birleştirme
tema_afa <- theme_minimal(base_size = 13) +
theme(
plot.background = element_rect(fill = "#1a1e2e", color = NA),
panel.background = element_rect(fill = "#1a1e2e", color = NA),
panel.grid.major = element_line(color = "#2e3557"),
panel.grid.minor = element_line(color = "#252a3d"),
text = element_text(color = "#e8e8e8"),
axis.text = element_text(color = "#c9d1d9"),
axis.title = element_text(color = "#9dc9e0", face = "bold"),
plot.title = element_text(color = "#7eb8d4", face = "bold", size = 14),
plot.subtitle = element_text(color = "#b8d4e6"),
legend.background = element_rect(fill = "#1a1e2e", color = NA),
legend.key = element_rect(fill = "#1a1e2e", color = NA),
strip.background = element_rect(fill = "#2e3557", color = NA),
strip.text = element_text(color = "#9dc9e0", face = "bold")
)
# gt tabloları için ortak stil fonksiyonu
stil_gt <- function(tbl) {
tbl |>
tab_options(
table.background.color = "#1a1e2e",
table.font.color = "#e8e8e8",
table.font.size = px(15),
heading.background.color = "#2e3557",
heading.title.font.size = px(17),
column_labels.background.color = "#2e3557",
column_labels.font.weight = "bold",
row.striping.background_color = "#252a3d",
row.striping.include_table_body = TRUE,
table.border.top.color = "#3a4060",
table.border.bottom.color = "#3a4060"
) |>
opt_row_striping()
}
# %||% yardımcı operatörü — NULL veya NA olduğunda yedeğe geç
# (Tüm dosyada sürüm-savunmacı erişim için)
`%||%` <- function(a, b) {
if (is.null(a)) return(b)
if (length(a) == 0) return(b)
if (length(a) == 1 && is.na(a)) return(b)
a
}# Veri seti orijinal dosya yolundan okunuyor
afa_ham <- read_sav("AFAV10N200.sav")
# Başlangıç kontrolü
cat("Satır sayısı :", nrow(afa_ham), "\n")## Satır sayısı : 200
## Sütun sayısı : 10
## Değişkenler : X1, X2, X3, X4, X5, X6, X7, X8, X9, X10
# (1) Yalnızca x1–x10 değişkenlerini al — büyük/küçük harfe duyarsız regex
# (2) haven labelled tiplerini saf numeric'e çevir
# (psych::fa, mirt, EGAnet labelled vektörlerle her zaman barışık değil)
# (3) Sütun isimlerini küçük harfe sabitle (raporda x1..x10 referans veriyoruz)
# (4) Listewise eksik veri silme — küçük örneklemde mecburi tek strateji
veri <- afa_ham |>
dplyr::select(dplyr::matches("^[xX][0-9]+$")) |>
dplyr::mutate(dplyr::across(dplyr::everything(), ~as.numeric(haven::zap_labels(.x)))) |>
dplyr::rename_with(tolower) |>
stats::na.omit() |>
as.data.frame()
# Yapı kontrolü
str(veri)## 'data.frame': 200 obs. of 10 variables:
## $ x1 : num 0.0496 -0.401 -0.6111 -1.0787 2.5436 ...
## $ x2 : num -2.7092 1.5148 0.0427 1.4289 1.5114 ...
## $ x3 : num -0.4055 -0.5875 0.0996 -0.6773 0.1716 ...
## $ x4 : num -0.999 1.01 -0.554 -0.947 0.746 ...
## $ x5 : num 0.662 1.365 -0.773 0.567 0.309 ...
## $ x6 : num 0.258 -0.441 -0.627 -1.138 -0.657 ...
## $ x7 : num -0.6683 0.5771 -0.8532 -0.0734 -0.6973 ...
## $ x8 : num -0.42 2.37 -1.69 1.85 1.05 ...
## $ x9 : num 2.079 0.617 -1.464 -0.11 -0.481 ...
## $ x10: num 1.572 -0.323 -2.353 -1.436 -0.51 ...
##
## Son analiz örneklemi: n = 200
## Rows: 200
## Columns: 10
## $ x1 <dbl> 0.049557, -0.401043, -0.611112, -1.078668, 2.543550, 0.370340, 0.5…
## $ x2 <dbl> -2.709164, 1.514841, 0.042667, 1.428922, 1.511399, 0.435413, 1.767…
## $ x3 <dbl> -0.405507, -0.587482, 0.099589, -0.677331, 0.171609, 1.791379, 1.2…
## $ x4 <dbl> -0.999259, 1.010374, -0.553762, -0.947275, 0.745966, 1.641532, 0.7…
## $ x5 <dbl> 0.661877, 1.365162, -0.773270, 0.566928, 0.308675, 0.268354, 2.059…
## $ x6 <dbl> 0.258086, -0.441055, -0.627353, -1.137985, -0.657311, 0.807591, 3.…
## $ x7 <dbl> -0.668271, 0.577073, -0.853195, -0.073436, -0.697288, 1.733908, 0.…
## $ x8 <dbl> -0.419684, 2.372727, -1.693240, 1.850293, 1.049745, -0.334656, 0.2…
## $ x9 <dbl> 2.079402, 0.617201, -1.463801, -0.109519, -0.480856, 0.440327, 1.3…
## $ x10 <dbl> 1.572202, -0.323086, -2.353268, -1.436095, -0.510027, 0.229442, 3.…
| AFAV10N200 — İlk 6 Gözlem | |||||||||
| x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | x10 |
|---|---|---|---|---|---|---|---|---|---|
| 0.049557 | -2.709164 | -0.405507 | -0.999259 | 0.661877 | 0.258086 | -0.668271 | -0.419684 | 2.079402 | 1.572202 |
| -0.401043 | 1.514841 | -0.587482 | 1.010374 | 1.365162 | -0.441055 | 0.577073 | 2.372727 | 0.617201 | -0.323086 |
| -0.611112 | 0.042667 | 0.099589 | -0.553762 | -0.773270 | -0.627353 | -0.853195 | -1.693240 | -1.463801 | -2.353268 |
| -1.078668 | 1.428922 | -0.677331 | -0.947275 | 0.566928 | -1.137985 | -0.073436 | 1.850293 | -0.109519 | -1.436095 |
| 2.543550 | 1.511399 | 0.171609 | 0.745966 | 0.308675 | -0.657311 | -0.697288 | 1.049745 | -0.480856 | -0.510027 |
| 0.370340 | 0.435413 | 1.791379 | 1.641532 | 0.268354 | 0.807591 | 1.733908 | -0.334656 | 0.440327 | 0.229442 |
eksik_df <- data.frame(
Madde = names(veri),
Eksik = sapply(veri, function(x) sum(is.na(x))),
Yuzde = round(sapply(veri, function(x) sum(is.na(x))) / nrow(veri) * 100, 2)
)
gt(eksik_df) |>
tab_header(title = "Madde Bazında Eksik Veri Sayısı") |>
cols_label(Madde = "Madde", Eksik = "Eksik (n)", Yuzde = "Eksik (%)") |>
stil_gt()| Madde Bazında Eksik Veri Sayısı | ||
| Madde | Eksik (n) | Eksik (%) |
|---|---|---|
| x1 | 0 | 0 |
| x2 | 0 | 0 |
| x3 | 0 | 0 |
| x4 | 0 | 0 |
| x5 | 0 | 0 |
| x6 | 0 | 0 |
| x7 | 0 | 0 |
| x8 | 0 | 0 |
| x9 | 0 | 0 |
| x10 | 0 | 0 |
Tablodan görüldüğü üzere veri seti tamamen eksiksiz: 200 birey × 10 madde = 2.000 hücrenin tamamı dolu. “Savunulabilir Karar” ilkesi gereği, uygulamada eksik veri çıksaydı tercih MICE veya FIML yönünde olurdu; ancak burada böyle bir kararı vermeyi gerektirecek veri yapısı bulunmuyor.
betimsel <- psych::describe(veri) |>
as.data.frame() |>
rownames_to_column("Madde") |>
select(Madde, n, mean, sd, median, min, max, skew, kurtosis) |>
mutate(across(c(mean, sd, median, skew, kurtosis), ~round(.x, 3)))
gt(betimsel) |>
tab_header(title = "Madde Düzeyi Betimsel İstatistikler") |>
cols_label(
n = "n", mean = "Ort", sd = "SS", median = "Medyan",
min = "Min", max = "Maks", skew = "Çarpıklık", kurtosis = "Basıklık"
) |>
stil_gt()| Madde Düzeyi Betimsel İstatistikler | ||||||||
| Madde | n | Ort | SS | Medyan | Min | Maks | Çarpıklık | Basıklık |
|---|---|---|---|---|---|---|---|---|
| x1 | 200 | 0.122 | 1.029 | 0.159 | -2.939802 | 3.448407 | 0.040 | 0.348 |
| x2 | 200 | 0.031 | 1.118 | 0.017 | -2.782325 | 2.998335 | -0.069 | -0.269 |
| x3 | 200 | -0.047 | 1.038 | -0.144 | -2.601778 | 2.712188 | 0.041 | -0.504 |
| x4 | 200 | 0.005 | 1.137 | 0.042 | -3.726345 | 2.783553 | -0.199 | 0.111 |
| x5 | 200 | 0.065 | 1.117 | 0.088 | -2.492648 | 2.885320 | 0.043 | -0.345 |
| x6 | 200 | 0.068 | 1.201 | 0.118 | -3.058709 | 3.757349 | -0.070 | 0.342 |
| x7 | 200 | 0.036 | 1.021 | 0.150 | -2.249035 | 2.915999 | -0.103 | -0.537 |
| x8 | 200 | 0.112 | 1.181 | -0.040 | -2.959739 | 3.005078 | 0.155 | -0.446 |
| x9 | 200 | 0.004 | 1.046 | 0.081 | -2.850181 | 3.476267 | 0.102 | 0.193 |
| x10 | 200 | 0.029 | 1.057 | 0.071 | -3.091555 | 3.547835 | 0.159 | 0.115 |
Maddelerin ortalamaları sıfıra (−0.047 ile 0.122 arasında), standart sapmaları bire (1.021 ile 1.201 arasında) çok yakın. Bu, verinin z-skor formuna standartlaştırılmış sürekli değişkenler olarak okunduğunu; orijinal Likert benzeri kategorilerden çok puan-tipi sürekli değerlerle çalıştığımızı gösteriyor. Buna göre Pearson momentler-çarpımı korelasyonu uygun seçimdir; polikorik yaklaşımı zorunlu kılan ordinal ölçek koşulu burada oluşmuyor.
İkincisi, çarpıklık değerleri −0.199 ile 0.159, basıklık değerleri −0.537 ile 0.348 arasında; tüm maddeler George ve Mallery’nin (2010) ±2 eşiğinin, hatta Kline’ın (2016) ±1 / ±3 muhafazakâr eşiğinin de çok altında. Yani maddelerin tek-değişkenli dağılımları yaklaşık normal.
veri_uzun <- veri |>
pivot_longer(everything(), names_to = "Madde", values_to = "Deger") |>
mutate(Madde = factor(Madde, levels = paste0("x", 1:10)))
ggplot(veri_uzun, aes(x = Deger)) +
geom_histogram(fill = "#7eb8d4", color = "#1a1e2e", bins = 15) +
facet_wrap(~ Madde, ncol = 5, scales = "free") +
labs(
title = "10 Maddenin Dağılımı",
subtitle = "Çarpıklık ve ölçek tipinin görsel kontrolü",
x = NULL, y = "Frekans"
) +
tema_afaHistogramların görünümü betimsel istatistikleri görsel olarak doğruluyor: 10 maddenin tamamı simetrik, çan eğrisine yakın dağılım gösteriyor. Hiçbir maddede tavan ya da taban etkisi (extreme floor/ceiling), iki-tepeli (bimodal) yapı veya keskin asimetri bulunmuyor. Bu görsel kanıt, maddeler için sürekli ölçek varsayımının makul olduğunu ve Pearson korelasyonu üzerinden yürüyen klasik AFA akışına engel teşkil etmediğini netleştiriyor.
AFA’da analiz edilen temel matris korelasyon matrisidir. Faktör çıkarma işleminin tüm adımları (faktör puanları hariç) bu matristen yürütülür. Aşağıda Pearson momentler-çarpımı korelasyon matrisi sunulmaktadır.
R <- cor(veri, use = "pairwise.complete.obs")
R_alt <- R
R_alt[upper.tri(R_alt)] <- NA
R_tbl <- as.data.frame(round(R_alt, 2)) |>
rownames_to_column("Madde")
gt(R_tbl) |>
tab_header(
title = "Pearson Korelasyon Matrisi (Alt Üçgen)",
subtitle = "AFA'da analiz edilen temel girdi matrisi"
) |>
stil_gt() |>
sub_missing(columns = everything(), missing_text = "")| Pearson Korelasyon Matrisi (Alt Üçgen) | ||||||||||
| AFA'da analiz edilen temel girdi matrisi | ||||||||||
| Madde | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | x10 |
|---|---|---|---|---|---|---|---|---|---|---|
| x1 | 1.00 | |||||||||
| x2 | 0.33 | 1.00 | ||||||||
| x3 | 0.59 | 0.29 | 1.00 | |||||||
| x4 | 0.54 | 0.34 | 0.60 | 1.00 | ||||||
| x5 | 0.26 | 0.65 | 0.29 | 0.29 | 1.00 | |||||
| x6 | 0.20 | 0.28 | 0.30 | 0.27 | 0.19 | 1.00 | ||||
| x7 | 0.59 | 0.29 | 0.59 | 0.58 | 0.28 | 0.34 | 1.00 | |||
| x8 | 0.30 | 0.58 | 0.26 | 0.33 | 0.60 | 0.23 | 0.25 | 1.00 | ||
| x9 | 0.23 | 0.24 | 0.31 | 0.25 | 0.21 | 0.54 | 0.38 | 0.15 | 1.00 | |
| x10 | 0.30 | 0.20 | 0.21 | 0.26 | 0.22 | 0.60 | 0.40 | 0.21 | 0.56 | 1 |
corrplot(R,
method = "color",
type = "lower",
order = "original",
tl.cex = 0.9,
tl.col = "white",
addCoef.col = "white",
number.cex = 0.75,
col = colorRampPalette(c("#c06060", "#252a3d", "#8ed47e"))(200),
bg = "#1a1e2e",
tl.srt = 45)Korelasyon matrisi gözle bakıldığında üç farklı yüksek-korelasyon bloğu ortaya çıkartıyor — ve bu bulgu ileride çoklu kriter analizinin 3 faktör önerisini önceleyen ilk işarettir.
Birinci blok (içselleştirici/depresif duygu durum): x1, x3, x4, x7 maddeleri arasında korelasyonlar 0.54–0.60 aralığında yoğunlaşıyor — Kendini değersiz hissetme, üzgün hissetme, endişeli hissetme, sevilmediğini hissetme. Bu, depresyon ve anksiyetenin literatürdeki örüntüsüyle birebir örtüşüyor.
İkinci blok (düşünce/algılama): x2, x5, x8 arasında korelasyonlar 0.58–0.65 aralığında — Aklından çıkaramama, bazı şeyler duyma, garip fikirler. İlk bakışta x2 (rumination) içselleştirici boyuta yakın gibi durabilir; ancak veri x2’yi düşünce maddeleriyle çok daha güçlü ilişkilendiriyor (x2-x5: 0.65, x2-x8: 0.58). Bu, psikoz benzeri düşünce/algılama bozukluğu olarak yorumlanabilecek üçüncü bir kuramsal boyutun varlığına ilk somut işaret.
Üçüncü blok (dışsallaştırıcı): x6, x9, x10 arasında korelasyonlar 0.54–0.60 — Kaçma, kaçak/aylak, kavgaya karışma. Davranışsal problemlerin klasik dışa-vurum kümesi.
AFA’ya geçmeden önce verinin faktörleştirmeye uygun olup olmadığı test edilmelidir.
KMO örnekleme yeterliği ölçüsü maddeler arası örtüşmenin derecesini değerlendirir.
Bartlett’in küresellik testi korelasyon matrisinin bir birim matristen anlamlı şekilde farklı olup olmadığını sınar.
KMO (Kaiser-Meyer-Olkin), maddeler arası kısmi korelasyonların büyüklüğünü değerlendirir. Eğer maddeler altta yatan ortak faktörleri paylaşıyorsa, kısmi korelasyonlar küçük olacak ve KMO 1’e yaklaşacaktır.
Yorum eşikleri (Kaiser, 1974):
KMO testi bir istatistiksel hipotez testi değil, betimsel bir indekstir; genel kabul gören eşik 0.60’dır.
kmo_sonuc <- KMO(veri)
# Genel KMO ve madde başına MSA değerleri
kmo_madde_df <- data.frame(
Madde = names(kmo_sonuc$MSAi),
MSA = round(as.numeric(kmo_sonuc$MSAi), 3),
Yorum = case_when(
kmo_sonuc$MSAi < 0.50 ~ "Kabul edilemez",
kmo_sonuc$MSAi < 0.60 ~ "Kötü",
kmo_sonuc$MSAi < 0.70 ~ "Vasat",
kmo_sonuc$MSAi < 0.80 ~ "Orta",
kmo_sonuc$MSAi < 0.90 ~ "İyi",
TRUE ~ "Mükemmel"
)
)
# Genel KMO satırını ekle
kmo_full <- rbind(
data.frame(
Madde = "GENEL KMO",
MSA = round(kmo_sonuc$MSA, 3),
Yorum = case_when(
kmo_sonuc$MSA < 0.50 ~ "Kabul edilemez",
kmo_sonuc$MSA < 0.60 ~ "Kötü",
kmo_sonuc$MSA < 0.70 ~ "Vasat",
kmo_sonuc$MSA < 0.80 ~ "Orta",
kmo_sonuc$MSA < 0.90 ~ "İyi",
TRUE ~ "Mükemmel"
)
),
kmo_madde_df
)
gt(kmo_full) |>
tab_header(
title = "Kaiser-Meyer-Olkin Örnekleme Yeterliği",
subtitle = "Genel KMO ve madde bazında MSA değerleri"
) |>
cols_label(Madde = "Madde", MSA = "KMO / MSA", Yorum = "Yorum") |>
stil_gt() |>
tab_style(
style = list(cell_fill(color = "#2e3557"), cell_text(weight = "bold")),
locations = cells_body(rows = 1) # Genel KMO ilk satırda
)| Kaiser-Meyer-Olkin Örnekleme Yeterliği | ||
| Genel KMO ve madde bazında MSA değerleri | ||
| Madde | KMO / MSA | Yorum |
|---|---|---|
| GENEL KMO | 0.816 | İyi |
| x1 | 0.829 | İyi |
| x2 | 0.793 | Orta |
| x3 | 0.816 | İyi |
| x4 | 0.883 | İyi |
| x5 | 0.763 | Orta |
| x6 | 0.774 | Orta |
| x7 | 0.882 | İyi |
| x8 | 0.836 | İyi |
| x9 | 0.834 | İyi |
| x10 | 0.739 | Orta |
KMO İncelemesi
Genel KMO değeri 0.816; Kaiser’in (1974) ölçeğinde “iyi” (meritorious) kategorisinde. Bu, maddeler arasındaki ortak varyansın faktör analizine zemin teşkil edecek büyüklükte olduğunu gösterir.
(a) Hangi varsayımı test eder? KMO, gözlenen korelasyonların kısmi korelasyonlardan çok daha büyük olduğu varsayımını test eder — başka bir deyişle, maddeler arası ilişkilerin tek tek çiftleri açıklayan “küçük etkilerden” değil, ortak gizil yapılardan kaynaklandığı varsayımını. Eğer maddeler altta yatan ortak faktörleri paylaşıyorsa, bir madde çiftinin korelasyonu diğer maddeler kontrol altına alındığında (yani kısmi korelasyonda) küçülmeli, çünkü ortak varyansın çoğu zaten kontrol değişkenleri tarafından soğurulmalıdır.
(b) Karşılanıyor mu? Evet, hem genel hem madde düzeyinde. Madde-MSA değerleri 0.739 (x10) ile 0.883 (x4) arasında; en düşük değer bile literatürdeki 0.60 minimum eşiğin epey üstünde. x4 ve x7 maddeleri en yüksek MSA değerine sahip — bu, içselleştirici bloğun çekirdek maddelerinin matristeki ortak varyansa en güçlü katkıyı sağladığını ima ediyor. Sonuç: veri faktörleştirilebilir; AFA’ya geçmek için zemin sağlam.
Bartlett’s Test of Sphericity, \(H_0\): korelasyon matrisi bir birim matristir (yani maddeler arasında hiçbir korelasyon yok) hipotezini test eder. \(\chi^2\) dağılımına yaklaşık olarak uyar. Sıfır hipotezinin reddedilmesi beklenir; aksi halde maddeler arasında faktörleştirilebilecek anlamlı korelasyon bulunmadığı sonucuna varılır.
bart_sonuc <- cortest.bartlett(R, n = nrow(veri))
bart_df <- data.frame(
Olcu = c("χ² istatistiği", "Serbestlik derecesi (df)", "p-değeri"),
Deger = c(round(bart_sonuc$chisq, 3),
bart_sonuc$df,
format.pval(bart_sonuc$p.value, digits = 3))
)
gt(bart_df) |>
tab_header(
title = "Bartlett'in Küresellik Testi",
subtitle = "H₀: Korelasyon matrisi = Birim matris"
) |>
cols_label(Olcu = "Ölçü", Deger = "Değer") |>
stil_gt()| Bartlett'in Küresellik Testi | |
| H₀: Korelasyon matrisi = Birim matris | |
| Ölçü | Değer |
|---|---|
| χ² istatistiği | 827.114 |
| Serbestlik derecesi (df) | 45 |
| p-değeri | <2e-16 |
SBartlett küresellik testi χ²(45) = 827.114, p < 2 × 10⁻¹⁶ — sıfır hipotezi korelasyon matrisinin birim matristen farksız olduğunu söylüyordu; bu hipotez çok güçlü biçimde reddedildi. Yani maddeler arasında faktörleştirilebilecek anlamlı korelasyon yapısı mevcut.
KMO 0.816 + Bartlett p < .001 ikilisi, AFA’ya başlamak için kuramsal ve istatistiksel ön-koşulların eksiksiz karşılandığını açıkça gösteriyor.
Faktör sayısı belirlenirken birden fazla kriter dikkate alıncaktır.
Kaiser-Guttman (K1) kuralı: Özdeğeri 1.0’dan büyük faktörler tutulur. Mantığı, anlamlı bir faktörün tek bir maddenin varyansından fazlasını açıklaması gerektiğidir (standartlaştırılmış maddenin varyansı 1’dir).
# Korelasyon matrisi özdeğerleri (R'nin native eigen fonksiyonu)
# fa(veri)$e.values warning üretebildiği için doğrudan hesap
ozdegerler <- eigen(R)$values
ozdeger_df <- data.frame(
Faktor = paste0("F", seq_along(ozdegerler)),
Ozdeger = round(ozdegerler, 3),
Birikimli = round(cumsum(ozdegerler), 3),
Aciklanan_Yuzde = round(ozdegerler / sum(ozdegerler) * 100, 2),
K1_Kriteri = ifelse(ozdegerler > 1, "✓ Tut", "✗ At")
)
gt(ozdeger_df) |>
tab_header(
title = "Korelasyon Matrisi Özdeğerleri",
subtitle = "Kaiser (K1) kuralı: özdeğer > 1 olan faktörler tutulur"
) |>
cols_label(
Faktor = "Faktör", Ozdeger = "Özdeğer",
Birikimli = "Birikimli", Aciklanan_Yuzde = "Açıklanan %",
K1_Kriteri = "K1 Kararı"
) |>
stil_gt()| Korelasyon Matrisi Özdeğerleri | ||||
| Kaiser (K1) kuralı: özdeğer > 1 olan faktörler tutulur | ||||
| Faktör | Özdeğer | Birikimli | Açıklanan % | K1 Kararı |
|---|---|---|---|---|
| F1 | 4.213 | 4.213 | 42.13 | ✓ Tut |
| F2 | 1.557 | 5.770 | 15.57 | ✓ Tut |
| F3 | 1.369 | 7.139 | 13.69 | ✓ Tut |
| F4 | 0.528 | 7.667 | 5.28 | ✗ At |
| F5 | 0.503 | 8.171 | 5.03 | ✗ At |
| F6 | 0.435 | 8.606 | 4.35 | ✗ At |
| F7 | 0.407 | 9.013 | 4.07 | ✗ At |
| F8 | 0.388 | 9.400 | 3.88 | ✗ At |
| F9 | 0.349 | 9.749 | 3.49 | ✗ At |
| F10 | 0.251 | 10.000 | 2.51 | ✗ At |
## K1 kuralına göre çıkarılacak faktör sayısı: 3
Kaiser kriterine göre faktör sayısı yanıtı.
Korelasyon matrisinin özdeğerleri: 4.213, 1.557, 1.369, 0.528, 0.503, 0.435 … Birden büyük olan üç özdeğer var; dolayısıyla Kaiser-Guttman (K1) kriterine göre tutulacak faktör sayısı = 3.
Özdeğer örüntüsü oldukça öğretici: birinci özdeğer (4.213) açıkça baskın — toplam varyansın %42.13’ünü tek başına açıklıyor. İkinci ve üçüncü özdeğerler (1.557 ve 1.369) eşiğin sadece bir miktar üzerinde, ama net şekilde 1’den büyük. Dördüncü özdeğer (0.528) ile üçüncü arasındaki “kopuş” oldukça keskin — 1.369 → 0.528 yaklaşık 0.84’lük bir düşüş, ondan sonra çok daha düz bir iniş geliyor. Bu “kopuş”, scree plotta görsel olarak net bir dirsek halinde belirginleşiyor.
K1, özdeğerlerin birbirine yakın olduğu durumlarda fazla-tahmin eğilimindedir (Zwick & Velicer, 1986). Bu veride 1.557 ve 1.369 birbirine yakın ama K1 eşiği olan 1’den ikisi de yeterince uzak; dolayısıyla “üç faktör” kararı K1 açısından sağlam görünüyor. Yine de tek bir kritere yaslanmamak için bir sonraki adımlarda paralel analiz, MAP, VSS ve EGA ile de faktör sayısı incelenmiştir.
scree_df <- data.frame(
Faktor = 1:length(ozdegerler),
Ozdeger = ozdegerler
)
ggplot(scree_df, aes(x = Faktor, y = Ozdeger)) +
geom_line(color = "#7eb8d4", linewidth = 1) +
geom_point(color = "#7eb8d4", size = 3) +
geom_hline(yintercept = 1, color = "#d4a560", linetype = "dashed") +
annotate("text", x = max(scree_df$Faktor) * 0.85, y = 1.15,
label = "K1 eşiği = 1", color = "#d4a560", size = 4) +
scale_x_continuous(breaks = 1:length(ozdegerler)) +
labs(
title = "Yamaç Birikinti Grafiği (Scree Plot)",
subtitle = "Cattell'in 'dirsek' kriteri — eğrinin düzleştiği nokta",
x = "Faktör Sayısı",
y = "Özdeğer"
) +
tema_afaScree plot, K1’in sayısal olarak söylediğini görsel olarak doğruluyor. İlk üç noktada eğri belirgin biçimde dik iniyor (4.213 → 1.557 → 1.369), sonra dördüncü noktada (0.528) net bir kırılma var; o noktadan itibaren eğri iyice yatıklaşıyor. Cattell’in (1966) “dirsek kuralı” — eğriden çıkıp düz çizgiye dönen noktayı yakalama mantığı — bu veride 3 faktör önerisinde K1 ile uzlaşıyor.
Scree plot’un sınırlılığını da unutmamak gerek: Cattell’in kendisi “dirseğin yorumu deneyimle gelişir” demiş, dolayısıyla bu kriter yargısaldır (subjective). Burada dirsek görece net olduğu için tartışma az; ancak ikinci ve üçüncü özdeğer arasındaki düşüş (1.557 → 1.369) “yumuşak” görünebilir, dirseği “üçüncü”de değil “ikinci”de okumak isteyen bir analizci de çıkabilir. İşte tam bu yüzden tek başına scree yetersiz; paralel analizle nesnelleştirmek gerekecek.
Horn’un (1965) paralel analizi, kaç faktör çıkarılacağı kararının modern altın standardıdır. Mantığı: aynı örneklem büyüklüğü ve madde sayısına sahip rastgele veriden simüle edilen özdeğerlerle gerçek veriden elde edilen özdeğerleri karşılaştırır. Yalnızca simülasyon ortalamasından büyük olan özdeğerlere karşılık gelen faktörler tutulur. Simülasyon çalışmaları (Zwick & Velicer, 1986; Golino vd., 2020) paralel analizin K1’den çok daha doğru sonuç verdiğini, K1’in genellikle faktör sayısını fazla tahmin ettiğini göstermiştir.
set.seed(2026)
# fm="minres" küçük örneklemde PA'dan daha kararlı yakınsar.
# Hocanın PAF tercihi Model 1/2'de geçerli kalır; faktör SAYISI kararı
# için MinRes-tabanlı paralel analiz yöntem-bağımsız bir referanstır.
pa_sonuc <- fa.parallel(
veri,
fa = "fa",
fm = "minres",
n.iter = 50,
main = "Paralel Analiz",
show.legend = TRUE
)## Paralel analiz önerisi: 3 faktör
Horn’un paralel analizi de 3 faktör öneriyor — K1 ve scree ile üç farklı kriter aynı sayıyı söylüyor. Bu bir tesadüf değil: gerçek verinin ilk üç özdeğeri (4.213, 1.557, 1.369), aynı boyutlarda rastgele üretilen verilerden simüle edilen ortalama özdeğerlerden açıkça yüksek; dördüncü ve sonraki özdeğerlerin tümü simülasyon ortalamasının altında kalıyor. Yani üç faktörden sonra gözlenen yapı “rastgele örüntü ile ayırt edilemez” hale geliyor.
Paralel analiz, simülasyon çalışmaları arasında en doğru sayı veren yöntem (Zwick & Velicer, 1986; daha yakın tarihte Golino vd., 2020). K1’in fazla-tahmin etme eğilimini düzeltir, scree’nin yargısallığını nesnelleştirir.
Velicer’in MAP (Minimum Average Partial) testi ve VSS (Very Simple Structure) kriteri, çağdaş psikometride paralel analizi tamamlayan iki yaklaşımdır. MAP, kısmi korelasyonların ortalamasını minimize eden faktör sayısını arar; VSS, basit yapıya en yakın çözümü bulur.
# vss() içinde rotate="promax" küçük örneklemde Varimax→SVD basamağında
# patlayabiliyor (La.svd: infinite or missing values in 'x' hatası).
# rotate="oblimin" + fm="minres" sayısal olarak çok daha kararlı.
# Patlamasına karşı tryCatch koruması.
vss_sonuc <- tryCatch(
vss(
veri,
n = min(6, ncol(veri) - 1),
fm = "minres",
rotate = "oblimin",
plot = TRUE
),
error = function(e) {
message("vss() başarısız oldu: ", e$message,
"\nBoş liste döndürülüyor; çoklu kriter tablosu eksik raporlayacak.")
NULL
}
)# vss_sonuc başarısız olduysa NA dolduruyoruz
if (!is.null(vss_sonuc)) {
vss_c1_n <- which.max(vss_sonuc$cfit.1)
vss_c2_n <- which.max(vss_sonuc$cfit.2)
map_n <- which.min(vss_sonuc$map)
bic_n <- if (!is.null(vss_sonuc$vss.stats$BIC))
which.min(vss_sonuc$vss.stats$BIC) else NA
sabic_n <- if (!is.null(vss_sonuc$vss.stats$SABIC))
which.min(vss_sonuc$vss.stats$SABIC) else NA
} else {
vss_c1_n <- vss_c2_n <- map_n <- bic_n <- sabic_n <- NA
}
vss_ozet <- data.frame(
Kriter = c("VSS Complexity 1 (en uygun)",
"VSS Complexity 2 (en uygun)",
"Velicer MAP (en uygun)",
"BIC (en uygun)",
"Sample-size adjusted BIC (en uygun)"),
Faktor = c(vss_c1_n, vss_c2_n, map_n, bic_n, sabic_n)
)
gt(vss_ozet) |>
tab_header(title = "VSS / MAP / BIC Önerileri") |>
cols_label(Kriter = "Kriter", Faktor = "Önerilen Faktör Sayısı") |>
stil_gt()| VSS / MAP / BIC Önerileri | |
| Kriter | Önerilen Faktör Sayısı |
|---|---|
| VSS Complexity 1 (en uygun) | 1 |
| VSS Complexity 2 (en uygun) | 3 |
| Velicer MAP (en uygun) | 3 |
| BIC (en uygun) | 3 |
| Sample-size adjusted BIC (en uygun) | 4 |
n_sonuc <- nScree(x = ozdegerler, model = "factors")
kriter_ozet <- data.frame(
Kriter = c("Kaiser (K1) — özdeğer > 1",
"Optimal Coordinates (nFactors)",
"Acceleration Factor (nFactors)",
"Paralel Analiz (Horn)",
"VSS Complexity 1",
"VSS Complexity 2",
"Velicer MAP"),
Onerilen_Sayi = c(k1_n,
n_sonuc$Components$noc,
n_sonuc$Components$naf,
pa_sonuc$nfact,
vss_c1_n,
vss_c2_n,
map_n)
)
gt(kriter_ozet) |>
tab_header(
title = "Faktör Sayısı: Çoklu Kriter Karşılaştırması",
subtitle = "Kriterlerin uzlaştığı sayı en güçlü kanıttır"
) |>
cols_label(Kriter = "Kriter", Onerilen_Sayi = "Önerilen Faktör Sayısı") |>
stil_gt()| Faktör Sayısı: Çoklu Kriter Karşılaştırması | |
| Kriterlerin uzlaştığı sayı en güçlü kanıttır | |
| Kriter | Önerilen Faktör Sayısı |
|---|---|
| Kaiser (K1) — özdeğer > 1 | 3 |
| Optimal Coordinates (nFactors) | 3 |
| Acceleration Factor (nFactors) | 1 |
| Paralel Analiz (Horn) | 3 |
| VSS Complexity 1 | 1 |
| VSS Complexity 2 | 3 |
| Velicer MAP | 3 |
Çoklu kriter tablosu, hocanın “tek bir kritere yaslanmama” ilkesinin neden bu kadar önemli olduğunu net biçimde gösteriyor: yedi kriterin beşi 3 faktör diyor — K1, Optimal Coordinates, Paralel Analiz, VSS Complexity 2 ve Velicer MAP. İki kriter farklı yönde: Acceleration Factor 1 faktör öneriyor (bu ölçü zaten en konservatif yöntem olarak bilinir; “ilk büyük düşüş nerede?” sorusuna cevap arar ve tek-faktörlü çözümlerde tipik olarak 1 verir), VSS Complexity 1 de 1 faktör (bu da basit yapı kriterini en katı haliyle uygulayan bir ölçü, cross-loading’leri sıfırla cezalandırdığı için tek-faktörlü çözümleri abartılı şekilde tercih eder).
Diğer bir deyişle, 5/7 yöntem 3 faktöre uzlaşıyor; aykırı 2 sonuç ise teknik olarak beklenen muhafazakâr biaslara sahip yöntemlerden geliyor. Bu, doktora seviyesi bir AFA kararı için son derece güçlü bir kanıt zinciridir; tek başına Kaiser kriterine güvenmiş olsaydık (Bölüm 12 Hata 2) yine 3 derdik, ama gerekçemiz sığ kalırdı.
Nihai karar (3 faktör): Bu çalışmada hocanın yönergesi gereği iki faktörlü Promax çözümünü Model 1 ve Model 2 olarak raporlayacağım. Ancak veriden çıkan kanıt 3 boyuta işaret ediyor; bu gerilim ileride iki yerde tekrar yüzeye çıkacak: (i) Model 1’in artık matrisinde, iki faktörün açıklamadığı sistematik kalıntılar olarak; (ii) Modern eklentiler bölümünde EGA, bootEGA ve IFA, bu çalışmadaki üç-boyutlu yapıyı bağımsız olarak doğrulayacak. Yansımada bu tartışmayı epistemolojik düzeyde derinleştireceğim: “yönergeyi takip etmek” ile “veriden gelen sinyali izlemek” arasındaki gerilim, AFA’nın doğasına dair temel bir öğreti.
Faktör çıkarma yöntemi olarak Principal Axis Factoring
(PAF) kullanılmış, döndürme yapılmamıştır
(rotate = "none"). Faktör sayısı bir önceki bölümde
belirlenen değer kullanılacaktır.
Neden PAF?
Principal Axis Factoring, başlangıç communality kestirimi olarak kareli çoklu korelasyonu (SMC) kullanır ve iteratif olarak günceller. Çok değişkenli normallik varsayımı gerektirmez; bu özellikle ölçüm seviyesi ordinal-yakın olan davranış problemi maddeleri için ML’ye göre daha uygun bir tercihtir. Bölüm 12 Hata 1 uyarınca PAF, PCA’dan farklı olarak yalnızca ortak varyansı modeller, hata ve tekil varyansı dışlar.
# Çoklu kriter sonucuna göre faktör sayısını belirleme
# DİKKAT: Bu değer çoklu kriter analizine göre güncellenmeli
n_faktor <- 2 # Çoklu kriter ortak kararına göre güncellenecek
cat("Bu analizde çıkarılacak faktör sayısı:", n_faktor, "\n")## Bu analizde çıkarılacak faktör sayısı: 2
n_faktor değişkeni, çoklu kriter
sonuçlarına göre buradaki sayı doğrudan elle
güncellenecek. Eğer paralel analiz, MAP ve kuramsal beklenti 2
faktöre uzlaşıyorsa 2; 3 faktöre uzlaşıyorsa 3 olacak. Sayının
değiştirilmesi gerekiyorsa yukarıdaki n_faktor satırı
düzenlenecek; tüm sonraki çıktılar otomatik güncellenir.
pattern_1 <- as.data.frame(unclass(model_1$loadings)) |>
rownames_to_column("Madde") |>
mutate(across(where(is.numeric), ~round(.x, 3)))
# h2 (communality) ve u2 (uniqueness) ekle
pattern_1$h2 <- round(model_1$communality, 3)
pattern_1$u2 <- round(model_1$uniquenesses, 3)
pattern_1$Karmasiklik <- round(model_1$complexity, 2)
gt(pattern_1) |>
tab_header(
title = "Model 1 — Örüntü Matrisi (Pattern Matrix, Döndürmesiz)",
subtitle = "PAF çıkarma; döndürme yapılmamıştır"
) |>
cols_label(
h2 = "h² (ortak varyans)",
u2 = "u² (tekil)",
Karmasiklik = "Karmaşıklık"
) |>
stil_gt()| Model 1 — Örüntü Matrisi (Pattern Matrix, Döndürmesiz) | |||||
| PAF çıkarma; döndürme yapılmamıştır | |||||
| Madde | PA1 | PA2 | h² (ortak varyans) | u² (tekil) | Karmaşıklık |
|---|---|---|---|---|---|
| x1 | 0.636 | 0.115 | 0.418 | 0.582 | 1.06 |
| x2 | 0.631 | -0.475 | 0.623 | 0.377 | 1.86 |
| x3 | 0.659 | 0.163 | 0.461 | 0.539 | 1.12 |
| x4 | 0.658 | 0.102 | 0.443 | 0.557 | 1.05 |
| x5 | 0.592 | -0.525 | 0.627 | 0.373 | 1.97 |
| x6 | 0.530 | 0.250 | 0.343 | 0.657 | 1.42 |
| x7 | 0.718 | 0.263 | 0.584 | 0.416 | 1.26 |
| x8 | 0.571 | -0.468 | 0.546 | 0.454 | 1.93 |
| x9 | 0.520 | 0.291 | 0.355 | 0.645 | 1.57 |
| x10 | 0.534 | 0.297 | 0.373 | 0.627 | 1.56 |
Soru 1.(3)(b) — x2 örüntü katsayıları yanıtı. Döndürülmemiş 2-faktörlü PAF çözümünde x2 maddesi için iki örüntü katsayısı hesaplandı: PA1 üzerinde 0.631 ve PA2 üzerinde −0.475.
Yorum: dik (orthogonal, döndürmesiz) çözümde örüntü katsayıları diğer faktörlerin etkisi sabitlendiğinde maddenin o faktöre bireysel katkısını gösterir; tıpkı çoklu regresyondaki standartlaştırılmış β ağırlıkları gibi. x2 için PA1 yükü 0.631 olması, “genel davranış problemi” boyutunda x2’nin oldukça güçlü bir göstergesi olduğunu söylüyor (yükün karesi 0.398 → x2 varyansının %39.8’i tek başına PA1 tarafından açıklanıyor). PA2 yükü −0.475 ise x2’nin “diğer maddelerin tipik örüntüsünden ayrı bir doğrultuda” yer aldığını gösteriyor — negatif işaret, döndürmesiz çözümde faktörlerin kuramsal anlamla değil “matematiksel ortogonal eksenlerle” hizalandığının doğal bir sonucudur.
Burada kritik nokta şu: döndürmeden önce faktörler kuramsal olarak yorumlanamaz. PA1 herkesi pozitif yüklediği için “genel faktör” gibi davranır, PA2 ise basitçe “PA1’den artakalan ikinci ortogonal varyans yönü”dür. Asıl yorumlanabilir yapı, Promax döndürme sonrası Model 2’de ortaya çıkacak; orada x2 için aynı katsayılar çok farklı bir hikâye anlatacak — örüntü ↔︎ yapı ayrımı ile birlikte.
Communality (\(h^2\)), bir maddenin varyansının çıkarılan faktörler tarafından açıklanan oranıdır. Çoklu regresyondaki \(R^2\) ile birebir aynı mantıktadır. \(h^2\) aynı zamanda madde puanlarının güvenirliğinin alt sınırıdır — yani \(h^2 = .50\) ise o maddenin güvenilirliği en az .50’dir.
Faktörler dik olduğu için \(h^2\) örüntü katsayılarının kareleri toplanarak hesaplanır: \[h_i^2 = \sum_{j=1}^{F} \lambda_{ij}^2\]
h2_df <- data.frame(
Madde = names(model_1$communality),
Communality = round(as.numeric(model_1$communality), 3),
Uniqueness = round(as.numeric(model_1$uniquenesses), 3),
Yorum = case_when(
model_1$communality < 0.20 ~ "Çok düşük — madde gözden geçirilmeli",
model_1$communality < 0.40 ~ "Düşük",
model_1$communality < 0.60 ~ "Orta",
model_1$communality < 0.80 ~ "İyi",
TRUE ~ "Mükemmel"
)
)
# x2 satır indeksi (gt::cells_body data scope'unda Madde'yi bulamadığı için
# önceden hesaplayıp değişken olarak geçiyoruz)
x2_satir <- which(h2_df$Madde == "x2")
gt(h2_df) |>
tab_header(
title = "Madde Düzeyi Communality (h²) ve Uniqueness (u²)",
subtitle = "h² + u² = 1 olmak zorundadır"
) |>
cols_label(
Madde = "Madde", Communality = "h²", Uniqueness = "u²", Yorum = "Yorum"
) |>
stil_gt() |>
tab_style(
style = list(cell_fill(color = "#3a2d3d"), cell_text(weight = "bold")),
locations = cells_body(rows = x2_satir)
)| Madde Düzeyi Communality (h²) ve Uniqueness (u²) | |||
| h² + u² = 1 olmak zorundadır | |||
| Madde | h² | u² | Yorum |
|---|---|---|---|
| x1 | 0.418 | 0.582 | Orta |
| x2 | 0.623 | 0.377 | İyi |
| x3 | 0.461 | 0.539 | Orta |
| x4 | 0.443 | 0.557 | Orta |
| x5 | 0.627 | 0.373 | İyi |
| x6 | 0.343 | 0.657 | Düşük |
| x7 | 0.584 | 0.416 | Orta |
| x8 | 0.546 | 0.454 | Orta |
| x9 | 0.355 | 0.645 | Düşük |
| x10 | 0.373 | 0.627 | Düşük |
Soru 1.(4) — x2 communality yanıtı. x2 maddesinin communality değeri h² = 0.623; karşılığında uniqueness u² = 0.377.
(a) Bu ne öneriyor? x2 maddesinin toplam varyansının %62.3’ü çıkarılan iki ortak faktör tarafından açıklanmaktadır; geriye kalan %37.7 tekil (madde-spesifik + hata) varyanstır. h² aynı zamanda bu maddenin güvenirliğinin alt sınırıdır — yani x2 puanlarının güvenirliği en az 0.62’dir. Bu, içselleştirici/düşünce maddeleri için tipik bir “iyi” düzey.
(b) Örüntü katsayıları ile communality arasındaki matematiksel bağlantı. Faktörler dik olduğu için (rotate = “none”), x2 maddesinin communality’si örüntü katsayılarının kareleri toplamına eşittir: \(h_2^2 = \lambda_{2,\,PA1}^2 + \lambda_{2,\,PA2}^2\). Sayılarla: \(0.631^2 + (-0.475)^2 = 0.398 + 0.226 = 0.624\). Tablodaki 0.623 değeri ile kuruşu kuruşuna örtüşüyor (ufak ondalık fark yuvarlamadan). Bu, sıkça karıştırılan bir noktayı somutlaştırıyor: örüntü katsayıları varyansın faktörler arasında nasıl dağıldığını gösterir; bunların kareleri toplamı ise ortak varyansın kendisidir. Bu özdeşlik yalnızca dik (orthogonal) çözümler için geçerlidir; Model 2’deki Promax sonrası faktörler korelasyonlu olduğu için aynı formül artık çalışmayacak (orada \(h_i^2 = \lambda_i' \, \Phi \, \lambda_i\) formülüne geçilir).
Genel tabloya bakıldığında: x2, x5, x7 (h² = 0.62, 0.63, 0.58) en yüksek; x6, x9, x10 (h² = 0.34, 0.36, 0.37) en düşük communality değerlerine sahip. Düşük communality’li üç maddenin tam olarak dışsallaştırıcı blok olması tesadüf değil — 2-faktörlü çözüm bu boyutu tek başına çıkarmaya yetmediği için, dışsal maddelerin varyansının bir kısmı modelin dışında “tekil” olarak görünüyor. Bu da 3. faktörün eksikliğine dair yine bir parmak izi.
Yüklerin Kareleri Toplamı (SS Loadings) her faktör için örüntü katsayılarının kareleri toplamıdır; bu özdeğere eşittir. Faktör başına açıklanan varyans yüzdesi: \[\text{Aç.Varyans}_k = \frac{\sum_{i=1}^V \lambda_{ik}^2}{V} \times 100\]
v_acc_1 <- as.data.frame(model_1$Vaccounted) |>
rownames_to_column("Olcu") |>
mutate(across(where(is.numeric), ~round(.x, 3)))
gt(v_acc_1) |>
tab_header(
title = "Model 1 — Faktör Başına Açıklanan Varyans",
subtitle = "SS Loadings = özdeğer; Proportion Var = açıklanan oran"
) |>
stil_gt()| Model 1 — Faktör Başına Açıklanan Varyans | ||
| SS Loadings = özdeğer; Proportion Var = açıklanan oran | ||
| Olcu | PA1 | PA2 |
|---|---|---|
| SS loadings | 3.698 | 1.075 |
| Proportion Var | 0.370 | 0.108 |
| Cumulative Var | 0.370 | 0.477 |
| Proportion Explained | 0.775 | 0.225 |
| Cumulative Proportion | 0.775 | 1.000 |
Soru 1.(5) — Açıklanan varyans yanıtı. Tablodan okunduğunda PA1’in SS Loadings’i 3.698 (özdeğeri ile aynı sayı), PA2’nin 1.075. Bunlar her bir faktör için “örüntü katsayılarının karelerinin sütun toplamı” — yani o faktörün tüm maddelerden topladığı ortak varyansın büyüklüğü.
Toplam 10 maddenin standart varyansı 10 birim olduğu için, faktör başına açıklanan varyans yüzdesi:
Yorumu açık: 2-faktörlü çözüm 10 maddelik veri setindeki varyansın yarısından azını açıklayabiliyor. Sosyal/davranışsal ölçeklerde tipik beklenti toplam %50–60 (Hair vd., 2019); buradaki %47.73 değeri kabul edilebilir alt sınırın az altında.
Bu da 2-faktörlü çözümün “yetersiz” olduğuna dair üçüncü kanıt (KMO/Bartlett yeşil ışık verirken çoklu kriter 3 dedi, scree dirsek 3 dedi, şimdi açıklanan varyans %50’nin altında kaldı). 3-faktörlü çözüm denenseydi yaklaşık %58–60 açıklanan varyans elde edilecekti (üçüncü özdeğer 1.369; ortak varyansa katkısı yaklaşık %10–11). Bu sayıyı yansımada açıkça hesaplayacağım.
Örüntü ↔︎ özdeğer ilişkisi: PA1 özdeğeri 4.213, ama SS Loading 3.698 — fark, PAF’ın iteratif communality kestiriminden kaynaklanan “ortak varyans çıkarımıdır”. PCA’da bu fark yoktur (özdeğer = SS Loading); PAF’ta vardır çünkü PAF maddelerin tek başına varyansını değil, paylaşılan varyansı modeller. Bu da tam olarak Bölüm 12 Hata 1’in (PCA’yı AFA olarak sunmak) neden ciddi bir sorun olduğunu matematiksel olarak gösteriyor.
AFA modeli korelasyon matrisini ne kadar iyi yeniden üretiyor? Üretilen matris (\(\hat{R} = \Lambda \Lambda'\)) ile gözlenen \(R\) matrisi arasındaki fark artık matristir (\(R_{res} = R - \hat{R}\)). İdeal olarak artıkların mutlak değeri 0.05’in altında olmalıdır.
artik_1 <- model_1$residual
diag(artik_1) <- NA # Köşegen 0 olmadığı için NA atıyoruz
artik_df <- as.data.frame(round(artik_1, 3)) |>
rownames_to_column("Madde")
gt(artik_df) |>
tab_header(
title = "Model 1 — Artık Korelasyon Matrisi",
subtitle = "İdeal: |artık| < 0.05"
) |>
stil_gt() |>
sub_missing(columns = everything(), missing_text = "—")| Model 1 — Artık Korelasyon Matrisi | ||||||||||
| İdeal: |artık| < 0.05 | ||||||||||
| Madde | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | x10 |
|---|---|---|---|---|---|---|---|---|---|---|
| x1 | — | -0.012 | 0.156 | 0.110 | -0.060 | -0.166 | 0.101 | -0.007 | -0.137 | -0.075 |
| x2 | -0.012 | — | -0.048 | -0.027 | 0.027 | 0.067 | -0.033 | -0.001 | 0.052 | 0.007 |
| x3 | 0.156 | -0.048 | — | 0.151 | -0.017 | -0.089 | 0.070 | -0.036 | -0.079 | -0.186 |
| x4 | 0.110 | -0.027 | 0.151 | — | -0.050 | -0.104 | 0.086 | 0.002 | -0.121 | -0.125 |
| x5 | -0.060 | 0.027 | -0.017 | -0.050 | — | 0.009 | -0.004 | 0.014 | 0.052 | 0.056 |
| x6 | -0.166 | 0.067 | -0.089 | -0.104 | 0.009 | — | -0.102 | 0.046 | 0.195 | 0.244 |
| x7 | 0.101 | -0.033 | 0.070 | 0.086 | -0.004 | -0.102 | — | -0.033 | -0.072 | -0.060 |
| x8 | -0.007 | -0.001 | -0.036 | 0.002 | 0.014 | 0.046 | -0.033 | — | -0.007 | 0.042 |
| x9 | -0.137 | 0.052 | -0.079 | -0.121 | 0.052 | 0.195 | -0.072 | -0.007 | — | 0.200 |
| x10 | -0.075 | 0.007 | -0.186 | -0.125 | 0.056 | 0.244 | -0.060 | 0.042 | 0.200 | — |
# 0.05'ten büyük artık sayısı
artik_alt <- artik_1[lower.tri(artik_1)]
buyuk_artik <- sum(abs(artik_alt) > 0.05, na.rm = TRUE)
toplam_artik <- sum(!is.na(artik_alt))
rmsr_1 <- sqrt(mean(artik_alt^2, na.rm = TRUE))
artik_ozet <- data.frame(
Olcu = c("Toplam artık (alt üçgen)",
"|artık| > 0.05 sayısı",
"Yüzdesi",
"RMSR (Root Mean Square Residual)"),
Deger = c(toplam_artik,
buyuk_artik,
paste0(round(buyuk_artik / toplam_artik * 100, 1), " %"),
round(rmsr_1, 4))
)
gt(artik_ozet) |>
tab_header(
title = "Artık Matris Özeti",
subtitle = "Modelin korelasyon matrisini yeniden üretme başarısı"
) |>
cols_label(Olcu = "Ölçü", Deger = "Değer") |>
stil_gt()| Artık Matris Özeti | |
| Modelin korelasyon matrisini yeniden üretme başarısı | |
| Ölçü | Değer |
|---|---|
| Toplam artık (alt üçgen) | 45 |
| |artık| > 0.05 sayısı | 26 |
| Yüzdesi | 57.8 % |
| RMSR (Root Mean Square Residual) | 0.0956 |
Soru 1.(6) — Modelin uyumu yanıtı. Sayılar net konuşuyor: toplam 45 madde-çifti artığından 26’sının (%57.8) mutlak değeri 0.05 eşiğini aşıyor; RMSR (Root Mean Square Residual) = 0.0956, ideal eşik olan 0.05’in iki katı. Bu, 2-faktörlü çözümün korelasyon matrisini başarıyla yeniden üretemediğini gösteriyor — model açıklamadığı sistematik kalıntılar bırakıyor.
Daha önemlisi: artıklar rastgele dağılmıyor, kümeleniyor. En büyük artıklara bir bakın:
İlk üç en yüksek artığın hepsi dışsallaştırıcı blok içinde (x6, x9, x10): model bu üçlü arasındaki gözlenen güçlü korelasyonları (0.54–0.60) yeterince yeniden üretemiyor; kalan 0.20–0.24 büyüklüğünde paylaşılan varyans modelin dışında kalıyor. Bu, açıkça eksik bir üçüncü faktöre — dışsallaştırıcı boyuta — işaret eden bir parmak izidir. 3-faktörlü bir çözüm uygulansaydı bu kalıntılar 0.05’in altına büyük ölçüde inecekti.
Negatif işaretli en büyük artıklar (x3–x10 = −0.186, x1–x6 = −0.166) ise tersi yönde anlamlı: 2-faktörlü model, dışsallaştırıcı maddeleri PA1’e (genel/içsel faktöre) zorla bindirdiği için, dışsal-içsel çapraz korelasyonları olduğundan büyük tahmin etmiş — aradaki fark negatif artık olarak görünüyor. Yani sadece “açıklayamıyor” değil, “yanlış yere açıklıyor” — bu daha tehlikeli bir durum.
Sonuç: Model 1, Soru 1.(6)’nın yanıtı bağlamında veriye “kabul edilebilir ama yetersiz” uyum sağlıyor. KMO ve Bartlett “AFA yapılabilir” dedi; ancak K1, paralel analiz, MAP ve şimdi artık matrisi de bir arada 3 faktör çözümünün gerekli olduğunu söylüyor.
Faktör çıkarma yöntemi yine PAF, ancak şimdi Promax oblique döndürme uygulanmaktadır (κ = 4 olağan değeri).
Neden eğik döndürme?
“Eğik döndürme sonucu elde edilen faktör yapısının daha basit ve daha kolay yorumlanabilir olduğu görülmektedir.” Davranış problemi boyutları (içselleştirici / dışsallaştırıcı) literatürde tutarlı biçimde korelasyonlu bulunur — varimax gibi dik döndürme bu gerçek korelasyonu sıfıra zorlar ve yapay bir ortogonalite görüntüsü yaratır (Bölüm 12 Hata 3: “Varsayılan olarak Varimax”).
Promax’ın çalışma mantığı: Önce varimax dik döndürme yapılır, sonra yükler κ. kuvvete yükseltilerek “hedef” matrise dönüştürülür. κ = 4 değeri default’tur; daha küçük değerler daha az korelasyonlu, daha büyük değerler daha çok korelasyonlu faktörler üretir.
Promax sonrası faktörler arası korelasyon matrisi (Φ).
phi_df <- as.data.frame(round(model_2$Phi, 3)) |>
rownames_to_column("Faktör")
gt(phi_df) |>
tab_header(
title = "Model 2 — Faktörler Arası Korelasyon Matrisi (Φ)",
subtitle = "Promax sonrası — sıfırdan farklı korelasyonlar eğik döndürmenin doğal sonucudur"
) |>
stil_gt()| Model 2 — Faktörler Arası Korelasyon Matrisi (Φ) | ||
| Promax sonrası — sıfırdan farklı korelasyonlar eğik döndürmenin doğal sonucudur | ||
| Faktör | PA1 | PA2 |
|---|---|---|
| PA1 | 1.000 | 0.512 |
| PA2 | 0.512 | 1.000 |
Soru 2.(1) — Faktörler arası korelasyon yanıtı. Promax sonrası Φ matrisi tek bir kritik sayı veriyor: r(PA1, PA2) = 0.512. Bu, iki faktörün arasındaki korelasyonun orta-güçlü seviyede olduğunu gösteriyor.
Yorum üç katmanda işliyor:
(1) İstatistiksel yorum. |φ| ≥ 0.30 olduğunda eğik (oblique) döndürmenin tercih edilmesi gerektiği yaygın kabul edilen pratik eşiktir. Burada 0.512 bu eşiğin çok üstünde — yani Promax kararı deneysel olarak da haklılaşıyor. Eğer bu çalışmada Varimax (dik) döndürme tercih edilseydi, Φ’yi sıfıra zorlamış olurduk; bu durumda faktörler “yapay olarak ortogonal” görünür ama gerçek ilişki gizlenirdi (Bölüm 12 Hata 3’ün doğrudan canlı örneği).
(2) Kavramsal yorum. Davranışsal problem boyutları literatürde “büyük çoğunlukla” pozitif korelasyonludur (Achenbach & Edelbrock, 1978). Çocuklarda/ergenlerde içselleştirici ve dışsallaştırıcı problemler sıklıkla aynı bireyde birlikte görülür; depresyon, kaygı, davranış bozukluğu paylaşılan risk faktörleri (genetik yatkınlık, aile dinamikleri, travma) üzerine kurulu. 0.512 bu literatür beklentisine uyumlu.
(3) Kritik öz-eleştiri. Φ = 0.512 değeri “faktörler birbirine oldukça yakın, belki tek bir genel faktör mü?” sorusunu da gündeme getirebilir; ancak ω hesabımız ileride bu soruya cevap verecek (ω_h / ω_t oranı). Daha ilginci: bu çalışmada eğer 3 faktörlü çözüme gidilseydi, içselleştirici-düşünce arası korelasyon muhtemelen 0.50 civarında (yüksek), içselleştirici-dışsal arası 0.40 civarında (orta), düşünce-dışsal arası 0.30 civarında (düşük) çıkacaktı. 2-faktörlü çözümde bu üç korelasyon tek bir 0.512 sayısına “ortalandı” — kuramsal zenginliği bir ölçüde aşındıran ama yine de eğik döndürmeyi savunabilir kılan bir değer.
Eğik döndürme sonrası örüntü matrisi, dik döndürmedekinden farklı anlam taşır: artık katsayılar diğer faktörlerin etkisi kontrol altına alındıktan sonra bireysel (unique) katkıdır — çoklu regresyondaki β ağırlıkları gibi. Faktörler arası korelasyon sıfır olmadığı için örüntü ≠ yapı.
pattern_2 <- as.data.frame(unclass(model_2$loadings)) |>
rownames_to_column("Madde") |>
mutate(across(where(is.numeric), ~round(.x, 3)))
pattern_2$h2 <- round(model_2$communality, 3)
pattern_2$u2 <- round(model_2$uniquenesses, 3)
pattern_2$Karmasiklik <- round(model_2$complexity, 2)
x2_satir_p2 <- which(pattern_2$Madde == "x2")
gt(pattern_2) |>
tab_header(
title = "Model 2 — Örüntü Matrisi (Pattern Matrix, Promax)",
subtitle = "Bir maddenin bir faktöre BİREYSEL (unique) katkısı"
) |>
cols_label(
h2 = "h²", u2 = "u²", Karmasiklik = "Karmaşıklık"
) |>
stil_gt() |>
tab_style(
style = list(cell_fill(color = "#3a2d3d"), cell_text(weight = "bold")),
locations = cells_body(rows = x2_satir_p2)
)| Model 2 — Örüntü Matrisi (Pattern Matrix, Promax) | |||||
| Bir maddenin bir faktöre BİREYSEL (unique) katkısı | |||||
| Madde | PA1 | PA2 | h² | u² | Karmaşıklık |
|---|---|---|---|---|---|
| x1 | 0.562 | 0.142 | 0.418 | 0.582 | 1.13 |
| x2 | 0.018 | 0.780 | 0.623 | 0.377 | 1.00 |
| x3 | 0.623 | 0.099 | 0.461 | 0.539 | 1.05 |
| x4 | 0.566 | 0.165 | 0.443 | 0.557 | 1.17 |
| x5 | -0.055 | 0.819 | 0.627 | 0.373 | 1.01 |
| x6 | 0.610 | -0.050 | 0.343 | 0.657 | 1.01 |
| x7 | 0.757 | 0.015 | 0.584 | 0.416 | 1.00 |
| x8 | -0.018 | 0.748 | 0.546 | 0.454 | 1.00 |
| x9 | 0.640 | -0.098 | 0.355 | 0.645 | 1.05 |
| x10 | 0.656 | -0.099 | 0.373 | 0.627 | 1.05 |
Soru 2.(2) — Promax sonrası x2 örüntü katsayıları yanıtı. Promax döndürme x2 için iki örüntü katsayısı veriyor: PA1 üzerinde 0.018, PA2 üzerinde 0.780.
Bu, döndürmesiz çözümle (PA1 = 0.631, PA2 = −0.475) kıyaslandığında çarpıcı bir manzara: x2’nin PA1 katsayısı neredeyse sıfıra düştü, PA2 katsayısı ise 0.780’e fırladı ve pozitif işaretli oldu. Bu Promax’ın yapmaya çalıştığı şeyin tam da kendisi: basit yapı.
Eğik döndürme sonrası örüntü katsayılarının yorumu çok belirgin bir şekilde değişir: artık katsayılar diğer faktörlerin etkisi sabitlendiğinde maddenin o faktöre bireysel (unique) katkısını gösterir — tıpkı çoklu regresyondaki β ağırlıkları gibi. Yorum şöyle:
Karmaşıklık değeri x2 için 1.00 (mükemmel basit yapı) — bu zaten örüntü katsayılarından açıkça görülüyordu. x2 maddesi (“Aklından çıkaramama / rumination”) iki faktörlü çözümde düşünce/algılama bozukluğu boyutunun ana göstergelerinden biri haline gelmiş.
Burada altını çizmek istediğim kavramsal nokta: aynı x2 maddesinin katsayıları (Model 1: 0.631 ve −0.475 → Model 2: 0.018 ve 0.780) matematiksel olarak aynı çözümün iki farklı koordinat sistemindeki ifadeleridir. Veriden çıkan bilgi miktarı (h² = 0.623) hiç değişmedi — sadece “nereye yazılmış” değişti. Promax’ın yaptığı budur: aynı bilgiyi daha yorumlanabilir bir eksene taşımak.
Yapı matrisi, bir madde ile bir faktör arasındaki iki değişkenli korelasyon katsayısıdır — kontrolsüz ilişki. Eğik döndürmede \(S = \Lambda \Phi\) ilişkisiyle örüntüden hesaplanır. Faktörler arası korelasyon olduğu için yapı katsayıları örüntüden büyük çıkma eğilimindedir; özellikle çapraz yüklemelerde fark belirginleşir.
structure_2 <- as.data.frame(unclass(model_2$Structure)) |>
rownames_to_column("Madde") |>
mutate(across(where(is.numeric), ~round(.x, 3)))
x2_satir_s2 <- which(structure_2$Madde == "x2")
gt(structure_2) |>
tab_header(
title = "Model 2 — Yapı Matrisi (Structure Matrix, Promax)",
subtitle = "Bir madde ile bir faktör arasındaki iki değişkenli korelasyon"
) |>
stil_gt() |>
tab_style(
style = list(cell_fill(color = "#3a2d3d"), cell_text(weight = "bold")),
locations = cells_body(rows = x2_satir_s2)
)| Model 2 — Yapı Matrisi (Structure Matrix, Promax) | ||
| Bir madde ile bir faktör arasındaki iki değişkenli korelasyon | ||
| Madde | PA1 | PA2 |
|---|---|---|
| x1 | 0.635 | 0.429 |
| x2 | 0.418 | 0.789 |
| x3 | 0.674 | 0.418 |
| x4 | 0.651 | 0.455 |
| x5 | 0.364 | 0.790 |
| x6 | 0.584 | 0.262 |
| x7 | 0.764 | 0.402 |
| x8 | 0.364 | 0.738 |
| x9 | 0.590 | 0.229 |
| x10 | 0.605 | 0.237 |
Soru 2.(3) — Promax sonrası x2 yapı katsayıları yanıtı. Yapı matrisinde x2 için iki katsayı var: PA1 = 0.418, PA2 = 0.789.
Yapı katsayıları iki değişkenli (bivariate) korelasyonu gösterir — yani maddenin bir faktörle ilişkisi, diğer faktörlerin etkisi kontrol edilmeden. Matematiksel olarak: \(S = \Lambda \, \Phi\), yani örüntü matrisi ile faktörler arası korelasyon matrisinin çarpımı. Hesaplayalım:
Yorum:
pat_uzun <- as.data.frame(unclass(model_2$loadings)) |>
rownames_to_column("Madde") |>
pivot_longer(-Madde, names_to = "Faktor", values_to = "Pattern")
str_uzun <- as.data.frame(unclass(model_2$Structure)) |>
rownames_to_column("Madde") |>
pivot_longer(-Madde, names_to = "Faktor", values_to = "Structure")
karsilastirma <- left_join(pat_uzun, str_uzun, by = c("Madde", "Faktor")) |>
mutate(
Pattern = round(Pattern, 3),
Structure = round(Structure, 3),
Fark = round(Structure - Pattern, 3)
)
gt(karsilastirma) |>
tab_header(
title = "Örüntü ↔ Yapı Katsayıları Karşılaştırması",
subtitle = "Fark = Structure − Pattern; faktörler arası korelasyondan kaynaklanır"
) |>
cols_label(
Madde = "Madde", Faktor = "Faktör",
Pattern = "Örüntü (λ)", Structure = "Yapı (s)", Fark = "Fark"
) |>
stil_gt()| Örüntü ↔ Yapı Katsayıları Karşılaştırması | ||||
| Fark = Structure − Pattern; faktörler arası korelasyondan kaynaklanır | ||||
| Madde | Faktör | Örüntü (λ) | Yapı (s) | Fark |
|---|---|---|---|---|
| x1 | PA1 | 0.562 | 0.635 | 0.073 |
| x1 | PA2 | 0.142 | 0.429 | 0.287 |
| x2 | PA1 | 0.018 | 0.418 | 0.400 |
| x2 | PA2 | 0.780 | 0.789 | 0.009 |
| x3 | PA1 | 0.623 | 0.674 | 0.051 |
| x3 | PA2 | 0.099 | 0.418 | 0.319 |
| x4 | PA1 | 0.566 | 0.651 | 0.085 |
| x4 | PA2 | 0.165 | 0.455 | 0.290 |
| x5 | PA1 | -0.055 | 0.364 | 0.419 |
| x5 | PA2 | 0.819 | 0.790 | -0.029 |
| x6 | PA1 | 0.610 | 0.584 | -0.026 |
| x6 | PA2 | -0.050 | 0.262 | 0.312 |
| x7 | PA1 | 0.757 | 0.764 | 0.007 |
| x7 | PA2 | 0.015 | 0.402 | 0.387 |
| x8 | PA1 | -0.018 | 0.364 | 0.382 |
| x8 | PA2 | 0.748 | 0.738 | -0.010 |
| x9 | PA1 | 0.640 | 0.590 | -0.050 |
| x9 | PA2 | -0.098 | 0.229 | 0.327 |
| x10 | PA1 | 0.656 | 0.605 | -0.051 |
| x10 | PA2 | -0.099 | 0.237 | 0.336 |
Maddelerin birincil faktöründe örüntü ve yapı katsayıları çok yakın (örn. x7 PA1: 0.757 vs 0.764, fark 0.007; x5 PA2: 0.819 vs 0.790). Buna karşılık ikincil (zayıf) faktörde fark belirginleşiyor: x2 PA1 için örüntü 0.018 ama yapı 0.418 — fark 0.400! x5 PA1 için fark 0.419, x8 PA1 için 0.382, x6 PA2 için 0.312…
Bu sistematik fark tek bir matematiksel olgudan geliyor: yapı = örüntü + (faktörler arası korelasyon × diğer faktörlere yükler). Yani Φ ne kadar büyükse, ikincil faktördeki yapı-örüntü farkı da o kadar büyür. Burada Φ = 0.512 olduğu için fark genellikle 0.30–0.40 aralığında.
Hangisini raporlamalı?
Bu çalışmada her ikisi de raporlanmıştır, çünkü ikisi farklı soruların yanıtı:
Eğer yalnız birini raporlamak gerekseydi, örüntü matrisi yorumlanabilirlik için tercih edilir; ancak şeffaflık ilkesi gereği ikisini birlikte sunmak daha doğrudur. Bu, Tabachnick & Fidell (2019) ve Thompson’ın (2004) ortak önerisi.
v_acc_2 <- as.data.frame(model_2$Vaccounted) |>
rownames_to_column("Olcu") |>
mutate(across(where(is.numeric), ~round(.x, 3)))
gt(v_acc_2) |>
tab_header(
title = "Model 2 — Açıklanan Varyans (Promax sonrası)",
subtitle = "Toplam varyans değişmez; faktörler arası dağılım yeniden hesaplanır"
) |>
stil_gt()| Model 2 — Açıklanan Varyans (Promax sonrası) | ||
| Toplam varyans değişmez; faktörler arası dağılım yeniden hesaplanır | ||
| Olcu | PA1 | PA2 |
|---|---|---|
| SS loadings | 2.834 | 1.939 |
| Proportion Var | 0.283 | 0.194 |
| Cumulative Var | 0.283 | 0.477 |
| Proportion Explained | 0.594 | 0.406 |
| Cumulative Proportion | 0.594 | 1.000 |
Tablo iki temel olguyu netleştiriyor:
(1) Toplam açıklanan varyans değişmiyor. Model 1’de %47.7 olan birikimli varyans Model 2’de yine %47.7 (Cumulative Var = 0.477). Döndürme matematiksel olarak yalnızca bir koordinat dönüşümüdür; veriden çıkan ortak varyans miktarına dokunmaz, sadece bu varyansı faktörler arasında yeniden dağıtır.
(2) Faktörler arası dağılım dengelenir. Model 1’de PA1 %37.0, PA2 %10.8 (ezici PA1 baskınlığı) idi; Promax sonrası PA1 %28.3, PA2 %19.4 — daha eşit bir dağılım. Bu, dik döndürmesiz çözümde “birinci faktör her şeyi topluyor” tipik örüntüsünün, eğik döndürme ile “her faktör asıl temasını topluyor” örüntüsüne geçişinin sayısal ifadesi.
Önemli not: Promax sonrası açıklanan varyans yüzdeleri eğik çözümde “yorumsal” değer taşır; faktörler korelasyonlu olduğu için bu yüzdeler birbirine eklenip “birikimli” diye okunduğunda toplam varyansa eşit olmaz aslında — örtüşen kısımlar var. Buradaki tabloda psych paketi paylaşılan varyansı dik kabul ederek raporluyor; doktora seviyesi bir yazıda bu nüans not düşülmelidir. (Bkz. Brown, 2015, s. 31–33.)
Rotasyonun amacı genel olarak açıklanacak ve mevcut sonuçlara dayanarak bu amacın gerçekleşip gerçekleşmediği değerlendirilecek.
Faktör döndürmenin amacı Thurstone’un “basit yapı” (simple structure) idealine ulaşmaktır: her madde yalnızca bir faktöre yüklensin (komşu yükler küçük olsun, baskın yük büyük olsun). Döndürme model uyumunu (toplam \(h^2\), açıklanan varyans, artıklar) değiştirmez — yalnızca faktörlerin yorumlanabilirliğini artırır.
Hofmann karmaşıklık endeksi (Complexity), her maddenin kaç faktöre anlamlı yüklendiğini özetler. Basit yapıda her madde karmaşıklık ≈ 1 olmalıdır. Karmaşıklık 2’ye yaklaşıyorsa madde iki faktör arasında “bölünmüş” demektir.
\[\text{Complexity}_i = \frac{(\sum \lambda_{ij}^2)^2}{\sum \lambda_{ij}^4}\]
karmasiklik_df <- data.frame(
Madde = names(model_1$complexity),
Model_1 = round(as.numeric(model_1$complexity), 2),
Model_2 = round(as.numeric(model_2$complexity), 2),
Iyilesme = round(as.numeric(model_1$complexity) - as.numeric(model_2$complexity), 2),
stringsAsFactors = FALSE
)
# Ortalama satırını ekle
karmasiklik_df <- rbind(
karmasiklik_df,
data.frame(
Madde = "ORTALAMA",
Model_1 = round(mean(model_1$complexity), 2),
Model_2 = round(mean(model_2$complexity), 2),
Iyilesme = round(mean(model_1$complexity) - mean(model_2$complexity), 2),
stringsAsFactors = FALSE
)
)
gt(karmasiklik_df) |>
tab_header(
title = "Madde Karmaşıklığı: Model 1 ↔ Model 2",
subtitle = "1'e yakın değer = basit yapı; düşüş = döndürme amacının gerçekleşmesi"
) |>
cols_label(
Model_1 = "Model 1 (Döndürmesiz)",
Model_2 = "Model 2 (Promax)",
Iyilesme = "İyileşme (M1 − M2)"
) |>
stil_gt() |>
tab_style(
style = list(cell_fill(color = "#2e3557"), cell_text(weight = "bold")),
locations = cells_body(rows = nrow(karmasiklik_df))
)| Madde Karmaşıklığı: Model 1 ↔ Model 2 | |||
| 1'e yakın değer = basit yapı; düşüş = döndürme amacının gerçekleşmesi | |||
| Madde | Model 1 (Döndürmesiz) | Model 2 (Promax) | İyileşme (M1 − M2) |
|---|---|---|---|
| x1 | 1.06 | 1.13 | -0.06 |
| x2 | 1.86 | 1.00 | 0.86 |
| x3 | 1.12 | 1.05 | 0.07 |
| x4 | 1.05 | 1.17 | -0.12 |
| x5 | 1.97 | 1.01 | 0.96 |
| x6 | 1.42 | 1.01 | 0.41 |
| x7 | 1.26 | 1.00 | 0.26 |
| x8 | 1.93 | 1.00 | 0.92 |
| x9 | 1.57 | 1.05 | 0.52 |
| x10 | 1.56 | 1.05 | 0.52 |
| ORTALAMA | 1.48 | 1.05 | 0.43 |
Soru 2.(4) — Rotasyonun amacı ve gerçekleşmesi yanıtı.
Rotasyonun amacı, Thurstone’un (1947) “basit yapı” (simple structure) idealine yaklaşmaktır. Basit yapıda her madde tercihen tek bir faktöre güçlü yüklenir; diğer faktörlerdeki yükleri sıfıra yakın kalır. Bu, hem yorumlanabilirliği artırır hem de gizil boyutların kuramsal olarak ayrıştırılmasını sağlar. Önemli olan şudur: döndürme model uyumunu değiştirmez — toplam communality, açıklanan varyans, artık matrisi ve modelin uyum göstergelerinin hepsi sabit kalır. Değişen yalnızca yüklerin “hangi faktöre yazıldığıdır”.
Gerçekleşti mi? Tabloya bakıldığında gerçekleşti, hem de net biçimde. Hofmann karmaşıklık endeksi (item complexity) ortalama 1.48’den 1.05’e düştü, yani 0.43 birim iyileşme — bu büyük bir düşüş. Madde-madde kırılım da öğretici:
Bu örüntü Promax’ın klasik dinamiğini gösteriyor: döndürme öncesi “orta yerde duran” maddeler (yani PA2’de yüksek mutlak değer taşıyan x2, x5, x8 ve PA1’in ikinci tabakası x6, x9, x10) en çok fayda gördü; zaten net olan maddeler (x1, x3, x4, x7) zaten yerindeydi.
Sonuç olarak rotasyonun amacı yüksek başarıyla gerçekleşmiştir — ortalama karmaşıklık 1’e çok yakın,“her madde yalnızca bir faktör temsil etmeli” kriteri karşılanıyor. Tek küçük istisna x1 ve x4’ün PA2’ye gevşek yüklenmesi (yapı katsayıları 0.43–0.46), ki bu da içselleştirici-düşünce kuramsal yakınlığının kalıntısı olarak okunabilir.
if (n_faktor >= 2) {
# Yük matrisleri (sadece ilk iki faktör)
m1_mat <- as.matrix(unclass(model_1$loadings))[, 1:2]
m2_mat <- as.matrix(unclass(model_2$loadings))[, 1:2]
yuk_birlesik <- bind_rows(
data.frame(
Madde = rownames(m1_mat),
F1 = m1_mat[, 1],
F2 = m1_mat[, 2],
Model = "Model 1: Döndürmesiz"
),
data.frame(
Madde = rownames(m2_mat),
F1 = m2_mat[, 1],
F2 = m2_mat[, 2],
Model = "Model 2: Promax"
)
)
ggplot(yuk_birlesik, aes(x = F1, y = F2, label = Madde, color = Model)) +
geom_hline(yintercept = 0, color = "#3a4060", linetype = "dashed") +
geom_vline(xintercept = 0, color = "#3a4060", linetype = "dashed") +
geom_point(size = 3) +
ggrepel::geom_text_repel(size = 4, max.overlaps = 20) +
scale_color_manual(values = c("Model 1: Döndürmesiz" = "#d4a560",
"Model 2: Promax" = "#7eb8d4")) +
facet_wrap(~ Model) +
labs(
title = "Faktör Yük Grafiği — Döndürme Öncesi vs Sonrası",
subtitle = "Promax sonrası maddelerin eksenlere daha yakın kümelenmesi 'basit yapı'nın işaretidir",
x = "Faktör 1",
y = "Faktör 2"
) +
tema_afa +
theme(legend.position = "none")
}Yük grafiği, karmaşıklık tablosundaki sayısal iyileşmeyi görsel olarak belgeliyor. Sol panelde (Model 1, döndürmesiz) maddeler hilal benzeri bir bantta dağılmışlar — hepsi yatay eksende yüksek ama düşey eksende kuramsal anlamı belirsiz şekilde dağılmış. x2, x5, x8 negatif PA2 yarısında, x6-x10 pozitif PA2 yarısında ama hiçbiri gerçek bir “küme” oluşturmuyor.
Sağ panelde (Model 2, Promax) tablo çarpıcı biçimde değişmiş: maddeler iki belirgin küme halinde toplanmış. Yatay eksene (PA1) yapışık büyük küme x1, x3, x4, x6, x7, x9, x10 (yedi madde) — düşey eksende sıfıra yakın. Düşey eksene (PA2) yapışık küçük küme x2, x5, x8 (üç madde) — yatay eksende sıfıra yakın. Bu, basit yapının geometrik somutlamasıdır: maddeler bir eksene ne kadar “yapışık” o kadar net yorumlanabilir.
Tek şey gözden kaçmamalı: 7 maddelik PA1 kümesi içinde iki alt-küme hâlâ seçilebilir — x1, x3, x4, x7 biraz daha yukarıda (PA2 = 0.10–0.17), x6, x9, x10 biraz aşağıda (PA2 = −0.05 ile −0.10). 2-faktörlü çözüm bu iki blok arasındaki kuramsal farkı tek bir eksende ezdi; dikkatli bir okur grafikte bile 3. faktörün yokluğunu hissedebilir.
Promax döndürme sonrası örüntü matrisine dayanarak her faktörün anlamı yorumlanacak. Hangi maddeler hangi faktöre güçlü yüklenmiş, bu maddelerin ortak teması nedir, faktöre kavramsal olarak ne ad verilebilir?
# Yük matrisi (sadece sayısal sütunlar)
yuk_mat <- as.matrix(unclass(model_2$loadings))
# Her madde için baskın faktör (en yüksek |yük|) ve değeri
baskin_idx <- apply(yuk_mat, 1, function(x) which.max(abs(x)))
baskin_faktor <- colnames(yuk_mat)[baskin_idx]
baskin_yuk <- mapply(function(i, j) yuk_mat[i, j],
seq_len(nrow(yuk_mat)), baskin_idx)
# Madde içerikleri
madde_icerik <- c(
x1 = "Kendini değersiz hissetme",
x2 = "Aklından çıkaramama",
x3 = "Üzgün hissetme",
x4 = "Endişeli hissetme",
x5 = "Bazı şeyler duyma",
x6 = "Kaçma",
x7 = "Sevilmediğini hissetme",
x8 = "Garip fikirler",
x9 = "Kaçak / aylak",
x10 = "Birçok kavgaya karışma"
)
faktor_yorum <- data.frame(
Madde = rownames(yuk_mat),
Icerik = madde_icerik[rownames(yuk_mat)],
Baskin_Faktor = baskin_faktor,
Baskin_Yuk = round(baskin_yuk, 3),
stringsAsFactors = FALSE
) |>
arrange(Baskin_Faktor, desc(abs(Baskin_Yuk)))
gt(faktor_yorum) |>
tab_header(
title = "Maddelerin Baskın Faktörlere Atanması",
subtitle = "Her maddenin en güçlü yüklendiği faktör"
) |>
cols_label(
Madde = "Madde", Icerik = "İçerik",
Baskin_Faktor = "Baskın Faktör", Baskin_Yuk = "Yük"
) |>
stil_gt()| Maddelerin Baskın Faktörlere Atanması | |||
| Her maddenin en güçlü yüklendiği faktör | |||
| Madde | İçerik | Baskın Faktör | Yük |
|---|---|---|---|
| x7 | Sevilmediğini hissetme | PA1 | 0.757 |
| x10 | Birçok kavgaya karışma | PA1 | 0.656 |
| x9 | Kaçak / aylak | PA1 | 0.640 |
| x3 | Üzgün hissetme | PA1 | 0.623 |
| x6 | Kaçma | PA1 | 0.610 |
| x4 | Endişeli hissetme | PA1 | 0.566 |
| x1 | Kendini değersiz hissetme | PA1 | 0.562 |
| x5 | Bazı şeyler duyma | PA2 | 0.819 |
| x2 | Aklından çıkaramama | PA2 | 0.780 |
| x8 | Garip fikirler | PA2 | 0.748 |
Soru 2.(5) — Faktörlerin yorumlanması yanıtı.
Faktör 1 (PA1) — “Genel Davranış Problemi” boyutu: Yedi madde bu faktöre baskın yüklendi (örüntü katsayılarına göre): x7 (Sevilmediğini hissetme, 0.757), x10 (Kavgaya karışma, 0.656), x9 (Kaçaklık, 0.640), x3 (Üzgün hissetme, 0.623), x6 (Kaçma, 0.610), x4 (Endişeli hissetme, 0.566), x1 (Değersiz hissetme, 0.562).
Bu küme kuramsal olarak heterojen — içinde hem içselleştirici duygu durum maddeleri (x1, x3, x4, x7: depresif duygulanım, sevilmeme hissi, kaygı) hem dışsallaştırıcı davranışsal maddeler (x6, x9, x10: kaçma, kaçaklık, kavga) bir arada. Buna en muhafazakâr şekilde “Genel davranış problemi / psikososyal sıkıntı” adı verilebilir; ama kuramsal olarak bu bir karışım faktördür — veriden çıkan ses çok daha iki ayrı boyut diyor (içsel + dışsal).
Faktör 2 (PA2) — “Düşünce / Algı Bozukluğu” boyutu: Üç madde bu faktöre baskın yüklendi: x5 (Bazı şeyler duyma, 0.819), x2 (Aklından çıkaramama, 0.780), x8 (Garip fikirler, 0.748). Bu küme çok homojen ve yorumlanabilir: tüm maddeler bilişsel- algısal süreçlerle ilgili (varsanı benzeri, ruminatif, alışılmadık düşünceler). Klinik literatürdeki “düşünce bozukluğu” / “psikoz-benzeri yaşantılar” boyutuna karşılık geliyor (Achenbach Thought Problems alt ölçeğine yakın).
Beklenti ↔︎ bulgu karşılaştırması: Başlangıçtaki kuramsal beklentide x5 ve x8’in soru işaretliydi (yorumda “?” konmuştu); şimdi veri açıkça bu maddelerin x2 ile birlikte üçüncü, ayrı bir boyut oluşturduğunu söylüyor. Bu, özellikle ilgi çekici çünkü x2 (“rumination / aklından çıkaramama”) ilk bakışta içselleştirici gibi durur, ama korelasyon matrisinden ve örüntü katsayılarından çıkan veri açıkça x2’yi düşünce bloğuyla eşleştiriyor.
Beklenmeyen atanma: x6, x9, x10 (dışsallaştırıcı) maddeler 2-faktörlü çözümde içsel maddelerle aynı PA1’e bindi. Beklenen ama bulunmayan sonuç: dışsallaştırıcı boyutu ayrı bir faktör olarak çıkamadı. Yapı katsayılarına bakıldığında bu maddelerin PA1 ile korelasyonu (0.58–0.61) içsel maddelerinki (0.63–0.76) kadar yüksek değil; faktör atanması “baskın” değil “zorla” gerçekleşmiş gibi duruyor. Üçüncü bir faktöre bu maddelerin geçişi, modern eklentiler bölümünde EGA tarafından netleştirilecek.
Toplam tablo: 2-faktörlü çözüm “Düşünce” boyutunu temiz şekilde çıkardı, ama “İçselleştirici” ve “Dışsallaştırıcı” boyutlarını ayırt edemedi.
Bu bölüm çağdaş yaklaşımları içerir. Klasik AFA’nın yerini almaz, triangulation (üçgenleme) sağlar: aynı veriye birden fazla yöntemle bakıp bulguların sağlamlığını test eder. Bölüm 12’deki “yaygın hatalar” listesindeki bazı tuzakları (özellikle Hata 7 — “tek veri setinde AFA + DFA döngüsel doğrulama”) da farklı yöntemlerle aşmaya çalışır.
EGA (Exploratory Graph Analysis; Golino & Epskamp, 2017), faktör analizine paradigma dışı bir alternatiftir. Klasik AFA’nın gizil değişken çerçevesinin aksine, maddeler arası kısmi korelasyonlardan oluşan bir ağ (network) kurar; ağdaki topluluk yapısını (community structure) Walktrap veya Louvain algoritmalarıyla bulur. Her topluluk bir “boyut” kabul edilir.
EGA’nın AFA’ya getirdikleri:
ega_ozet <- data.frame(
Olcu = c("Önerilen boyut sayısı",
"Düğüm (madde) sayısı",
"Kenar (anlamlı ilişki) sayısı",
"Kenar yoğunluğu"),
Deger = c(ega_sonuc$n.dim,
length(ega_sonuc$wc),
sum(ega_sonuc$network != 0) / 2,
round(sum(ega_sonuc$network != 0) /
(length(ega_sonuc$wc) * (length(ega_sonuc$wc) - 1)), 3))
)
gt(ega_ozet) |>
tab_header(
title = "EGA Özet Sonuçları",
subtitle = "GLASSO + Walktrap algoritması"
) |>
cols_label(Olcu = "Ölçü", Deger = "Değer") |>
stil_gt()| EGA Özet Sonuçları | |
| GLASSO + Walktrap algoritması | |
| Ölçü | Değer |
|---|---|
| Önerilen boyut sayısı | 3.000 |
| Düğüm (madde) sayısı | 10.000 |
| Kenar (anlamlı ilişki) sayısı | 31.000 |
| Kenar yoğunluğu | 0.689 |
topluluk_df <- data.frame(
Madde = names(ega_sonuc$wc),
Icerik = madde_icerik[names(ega_sonuc$wc)],
EGA_Topluluk = ega_sonuc$wc
) |>
arrange(EGA_Topluluk)
gt(topluluk_df) |>
tab_header(
title = "EGA — Madde-Topluluk Atanması",
subtitle = "Her madde hangi ağ topluluğuna düşüyor?"
) |>
cols_label(
Madde = "Madde", Icerik = "İçerik",
EGA_Topluluk = "Topluluk (Boyut)"
) |>
stil_gt()| EGA — Madde-Topluluk Atanması | ||
| Her madde hangi ağ topluluğuna düşüyor? | ||
| Madde | İçerik | Topluluk (Boyut) |
|---|---|---|
| x1 | Kendini değersiz hissetme | 1 |
| x3 | Üzgün hissetme | 1 |
| x4 | Endişeli hissetme | 1 |
| x7 | Sevilmediğini hissetme | 1 |
| x2 | Aklından çıkaramama | 2 |
| x5 | Bazı şeyler duyma | 2 |
| x8 | Garip fikirler | 2 |
| x6 | Kaçma | 3 |
| x9 | Kaçak / aylak | 3 |
| x10 | Birçok kavgaya karışma | 3 |
EGA, klasik AFA’nın kaçırdığı yapıyı ders kitabı netliğinde çıkardı: 3 boyut, ve maddelerin atanması korelasyon matrisinde gözlediğimiz blokları birebir yansıtıyor:
Bu, AFA’nın (Promax) sunduğu “x6, x9, x10 + içsel maddeler hep PA1’e” örüntüsünü kökten reddediyor. EGA, maddeler arası kısmi korelasyonlardan oluşan bir ağda topluluk yapısı arar; gizil değişken varsayımı yapmaz. Buna rağmen — daha doğrusu tam da bu yüzden — veriden çıkan sinyali daha temiz okuyor: 2-faktörlü AFA’nın “birinci faktöre fazla yükleme” zorlamasından muaf çünkü EGA zaten parametrik faktör sayısı dayatmıyor.
Üç faktörlü AFA çözümü denenseydi sonuçların EGA topluluklarıyla neredeyse birebir örtüşmesi beklenirdi. EGA bu çalışmada kuramsal beklentinin ötesine geçen bir bulgu sunuyor: yalnızca içsel/dışsal ayrımı değil, ek olarak düşünce/algı boyutunun da veri-odaklı olarak doğrulanması. Bu, başlangıçtaki “x5 ve x8 ne olacak?” sorusuna kesin cevap.
Kenar yoğunluğu = 0.689 — yani 10 düğümlü ağdaki olası 45 kenarın %69’u istatistiksel olarak anlamlı. Bu yüksek bir yoğunluk; maddelerin birbiriyle güçlü kısmi korelasyonları olduğunu ve toplulukların gerçekten “yoğun mahalleler” oluşturduğunu söylüyor.
bootEGA, boyut sayısının ve madde-topluluk eşleşmelerinin örnekleme tekrarlanabilirliğini test eder. Parametrik veya parametrik olmayan bootstrap ile çoklu replikasyonlar üretir; hangi sayının ne sıklıkta önerildiğini ve her maddenin orijinal topluluğunda ne sıklıkta kaldığını raporlar.
set.seed(2026)
boot_ega_sonuc <- bootEGA(
data = veri,
iter = 500,
type = "parametric",
typicalStructure = TRUE,
plot.typicalStructure = TRUE
)# bootEGA çıktısının yapısı EGAnet sürümüne göre değişebilir.
# Defensive erişim: birden fazla olası alanı kontrol et.
tipik_n <- boot_ega_sonuc$EGA$n.dim
medyan_n <- if (!is.null(boot_ega_sonuc$summary.table$median)) {
boot_ega_sonuc$summary.table$median
} else if (!is.null(boot_ega_sonuc$frequency)) {
# Frekans tablosundan en sık görülen
as.numeric(names(which.max(boot_ega_sonuc$frequency)))
} else {
NA
}
boot_ozet <- data.frame(
Olcu = c("Tipik yapı boyut sayısı (orijinal EGA)",
"Bootstrap dağılımının medyanı",
"Bootstrap iterasyon sayısı"),
Deger = c(tipik_n, medyan_n, 500)
)
gt(boot_ozet) |>
tab_header(
title = "Bootstrap EGA — Boyut Sayısı Sağlamlığı",
subtitle = "500 parametrik bootstrap iterasyonu"
) |>
cols_label(Olcu = "Ölçü", Deger = "Değer") |>
stil_gt()| Bootstrap EGA — Boyut Sayısı Sağlamlığı | |
| 500 parametrik bootstrap iterasyonu | |
| Ölçü | Değer |
|---|---|
| Tipik yapı boyut sayısı (orijinal EGA) | 3 |
| Bootstrap dağılımının medyanı | 3 |
| Bootstrap iterasyon sayısı | 500 |
# itemStability çıktısı da EGAnet sürümüne göre farklılaşabilir
stability_sonuc <- tryCatch(
itemStability(boot_ega_sonuc),
error = function(e) NULL
)if (!is.null(stability_sonuc)) {
# Yeni versiyonlarda: $item.stability$empirical.dimensions
# Eski versiyonlarda: $items doğrudan
stab_vec <- if (!is.null(stability_sonuc$item.stability$empirical.dimensions)) {
stability_sonuc$item.stability$empirical.dimensions
} else if (!is.null(stability_sonuc$items)) {
stability_sonuc$items
} else {
NULL
}
if (!is.null(stab_vec)) {
stab_df <- data.frame(
Madde = names(stab_vec),
Icerik = madde_icerik[names(stab_vec)],
Stabilite = round(as.numeric(stab_vec), 3)
)
gt(stab_df) |>
tab_header(
title = "Madde-Topluluk Sağlamlığı (itemStability)",
subtitle = "Her maddenin orijinal topluluğunda kalma oranı (0–1 arası)"
) |>
cols_label(
Madde = "Madde", Icerik = "İçerik", Stabilite = "Stabilite"
) |>
stil_gt()
}
}| Madde-Topluluk Sağlamlığı (itemStability) | ||
| Her maddenin orijinal topluluğunda kalma oranı (0–1 arası) | ||
| Madde | İçerik | Stabilite |
|---|---|---|
| x1 | Kendini değersiz hissetme | 1 |
| x2 | Aklından çıkaramama | 1 |
| x3 | Üzgün hissetme | 1 |
| x4 | Endişeli hissetme | 1 |
| x5 | Bazı şeyler duyma | 1 |
| x6 | Kaçma | 1 |
| x7 | Sevilmediğini hissetme | 1 |
| x8 | Garip fikirler | 1 |
| x9 | Kaçak / aylak | 1 |
| x10 | Birçok kavgaya karışma | 1 |
Bootstrap EGA, EGA’nın 3-boyutlu yapısının örnekleme sağlam olup olmadığını sınadı; sonuç olağanüstü güçlü: 500 parametrik bootstrap iterasyonunun medyanı yine 3 boyut, ve 10 maddenin hepsi 1.00 stabilite skoruyla orijinal topluluklarında kaldı. Stabilite skoru, bir maddenin bootstrap iterasyonları boyunca orijinal topluluğunda kalma oranıdır; 0.75 üzeri “kararlı”, 0.50–0.75 “şüpheli”, 0.50 altı “kararsız” kabul edilir (Christensen & Golino, 2021). Burada her madde mükemmel sağlamlık (1.00) gösteriyor.
Bu çıktının ne anlama geldiğini açıkça söylemek gerek: 3-boyutlu yapı bu veride istatistiksel olarak son derece sağlam. Aynı süreç, aynı dağılımdan çekilmiş 500 farklı örneklemde de aynı yapı ortaya çıkıyor. Bu, 2-faktörlü AFA çözümünün artık matrisinde gördüğümüz uyumsuzluğun “rastgele örneklem dalgalanması” değil gerçek bir model-yapı uyuşmazlığı olduğunun en temiz kanıtı.
Pratik çıkarım: Bu veri 200 birey gibi mütevazı bir örneklemde bile 3 boyutlu yapıyı bu kadar sağlam veriyorsa, daha büyük bir örneklemde DFA ile sınanması durumunda da 3-faktörlü model çok muhtemelen iyi uyum gösterecektir. Bu, kuramsal modelin gücüne dair güçlü bir ön-kanıt — gelecekteki bir CFA çalışması için hipotez kurarken bu bulguya doğrudan dayanılabilir.
McDonald’s ω (1999), Cronbach α’nın tau-eşdeğerlik (tüm yükler eşit) ve tek-faktörlülük varsayımlarına ihtiyaç duymadan güvenirlik tahmini yapar. Bifactor model çatısında hesaplanır:
# omega() bifactor mantığı için en az 3 alt faktör ister.
# n_faktor < 3 ise omega yine çalışır ama bifactor yapısı zayıflar.
# Bu durumda omega'yı 3 ile zorlamak yerine hesabın anlamlı olduğu
# n_faktor değerinde çalıştırıyoruz; çıktı tek boyutluluk göstergesi olarak
# yorumlanacak.
omega_sonuc <- tryCatch(
omega(
veri,
nfactors = max(n_faktor, 3), # bifactor için minimum 3
fm = "pa",
rotate = "promax",
plot = TRUE
),
error = function(e) {
message("omega() çağrısı başarısız: ", e$message)
NULL
}
)# Cronbach alpha (her durumda hesapla — karşılaştırma için)
alpha_sonuc <- tryCatch(
psych::alpha(veri, check.keys = TRUE),
error = function(e) NULL
)
cron_alpha <- if (!is.null(alpha_sonuc)) {
as.numeric(alpha_sonuc$total$raw_alpha)
} else NA
# omega çıktı isimleri sürüme göre değişebiliyor: omega.tot, omega_t, omega.t
om_t <- if (!is.null(omega_sonuc)) {
omega_sonuc$omega.tot %||% omega_sonuc$omega_t %||% NA
} else NA
om_h <- if (!is.null(omega_sonuc)) {
omega_sonuc$omega_h %||% omega_sonuc$omega.h %||% NA
} else NA
omega_df <- data.frame(
Olcu = c("ω_total (Tüm güvenilir varyans)",
"ω_hierarchical (Yalnız genel faktör)",
"ω_h / ω_t oranı (tek-boyutluluk)",
"Cronbach α (karşılaştırma için)"),
Deger = c(round(om_t, 3),
round(om_h, 3),
if (!is.na(om_t) && !is.na(om_h) && om_t > 0) round(om_h / om_t, 3) else NA,
round(cron_alpha, 3))
)
gt(omega_df) |>
tab_header(
title = "McDonald's Omega Güvenirlik Endeksleri",
subtitle = "Bifactor modeline dayalı çağdaş güvenirlik raporu"
) |>
cols_label(Olcu = "Ölçü", Deger = "Değer") |>
stil_gt()| McDonald's Omega Güvenirlik Endeksleri | |
| Bifactor modeline dayalı çağdaş güvenirlik raporu | |
| Ölçü | Değer |
|---|---|
| ω_total (Tüm güvenilir varyans) | 0.903 |
| ω_hierarchical (Yalnız genel faktör) | 0.657 |
| ω_h / ω_t oranı (tek-boyutluluk) | 0.728 |
| Cronbach α (karşılaştırma için) | 0.844 |
Omega çıktısı dört değer veriyor; her biri farklı bir soruyu yanıtlıyor:
Bütünleşik yorum: Veri, hem güçlü bir genel faktör hem de ayırt edilebilir alt boyutlar barındırıyor — bu da klinik literatürde “bifactor” yapıların tipik görüntüsüdür (Reise vd., 2010). Eğer bu çalışma bir CFA aşamasına geçseydi, yalnız 3-faktör korelasyonlu model değil, bifactor model (genel faktör + 3 alt faktör) de aday olarak değerlendirilmeliydi. Bu yansımada açacağım modern bir soruşturma yönü.
Takane ve de Leeuw (1987), kategorik veriler için polikorik korelasyonlar üzerinden yapılan AFA’nın 2-parametreli normal-ogive IRT modeline matematiksel olarak denk olduğunu kanıtladı:
mirt paketi (Chalmers, 2012) bu birleşimi pratik olarak
somutlar. Davranış problemi maddeleri büyük olasılıkla ordinal ölçek
düzeyindedir — bu da Pearson yerine polikorik
korelasyon ile analiz yapmayı (Bölüm 12 Hata
1’in dışa-dönük versiyonu) gerektirir.
# Madde tipi tespiti: her sütundaki unique değer sayısı
unique_per_item <- sapply(veri, function(x) length(unique(x[!is.na(x)])))
unique_max <- max(unique_per_item)
madde_tipi <- if (unique_max == 2) "2PL" else "graded"
cat("Madde başına unique değer sayıları:\n")
print(unique_per_item)
cat("\nTespit edilen madde tipi:", madde_tipi, "\n")
# Exploratory IFA — model argümanı integer olduğunda mirt EFA modunu açar
fit_ifa <- tryCatch(
mirt(
data = veri,
model = n_faktor,
itemtype = madde_tipi,
method = "EM",
verbose = FALSE
),
error = function(e) {
message("mirt() başarısız oldu: ", e$message)
NULL
}
)# mirt'in summary() çıktısı sürümler arasında oldukça farklı yapılarda gelebiliyor
# (rotF bazen matris, bazen list-içi-matris, bazen extra "x" kolonlu).
# En sağlam yol: yükleri doğrudan coef()'ten çekmek.
# Graded model için coef()$items: a1, a2, ..., aF (slopes = yükler), d1, d2, ... (kesimler)
# 2PL için coef()$items: a1, ..., aF, d (kesim), g, u
if (!is.null(fit_ifa)) {
# 1) Önce summary'i deneyelim (rotated yükler için)
ifa_load_mat <- tryCatch({
sm <- if (n_faktor >= 2) {
summary(fit_ifa, rotate = "promax", suppress = 0, verbose = FALSE)
} else {
summary(fit_ifa, verbose = FALSE)
}
cand <- sm$rotF %||% sm$F %||% sm$loadings
if (!is.null(cand)) {
m <- as.matrix(unclass(cand))
storage.mode(m) <- "numeric"
# Yalnızca nfact kadar kolon kalsın (extra h2 vb. olabilir)
if (ncol(m) > n_faktor) m <- m[, seq_len(n_faktor), drop = FALSE]
m
} else NULL
}, error = function(e) {
message("summary()'den yük çıkarılamadı: ", e$message)
NULL
})
# 2) summary başarısızsa coef()'ten slope kolonlarını çıkar (rotation YOK)
if (is.null(ifa_load_mat)) {
co <- coef(fit_ifa, simplify = TRUE)$items
a_cols <- grep("^a[0-9]+$", colnames(co), value = TRUE)
if (length(a_cols) >= 1) {
ifa_load_mat <- as.matrix(co[, a_cols, drop = FALSE])
colnames(ifa_load_mat) <- paste0("F", seq_len(ncol(ifa_load_mat)))
message("NOT: Yükler döndürmesiz slope (a) parametrelerinden alındı.")
}
}
if (!is.null(ifa_load_mat)) {
# Madde isimleri: rownames yoksa veri sütun adları
madde_ad <- rownames(ifa_load_mat)
if (is.null(madde_ad) || length(madde_ad) != nrow(ifa_load_mat)) {
madde_ad <- names(veri)
}
# Base R ile data frame inşa (dplyr/across zincirinden kaçınmak için)
ifa_F <- data.frame(
Madde = madde_ad,
round(ifa_load_mat, 3),
stringsAsFactors = FALSE,
check.names = FALSE
)
gt(ifa_F) |>
tab_header(
title = "IFA — Polikorik Tabanlı Faktör Yükleri",
subtitle = "AFA dilinde: λ değerleri (yüklemeler)"
) |>
stil_gt()
} else {
cat("IFA yük matrisi çıkarılamadı.\n")
}
} else {
cat("IFA modeli kurulamadı; bu bölüm atlanıyor.\n")
ifa_load_mat <- NULL
}| IFA — Polikorik Tabanlı Faktör Yükleri | ||
| AFA dilinde: λ değerleri (yüklemeler) | ||
| Madde | F1 | F2 |
|---|---|---|
| x1 | -0.238 | 0.888 |
| x2 | 0.204 | 0.457 |
| x3 | -0.088 | 0.830 |
| x4 | 0.036 | 0.717 |
| x5 | 0.250 | 0.455 |
| x6 | 0.917 | -0.166 |
| x7 | -0.009 | 0.726 |
| x8 | 0.129 | 0.477 |
| x9 | 0.738 | -0.065 |
| x10 | 0.707 | -0.008 |
if (!is.null(fit_ifa)) {
ifa_param <- coef(fit_ifa, IRTpars = TRUE, simplify = TRUE)
# Items matrisini güvenli şekilde data frame'e dönüştür
items_mat <- as.matrix(ifa_param$items)
storage.mode(items_mat) <- "numeric"
ifa_a_b <- data.frame(
Madde = rownames(items_mat) %||% names(veri),
round(items_mat, 3),
stringsAsFactors = FALSE,
check.names = FALSE
)
gt(ifa_a_b) |>
tab_header(
title = "IFA — IRT Parametrelendirmesi",
subtitle = "a = ayırt edicilik (≈ AFA yükü); b = güçlük (≈ kesim noktası)"
) |>
stil_gt()
} else {
cat("IRT parametreleri hesaplanamadı.\n")
}| IFA — IRT Parametrelendirmesi | ||||||||||||||
| a = ayırt edicilik (≈ AFA yükü); b = güçlük (≈ kesim noktası) | ||||||||||||||
| Madde | a1 | a2 | d1 | d2 | d3 | d4 | d5 | d6 | b1 | b2 | b3 | b4 | b5 | b6 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| x1 | -0.751 | -1.923 | 5.719 | 3.000 | -2.389 | -4.744 | -7.165 | NA | NA | NA | NA | NA | NA | NA |
| x2 | -1.003 | -0.793 | 4.047 | 2.014 | -1.742 | -4.189 | NA | NA | NA | NA | NA | NA | NA | NA |
| x3 | -1.080 | -1.831 | 5.586 | 2.517 | -2.590 | -6.369 | NA | NA | NA | NA | NA | NA | NA | NA |
| x4 | -1.148 | -1.471 | 6.266 | 4.670 | 2.612 | -2.267 | -4.444 | NA | NA | NA | NA | NA | NA | NA |
| x5 | -1.135 | -0.818 | 3.897 | 2.094 | -1.817 | -3.600 | NA | NA | NA | NA | NA | NA | NA | NA |
| x6 | -2.499 | 0.386 | 8.278 | 5.069 | 2.744 | -2.470 | -4.847 | -7.006 | NA | NA | NA | NA | NA | NA |
| x7 | -1.019 | -1.445 | 4.616 | 2.383 | -2.175 | -5.502 | NA | NA | NA | NA | NA | NA | NA | NA |
| x8 | -0.841 | -0.800 | 4.502 | 1.971 | -1.487 | -3.278 | -5.967 | NA | NA | NA | NA | NA | NA | NA |
| x9 | -1.671 | 0.110 | 4.880 | 2.153 | -2.580 | -4.480 | -6.722 | NA | NA | NA | NA | NA | NA | NA |
| x10 | -1.680 | 0.000 | NA | NA | NA | NA | NA | NA | 4.008 | 3.112 | 1.372 | -1.275 | -2.634 | -4.049 |
IFA çıktısı, klasik AFA’dan kritik bir farkla ayrılıyor: ölçek düzeyini ordinal varsayarak (graded model) madde-faktör ilişkilerini yeniden hesapladı. Sonuç oldukça ilginç:
IFA yük matrisi (Promax döndürmeli, 2-faktör): - F1 (yüksek pozitif yükler): x6 (0.917), x9 (0.738), x10 (0.707) - F2 (yüksek pozitif yükler): x1 (0.888), x3 (0.830), x7 (0.726), x4 (0.717) - Düşük/karmaşık yükler: x2 (F1: 0.20, F2: 0.46), x5 (F1: 0.25, F2: 0.46), x8 (F1: 0.13, F2: 0.48)
Bu, klasik AFA’dan yapısal olarak farklı bir tablo: IFA, x6, x9, x10’u (dışsallaştırıcı) kendi başına bir faktöre koyuyor; içsel maddeleri (x1, x3, x4, x7) ayrı bir faktöre. Düşünce maddeleri (x2, x5, x8) ise iki faktör arasında çapraz yüklü kalıyor — IFA’nın örtük olarak “bu üçlü için 3. bir faktöre ihtiyaç var” demesidir bu (sadece 2-faktör zorlandığı için ortada kalıyorlar).
Pearson AFA ↔︎ Polikorik IFA karşılaştırması: Pearson tabanlı Promax x6, x9, x10’u içsel maddelerle aynı faktöre koymuştu; polikorik tabanlı IFA bunları ayırdı. Bu, ölçek düzeyinin yorum üzerindeki gerçek etkisini gösteriyor — verimiz sürekli z-skorlar olduğu için Pearson teorik olarak doğru tercih ama IFA’nın daha “basit yapı” üretmesi düşündürücü. Olası açıklama: IFA’nın EM algoritması faktör skorlarını maksimize ederken bilgi katsayısı matrisinden faydalanır; Pearson AFA’nın iteratif PAF’ı daha “ortak varyans yığma” eğilimindedir.
IRT parametreleri: Ayırt edicilik (a) parametreleri, AFA’daki faktör yüklerinin IRT eşdeğeridir (Takane & de Leeuw, 1987). a₁ sütununda en güçlü maddeler x6 (a₁ = −2.499), x9 (−1.671), x10 (−1.680) — bu üç madde “F1” boyutunu çok güçlü ayırt ediyor (işaret yönü Promax döndürmesinden kaynaklı, mutlak değer önemli). a₂ sütununda en güçlü maddeler x1 (−1.923), x3 (−1.831), x7 (−1.445) — F2 boyutunda güçlü göstergeler. Düşük a değerli madde yok; tüm maddeler iyi ayırt edici (|a| > 0.7). Güçlük (b) parametreleri sürekli ölçekteki kesim noktalarını gösteriyor — maddelerin geniş bir aralıkta bilgi sağladığı görülüyor.
Triangulation sonucu: Pearson AFA + Polikorik IFA + EGA üçlüsü farklı parametrik varsayımlardan başlayarak aynı kuramsal sonuca ulaşıyor: dışsallaştırıcı maddeler (x6, x9, x10), içsel maddeler (x1, x3, x4, x7) ve düşünce maddeleri (x2, x5, x8) gerçek anlamda üç ayrı boyut oluşturuyor.
Bu bölüm, AFA (Pearson), AFA (Promax), EGA, ve IFA’nın madde-boyut atamalarını yan yana getirir. Yöntemler birbirini destekliyorsa sonuçlar sağlamdır; ayrışıyorsa hangi yöntemin neyi farklı gördüğü tartışılır.
# AFA (Promax) baskın faktör atamaları (faktor_yorumlama bloğundan)
afa_baskin <- baskin_faktor
# EGA topluluk atamaları
ega_baskin <- ega_sonuc$wc
# IFA baskın faktör atamaları (ifa_load_mat boşsa NA)
if (!is.null(ifa_load_mat)) {
ifa_baskin <- apply(ifa_load_mat, 1, function(x) which.max(abs(x)))
ifa_kolonu <- paste0("F", ifa_baskin)
} else {
ifa_kolonu <- rep("—", length(afa_baskin))
}
karsilastirma_tum <- data.frame(
Madde = paste0("x", 1:10),
Icerik = madde_icerik[paste0("x", 1:10)],
AFA_Promax = afa_baskin,
EGA = paste0("Top.", ega_baskin),
IFA = ifa_kolonu,
stringsAsFactors = FALSE
)
gt(karsilastirma_tum) |>
tab_header(
title = "Üç Yöntemin Madde-Boyut Atamaları",
subtitle = "AFA (Promax) ↔ EGA ↔ IFA — yöntemler arası uzlaşı"
) |>
cols_label(
Madde = "Madde", Icerik = "İçerik",
AFA_Promax = "AFA (Promax)", EGA = "EGA Topluluğu", IFA = "IFA"
) |>
stil_gt()| Üç Yöntemin Madde-Boyut Atamaları | ||||
| AFA (Promax) ↔ EGA ↔ IFA — yöntemler arası uzlaşı | ||||
| Madde | İçerik | AFA (Promax) | EGA Topluluğu | IFA |
|---|---|---|---|---|
| x1 | Kendini değersiz hissetme | PA1 | Top.1 | F2 |
| x2 | Aklından çıkaramama | PA2 | Top.2 | F2 |
| x3 | Üzgün hissetme | PA1 | Top.1 | F2 |
| x4 | Endişeli hissetme | PA1 | Top.1 | F2 |
| x5 | Bazı şeyler duyma | PA2 | Top.2 | F2 |
| x6 | Kaçma | PA1 | Top.3 | F1 |
| x7 | Sevilmediğini hissetme | PA1 | Top.1 | F2 |
| x8 | Garip fikirler | PA2 | Top.2 | F2 |
| x9 | Kaçak / aylak | PA1 | Top.3 | F1 |
| x10 | Birçok kavgaya karışma | PA1 | Top.3 | F1 |
Bu tablo, raporun özet bilançosunu sunuyor — her bir maddenin üç farklı yöntemde nereye atandığını yan yana görüyoruz. Üç temel örüntü ortaya çıkıyor:
(1) Düşünce maddeleri (x2, x5, x8) tüm yöntemlerde aynı yere gidiyor. AFA → PA2, EGA → Topluluk 2, IFA → F2 (yüksek yük). Sağlam ve değişmez bir bulgu.
(2) İçsel maddeler (x1, x3, x4, x7) AFA ve EGA’da farklı yerlere düşüyor — ama kuramsal anlamda örtüşüyor. AFA bunları PA1’e (genel davranış problemi karışımına) koymuş; EGA Topluluk 1’e (saf içselleştirici) koymuş; IFA F2’ye (içsel temalı) koymuş. EGA ve IFA’nın “saf içsel” çıkarması, AFA’nın 2-faktör kısıtının dayattığı “karışım”a göre kuramsal olarak daha doğru.
(3) Dışsal maddeler (x6, x9, x10) AFA’da yanlış kutuda; EGA ve IFA’da doğru yerde. AFA → PA1 (içsel maddelerle aynı kutu); EGA → Topluluk 3 (ayrı, dışsal); IFA → F1 (en yüksek yükler bunlarda). Bu üç madde için AFA’nın ayrım yapamaması, 2-faktörlü modelin tek büyük başarısızlığı ve Soru 1.(6)’da gözlediğimiz “x6, x9, x10 arasındaki büyük artıklar”ın yöntem-bağımsız doğrulanması.
Genel bilanço: Üç yöntemden ikisi (EGA + IFA) 3 boyutlu bir yapıya işaret ediyor; klasik AFA hocanın yönergesi gereği 2 faktörle sınırlı kaldığı için bu yapıyı tam yansıtamadı. Triangulation’ın değeri burada açıkça görünüyor: tek bir yöntemin sonucuna bakıp “x6 içsel maddelerin akrabası” demek yerine, üç farklı parametrik çatıdan gelen bulguları üst üste koyarak gerçek yapının 3 boyutlu olduğunu güvenle söyleyebiliyoruz.
Kuramsal beklenti (içsel + dışsal) ↔︎ veri: - İçsel boyut kısmen doğrulandı — EGA’da net, AFA’da içselleştirici- dışsallaştırıcı karışımına sıkışmış. - Dışsal boyut EGA ve IFA’da tam doğrulandı, AFA’da kaybedildi. - Bonus bulgu: Düşünce/algı boyutu (x2, x5, x8) — kuramsal beklentide bir soru işaretiyle gelen bu üçlü, üç yöntemde de ayrı bir boyut olarak çıktı. Veri, kuramsal beklentinin ötesinde bir öğreti sunuyor.
hata_listesi <- data.frame(
Hata = c(
"1. PCA'yı AFA olarak sunmak",
"2. Sadece Kaiser kuralına güvenmek",
"3. Varsayılan olarak Varimax döndürme",
"4. Küçük örneklemde çok faktör",
"5. Faktör skorlarını doğrudan kullanmak",
"6. Yorumsuz sayısal karar",
"7. Tek veri setinde AFA + DFA"
),
Bu_Calismadaki_Onlem = c(
"fm = 'pa' kullanıldı; PCA dışlandı.",
"K1 yanında scree, paralel analiz, MAP, VSS — çoklu kriter.",
"Promax (eğik) tercih edildi; faktör korelasyonu raporlandı.",
"n = 200, V = 10 → 20 birey/madde — Gorsuch eşiğinin üstü.",
"Faktör puanları kullanılmadı; rapor edildiği yerde belirsizlik notu eklendi.",
"Her faktör kuramsal olarak adlandırılmaya çalışıldı.",
"Farklı yöntemlerle (EGA, IFA) triangulation yapıldı."
)
)
gt(hata_listesi) |>
tab_header(
title = "Bitiş Kontrol Listesi — Bölüm 12'deki 7 Yaygın Hata"
) |>
cols_label(
Hata = "Hata",
Bu_Calismadaki_Onlem = "Bu Çalışmadaki Önlem"
) |>
stil_gt()| Bitiş Kontrol Listesi — Bölüm 12'deki 7 Yaygın Hata | |
| Hata | Bu Çalışmadaki Önlem |
|---|---|
| 1. PCA'yı AFA olarak sunmak | fm = 'pa' kullanıldı; PCA dışlandı. |
| 2. Sadece Kaiser kuralına güvenmek | K1 yanında scree, paralel analiz, MAP, VSS — çoklu kriter. |
| 3. Varsayılan olarak Varimax döndürme | Promax (eğik) tercih edildi; faktör korelasyonu raporlandı. |
| 4. Küçük örneklemde çok faktör | n = 200, V = 10 → 20 birey/madde — Gorsuch eşiğinin üstü. |
| 5. Faktör skorlarını doğrudan kullanmak | Faktör puanları kullanılmadı; rapor edildiği yerde belirsizlik notu eklendi. |
| 6. Yorumsuz sayısal karar | Her faktör kuramsal olarak adlandırılmaya çalışıldı. |
| 7. Tek veri setinde AFA + DFA | Farklı yöntemlerle (EGA, IFA) triangulation yapıldı. |
AFA herhangi bir akademik yayın için kullanmamış olsam da YL derslerinde bir iki kez karşılaştığım ve ödevini yaptığım bir analizdi. Ama hem R ile yapmamış hem de özellikle kavramsal boyutta bu kadar detay görmemiştik. Bu açıdan kavrama daha geniş bir perspektiften bakmamı ve AFA için R güzelliğini yaşamamı sağlayan bir uygulama oldu. Üstüne bir de AFA’yı tamamlayıcı yeni yaklaşımların varlığı daha da güzel oldu. Bu dersten sonra belki hiç not bakmadan kendi başıma AFA yapamayabilirim ama hissediyorum ki ders notlarını ve bu ödevi el altında bulundurarak akademik gereklilikleri karşılayabilecek AFA yapıp yorumlayabilirim.
Achenbach, T. M., & Edelbrock, C. S. (1978). The classification of child psychopathology: A review and analysis of empirical efforts. Psychological Bulletin, 85(6), 1275–1301.
Chalmers, R. P. (2012). mirt: A multidimensional item response theory package for the R environment. Journal of Statistical Software, 48(6), 1–29.
Christensen, A. P., & Golino, H. (2021). Estimating the stability of psychological dimensions via bootstrap exploratory graph analysis: A Monte Carlo simulation and tutorial. Psych, 3(3), 479–500.
Golino, H. F., & Epskamp, S. (2017). Exploratory graph analysis: A new approach for estimating the number of dimensions in psychological research. PLOS ONE, 12(6), e0174035.
Golino, H., Shi, D., Christensen, A. P., Garrido, L. E., Nieto, M. D., Sadana, R., Thiyagarajan, J. A., & Martínez-Molina, A. (2020). Investigating the performance of exploratory graph analysis and traditional techniques to identify the number of latent factors: A simulation and tutorial. Psychological Methods, 25(3), 292–320.
Gorsuch, R. L. (1983). Factor analysis (2nd ed.). Lawrence Erlbaum.
Horn, J. L. (1965). A rationale and test for the number of factors in factor analysis. Psychometrika, 30(2), 179–185.
Kaiser, H. F. (1974). An index of factorial simplicity. Psychometrika, 39(1), 31–36.
McDonald, R. P. (1999). Test theory: A unified treatment. Lawrence Erlbaum.
Tabachnick, B. G., & Fidell, L. S. (2019). Using multivariate statistics (7th ed.). Pearson.
Takane, Y., & de Leeuw, J. (1987). On the relationship between item response theory and factor analysis of discretized variables. Psychometrika, 52(3), 393–408.
Thompson, B. (2004). Exploratory and confirmatory factor analysis: Understanding concepts and applications. American Psychological Association.
Zwick, W. R., & Velicer, W. F. (1986). Comparison of five rules for determining the number of components to retain. Psychological Bulletin, 99(3), 432–442.