1 Giriş

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.

2 Veri Setinin Tanıtımı

2.1 Kaynak ve Genel Yapı

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

2.2 Maddeler ve Türkçe Karşılıkları

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ı

3 Paketler ve Ortam Hazırlığı

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
}

4 Veri Yükleme ve Yapı Kontrolü

4.1 Veriyi Okuma

# 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
cat("Sütun sayısı :", ncol(afa_ham), "\n")
## Sütun sayısı : 10
cat("Değişkenler  :", paste(names(afa_ham), collapse = ", "), "\n")
## Değişkenler  : X1, X2, X3, X4, X5, X6, X7, X8, X9, X10

4.2 Veri Hazırlığı

# (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 ...
cat("\nSon analiz örneklemi: n =", nrow(veri), "\n")
## 
## Son analiz örneklemi: n = 200
glimpse(veri)
## 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.…

4.3 İlk 6 Gözlem

head(veri) |>
  gt() |>
  tab_header(title = "AFAV10N200 — İlk 6 Gözlem") |>
  stil_gt()
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

4.4 Eksik Veri Kontrolü

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.


5 Betimsel İstatistikler

5.1 Madde Düzeyi İstatistikler

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.

5.2 Madde Dağılım Grafikleri

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_afa

Histogramları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.

5.3 Korelasyon Matrisi

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.


6 Faktör Analizi Uygunluğu: KMO ve Bartlett

AFA’ya geçmeden önce verinin faktörleştirmeye uygun olup olmadığı test edilmelidir.

  1. KMO örnekleme yeterliği ölçüsü maddeler arası örtüşmenin derecesini değerlendirir.

  2. Bartlett’in küresellik testi korelasyon matrisinin bir birim matristen anlamlı şekilde farklı olup olmadığını sınar.

6.1 KMO Örnekleme Yeterliği

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 < 0.50: kabul edilemez
  • 0.50–0.59: kötü (miserable)
  • 0.60–0.69: vasat (mediocre)
  • 0.70–0.79: orta (middling)
  • 0.80–0.89: iyi (meritorious)
  • ≥ 0.90: mükemmel (marvelous)

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.

6.2 Bartlett’in Küresellik Testi

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.


7 Faktör Sayısının Belirlenmesi

Faktör sayısı belirlenirken birden fazla kriter dikkate alıncaktır.

7.1 Özdeğerler ve Kaiser (K1) Kuralı

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_n <- sum(ozdegerler > 1)
cat("K1 kuralına göre çıkarılacak faktör sayısı:", k1_n, "\n")
## 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.

7.2 Yamaç Birikinti Grafiği (Scree Plot)

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_afa

Scree 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.

7.3 Paralel Analiz

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
)

cat("Paralel analiz önerisi:", pa_sonuc$nfact, "faktör\n")
## 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.

7.4 VSS ve MAP Testi

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

7.5 Çoklu Kriter Özeti

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.


8 Model 1: PAF — Döndürmesiz Çözüm

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.

8.1 Faktör Sayısı Kararı

# Ç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.

8.2 Model Kurma

model_1 <- fa(
  r        = veri,
  nfactors = n_faktor,
  fm       = "pa",
  rotate   = "none",
  scores   = "regression"
)

8.3 Örüntü Matrisi (Pattern Matrix)

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.

8.4 Communality (Ortak Varyans) Yorumu

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 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.

8.5 SS Loadings ve Açıklanan Toplam Varyans

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:

  • PA1: 3.698 / 10 = %36.98 (toplam varyansın yaklaşık %37’si)
  • PA2: 1.075 / 10 = %10.75
  • Birikimli iki faktör: %47.73 — toplam varyansın yarısına yaklaşıyor ama yarıyı bulamıyor

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.

8.6 Üretilen ve Artık Korelasyon Matrisleri

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:

  • x6–x10 = 0.244 (Kaçma ↔︎ Kavgaya karışma)
  • x9–x10 = 0.200 (Kaçaklık ↔︎ Kavgaya karışma)
  • x6–x9 = 0.195 (Kaçma ↔︎ Kaçaklık)
  • x3–x10 = −0.186; x1–x6 = −0.166

