Po co nam SEM? Badanie zależności między latentnymi zmiennymi Porównywanie konkurencyjnych modeli Badanie efektów pośrednich i bezpośrednich Konfirmacyjne analizy struktury narzędzi badawczych Testowanie złożonych modeli mediacji zmiennych Sprawdzanie międzygrupowej stabilności modeli Równania strukturalne Paweł Kleka 25 stycznia 2017 (uaktualnione 2019-04-25) 3/47 Co już wiemy Y ~ X korelacja Y ~ X 1 + X 2 + + X n regresja Równania strukturalne: Y 1 ~ X 1 + X 2 ; Y 2 ~ X 3 + X 4 ; Y ~ Y 2 Analiza ścieżek vs Równania strukturalne Path analysis + równania regresji wielorakiej + wszystkie zmienne są obserwowane Structural Equations Modeling + rachunek macierzowy + zmienne jawne i ukryte (latentne) 2/47 4/47
SEM w pigułce Wykres ścieżkowy - elementy Graficzny obraz struktury zależności między zmiennymi wraz ze współczynnikami i miarą dopasowania do danych. zmienna obserwowana a zmienna ukryta c przyczynowa kowariancja b d 5/47 7/47 Etapy postępowania Składnia 1. Zdefiniowanie modelu w oparciu o teorię 2. Przygotowanie danych usunięcie lub uzupełnienie braków danych ocena normalności i wartości odstających 3. Sporządzenie i ocena modelu współczynniki dopasowanie interpretacja 4. Opcjonalnie: modyfikacja modelu i ponowna jego ocena 5. Odniesienie wyniku do teorii 1. zmienna ukryta f1 =~ y1 + y2 + y3 2. regresja f1 ~ f3 + f4 3. kowariancja y1 ~~ y1 4. stałe f1 ~ 1 Więcej: model.syntax {lavaan} 6/47 8/47
Regresja jako równaie strukturalne Założenia SEM X1 β 1 liniowość zależności normalność rozkładów zmiennych ciągłość zmiennych obserwowalnych (kategorii=>7) niezależność obserwacji X2 β 2 Y losowość próby o dużej liczebności ε 9/47 11/47 Analiza czynnikowa jako SEM Estymatory ML - maksymalnej wiarygodności GLS - uogólnionych najmniejszych kwadratów ULS - nieważonych najmniejszych kwadratów SLS - niezależna od skali najmniejszych kwadratów ADF - asymptotycznie wolna od rozkładu 10/47 12/47
Wymagane N Wyjątkow N < 200 Metoda estymacji N obserwacji skośność i kurtoza ML 150 + 15 x V -1 : 1 _LS 150 + 15 x V -1 : 1 _LS 2500+ -2,5 : 2,5 Gdy: Modele bez zmiennych latentnych Modele z silnie skorelowanymi zmiennymi (>0.6) Proste modele Modele na ograniczonych populacjach ADF 5000+ - 13/47 15/47 Sample size Co, gdy skale porządkowe? N < 200 to mała grupa Dla estymatora ML: N >= df * 10 Czyli gdzie s to liczba ustalonych parametrów w modelu, a k liczba zmiennych Dla estymatora GLS: N >= df * 3 1 df = k (k 1) 2 s przy N < 120 minimum to n >= df przy N > 150 n > k Skale porządkowe są z natury dyskretne, likertowskie <- średnie, wariancje i kowariancje nie mają znaczenia -> związki są zawsze niedoszacowane: 1. obciążone parametry 1. obciążone błędy standardowe 1. niepoprawne wyniki testów Rozwiązanie UVA (undelraing variable approach): pod obserwowaną zmienną porządkową jest zmienna ilościowa, ciągła, dlatego można stosować korelacje terrachoryczne lub polychoryczne i estymator WLS (N >= 20*df) Dla N => 500+ można uzywać estymator DWLS, który ma zalety WLS, ale ma mniejsze wymagania co do wielkości próby. Brzeziński 1996, s. 525-530 14/47 16/47
Tabelka z mocą (Konarski, 2009) Miary dopasowania CMIN* (miara niedopasowania o rozkładzie chi2) Hoelter** > 200 (dla n >200 i istotnego chi2) Miara rozbieżności dopasowania RMSEA 0 -dobre-.05 -zadowalające-.08 -mierne-.10 -brak- 1.0 Miary wyjaśnionej wariancji GFI AGFI, PGFI - jak skorygowane R2 NFI (miara różnicy od modelu niezależnego) RFI, PNFI, TLI (duże n), IFI (duże n) ->.90 Kryteria informacyjne AIC, BCC, CAIC, BIC - im niższe, tym lepiej; do porównywania modeli chi2 jest wiarygodne dla prób 75-200 osób, powyżej 400 przeważnie jest istotne wielkość efektu: Z = 2χ 2 2 df 1 17/47 19/47 Szacowanie dopasowania modeli Raport z analizy SEM Porównanie między modelami: niezależny (independence) - brak związków między zmiennymi badawczy (default) nasycony (saturated) - związki między wszystkimi zmiennymi 1. przesłanki teoretyczne 2. przykładowa macierz korelacji z średnimi i odchyleniami standardowymi na przekątnej 3. minimum po jednym wskaźniku dopasowania z każdej grupy 4. interpretacja wartości wskaźników 5. współczynniki modelu 6. odniesienie do podobnych analiz 18/47 20/47
Overfitting http://tylervigen.com/spurious-correlations Przykłady mające pokazać, że SEM jest metodą nadrzędną do wszystkiego co do tej pory było ;-) 21/47 Literatura Analiza mediacji w SEM Cwalina, W. (2000). Zastosowanie modelowania równań strukturalnych w naukach społecznych. W: Statystyka w badaniach naukowych. Materiały na seminaria organizowane przez StatSoft Polska Sp. z o.o. 9 października 2000 r. w Warszawie, (15-22). Kraków: StatSoft Polska. Gaul, M., Machowski, A. (1987). Elementy analizy cieżek. W: J. Brzeziński (red.), Wielozmiennowe modele statystyczne w badaniach psychologicznych, s. 82-112. Warszawa: PWN. Indeksy dopasowania: http://davidakenny.net/cm/fit.htm Hair, J. F., Jr., Black, W. C., Babin, B. J., Anderson, R. E. (2010). Multivariate data analysis (7 ed.), rozdział 12. Upper Saddle River: Prentice Hall. set.seed(1234) #generuję dane X <- rnorm(100) M <- 0.5 * X + rnorm(100) Y <- 0.7 * M + rnorm(100) Data <- data.frame(x = X, Y = Y, M = M) model.mediacji <- '# direct effect Y ~ c*x # mediator M ~ a*x Y ~ b*m # indirect effect (a*b) ab := a*b # total effect total := c + (a*b)' fit.m <- sem(model.mediacji, data = Data) 22/47 26/47
lavaan 0.6-3 ended normally after 12 iterations Optimization method NLMINB Number of free parameters 5 Number of observations 100 Estimator ML Model Fit Test Statistic 0.000 Degrees of freedom 0 Minimum Function Value 0.0000000000000 Parameter Estimates: Information Expected Information saturated (h1) model Structured Standard Errors Standard Regressions: Estimate Std.Err z-value P(> z ) Y ~ X (c) 0.036 0.104 0.348 0.728 M ~ X (a) 0.474 0.103 4.613 0.000 Y ~ M (b) 0.788 0.092 8.539 0.000 Variances: Estimate Std.Err z-value P(> z ).Y 0.898 0.127 7.071 0.000.M 1.054 0.149 7.071 0.000 27/47 Mediacja z uwzględnieniem grup model <- ' # outcome model outcomevar ~ c*xvar + b1*medvar1 + b2*medvar2 # mediator models medvar1 ~ a1*xvar medvar2 ~ a2*xvar # indirect effects (IDE) medvar1ide := a1*b1 medvar2ide := a2*b2 sumide := (a1*b1) + (a2*b2) # total effect total := c + (a1*b1) + (a2*b2) medvar1 ~~ medvar2 # model correlation between mediators ' fit <- sem(model, data=dataframe) summary(fit, fit.measures=true, standardize=true, rsquare=true) #bootstrap confidence intervals boot.fit <- parameterestimates(fit, boot.ci.type="bca.simple") 29/47 Regressions: Estimate Std.Err Z-value P(> z ) Y ~ X (c) 0.036 0.104 0.348 0.728 M ~ X (a) 0.474 0.103 4.613 0.000 Y ~ M (b) 0.788 0.092 8.539 0.000 Variances: Estimate Std.Err Z-value P(> z ) Y 0.898 0.127 7.071 0.000 M 1.054 0.149 7.071 0.000 Defined Parameters: Estimate Std.Err Z-value P(> z ) ab 0.374 0.092 4.059 0.000 total 0.410 0.125 3.287 0.001 Przykład analizy konfirmacyjnej 28/47
Dane Model str(rs) 'data.frame': 177 obs. of 8 variables: $ wiek : int 20 20 21 23 20 26 20 20 26 22... $ plec : int 1 1 1 1 1 1 1 1 1 1... $ CzasBrakuPartnera : int 6 6 6 6 6 6 6 6 6 6... $ wsparcie.wazna.osoba : num 14.8 16.2 19.5 19.2 22.8... $ wsparcie.rodzina : num 16.2 15.2 13.8 19.2 22.8... $ wsparcie.przyjaciele : num 8.25 19.5 18.5 19.5 19.75... $ wsparcie : num 44.4 57.5 57.5 64.5 74.6... $ romantyczna.samotnosc: num 9.8 10.2 11.4 27.4 22.2 12.8 14.2 17.4 24.4 15.4... model0 <- ' # regresje romantyczna.samotnosc ~ wsparcie + CzasBrakuPartnera wsparcie ~ wsparcie.wazna.osoba + wsparcie.rodzina + wsparcie.przyjaciele #kowariancje wsparcie.wazna.osoba ~~ wsparcie.rodzina wsparcie.wazna.osoba ~~ wsparcie.przyjaciele wsparcie.rodzina ~~ wsparcie.przyjaciele ' # konwersji płci na zmienną kategorialną rs$plec <- factor(rs$plec, levels=1:2, labels=c("kobieta","mężczyzna")) 31/47 33/47 Dane - płeć Estymacja table(rs$plec) kobieta mężczyzna 121 56 prop.table(table(rs$plec)) kobieta mężczyzna 0.6836158 0.3163842 Analizę SEM można przeprowadzić bezpośrednio w R, w Jamovi, lub JASP w oparciu o pakiet lavaan. Estymatory, które można wykorzystać: (estimator=) ML, GLS, WLS (=ADF), ULS, DWLS # Do dzieła! fit0 <- cfa(model0, data=rs, fixed.x=f) cfa = sem = lavaan Więcej ustawień zobacz:?lavaan 32/47 34/47
Wyniki - dopasowanie modelu # pełna lista wskaźników dopasowania #fitmeasures(fit0) summary(fit0, standardized=t, fit.measures=t) lavaan 0.6-3 ended normally after 84 iterations Optimization method NLMINB Number of free parameters 14 Number of observations 177 Estimator ML Model Fit Test Statistic 17.365 Degrees of freedom 7 P-value (Chi-square) 0.015 Model test baseline model: Minimum Function Test Statistic 942.867 Degrees of freedom 15 P-value 0.000 User model versus baseline model: Comparative Fit Index (CFI) 0.989 Tucker-Lewis Index (TLI) 0.976 Loglikelihood and Information Criteria: 35/47 # wybrane wskaźniki fitmeasures(fit0, c("tli", "rmsea", "agfi")) tli rmsea agfi 0.976 0.091 0.909 37/47 lhs op rhs est se 1 romantyczna.samotnosc ~ wsparcie -0.064 0.038 2 romantyczna.samotnosc ~ CzasBrakuPartnera 0.019 0.004 3 wsparcie ~ wsparcie.wazna.osoba 1.194 0.031 4 wsparcie ~ wsparcie.rodzina 1.221 0.025 5 wsparcie ~ wsparcie.przyjaciele 0.976 0.033 6 wsparcie.wazna.osoba ~~ wsparcie.rodzina 9.337 1.672 7 wsparcie.wazna.osoba ~~ wsparcie.przyjaciele 11.239 1.589 8 wsparcie.rodzina ~~ wsparcie.przyjaciele 4.939 1.396 9 romantyczna.samotnosc ~~ romantyczna.samotnosc 35.239 3.746 10 wsparcie ~~ wsparcie 1.812 0.193 11 wsparcie.wazna.osoba ~~ wsparcie.wazna.osoba 20.174 2.144 12 wsparcie.rodzina ~~ wsparcie.rodzina 20.195 2.147 13 wsparcie.przyjaciele ~~ wsparcie.przyjaciele 15.884 1.688 14 CzasBrakuPartnera ~~ CzasBrakuPartnera 11963.650 1271.722 z pvalue ci.lower ci.upper 1-1.714 0.087-0.138 0.009 2 4.663 0.000 0.011 0.027 3 38.033 0.000 1.132 1.255 4 48.086 0.000 1.172 1.271 5 29.925 0.000 0.912 1.040 6 5.586 0.000 6.061 12.614 7 7.074 0.000 8.125 14.353 8 3.536 0.000 2.202 7.676 9 9.407 0.000 27.897 42.581 10 9.407 0.000 1.435 2.190 11 9.407 0.000 15.971 24.377 12 9.407 0.000 15.988 24.403 13 9.407 0.000 12.575 19.194 14 9.407 0.000 9471.121 14456.178 36/47 Model zmieniony model1 <- ' # regresje romantyczna.samotnosc ~ wsparcie.rodzina + CzasBrakuPartnera # usuwam: # wsparcie ~ wsparcie.wazna.osoba + wsparcie.rodzina + wsparcie.przyjaciele #kowariancje wsparcie.wazna.osoba ~~ wsparcie.rodzina wsparcie.wazna.osoba ~~ wsparcie.przyjaciele wsparcie.rodzina ~~ wsparcie.przyjaciele ' fit1 <- cfa(model1, data=rs, fixed.x=f) fitmeasures(fit1, c("tli", "rmsea", "agfi")) tli rmsea agfi 0.841 0.120 0.889 38/47
Porównywanie modeli zagnieżdżonych Najważniejsze parametry anova(fit1, fit0) Chi Square Difference Test Df AIC BIC Chisq Chisq diff Df diff Pr(>Chisq) fit1 5 6248.3 6280.1 17.744 fit0 7 6861.3 6905.8 17.365-0.37936 2 1 MI <- modificationindices(fit0) subset(mi, mi>5) # wartość tu: 5 zależy od wielu czynników lhs op rhs mi epc sepc.lv 32 wsparcie.wazna.osoba ~ romantyczna.samotnosc 6.771-0.105-0.105 34 wsparcie.wazna.osoba ~ CzasBrakuPartnera 5.687-0.005-0.005 37 wsparcie.rodzina ~ romantyczna.samotnosc 5.720 0.123 0.123 39 wsparcie.rodzina ~ CzasBrakuPartnera 8.370 0.008 0.008 sepc.all sepc.nox 32-0.149-0.149 34-0.129-0.001 37 0.174 0.174 39 0.193 0.002 39/47 41/47 Filtrowanie parametrów tylko jednego rodzaju ES <- parameterestimates(fit0, ci = F) subset(es, op == "~") lhs op rhs est se z pvalue 1 romantyczna.samotnosc ~ wsparcie -0.064 0.038-1.714 0.087 2 romantyczna.samotnosc ~ CzasBrakuPartnera 0.019 0.004 4.663 0.000 3 wsparcie ~ wsparcie.wazna.osoba 1.194 0.031 38.033 0.000 4 wsparcie ~ wsparcie.rodzina 1.221 0.025 48.086 0.000 5 wsparcie ~ wsparcie.przyjaciele 0.976 0.033 29.925 0.000 Overfitting Na podstawie indeksów modyfikacyjnych łatwo jest zbudować model dopasowany do danych, ale w efekcie powstaje coś, co pasuje tylko do obserwowanych danych. Taka sytuacja przeszacowania dobroci jest tak samo zła jak niedopasowania modelu. Można temu zapobiegać przez metody uczenia maszynowego (walidacja krzyżowa, bootstraping, itp.) 40/47 42/47
Model ulepszony Analiza w grupach Bez zmiennej wsparcie, która jest sumą pozostałych wsparć. model2 <- ' romantyczna.samotnosc ~ wsparcie.rodzina + wsparcie.wazna.osoba + wsparcie.przyjaciele + CzasBrakuPartnera wsparcie.wazna.osoba ~~ wsparcie.rodzina wsparcie.wazna.osoba ~~ wsparcie.przyjaciele wsparcie.rodzina ~~ wsparcie.przyjaciele wsparcie.rodzina ~~ CzasBrakuPartnera ' fit2 <- cfa(model2, data=rs, fixed.x=f) fitmeasures(fit2, c("tli", "rmsea", "agfi")) tli rmsea agfi 0.987 0.034 0.960 # uwzględniamy płeć fit.g <- cfa(model2, data=rs, group="plec", fixed.x=f) # porównanie modeli niezagnieżdżonych fitmeasures(fit2, c("tli", "aic", "bic","rmsea", "agfi")) tli aic bic rmsea agfi 0.987 6238.988 6280.278 0.034 0.960 fitmeasures(fit.g, c("tli", "aic", "bic","rmsea", "agfi")) tli aic bic rmsea agfi 0.833 6207.786 6322.127 0.121 0.990 Parametry gorsze i BIC wyższy - nie warto wprowadzać grup. 43/47 45/47 Porównywanie modeli anova(fit2, fit0) Chi Square Difference Test Df AIC BIC Chisq Chisq diff Df diff Pr(>Chisq) fit2 2 6239.0 6280.3 2.4056 fit0 7 6861.3 6905.8 17.3648 14.959 5 0.01054 * --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Istotna różnica (p < 0,0105). Uproszczony model jest lepszy 44/47