Yol analizi, yapısal eşitlik modellemesinin (YEM) yalnızca gözlenen değişkenlerle çalışan biçimidir; her yapının tek bir göstergesi olduğu durumlarda kullanılır. Amaç, gözlenen değişkenler arasındaki kovaryans örüntüsünü bir modelle açıklamaktır.
Temel kavramlar:
Model uyumu mantığı: Sıfır hipotezi, modelin ürettiği kovaryans matrisinin gözlenen kovaryans matrisine eşit olduğudur (Σ = Σ̂). Yol analizinde bu hipotezin reddedilmesi istenmez; yani ki-kare testinin p değerinin yüksek (anlamsız) olması iyi uyum işaretidir.
Test edilen model (X → M → Y):
Ölçeğin kuramsal yapısı iki alt boyutu toplamaya izin vermediği için,
tek aracılı testler (Baron-Kenny, Sobel, mediate)
her alt boyut için ayrı, lavaan paralel
modeli ise ikisini aynı anda çalıştırılır.
library(readxl); library(stringr); library(dplyr); library(knitr); library(kableExtra)
library(psych); library(lavaan); library(semPlot); library(semptools)
library(GGally); library(broom); library(DT); library(stargazer)
library(multilevel); library(bda); library(mediation); library(gvlma)
library(rockchalk); library(car); library(naniar); library(outliers)
library(MVN); library(olsrr)
library(semoutput)
veri_yolu <- "KAĞITTAN VE FORMSDAN ALINAN VERİLER (TEZ).xlsx"
ham <- read_excel(veri_yolu)
dat <- ham
names(dat)[13:27] <- paste0("M", 1:15) # Mindfulness 1-15
names(dat)[28:33] <- paste0("R", 1:6) # Ruminasyon 1-6
names(dat)[34:41] <- paste0("ER", 1:8) # Duygu Düzenleme 1-8
cat("N =", nrow(dat), "\n")
## N = 689
** Veri seti N = 689 katılımcıdan oluşuyor.
metin_to_sayi <- function(x) as.numeric(str_extract(as.character(x), "^\\s*\\d+"))
dat <- dat %>%
mutate(across(R1:R6, metin_to_sayi)) %>%
mutate(
across(M1:M15, ~ ifelse(.x < 1 | .x > 6, NA, .x)), # Mindfulness 1-6
across(R1:R6, ~ ifelse(.x < 1 | .x > 5, NA, .x)), # Ruminasyon 1-5
across(ER1:ER8,~ ifelse(.x < 1 | .x > 7, NA, .x)) # Duygu Düzenleme 1-7
)
dat <- dat %>% mutate(across(paste0("M", 6:10), ~ 7 - .x))
** Yol analizinde her yapı tek bir gözlenen ölçümle (göstergeyle) temsil edilir; bu yüzden maddelerin ortalamasını alıp ölçek puanları oluşturuyoruz.
ort <- function(df, cols) rowMeans(df[, cols, drop = FALSE], na.rm = TRUE)
dat <- dat %>% mutate(
BF_toplam = ort(., paste0("M", 1:15)), # X (dışsal değişken)
BF_farkindalik = ort(., paste0("M", 1:5)),
BF_yargilamama = ort(., paste0("M", 6:10)),
BF_yeniden_odak = ort(., paste0("M", 11:15)),
M_bilissel = ort(., paste0("ER", c(3,5,6,8))), # M1 (içsel/arabulucu)
M_bastirma = ort(., paste0("ER", c(1,2,4,7))), # M2 (içsel/arabulucu)
RUM = ort(., paste0("R", 1:6)) # Y (içsel değişken)
)
araci_full <- dat %>%
transmute(X = BF_toplam, M_bilissel, M_bastirma, Y = RUM) %>%
as.data.frame()
araci_full <- na.omit(araci_full)
cat("Analize giren tam veri (listwise) N =", nrow(araci_full), "\n")
## Analize giren tam veri (listwise) N = 689
head(araci_full)
Analize giren katılımcı sayısı yine N = 689 — yani hiçbir katılımcıda eksik veri yok.
alfa <- function(cols, ad) {
a <- psych::alpha(dat[, cols], check.keys = FALSE, warnings = FALSE)$total$raw_alpha
data.frame(Olcek = ad, Madde = length(cols), Alpha = round(a, 3))
}
bind_rows(
alfa(paste0("M", 1:15), "Bilinçli Farkındalık (Toplam)"),
alfa(paste0("ER", c(3,5,6,8)), "Bilişsel Yeniden Düzenleme"),
alfa(paste0("ER", c(1,2,4,7)), "Bastırma"),
alfa(paste0("R", 1:6), "Ruminasyon")
) %>% kable(caption = "Cronbach Alfa") %>% kable_styling(full_width = FALSE)
| Olcek | Madde | Alpha |
|---|---|---|
| Bilinçli Farkındalık (Toplam) | 15 | 0.613 |
| Bilişsel Yeniden Düzenleme | 4 | 0.789 |
| Bastırma | 4 | 0.737 |
| Ruminasyon | 6 | 0.858 |
Elde edilen güvenirlikler: Ruminasyon α = .858 (iyi), Bilişsel Yeniden Düzenleme α = .789 (iyi), Bastırma α = .737 (kabul edilebilir) ve Bilinçli Farkındalık toplam α = .613. İlk üç ölçek güvenilirdir. Bilinçli Farkındalık toplamının α’sı .70 ölçütünün altındadır; bu, ölçeğin 15 madde ve üç farklı alt boyuttan (biri ters puanlanan “Yargılamama”) oluşan çok boyutlu yapısıyla açıklanabilir.
psych::describe(araci_full)[, c("n","mean","sd","min","max","skew","kurtosis")] %>%
round(3) %>% kable(caption = "Betimsel İstatistikler") %>% kable_styling(full_width = FALSE)
| n | mean | sd | min | max | skew | kurtosis | |
|---|---|---|---|---|---|---|---|
| X | 689 | 4.09 | 0.534 | 2.13 | 5.8 | 0.006 | 0.415 |
| M_bilissel | 689 | 4.89 | 1.218 | 1.00 | 7.0 | -0.284 | 0.021 |
| M_bastirma | 689 | 4.39 | 1.335 | 1.00 | 7.0 | -0.096 | -0.398 |
| Y | 689 | 3.59 | 0.891 | 1.00 | 5.0 | -0.265 | -0.417 |
# GGally ile değişkenler arası ilişki
GGally::ggpairs(araci_full)
Ortalamalar: Bilinçli Farkındalık 4.09, Bilişsel Yeniden Düzenleme 4.89 ve Bastırma 4.39 , Ruminasyon 3.59. Tüm değişkenlerin çarpıklık değerleri −0.28 ile 0.01, basıklık değerleri −0.42 ile 0.42 arasındadır. Hepsi ±2 sınırının çok içinde olduğundan tek değişkenli normallik varsayımı karşılanmaktadır.
ggpairsgrafiğindeki saçılımlar da doğrusal ilişkileri desteklemektedir.
Aracılık analizi için; eksik verinin yapısı, hata bağımsızlığı, doğrusallık, eşvaryanslılık, normallik, uç değer yokluğu ve çoklu bağlantının olmaması incelenir.
any_na(araci_full) # kayıp veri var mı?
## [1] FALSE
n_miss(araci_full) # toplam eksik
## [1] 0
prop_miss(araci_full) # eksik oranı
## [1] 0
miss_var_summary(araci_full) # değişken bazında
analiz veri setinde hiç eksik veri yoktur.
model <- lm(Y ~ X + M_bilissel + M_bastirma, data = araci_full)
summary(model)
##
## Call:
## lm(formula = Y ~ X + M_bilissel + M_bastirma, data = araci_full)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.1455 -0.5229 -0.0279 0.6331 2.1259
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.8181 0.2623 10.75 < 0.0000000000000002 ***
## X -0.1091 0.0664 -1.64 0.1010
## M_bilissel 0.1753 0.0333 5.26 0.0000002 ***
## M_bastirma 0.0819 0.0282 2.91 0.0038 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.851 on 685 degrees of freedom
## Multiple R-squared: 0.0918, Adjusted R-squared: 0.0878
## F-statistic: 23.1 on 3 and 685 DF, p-value: 0.0000000000000303
Tam modelde (Y ~ X + iki aracı) sabit terim 2.82 (p<.001). Yordayıcılar arasında iki aracı anlamlıyken, Bilinçli Farkındalığın (X) doğrudan katsayısı negatif ve sınırda (≈ −0.11) çıkmaktadır.
durbinWatsonTest(model)
## lag Autocorrelation D-W Statistic p-value
## 1 -0.0434 2.08 0.29
## Alternative hypothesis: rho != 0
D-W = 2.08, p = .252. İstatistik 2’ye çok yakın ve p > .05 olduğundan hata terimleri bağımsızdır, bağımsızlık varsayımı karşılanmaktadır.
plot(model, 1)
plot(model, 3)
plot(model, 2) # Normal Q-Q
# Çok değişkenli normallik (Mardia)
psych::mardia(araci_full, plot = FALSE)
## Call: psych::mardia(x = araci_full, plot = FALSE)
##
## Mardia tests of multivariate skew and kurtosis
## Use describe(x) the to get univariate tests
## n.obs = 689 num.vars = 4
## b1p = 0.98 skew = 113 with probability <= 0.0000000000000057
## small sample skew = 114 with probability <= 0.0000000000000043
## b2p = 27.5 kurtosis = 6.56 with probability <= 0.000000000053
Mardia testinde çok değişkenli çarpıklık istatistiği çok büyük (skew ≈ 113) ve p < .0001 çıkmıştır; yani çok değişkenli normallik SAĞLANMAMAKTADIR. Bu nedenle aşağıdaki
mediatevelavaananalizlerinde bootstrap güven aralıkları kullandık; bootstrap dağılım varsayımına ihtiyaç duymadığından, normallik ihlaline rağmen kullanılabilir.
boxplot(araci_full$X, ylab = "Bilinçli Farkındalık")
boxplot(araci_full$Y, ylab = "Ruminasyon")
z.scores <- scores(araci_full, type = "z")
round(head(z.scores), 2)
# Mahalanobis uzaklığı (çok değişkenli uç değer)
md <- mahalanobis(araci_full, center = colMeans(araci_full), cov = cov(araci_full))
alpha <- .001
cutoff <- qchisq(p = 1 - alpha, df = ncol(araci_full))
ucdegerler <- which(md > cutoff)
ucdegerler
## 8 204
## 8 204
Mahalanobis uzaklığı (p < .001 eşiği), 8 ve 204 numaralı olmak üzere iki satırı çok değişkenli uç değer olarak işaretledi. 689 katılımcıda yalnızca 2 gözlem olduğundan etkileri ihmal edilebilir düzeydedir. Bu iki gözlemi çıkarmadan analşize devam ettim.
round(cor(araci_full), 2) # korelasyon matrisi
## X M_bilissel M_bastirma Y
## X 1.00 0.39 0.12 0.04
## M_bilissel 0.39 1.00 0.50 0.28
## M_bastirma 0.12 0.50 1.00 0.23
## Y 0.04 0.28 0.23 1.00
ols_vif_tol(model) # VIF ve Tolerans
Korelasyon matrisi: X–Bilişsel = .39, X–Bastırma = .12, Bilişsel–Bastırma = .50, Bilişsel–Y = .28, Bastırma–Y = .23 ve X–Y = .04. Yordayıcılar arası en yüksek korelasyon .50’dir; hepsi .80–.90 ölçütünün çok altında olduğundan çoklu bağlantı sorunu yoktur (VIF değerleri 1’e yakın beklenir). Bilinçli Farkındalık ile Ruminasyon arasındaki basit korelasyon ≈ 0’dır.
mediateBaron-Kenny adım adım mantığı; Sobel dolaylı etkinin anlamlılığını
tek testle; mediate ise dolaylı etkiyi
bootstrap ile (dağılım varsayımı olmadan) verir. Tek
aracı varsaydıkları için her alt boyut için ayrı
çalıştırılır.
araci <- araci_full %>% transmute(X, M = M_bilissel, Y) %>% as.data.frame()
fit <- lm(Y ~ X, data = araci) # 1. toplam etki (c)
fita <- lm(M ~ X, data = araci) # 2. yol a (X -> M)
fitb <- lm(Y ~ M + X, data = araci) # 3. yol b ve doğrudan etki c'
stargazer(fit, fita, fitb, type = "html",
title = "Baron-Kenny Yöntemi — Bilişsel Yeniden Düzenleme",
digits = 2)
| Dependent variable: | |||
| Y | M | Y | |
| (1) | (2) | (3) | |
| M | 0.22*** | ||
| (0.03) | |||
| X | 0.07 | 0.90*** | -0.13* |
| (0.06) | (0.08) | (0.07) | |
| Constant | 3.29*** | 1.22*** | 3.02*** |
| (0.26) | (0.33) | (0.25) | |
| Observations | 689 | 689 | 689 |
| R2 | 0.002 | 0.15 | 0.08 |
| Adjusted R2 | 0.0005 | 0.15 | 0.08 |
| Residual Std. Error | 0.89 (df = 687) | 1.12 (df = 687) | 0.86 (df = 686) |
| F Statistic | 1.31 (df = 1; 687) | 126.00*** (df = 1; 687) | 30.10*** (df = 2; 686) |
| Note: | p<0.1; p<0.05; p<0.01 | ||
a yolu (Model 2, X→M) = 0.90, p < .001 → anlamlı: bilinçli farkındalık, bilişsel yeniden düzenlemeyi güçlü biçimde yorduyor. b yolu (Model 3, M→Y) = 0.22, p < .001 → anlamlı. Toplam etki (Model 1, X→Y) = 0.07, anlamsız. Ancak aracı kontrol edilince doğrudan etki (Model 3, X→Y) = −0.13, p < .05 olup anlamlı ve NEGATİF hale geliyor. Burada dolaylı etki pozitif (≈ 0.90 × 0.22 = +0.20), doğrudan etki ise negatiftir. Bu, klasik aracılıktan farklı olarak baskılayıcı (suppression) aracılık** görülmektedir.
Dolaylı etkinin (a×b) sıfırdan farklı olup olmadığını tek z testiyle sınar.
multilevel::sobel(araci$X, araci$M, araci$Y)
## $`Mod1: Y~X`
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.2914 0.2623 12.55 0.0000000000000000000000000000000114
## pred 0.0728 0.0636 1.14 0.2527012425422869856816987521597184
##
## $`Mod2: Y~X+M`
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.018 0.2544 11.86 0.0000000000000000000000000000116
## pred -0.127 0.0665 -1.92 0.0555986687391976791561276627363
## med 0.223 0.0291 7.66 0.0000000000000616614355415956601
##
## $`Mod3: M~X`
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.223 0.3300 3.71 0.00022768734100848885232130925
## pred 0.897 0.0801 11.21 0.00000000000000000000000000681
##
## $Indirect.Effect
## [1] 0.2
##
## $SE
## [1] 0.0317
##
## $z.value
## [1] 6.33
##
## $N
## [1] 689
bda::mediation.test(araci$M, araci$X, araci$Y)
Sobel testinde dolaylı etki = 0.20, SE = 0.032, z ≈ 6.3 (p < .001) → dolaylı etki anlamlıdır. (
mediation::mediate (Bootstrap)fitM <- lm(M ~ X, data = araci) # X -> M
fitY <- lm(Y ~ X + M, data = araci) # X + M -> Y
gvlma(fitM); gvlma(fitY) # regresyon varsayımları
##
## Call:
## lm(formula = M ~ X, data = araci)
##
## Coefficients:
## (Intercept) X
## 1.223 0.897
##
##
## ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
## USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
## Level of Significance = 0.05
##
## Call:
## gvlma(x = fitM)
##
## Value p-value Decision
## Global Stat 24.771 0.0000559 Assumptions NOT satisfied!
## Skewness 6.559 0.0104331 Assumptions NOT satisfied!
## Kurtosis 1.935 0.1642064 Assumptions acceptable.
## Link Function 15.531 0.0000812 Assumptions NOT satisfied!
## Heteroscedasticity 0.746 0.3877562 Assumptions acceptable.
##
## Call:
## lm(formula = Y ~ X + M, data = araci)
##
## Coefficients:
## (Intercept) X M
## 3.018 -0.127 0.223
##
##
## ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
## USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
## Level of Significance = 0.05
##
## Call:
## gvlma(x = fitY)
##
## Value p-value Decision
## Global Stat 9.26 0.0549 Assumptions acceptable.
## Skewness 6.61 0.0101 Assumptions NOT satisfied!
## Kurtosis 1.15 0.2837 Assumptions acceptable.
## Link Function 0.99 0.3197 Assumptions acceptable.
## Heteroscedasticity 0.51 0.4752 Assumptions acceptable.
set.seed(2025)
fitMed <- mediate(fitM, fitY, treat = "X", mediator = "M")
summary(fitMed)
##
## Causal Mediation Analysis
##
## Quasi-Bayesian Confidence Intervals
##
## Estimate 95% CI Lower 95% CI Upper p-value
## ACME 0.2008 0.1399 0.2682 <0.0000000000000002 ***
## ADE -0.1280 -0.2690 0.0088 0.066 .
## Total Effect 0.0728 -0.0480 0.2034 0.248
## Prop. Mediated 2.2016 -18.3830 28.9852 0.248
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Sample Size Used: 689
##
##
## Simulations: 1000
set.seed(2025)
fitMedBoot <- mediate(fitM, fitY, boot = TRUE, sims = 999,
treat = "X", mediator = "M")
summary(fitMedBoot)
##
## Causal Mediation Analysis
##
## Nonparametric Bootstrap Confidence Intervals with the Percentile Method
##
## Estimate 95% CI Lower 95% CI Upper p-value
## ACME 0.20031 0.13354 0.26947 <0.0000000000000002 ***
## ADE -0.12746 -0.25924 0.00148 0.054 .
## Total Effect 0.07285 -0.07189 0.20636 0.308
## Prop. Mediated 2.74961 -29.27799 35.24470 0.308
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Sample Size Used: 689
##
##
## Simulations: 999
Bootstrap sonuçları: ACME (dolaylı etki) = 0.200, %95 GA [0.134, 0.269], p < .001 → güçlü ve anlamlı bir aracılık. ADE (doğrudan etki) = −0.128, %95 GA [−0.259, 0.001], p = .054 → sıfırı sınırda içeren, anlamsız/negatif doğrudan etki. Toplam etki = 0.073, GA sıfırı içeriyor, p ≈ .31 → anlamsız. Bilinçli farkındalık, ruminasyona bilişsel yeniden düzenleme üzerinden anlamlı ve pozitif bir dolaylı etki göstermektedir.
İki alt boyut toplanamadığı için ; her birinin aracılık rolü ayrı ayrı sınanmaktadır.
araci <- araci_full %>% transmute(X, M = M_bastirma, Y) %>% as.data.frame()
fit <- lm(Y ~ X, data = araci)
fita <- lm(M ~ X, data = araci)
fitb <- lm(Y ~ M + X, data = araci)
stargazer(fit, fita, fitb, type = "html",
title = "Baron-Kenny Yöntemi — Bastırma", digits = 2)
| Dependent variable: | |||
| Y | M | Y | |
| (1) | (2) | (3) | |
| M | 0.16*** | ||
| (0.02) | |||
| X | 0.07 | 0.30*** | 0.03 |
| (0.06) | (0.09) | (0.06) | |
| Constant | 3.29*** | 3.16*** | 2.80*** |
| (0.26) | (0.39) | (0.27) | |
| Observations | 689 | 689 | 689 |
| R2 | 0.002 | 0.01 | 0.06 |
| Adjusted R2 | 0.0005 | 0.01 | 0.05 |
| Residual Std. Error | 0.89 (df = 687) | 1.33 (df = 687) | 0.87 (df = 686) |
| F Statistic | 1.31 (df = 1; 687) | 10.10*** (df = 1; 687) | 20.00*** (df = 2; 686) |
| Note: | p<0.1; p<0.05; p<0.01 | ||
a yolu (X→M) = 0.30, p < .001 → anlamlı ama Bilişsel boyuta (0.90) kıyasla çok daha zayıf. b yolu (M→Y) = 0.16, p < .001 → anlamlı. Toplam etki (X→Y) = 0.07, anlamsız ve aracı kontrol edilince doğrudan etki = 0.03, anlamsız. Burada her iki yol da pozitif ve doğrudan etki sıfıra yakın olduğundan Bastırma için “dolaylı” aracılık söz konusudur.
multilevel::sobel(araci$X, araci$M, araci$Y)
## $`Mod1: Y~X`
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.2914 0.2623 12.55 0.0000000000000000000000000000000114
## pred 0.0728 0.0636 1.14 0.2527012425422869856816987521597184
##
## $`Mod2: Y~X+M`
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.8006 0.2673 10.478 0.00000000000000000000000625
## pred 0.0261 0.0624 0.418 0.67621861023447282779130774
## med 0.1552 0.0250 6.221 0.00000000085997785526222920
##
## $`Mod3: M~X`
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.162 0.3905 8.10 0.00000000000000256
## pred 0.301 0.0947 3.18 0.00153554682613081
##
## $Indirect.Effect
## [1] 0.0468
##
## $SE
## [1] 0.0165
##
## $z.value
## [1] 2.83
##
## $N
## [1] 689
bda::mediation.test(araci$M, araci$X, araci$Y)
mediation::mediate (Bootstrap)fitM <- lm(M ~ X, data = araci)
fitY <- lm(Y ~ X + M, data = araci)
set.seed(2025)
fitMed <- mediate(fitM, fitY, treat = "X", mediator = "M")
summary(fitMed)
##
## Causal Mediation Analysis
##
## Quasi-Bayesian Confidence Intervals
##
## Estimate 95% CI Lower 95% CI Upper p-value
## ACME 0.0473 0.0168 0.0821 0.002 **
## ADE 0.0255 -0.1024 0.1494 0.660
## Total Effect 0.0728 -0.0485 0.2004 0.258
## Prop. Mediated 0.4924 -5.8824 4.8702 0.256
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Sample Size Used: 689
##
##
## Simulations: 1000
set.seed(2025)
fitMedBoot <- mediate(fitM, fitY, boot = TRUE, sims = 999,
treat = "X", mediator = "M")
summary(fitMedBoot)
##
## Causal Mediation Analysis
##
## Nonparametric Bootstrap Confidence Intervals with the Percentile Method
##
## Estimate 95% CI Lower 95% CI Upper p-value
## ACME 0.0468 0.0134 0.0871 0.006 **
## ADE 0.0261 -0.1078 0.1521 0.695
## Total Effect 0.0728 -0.0719 0.2064 0.308
## Prop. Mediated 0.6420 -6.1323 7.7858 0.310
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Sample Size Used: 689
##
##
## Simulations: 999
Bootstrap sonuçları: ACME (dolaylı etki) = 0.047, %95 GA [0.013, 0.087], p = .006 → anlamlı, ancak Bilişsel boyutun dolaylı etkisine (0.200) göre küçük. ADE (doğrudan etki) = 0.026, p = .70** → anlamsız. Toplam etki = 0.073 → anlamsız. Sonuç: Bastırma da bilinçli farkındalık–ruminasyon ilişkisinde anlamlı ama zayıf bir aracı rol oynamaktadır; aracılığın büyük bölümü bilişsel yeniden düzenlemeden gelmektedir.
lavaan ile Paralel Çoklu AracılıkNeden ayrıca lavaan? Tek aracılı yöntem her boyutu
yalnız ele alır. lavaan iki aracıyı aynı
modelde tutarak her birinin diğeri kontrol
edilerek dolaylı etkisini verir; doğrudan/dolaylı/toplam
etkileri tek çerçevede bootstrap güven aralıklarıyla hesaplar. Paralel
çoklu aracılık için uygundur.
Model denkleminde: ~ doğrudan etki (yol),
~~ kovaryans, := ise tanımlı (hesaplanan)
parametredir (dolaylı/toplam etkiler).
yol_model <- '
# a yolları (X -> M) : dışsal değişkenin aracılara doğrudan etkisi
M_bilissel ~ a1*X
M_bastirma ~ a2*X
# b yolları (M -> Y) ve doğrudan etki c\' (X -> Y)
Y ~ b1*M_bilissel + b2*M_bastirma + cp*X
# aracılar (bozuklukları) arası kovaryans
M_bilissel ~~ M_bastirma
# Doğrudan etki
dir := cp
# Dolaylı (aracılık) etkileri
ind_bilissel := a1*b1
ind_bastirma := a2*b2
# Toplam dolaylı ve toplam etki
tot_ind := (a1*b1) + (a2*b2)
tot := cp + (a1*b1) + (a2*b2)
'
set.seed(2025)
fsem <- sem(yol_model, data = araci_full,
se = "bootstrap", bootstrap = 1000)
summary(fsem, standardized = TRUE, rsquare = TRUE, ci = TRUE)
## lavaan 0.6-21 ended normally after 12 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 9
##
## Number of observations 689
##
## Model Test User Model:
##
## Test statistic 0.000
## Degrees of freedom 0
##
## Parameter Estimates:
##
## Standard errors Bootstrap
## Number of requested bootstrap draws 1000
## Number of successful bootstrap draws 998
##
## Regressions:
## Estimate Std.Err z-value P(>|z|) ci.lower ci.upper
## M_bilissel ~
## X (a1) 0.897 0.095 9.450 0.000 0.716 1.089
## M_bastirma ~
## X (a2) 0.301 0.107 2.822 0.005 0.090 0.505
## Y ~
## M_bilissl (b1) 0.175 0.034 5.170 0.000 0.113 0.250
## M_bastirm (b2) 0.082 0.032 2.551 0.011 0.013 0.142
## X (cp) -0.109 0.071 -1.534 0.125 -0.254 0.023
## Std.lv Std.all
##
## 0.897 0.393
##
## 0.301 0.120
##
## 0.175 0.240
## 0.082 0.123
## -0.109 -0.065
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) ci.lower ci.upper
## .M_bilissel ~~
## .M_bastirma 0.734 0.069 10.587 0.000 0.598 0.872
## Std.lv Std.all
##
## 0.734 0.495
##
## Variances:
## Estimate Std.Err z-value P(>|z|) ci.lower ci.upper
## .M_bilissel 1.252 0.070 17.812 0.000 1.112 1.393
## .M_bastirma 1.753 0.086 20.285 0.000 1.581 1.917
## .Y 0.720 0.038 18.828 0.000 0.646 0.794
## Std.lv Std.all
## 1.252 0.845
## 1.753 0.985
## 0.720 0.908
##
## R-Square:
## Estimate
## M_bilissel 0.155
## M_bastirma 0.015
## Y 0.092
##
## Defined Parameters:
## Estimate Std.Err z-value P(>|z|) ci.lower ci.upper
## dir -0.109 0.071 -1.534 0.125 -0.254 0.023
## ind_bilissel 0.157 0.034 4.611 0.000 0.097 0.233
## ind_bastirma 0.025 0.014 1.797 0.072 0.002 0.056
## tot_ind 0.182 0.036 5.059 0.000 0.116 0.258
## tot 0.073 0.072 1.017 0.309 -0.069 0.214
## Std.lv Std.all
## -0.109 -0.065
## 0.157 0.094
## 0.025 0.015
## 0.182 0.109
## 0.073 0.044
** Model 9 parametreyle, N = 689’da sorunsuz çalıştı; test istatistiği 0.000 ve df = 0 (ancak tanımlanmış model)). Standartlaştırılmış yol katsayıları: X→Bilişsel β = .39 (p<.001), X→Bastırma β = .12 (p=.004), Bilişsel→Y β = .24 (p<.001), Bastırma→Y β = .12 (p=.011), doğrudan X→Y β = −.065 (p=.124, anlamsız). Tüm a ve b yolları anlamlı, doğrudan yol anlamsızdır.
serbestlik derecesi (sd) = gözlem sayısı − kestirilen parametre sayısı. Bu modelde:
Yani model ancak tanımlanmıştır (just-identified ). Ancak tanımlanmış modelde model veriyi kusursuz yeniden ürettiği için artık kovaryans matrisi sıfırdır; ki-kare ≈ 0, CFI = 1, RMSEA = 0 tanımsal olarak çıkar. Bu bir “mükemmel uyum bulgusu” değildir — test edilecek kısıtlama olmadığı için bu değerler zorunlu olarak çıkmaktadır.
fitmeasures(fsem, fit.measures = c("chisq","df","pvalue",
"cfi","tli","rmsea",
"rmsea.ci.lower","rmsea.ci.upper","srmr"))
## chisq df pvalue cfi tli
## 0 0 NA 1 1
## rmsea rmsea.ci.lower rmsea.ci.upper srmr
## 0 0 0 0
chisq = 0, df = 0, CFI = 1, TLI = 1, RMSEA = 0, SRMR = 0 (p-değeri NA). Yukarıda sd = 10 − 10 = 0 hesabıyla gösterildiği üzere model tam tanımlanmıştır; bu değerler model iyi olduğu için değil, test edilecek kısıtlama olmadığı için tanımsal olarak** bu hâli alır.
standardizedsolution(fsem)
parameterEstimates(fsem, standardized = TRUE)
inspect(fsem, "rsquare")
## M_bilissel M_bastirma Y
## 0.155 0.015 0.092
** R² değerleri: Bilişsel Yeniden Düzenleme = .155 (bilinçli farkındalık, bu boyutun varyansının %15.5’ini açıklıyor), Bastırma = .015 (yalnızca %1.5 — yani bilinçli farkındalık bastırmayı çok az açıklıyor) ve Ruminasyon = .092 (model, ruminasyon varyansının %9.2’sini açıklıyor). Bu, X’in Bilişsel boyutla güçlü, Bastırma ile çok zayıf ilişkili olduğunu doğrular.
parameterEstimates(fsem, boot.ci.type = "bca.simple") %>%
dplyr::filter(op == ":=") %>%
dplyr::select(Etki = label, Tahmin = est, SH = se, z, p = pvalue,
"%95 Alt" = ci.lower, "%95 Üst" = ci.upper) %>%
kable(digits = 3,
caption = "Dolaylı / Toplam Etkiler (Bootstrap BCa %95 GA)") %>%
kable_styling(full_width = FALSE)
| Etki | Tahmin | SH | z | p | %95 Alt | %95 Üst |
|---|---|---|---|---|---|---|
| dir | -0.109 | 0.071 | -1.53 | 0.125 | -0.254 | 0.026 |
| ind_bilissel | 0.157 | 0.034 | 4.61 | 0.000 | 0.099 | 0.235 |
| ind_bastirma | 0.025 | 0.014 | 1.80 | 0.072 | 0.006 | 0.063 |
| tot_ind | 0.182 | 0.036 | 5.06 | 0.000 | 0.118 | 0.263 |
| tot | 0.073 | 0.072 | 1.02 | 0.309 | -0.055 | 0.232 |
- Bilişsel Yeniden Düzenleme üzerinden dolaylı etki = 0.157, %95 GA [0.099, 0.235] → GA sıfırı içermiyor → anlamlı (en güçlü aracılık yolu).
- Bastırma üzerinden dolaylı etki = 0.025, %95 GA [0.006, 0.063] → GA sıfırı içermiyor → anlamlı (zayıf). Not: z-temelli p = .072 olsa da bootstrap’ta ölçüt güven aralığıdır; GA sıfırı içermediğinden etki anlamlı kabul edilir.
- Toplam dolaylı etki = 0.182, %95 GA [0.118, 0.263] → anlamlı.
- Doğrudan etki (dir) = −0.109, %95 GA [−0.254, 0.026] → GA sıfırı içeriyor → anlamsız.
- Toplam etki (tot) ≈ 0.073 → anlamsız.
Genel değerlendirme: Doğrudan etki anlamsız + dolaylı etkiler anlamlı → duygu düzenleme, bilinçli farkındalık ile ruminasyon ilişkisinde aracı rol üstlenmektedir; üstelik basit X–Y korelasyonu ≈ 0 olduğu için bu bir “dolaylı aracılık” durumudur. Ayrıca doğrudan etki (−0.109) ile toplam dolaylı etki (+0.182) zıt işaretli olduğundan, bu aynı zamanda bir baskılama (suppression) aracılık söz konusudur: pozitif dolaylı yol ile negatif doğrudan eğilim birbirini götürdüğü için toplam etki sıfıra yakındır. Bu nedenle “bilinçli farkındalık ile ruminasyon arasında ilişki yok” demek yanlış olur; ilişki büyük ölçüde bilişsel yeniden düzenleme aracılığıyla işlemektedir.
Bilişsel yeniden düzenleme → ruminasyon yolu pozitiftir (β = .24). Yani bu örneklemde daha fazla bilişsel yeniden düzenleme daha fazla ruminasyonla birlikte gidiyor.
standardizedsolution(fsem) %>%
dplyr::filter(op == "~") %>%
dplyr::select('Bağımlı Değişken' = lhs, 'Yordayıcı' = rhs,
B = est.std, SE = se, Z = z, 'p' = pvalue) %>%
knitr::kable(digits = 3, caption = "Standartlaştırılmış Yol Katsayıları")
| Bağımlı Değişken | Yordayıcı | B | SE | Z | p |
|---|---|---|---|---|---|
| M_bilissel | X | 0.393 | 0.038 | 10.23 | 0.000 |
| M_bastirma | X | 0.120 | 0.042 | 2.85 | 0.004 |
| Y | M_bilissel | 0.240 | 0.046 | 5.24 | 0.000 |
| Y | M_bastirma | 0.123 | 0.048 | 2.55 | 0.011 |
| Y | X | -0.065 | 0.042 | -1.54 | 0.124 |
Standartlaştırılmış yol katsayıları: X→Bilişsel = .393, X→Bastırma = .120, Bilişsel→Y = .240, Bastırma→Y = .123* ve doğrudan X→Y = −.065 (p = .124, anlamsız). bilinçli farkındalığın en güçlü etkisi bilişsel yeniden düzenleme üzerinedir; her iki aracı da ruminasyonu pozitif yordamakta; doğrudan etki ise anlamsızdır.
m <- matrix(c(
NA, "M_bilissel", NA,
"X", NA, "Y",
NA, "M_bastirma", NA
), byrow = TRUE, nrow = 3, ncol = 3)
p_pa <- semPaths(fsem, whatLabels = "std",
layout = m, curvePivot = TRUE,
style = "ram", residuals = FALSE, intercepts = FALSE,
sizeMan = 11, edge.label.cex = 1.3,
nCharNodes = 0, nCharEdges = 0)
p_pa_2 <- semptools::mark_sig(p_pa, fsem)
plot(p_pa_2)
Diyagramda X (solda) → iki aracı (ortada) → Y (sağda) akışı görülür. Oklar üzerindeki standartlaştırılmış katsayılar: X→Bilişsel .39, X→Bastırma .12, Bilişsel→Y .24, Bastırma→Y .12 (hepsi yıldızlı = anlamlı); X→Y doğrudan oku −.07 (yıldızsız = anlamsız). İki aracı arasındaki çift yönlü eğri ok, aralarındaki kovaryansı (.50) gösterir. Şema, aracılığın esas olarak üst yol (bilişsel yeniden düzenleme) üzerinden işlediğini ve doğrudan yolun zayıf/anlamsız olduğunu görsel olarak özetler.
modindices(fsem, sort = TRUE)
resid(fsem, type = "normalized")
sessionInfo()
## R version 4.5.2 (2025-10-31)
## Platform: aarch64-apple-darwin20
## Running under: macOS Sequoia 15.4.1
##
## Matrix products: default
## BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRlapack.dylib; LAPACK version 3.12.1
##
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
##
## time zone: Europe/Istanbul
## tzcode source: internal
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] semoutput_1.0.2 olsrr_0.6.1 MVN_6.3 outliers_0.15
## [5] naniar_1.1.0 car_3.1-5 carData_3.0-6 rockchalk_1.8.157
## [9] gvlma_1.0.0.3 mediation_4.5.1 sandwich_3.1-1 mvtnorm_1.3-3
## [13] Matrix_1.7-4 bda_19.1.3 BI_1.2.0 boot_1.3-32
## [17] multilevel_2.8 MASS_7.3-65 nlme_3.1-168 stargazer_5.2.3
## [21] DT_0.34.0 broom_1.0.13 GGally_2.4.0 ggplot2_4.0.2
## [25] semptools_0.3.2 semPlot_1.1.8 lavaan_0.6-21 psych_2.6.1
## [29] kableExtra_1.4.0 knitr_1.51 dplyr_1.2.0 stringr_1.6.0
## [33] readxl_1.4.5
##
## loaded via a namespace (and not attached):
## [1] RColorBrewer_1.1-3 shape_1.4.6.1 rstudioapi_0.17.1
## [4] jsonlite_2.0.0 magrittr_2.0.4 jomo_2.7-6
## [7] farver_2.1.2 nloptr_2.2.1 rmarkdown_2.30
## [10] vctrs_0.7.1 minqa_1.2.8 base64enc_0.1-3
## [13] energy_1.7-12 htmltools_0.5.9 cellranger_1.1.0
## [16] Formula_1.2-5 mitml_0.4-5 sass_0.4.10
## [19] bslib_0.9.0 htmlwidgets_1.6.4 plyr_1.8.9
## [22] plotly_4.12.0 zoo_1.8-15 cachem_1.1.0
## [25] igraph_2.2.1 iterators_1.0.14 lifecycle_1.0.5
## [28] pkgconfig_2.0.3 R6_2.6.1 fastmap_1.2.0
## [31] rbibutils_2.4.1 digest_0.6.39 OpenMx_2.22.10
## [34] fdrtool_1.2.18 colorspace_2.1-2 textshaping_1.0.4
## [37] Hmisc_5.2-4 labeling_0.4.3 httr_1.4.8
## [40] abind_1.4-8 compiler_4.5.2 gsl_2.1-9
## [43] withr_3.0.2 glasso_1.11 htmlTable_2.4.3
## [46] S7_0.2.1 backports_1.5.0 viridis_0.6.5
## [49] ggstats_0.12.0 pan_1.9 corpcor_1.6.10
## [52] gtools_3.9.5 tools_4.5.2 pbivnorm_0.6.0
## [55] foreign_0.8-90 otel_0.2.0 zip_2.3.3
## [58] visdat_0.6.0 goftest_1.2-3 nnet_7.3-20
## [61] glue_1.8.0 quadprog_1.5-8 lisrelToR_0.3
## [64] grid_4.5.2 checkmate_2.3.3 cluster_2.1.8.1
## [67] reshape2_1.4.5 generics_0.1.4 lpSolve_5.6.23
## [70] gtable_0.3.6 nortest_1.0-4 tidyr_1.3.1
## [73] data.table_1.18.2.1 xml2_1.5.1 sem_3.1-16
## [76] foreach_1.5.2 pillar_1.11.1 splines_4.5.2
## [79] moments_0.14.1 lattice_0.22-7 survival_3.8-3
## [82] kutils_1.73 tidyselect_1.2.1 pbapply_1.7-4
## [85] reformulas_0.4.4 gridExtra_2.3 svglite_2.2.2
## [88] stats4_4.5.2 xfun_0.55 qgraph_1.9.8
## [91] arm_1.14-4 stringi_1.8.7 lazyeval_0.2.2
## [94] yaml_2.3.12 codetools_0.2-20 evaluate_1.0.5
## [97] mi_1.2 tibble_3.3.0 cli_3.6.6
## [100] RcppParallel_5.1.11-1 rpart_4.1.24 xtable_1.8-4
## [103] systemfonts_1.3.1 Rdpack_2.6.6 jquerylib_0.1.4
## [106] Rcpp_1.1.0 coda_0.19-4.1 png_0.1-8
## [109] XML_3.99-0.22 parallel_4.5.2 jpeg_0.1-11
## [112] glmnet_4.1-10 lme4_1.1-38 viridisLite_0.4.2
## [115] scales_1.4.0 openxlsx_4.2.8.1 purrr_1.2.2
## [118] rlang_1.2.0 mnormt_2.1.1 mice_3.19.0
Bu çalışmada yüksek lisans öğrencimin tezi için toplamaya devam ettiği verilerinin bir kısmını kullanarak, Bilinçli farkındalık, ruminasyon ve duygu düzenleme arasındaki ilişkiyi inceledim. Verilerin normal dağılmama durumunda bootstrap kullanmak gerektiğini daha önce başka bir çalışmada da okumuştum, bu anlizde de uygulamasını yapmış oldum. Analizde bilinçli farkındalık ile ruminasyon arasında neredeyse hiç korelasyon yokken, duygu düzenleme üzerinden dolaylı etkiler anlamlı çıktı. Yani “korelasyon yoksa ilişki de yoktur” demenin yanlış olabileceğini öğrendim. Son olarak, model ancak tanımlanmış olduğunda (sd = 0) uyum indekslerinin zaten mükemmel çıktığını, bu yüzden onlara bakıp “modelim çok iyi” dememem gerektiğini öğrendim.