İ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.


9 Model 2: PAF — Promax Eğik Döndürme (κ = 4)

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.

9.1 Model Kurma

model_2 <- fa(
  r        = veri,
  nfactors = n_faktor,
  fm       = "pa",
  rotate   = "promax",
  scores   = "regression"
)

9.2 Faktörler Arası Korelasyon Matrisi (Φ)

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.

9.3 Örüntü Matrisi (Pattern Matrix)

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 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:

  • PA1 = 0.018: PA2’nin (düşünce/algılama boyutunun) etkisi istatistiksel olarak sabit tutulduğunda x2’nin PA1’e (genel davranış problemi boyutuna) bağımsız katkısı pratikte yoktur.
  • PA2 = 0.780: PA1’in etkisi sabit tutulduğunda x2 PA2’ye çok güçlü ve bireysel olarak yüklenmektedir.

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.

9.4 Yapı Matrisi (Structure Matrix)

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:

  • x2 ↔︎ PA2: yapı = \(0.018 \times 0.512 + 0.780 \times 1.000 = 0.789\) ✓ (tablodaki değerle birebir)
  • x2 ↔︎ PA1: yapı = \(0.018 \times 1.000 + 0.780 \times 0.512 = 0.417\) ✓ (tablodaki 0.418 ile yuvarlama farkı)

Yorum:

  • PA2 ile yapı katsayısı 0.789 — x2 ile PA2 arasındaki ham Pearson-tipi korelasyon. PA1’in dolaylı etkisi kontrol edilmiş olmasa bile bu korelasyon hâlâ çok yüksek; çünkü x2 zaten PA2’nin ana göstergesi.
  • PA1 ile yapı katsayısı 0.418 — bu burada özellikle aydınlatıcı. Örüntü katsayısı 0.018 (yani PA1’e bireysel katkı yok) iken yapı katsayısı 0.418 çıkıyor. Bu 0.4 birim fark nereden geliyor? Cevap: faktörler arası korelasyondan! x2, PA2’ye güçlü yüklendiği ve PA1 ile PA2 arasında 0.512 korelasyon olduğu için, x2 dolaylı yoldan PA1 ile de korelasyonlu görünüyor — ama bu, doğrudan bir ilişki değil, PA2 üzerinden geçen “borç alınmış” bir ilişki.

9.5 Örüntü ↔︎ Yapı Karşılaştırması

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ı:

  • Örüntü matrisi maddenin hangi faktörü ölçtüğüne karar verirken kullanılır (basit yapı, atama kararı). “x2 hangi boyuta ait?” sorusunun cevabı örüntüden okunur — PA2 (0.780).
  • Yapı matrisi maddenin bir faktörle ham korelasyonunu gösterir; predict-edici güç, dış-ölçüt korelasyonları, ya da tek-değişkenli ilişkiler için bu daha uygundur.

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.

9.6 Döndürme Sonrası Açıklanan Varyans

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.)


10 Rotasyonun Amacı ve Sonuçların Değerlendirilmesi

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.

10.1 Karmaşıklık Karşılaştırması (Hofmann’s Complexity)

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:

  • Çarpıcı iyileşmeler: x5 (1.97 → 1.01, iyileşme 0.96), x8 (1.93 → 1.00, 0.92), x2 (1.86 → 1.00, 0.86), x9 (1.57 → 1.05, 0.52), x10 (1.56 → 1.05, 0.52), x6 (1.42 → 1.01, 0.41) — bu maddelerin tümünde döndürme çapraz yüklenmeyi temizledi.
  • Az değişim: x1 (1.06 → 1.13, hatta küçük artış), x4 (1.05 → 1.17) — bu maddelerin örüntüsü zaten basit yapıya yakındı, Promax bir şey eklemedi.

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.

10.2 Yük Grafiği (Loading Plot)

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.


11 Faktörlerin Yorumlanması

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.


12 Modern Eklentiler

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.

