Analiza mediacji i moderacji Dr Paweł Kleka 2019-04-04 X - predyktor M - mediator Y - zmienna zależna 3/50 Trochę historii Mediacja 4/50
Mediacja całkowita Analiza wielkości efektu pośredniego wg Barona i Kennego Jeśli c jest istotne Oraz a b jest istotne To jeśli c nie jest istotne To M jest mediatorem 5/50 Wariancja w modelu mediacji c - efekt pośredni (direct) d - efekt bezpośredni (indirect) c+d - efekt całkowity (total) 7/50 Jeśli c jest nadal istotne? to mediacja może być częściowa Jak to sprawdzić? Najczęściej stwierdza się mediacje częściowe Do oszacowania częściowości służy obliczenie stosunku efektu pośredniego do efektu całkowitego Stosunek ten to wariancja uwzględniona (VAF) Konieczny test istotności statystycznej, np: Sobela (duże próby, n > 250) Aroiana (duże próby, z poprawką na cor( X~ M)) Goodmana (małe próby, n < 50) Jak policzyć wynik takiego testu bez R? Google::Test Sobel 6/50 8/50
Krytyka klasycznej analizy mediacji CMA - causal mediation analysis Iloczyn rozkładów normalnych nie jest normalny. Krytyka poprzednich rozwiązań: - kontrola wpływu M nie oznacza, że M działa w stały sposób Rozwiązanie: - zamiast usuwać wariancję Y ~ M wyznacza się jej rozkład dla wszystkich wartości M Zalety: - - dowolne modele zależności (nie tylko liniowe) istotność w oparciu o 95% przedział ufności w oparciu o bootstrap 9/50 11/50 Błędy w stosowaniu analizy mediacji Drzewo decyzyjne (Zhang i in., 2010) zakłada się związek przyczynowo - skutkowy wszystkie zależności MUSZĄ być liniowe 10/50 12/50
Kiedy możemy spodziewać się obecności moderatora? Analiza reszt wykazuje heteroskedastyczność, np. po sprawdzenia testem White'a Jej obecność wskazuje na istnienie potencjalnnego moderatora lub co najmniej zmiennej kategorianej, którą należy dołączyć do modelu. Moderacja 15/50 Model moderacji Heteroskedastyczność występuje, gdy składniki losowe modelu mają różne wariancje często spotykana w przypadku modeli opartych na danych przekrojowych i przekrojowo-czasowych przyczyną są głównie różnice w zmienności DV w zależności od stanu IV uwzględnionych (lub nie) w modelu 14/50 16/50
Etapy analizy moderacji 1. centracja predyktorów 2. wyznaczenie składnika interakcyjnego 3. hierarchiczna analiza regresji 4. analizy (liczba mnoga!) regresji w podgrupach Literatura 17/50 Różnice między mediacją a moderacją Mediator Moderator Zależności na tyle silne, że można założyć jej istnienie z dużą dozą pewności i poświecić się dociekaniom dlaczego ona występuje. Poszukiwanie mediatorów jest istotnym elementem budowania teorii psychologicznej. Zależność słaba, która czasami występuje, a czasami zanika Identyfikacja moderatorów pozwala określić warunki, w których jakaś zależność występuje i odróżnić je od warunków, w których zależność zanika (nawet jeżeli nie rozumiemy dlaczego tak się dzieje ;-) Baron, R. M., Kenny, D. A. (1986). The moderator-mediator variable distinction in social psychological research: conceptual, strategic, and statistical considerations. Journal of Personality and Social Psychology, 51(6), 1173-1182. Sobel, M. E. (1982). Asymptotic confidence intervals for indirect effects in structural equation models. Sociological Methodology 13: 290 312. Pearl, J. (1994). A probabilistic calculus of actions. W: Lopez de Mantaras, R.; Poole, D., (red.), s. 454 462. Uncertainty in Artificial Intelligence 10. San Mateo, CA: Morgan Kaufmann. Zhao, X., Lynch Jr, J. G., Chen, Q. (2010). Reconsidering Baron and Kenny: Myths and truths about mediation analysis. Journal of consumer research, 37(2), 197-206. 18/50 20/50
Dane o uczniach o nazwie student d[1:5,1:9] fight attachment work score late coed smorale gender income 2767 0 1 0 45 2 1 4 0 10 1635 0 0 1 48 5 1 4 1 7 6057 1 0 0 51 2 1 4 0 12 2997 0 1 1 64 3 1 4 1 12 5320 1 1 0 37 3 1 5 0 11 Analiza mediacji w R Zmienne, które będą nas interesować to: 1. score - wynik z matematyki 2. income - dochody w rodzinie 3. pared - poziom wykształcenia rodziców (wyższy) 23/50 Analiza klasyczna Model do sprawdzenia Wczytujemy dane d <- mediation::student Użycie :: pozwala wywałać instrukcję lub dane z dowolnego pakietu nie wczytując go całego do pamięci. 1. Y = wynik z matematyki (score) 2. M = wykształcenie rodziców (pared) 3. X = dochód (income) dim(d) [1] 500 13 22/50 24/50
Test Sobela - regresje Poprawki do testu Sobela wynik <- with(d, sobel(pred=income, med=pared, out=score)) wynik[1:3] $`Mod1: Y~X` (Intercept) 39.414472 1.6693634 23.610481 2.914641e-83 pred 1.301823 0.1762171 7.387607 6.346801e-13 $`Mod2: Y~X+M` (Intercept) 40.073586 1.6710605 23.980930 5.255848e-85 pred 1.092778 0.1884110 5.799971 1.181206e-08 med 2.645128 0.8883595 2.977542 3.047542e-03 $`Mod3: M~X` (Intercept) -0.24918053 0.083549617-2.982426 2.999905e-03 pred 0.07903014 0.008819455 8.960886 6.471925e-18 25/50 a b test Sobela z = b2 s 2 a+ a 2 s 2 b poprawka na korelacje X ~ M Aroian a z = poprawka na małe próby Goodman a z = a b b2 s 2 a+ a 2 s 2 b+ s 2 a s 2 b a b + b2 s 2 a a 2 s 2 b s 2 a s 2 b a <- wynik$`mod3: M~X`[2,1]; b <- wynik$`mod2: Y~X+M`[3,1] sa <- wynik$`mod3: M~X`[2,2]; sb <- wynik$`mod2: Y~X+M`[3,2] (z.aroian <- (a*b)/sqrt(b^2*sa^2 + a^2*sb^2 + sa^2 * sb^2)) [1] 2.809921 round(2*(1-pnorm(z.aroian)),5) [1] 0.00496 (VAF <- wynik$indirect.effect/wynik$`mod1: Y~X`[2,1]) [1] 0.1605785 p-value testu Aroiana procent mediacji 27/50 Test Sobela - wynik $Indirect.Effect [1] 0.2090448 $SE [1] 0.07398155 $z.value [1] 2.825634 $N [1] 500 Jeszcze p value Analiza Causal Mediation Analysis round(2*(1-pnorm(wynik$z.value)),5) # wartość p odczytana z dystrybuanty rozkładu normalnego [1] 0.00472 26/50
Pakiet mediation 1. Określamy modele dla Y i dla M 2. Obliczamy przyczynowy test mediacji wynik.cma <- mediate(a, bc, treat ="income", mediator = "pared", data=d, sims=50, boot = T) a <- lm(formula = pared ~ income, data=d) bc <- lm(formula = score ~ income + pared, data=d) 29/50 31/50 Wyszukiwanie wartości odstających Wyniki CMA car::outliertest(model = bc) summary(wynik.cma) No Studentized residuals with Bonferonni p < 0.05 Largest rstudent : rstudent unadjusted p-value Bonferonni p 1749 3.113184 0.0019577 0.97885 30/50 Causal Mediation Analysis Nonparametric Bootstrap Confidence Intervals with the Percentile Method Estimate 95% CI Lower 95% CI Upper p-value ACME 0.2090 0.0981 0.38 <2e-16 *** ADE 1.0928 0.7498 1.37 <2e-16 *** Total Effect 1.3018 0.9476 1.60 <2e-16 *** Prop. Mediated 0.1606 0.0700 0.28 <2e-16 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Sample Size Used: 500 Simulations: 50 32/50
Interakcja między węglowodanami i tłuszczami w diecie oraz jej wpływ na wagę summary(int) nr_ob waga weglowodany tluszcze Min. : 1.00 Min. : 49.00 Min. :115.0 Min. : 20.00 1st Qu.: 7.75 1st Qu.: 61.50 1st Qu.:140.0 1st Qu.: 45.00 Median :14.50 Median : 72.00 Median :162.5 Median : 60.50 Mean :14.50 Mean : 73.64 Mean :165.9 Mean : 61.11 3rd Qu.:21.25 3rd Qu.: 82.00 3rd Qu.:190.0 3rd Qu.: 76.25 Max. :28.00 Max. :110.00 Max. :235.0 Max. :100.00 ACME - Averge Causual Mediation Effect - efekt pośredni ADE - Average Direct Effect - efekt bezpośredni Total effect - efekt całkowity 33/50 35/50 model1 <- lm(waga~weglowodany+tluszcze, data = int) model2 <- lm(waga~weglowodany+tluszcze+weglowodany:tluszcze, data = int) summary(model1)$coef; summary(model2)$coef (Intercept) 18.4306026 3.28446925 5.611440 7.732219e-06 weglowodany 0.1050371 0.03111134 3.376168 2.405320e-03 tluszcze 0.6184399 0.05014292 12.333545 3.981804e-12 Przykład analizy moderacji (Intercept) 40.433490058 9.781145459 4.1338195 0.0003755301 weglowodany -0.024236254 0.061689271-0.3928763 0.6978787589 tluszcze 0.235733075 0.168257448 1.4010261 0.1740047089 weglowodany:tluszcze 0.002143077 0.000906171 2.3649802 0.0264567515 36/50
Tworzenie czynnika interakcyjnego int$zweglowodany <- scale(int$weglowodany, center = T, scale = F) int$ztluszcze <- scale(int$tluszcze, center = T, scale=f) int$interakcja <- int$ztluszcze*int$zweglowodany head(int) nr_ob waga weglowodany tluszcze Zweglowodany Ztluszcze interakcja 1 9 51 160 35-5.857143-26.10714 152.9133 2 7 52 120 30-45.857143-31.10714 1426.4847 3 1 55 120 40-45.857143-21.10714 967.9133 4 10 56 115 45-50.857143-16.10714 819.1633 5 3 58 125 40-40.857143-21.10714 862.3776 6 2 60 130 39-35.857143-22.10714 792.6990 Skoro wszystko ważne to analiza hierarchiczna model1 <- lm(waga ~ weglowodany, data = int) model2 <- lm(waga ~ weglowodany + tluszcze, data = int) model3 <- lm(waga ~ weglowodany + tluszcze + interakcja, data = int) 37/50 39/50 Budowa modelu summary(model)$coef Analiza istotności wprowadzania kolejnego czynnika do modelu (Intercept) 18.713288696 3.021203000 6.193986 2.118816e-06 weglowodany 0.106721033 0.028604074 3.730973 1.036781e-03 tluszcze 0.591177632 0.047507376 12.443913 5.870642e-12 interakcja 0.002143077 0.000906171 2.364980 2.645675e-02 anova(model1,model2,model3) Analysis of Variance Table Model 1: waga ~ weglowodany Model 2: waga ~ weglowodany + tluszcze Model 3: waga ~ weglowodany + tluszcze + interakcja Res.Df RSS Df Sum of Sq F Pr(>F) 1 26 1705.61 2 25 240.75 1 1464.9 180.0639 1.196e-12 *** 3 24 195.25 1 45.5 5.5931 0.02646 * --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 38/50 40/50
Bety wystandaryzowane Czyli odpowiedź na pytanie o proporcje QuantPsyc::lm.beta(model3) table(int$ktluszcze); table(int$kweglowodany) niskie wysokie 14 14 weglowodany tluszcze interakcja 0.22165017 0.76180739 0.08874234 niskie wysokie 14 14 41/50 43/50 Podział wg mediany Szereg analiz regresji int$kweglowodany <- factor( ifelse(int$weglowodany > median(int$weglowodany), 1, 0), levels = 0:1, labels = c("niskie", "wysokie")) int$ktluszcze <- factor( ifelse(int$tluszcze > median(int$tluszcze), 1, 0), levels = 0:1, labels = c("niskie", "wysokie")) head(int[,5:9]) model4a <- lm(waga~weglowodany, data=int[int$ktluszcze=="niskie",]) model4b <- lm(waga~weglowodany, data=int[int$ktluszcze=="wysokie",]) model4c <- lm(waga~tluszcze, data=int[int$kweglowodany=="niskie",]) model4d <- lm(waga~tluszcze, data=int[int$kweglowodany=="wysokie",]) Zweglowodany Ztluszcze interakcja Kweglowodany Ktluszcze 1-5.857143-26.10714 152.9133 niskie niskie 2-45.857143-31.10714 1426.4847 niskie niskie 3-45.857143-21.10714 967.9133 niskie niskie 4-50.857143-16.10714 819.1633 niskie niskie 5-40.857143-21.10714 862.3776 niskie niskie 6-35.857143-22.10714 792.6990 niskie niskie 42/50 44/50
summary(model4a)$coef; summary(model4b)$coef; summary(model4c)$coef; summary(model4d)$coef (Intercept) 53.46757765 16.7629171 3.1896344 0.007780795 weglowodany 0.05355709 0.1182233 0.4530165 0.658618881 ggplot(int, aes(x=tluszcze, y=waga, colour=kweglowodany, group=kweglowodany)) + geom_point() + geom_smooth(method="lm", se=f, size=2) + theme_bw() (Intercept) 3.681527 10.21333119 0.3604629 7.247662e-01 weglowodany 0.432321 0.05312094 8.1384284 3.152901e-06 (Intercept) 27.2800796 3.27227821 8.336724 2.459162e-06 tluszcze 0.7504976 0.06802815 11.032162 1.227011e-07 (Intercept) 30.6578511 5.50026003 5.573891 1.210689e-04 tluszcze 0.7188477 0.07133662 10.076840 3.296833e-07 45/50 47/50 Rysunki Plot twist :-) ggplot(int, aes(x=weglowodany, y=waga, colour=ktluszcze, group=ktluszcze)) + geom_point() + geom_smooth(method="lm", se=f, size=2) + theme_bw() qplot(int$weglowodany,int$tluszcze, size=int$waga) 46/50 48/50