12.1 EGA: Açımlayıcı Grafik Analizi

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:

  1. Boyut sayısı veriden gelir (parametre ayarına az dayanır).
  2. Çapraz yüklenme yapısal olarak yoktur (her madde bir topluluğa).
  3. Görsel olarak ilişki haritasını sunar.
  4. Simülasyon çalışmaları paralel analizden bile daha doğru sonuç verdiğini göstermiştir (Golino vd., 2020).
ega_sonuc <- EGA(
  veri,
  model     = "glasso",
  algorithm = "walktrap",
  plot.EGA  = TRUE
)

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:

  • Topluluk 1 — İçselleştirici/Depresif: x1, x3, x4, x7 (Değersiz hissetme, Üzgün, Endişeli, Sevilmediğini hissetme)
  • Topluluk 2 — Düşünce/Algı: x2, x5, x8 (Aklından çıkaramama, Bazı şeyler duyma, Garip fikirler)
  • Topluluk 3 — Dışsallaştırıcı: x6, x9, x10 (Kaçma, Kaçaklık, Kavgaya karışma)

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.

12.2 Bootstrap EGA: Boyut Sağlamlığı

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.

12.3 McDonald’s Omega: Modern Güvenirlik

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_t\) (toplam): Tüm faktörlerin (genel + alt) açıkladığı güvenilir varyans oranı.
  • \(\omega_h\) (hiyerarşik): Yalnızca genel faktörün açıkladığı pay — “ne kadar tek-boyutlu?” sorusuna yanıt.
  • \(\omega_h / \omega_t\) oranı: 1’e yakınsa tek faktör hâkim; düşükse alt boyutlar baskın.
# 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:

  • ω_total = 0.903 — Ölçeğin tüm faktörleri (genel + alt) birlikte hesaba katıldığında toplam güvenirlik %90.3. Bu, Nunnally’nin
    1. 0.80 minimum eşiğinin oldukça üstünde; ölçek bir bütün olarak tutarlı ölçüm yapıyor.
  • ω_hierarchical = 0.657Sadece genel faktörün açıkladığı güvenilir varyans %65.7. Yani toplam güvenilir varyansın yaklaşık üçte ikisi tek bir genel “psikososyal sıkıntı” faktöründen geliyor; üçte biri alt faktörlerin (içsel/düşünce/dışsal) bireysel katkısı.
  • ω_h / ω_t = 0.728 — Ölçeğin “tek-boyutluluk” derecesi. Reise
    1. kriterine göre 0.50 minimum, 0.75 ideal eşik. 0.728 değeri “marginal” — yani genel faktör ölçeğin baskın yapısı, ancak alt boyutlar anlamlı paylar taşıyor, görmezden gelinemezler. Bu, 3-faktörlü yapının kabulüne ek bir kanıt: tek faktörlü çözüm yeterli olsaydı bu oran 0.85+ olurdu.
  • Cronbach α = 0.844 — Klasik karşılaştırma. ω_t (0.903)’ün α (0.844)’tan yüksek olması beklendik bir sonuç: α tau-eşdeğerlik (tüm yüklerin eşit) varsayımı altında alt sınır verir. Bu varsayım çoğu zaman ihlal edildiği için α sistematik olarak gerçek güvenirliği eksik tahmin eder. Bu çalışmadaki 0.06’lık fark (0.903 − 0.844) tipik bir büyüklük; doktora seviyesi raporlamada yalnızca α değil ω da sunulmalı (McNeish, 2018).

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ü.

12.4 IRT-AFA Köprüsü: Item Factor Analysis (IFA)

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ı:

  • AFA’daki faktör yükü (λ) ⇔ IRT’deki ayırt edicilik (a)
  • AFA’daki kesim noktaları ⇔ IRT’deki güçlük (b)

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.


13 Genel Karşılaştırma: Tüm Yöntemlerin Buluşması

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.


14 Yaygın Hata Kontrolü: Bitiş Listesi

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ı.

15 Günden Kalanlar

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.


16 Kaynakça

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.