Op deze pagina vind je een demonstratie van een statistische techniek aan de hand van een voorbeeld.

Meer informatie over hoe je deze pagina kan gebruiken vind je in deze handleiding.

De analyse gebeurt met behulp van R en RStudio. Een inleiding tot deze software vind je hier.


Referentie

Het voorbeeld op deze pagina is afkomstig van een studie van Vekeman, Devos, Valcke & Rosseel (2017). Er zijn lichte wijzigingen aangebracht om didactische redenen.



1 Doel

Padanalyse is een statistische techniek die je kan gebruiken om de onderliggende mechanismen bloot te leggen die een fenomeen kunnen verklaren.

Vekeman et al. (2017) probeerden onder meer te verklaren waarom leerkrachten de intentie hebben om het onderwijs te verlaten.

Anders dan bij lineaire regressie gaan we niet enkel op zoek naar het onafhankelijke effect van een reeks predictoren op een afhankelijke variabele. In padanalyse zijn we geïnteresseerd in een complexer systeem van variabelen. Kenmerkend is bijvoorbeeld dat er variabelen kunnen voorkomen die verklaard worden door andere variabelen, maar die zelf ook als verklaring fungeren van nog een andere variabele.

Over de terminologie die hoort bij padanalyse (bv. exogene en endogene variabelen, padcoëfficiënten), zie hier, in het bijzonder op slides 22 tot en met 27.

Vekeman et al. (2017) hadden een vermoeden van waarom leerkrachten de intentie hebben om het onderwijs te verlaten. Ze dachten dat een mediatie-effect en een moderatie-effect samen een goede verklaring zouden kunnen bieden voor het vertrek van leerkrachten.


Mediatie

De P-O fit (“hoe goed passen leerkracht en school bij elkaar?”) vormt een belangrijk deel van de verklaring. Deze fit zou een effect (a1) hebben op de jobtevredenheid, die op zijn beurt een effect (b1) zou hebben op de intentie om het onderwijs te verlaten. Dit deel van de verklaring zie je in onderstaande figuur. Er wordt natuurlijk ook rekening gehouden met een eventueel direct effect (c1) van POFit op intentieVertrek, dat dus niet via jobTevr gaat.

Vekeman mediation only


Meer informatie over mediatie vind je hier.


Moderatie (interactie)

De onderzoekers denken verder dat het effect van de jobtevredenheid op de intentie om het onderwijs te verlaten niet even groot is in alle omstandigheden. Specifiek gaan ze na of dit effect afhankelijk zou kunnen zijn (b3) van een andere variabele: de opties die leerkrachten denken te hebben om werk te vinden buiten het onderwijs (perceptieWerk).

Het model met mediatie én moderatie zie je hieronder. Alle pijlen hebben opnieuw een label gekregen (a1, b1,…).

Vekeman hypothesen

In dit model wordt jobtevredenheid (jobTevr) verklaard door P-O fit (POFit), maar tegelijk is jobtevredenheid zelf ook een verklaring voor de intentie om het onderwijs te verlaten (intentieVertrek). Dit laatste hangt af van de opties voor ander werk (perceptieWerk). Merk op dat het model ook een direct effect (b2) van perceptieWerk op intentieVertrek bevat. Zonder dat laatste bestaat de mogelijkheid dat we een verkeerde conclusie trekken over het moderatie-effect.


Meer informatie over moderatie (interactie) vind je hier vanaf p.61.


Controlevariabelen

Ten slotte bevat het model nog een reeks controlevariabelen (niet getoond op de figuur hierboven). Deze worden opgenomen omdat ze mogelijk gerelateerd zijn aan andere variabelen in het model en dus conclusies zouden kunnen beïnvloeden. Je vindt ze in het overzicht hieronder.


Overzicht variabelen

Alle variabelen in deze demonstratie

  • intentieVertrek: Intentie van leerkrachten om het onderwijs te verlaten
  • POFit: “Person-Organisation fit”, de mate waarin een individu en organisatie bij elkaar passen
  • perceptieWerk: “Perceived employability”, de mate waarin een leerkracht denkt buiten het onderwijs werk te kunnen vinden
  • jobTevr: “Job satisfaction”, tevredenheid met de job
  • perceptieWerkXjobTevr: product van perceptieWerk en jobTevr, om het interactie-effect te modelleren
  • GESL: geslacht (controlevariabele)
  • LFTD: leeftijd (controlevariabele)
  • JAARSCH: jaren ervaring in de school (controlevariabele)
  • GOK: sociaal-economische status van de school (controlevariabele)


Wat kan je leren uit padanalyse?

Met een padanalysemodel kan je verschillende zaken proberen te achterhalen. Belangrijke doelen van de analyse zijn

  • om te achterhalen of het model in zijn geheel goed fit met de data,
  • om alle padcoëfficiënten te schatten en
  • om te toetsen of deze coëfficiënten significant verschillen van nul.

De volgorde is hier belangrijk! Het heeft geen zin om conclusies te trekken over het al dan niet significant zijn van de afzonderlijke padcoëfficiënten in een model dat in zijn geheel niet goed fit met de data.



2 Packages en dataset

Voor de analyse van een padmodel kan je functies uit het lavaan-package gebruiken.

install.packages("lavaan") # eenmalig installeren
library(lavaan) # bij de start van elke sessie


De dataset bevat gegevens van 284 variabelen geobserveerd bij 997 leerkrachten.

Deze dataset kan je inladen met read.csv(). De data kan je best meteen in een object verloop onderbrengen zodat je die later makkelijk opnieuw kan oproepen.

verloop <- read.csv('https://statlas.ugent.be/datasets/verloopLeerkrachten.csv')


Met str() krijg je een opsomming van alle variabelen in de dataset. Je vindt er ook telkens bij om welk datatype het gaat. Afhankelijk van het datatype zal je sommige functies wel of juist niet kunnen gebruiken. Het heeft bijvoorbeeld geen zin om een gemiddelde te berekenen van een variabele van type chr.

str(verloop) 

In de output van str() kan je zien dat er inderdaad 284 variabelen zijn met telkens 997 observaties.



3 Padanalyse in R

Je kan het model fitten en alle parameters erin schatten in twee stappen.


Verbanden tussen variabelen vastleggen

Eerst leg je vast welke verbanden je model moet bevatten tussen welke variabelen. Die structuur stop je in een object. Vergeet de enkele aanhalingstekens ' vooraan en achteraan niet. In het model hieronder zijn verschillende soorten verbanden opgenomen, elk met een eigen syntax. Die zullen we een voor een bespreken.

Merk op dat hier een nieuwe variabele tussenstaat, namelijk perceptieWerkXjobTevr. Die is het product van perceptieWerk en jobTevr. Dit product in het model opnemen als nieuwe variabele is een manier om het moderatie-effect te modelleren.

mijnModel <- '
             # Directe effecten
               intentieVertrek ~ c1*POFit
               intentieVertrek ~ b2*perceptieWerk
               intentieVertrek ~ b3*perceptieWerkXjobTevr
 
             # Mediatie en controlevariabelen
               jobTevr ~ a1*POFit + GOK + LFTD + JAARSCH + GESL
               intentieVertrek ~ b1*jobTevr + GOK + LFTD + JAARSCH + GESL
 
             # Conditioneel Indirect Effect van POFit op intentieVertrek 
             #  voor bepaalde waarden van perceptieWerk. 
             #  1.02 is de standaarddeviatie van perceptieWerk.
               CIE1 := a1*(b1+b3*-1.02)
               CIE2 := a1*(b1+b3*0)   
               CIE3 := a1*(b1+b3*1.02)
 
             # Direct en Indirect Effect van POFit op intentieVertrek
               indirect := a1*b1
               direct := c1
               total := c1 + (a1*b1)
             '


Directe effecten

Directe effecten codeer je met de operator ~.

De code hierboven is opgesplitst in drie lijnen. Het kan even goed in één lijn:

mijnModel <- '# Directe effecten
              intentieVertrek ~ c1*POFit + b2*perceptieWerk + b3*perceptieWerkXjobTevr
              '


c1, b2 en b3 zijn labels. Die moeten enkel in je code staan als je er verderop indirecte effecten mee wil berekenen.


Een alternatieve manier om een moderatie-effect te specifiëren is door : te gebruiken in je syntax.

mijnModel <- '# Directe effecten
              intentieVertrek ~ c1*POFit + b2*perceptieWerk + b3*perceptieWerk:jobTevr
              '

Meer informatie over moderatie (interactie) vind je hier vanaf p.61.


Mediator

Je vermoedt dat er sprake is van mediatie. Het effect van POFit op intentieVertrek zou (eventueel gedeeltelijk) gemedieerd worden door jobTevr.

Ook dit systeem van verbanden tussen variabelen codeer je als een verzameling directe effecten met ~. Ook hier zijn labels toegevoegd om later indirecte effecten te berekenen.

Meer uitleg over mediatie vind je hier en een voorbeeld met lavaan vind je hier.


Indirecte effecten berekenen

Bij een aantal directe effecten heb je labels (a1, b1,…) vastgelegd. De labels stellen schattingen van padcoëfficiënten voor. Aan de hand daarvan kan je nu ook indirecte effecten laten berekenen. Daarvoor vermenigvuldig je de padcoëfficiënten op een pad tussen twee variabelen.

Totale effecten berekenen kan ook. Die zijn niets anders dan de som van alle indirecte en directe effecten die te vinden zijn tussen twee variabelen.

Zulke berekeningen zie je op het einde van mijnModel. Het effect dat je wil berekenen geef je een naam, gevolgd door de operator := met daarachter de gepaste formule met labels. Indirecte effecten die je op deze manier uitdrukkelijk laat berekenen zal je ook terugzien in de uiteindelijke output (zie verderop).

Let op: er is een moderatie-effect aanwezig in het model. Het effect van jobTevr op intentieVertrek kan dus verschillend zijn afhankelijk van perceptieWerk. De syntax indirect := a1*b1 levert je een waarde op voor het indirecte effect, in de specifieke conditie dat perceptieWerk de waarde 0 heeft. Het is met andere woorden een conditioneel indirect effect (en het is trouwens gelijk aan CIE2 wat hogerop).

In veel situaties is de conditie waarin een variabele de waarde 0 heeft onrealistisch of absurd.1 Ook hier is perceptieWerk gelijk aan nul niet echt betekenisvol.

Om ervoor te zorgen dat dit indirect effect wel een weergave is van een realistische situatie gaat men de moderatorvariabele perceptieWerk centreren. Dat zorgt ervoor dat de waarde 0 samenvalt met het gemiddelde van deze variabele. Dat heeft men in dit onderzoek inderdaad gedaan.

mean(verloop$perceptieWerk, na.rm=TRUE)  # afgerond 0
[1] 6.202985e-16


Je kan nog een stap verder gaan en berekenen wat het indirect effect is bij andere waarden van de moderator perceptieWerk (dus opnieuw “conditionele indirecte effecten”). Zo kies je er ook voor om het effect te berekenen wanneer perceptieWerk één standaarddeviatie onder en boven het gemiddelde ligt (respectievelijk CIE1 en CIE3).

sd(verloop$perceptieWerk, na.rm=TRUE) # afgerond 1.02
[1] 1.019214


Schatten van parameters

In een tweede stap schat je alle parameters van het model met de functie sem(). Deze functie heeft de specificatie van het model nodig (object mijnModel) en de data.2

fit <- sem(mijnModel, data = verloop, se = 'bootstrap')


In de code zie je een extra argument se = 'bootstrap'. Dit slaat op de methode om de standaardfouten (“standard error”) van parameters te berekenen. Wanneer je bv. een indirect effect schat, dan is de parameter een product van twee andere parameters en dus typisch niet normaal verdeeld over vele steekproeven heen. Met de “gewone” methode van standaardfouten berekenen kan dit tot verkeerde conclusies leiden over de significantie van het indirect effect. Daarom is het aangeraden om se = 'bootstrap' te kiezen.



4 Resultaten tonen

Om de resultaten te zien gebruik je de functie summary(). Het object fit kan uiteraard niet ontbreken. Met de argumenten kan je verder bepalen wat je precies in de output wil zien. (De output wordt besproken in paragraaf 5.)

summary(fit, fit.measures = TRUE, standardized = TRUE, rsquare = TRUE)


Enkele keuzes die je kan maken bij de summary()-functie zijn:


fit.measures = TRUE

Indien fit.measures = FALSE - wat standaard het geval is - wordt enkel een \(\chi^2\)-toets uitgevoerd als maat voor de fit van het model. Deze toets is niet altijd voldoende om de model fit te beoordelen, zeker bij hele grote steekproeven.

Het is aangeraden om bijkomende fitmaten te laten berekenen en te rapporteren in je publicatie, zoals CFI/TLI, RMSEA en SRMR. Al deze fitmaten zijn op een verschillende manier gevoelig voor misspecificatie van het model. Voeg deze fitmaten toe door eenvoudigweg het argument fit.measures = TRUE te gebruiken. De lezer van je onderzoek kan zo zelf ook een oordeel vellen.

Meer uitgebreide uitleg over deze fitmaten vind je in:

Kline, R. B. (2015). Principles and practice of structural equation modeling (Fourth Edition). New York: Guilford Press.


standardized = TRUE

Het is niet zomaar mogelijk om de padcoëfficiënten onderling te vergelijken en om uitspraken te doen over welke groter of kleiner is. Dat komt omdat de getalwaarde ervan afhangt van de meeteenheid van de variabelen. Met het argument standardized = TRUE krijg je een extra kolom Std.all met schattingen voor gestandaardiseerde padcoëfficiënten. Wanneer er nu twee pijlen in eenzelfde variabele toekomen, zoals bij intentieVertrek, kan je wel de grootte van de verschillende effecten vergelijken.


rsquare = TRUE

Met dit argument kan je een schatting van de proportie verklaarde variantie (m.a.w. de determinatiecoëfficiënt \(R^2\)) van elke endogene variabele laten berekenen.



5 Resultaten interpreteren

Wat kan je leren uit de output van summary(fit, fit.measures = TRUE, standardized = TRUE, rsquare = TRUE)?

Toon/verberg de output van summary()

lavaan 0.6-10 ended normally after 2 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                        15
                                                      
                                                  Used       Total
  Number of observations                           982         997
                                                                  
Model Test User Model:
                                                      
  Test statistic                                17.881
  Degrees of freedom                                 2
  P-value (Chi-square)                           0.000

Model Test Baseline Model:

  Test statistic                               366.528
  Degrees of freedom                                15
  P-value                                        0.000

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    0.955
  Tucker-Lewis Index (TLI)                       0.661

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)              -1915.509
  Loglikelihood unrestricted model (H1)      -1906.568
                                                      
  Akaike (AIC)                                3861.017
  Bayesian (BIC)                              3934.361
  Sample-size adjusted Bayesian (BIC)         3886.721

Root Mean Square Error of Approximation:

  RMSEA                                          0.090
  90 Percent confidence interval - lower         0.055
  90 Percent confidence interval - upper         0.130
  P-value RMSEA <= 0.05                          0.032

Standardized Root Mean Square Residual:

  SRMR                                           0.021

Parameter Estimates:

  Standard errors                            Bootstrap
  Number of requested bootstrap draws             1000
  Number of successful bootstrap draws            1000

Regressions:
                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  intentieVertrek ~                                                      
    POFit     (c1)     0.080    0.085    0.934    0.350    0.080    0.030
    percptWrk (b2)     0.074    0.022    3.353    0.001    0.074    0.100
    prcptWrXT (b3)    -0.082    0.039   -2.108    0.035   -0.082   -0.080
  jobTevr ~                                                              
    POFit     (a1)     0.581    0.072    8.075    0.000    0.581    0.251
    GOK               -0.031    0.040   -0.771    0.441   -0.031   -0.023
    LFTD              -0.004    0.003   -1.221    0.222   -0.004   -0.060
    JAARSCH            0.000    0.003    0.058    0.954    0.000    0.003
    GESL              -0.095    0.069   -1.363    0.173   -0.095   -0.046
  intentieVertrek ~                                                      
    jobTevr   (b1)    -0.529    0.042  -12.490    0.000   -0.529   -0.459
    GOK               -0.014    0.044   -0.322    0.748   -0.014   -0.009
    LFTD               0.001    0.004    0.307    0.759    0.001    0.015
    JAARSCH            0.004    0.004    1.087    0.277    0.004    0.055
    GESL               0.139    0.082    1.700    0.089    0.139    0.059

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .intentieVertrk    0.431    0.029   14.629    0.000    0.431    0.764
   .jobTevr           0.394    0.021   18.369    0.000    0.394    0.929

R-Square:
                   Estimate
    intentieVertrk    0.236
    jobTevr           0.071

Defined Parameters:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
    CIE1             -0.259    0.044   -5.853    0.000   -0.259   -0.095
    CIE2             -0.308    0.045   -6.792    0.000   -0.308   -0.115
    CIE3             -0.356    0.057   -6.222    0.000   -0.356   -0.135
    indirect         -0.308    0.045   -6.792    0.000   -0.308   -0.115
    direct            0.080    0.086    0.934    0.350    0.080    0.030
    total            -0.228    0.084   -2.704    0.007   -0.228   -0.085


Fit van het model

Of het model in zijn geheel goed fit met de data kan je achterhalen met behulp van de verschillende fitmaten.

Let op! De \(\chi^2\)-toets onder Model Test User Model interpreteren is hier anders dan je misschien intuïtief zou denken. Hier stelt de nulhypothese dat er een goede fit is. Dus als je hier een p-waarde kleiner dan 0.05 ziet, dan is de conclusie dat je de nulhypothese van goede fit moet verwerpen.

Met het argument fit.measures = TRUE heb je naast de \(\chi^2\)-toets nog andere fitmaten opgevraagd. Vuistregels voor deze fitmaten zijn dat er een goede fit is als …
  • CFI/TLI > 0.95
  • RMSEA < 0.05
  • SRMR < 0.06

In ons voorbeeld is de fit over het algemeen niet erg goed. Verschillende fitmaten wijzen op een slechte fit. Enkel de SRMR en CFI lijken aan te geven dat er een goede fit is.

In principe betekent dit dat je niet verder kan gaan met de analyse van de afzonderlijke padcoëfficiënten. Je zou eerst op zoeken moeten naar een beter fittend model. Om de demonstratie verder te kunnen zetten zullen we er nu van uitgaan dat er wél een goede fit is.

Modification indices

Als de fit van je model niet goed is, kan je eventueel de functie modificationIndices() gebruiken om suggesties te krijgen voor verbeteringen. In de kolom mi lees je welke bijkomende parameters een substantiële impact zouden hebben op de fit.3

Hier moet je wel heel voorzichtig mee omspringen! Het is verleidelijk om je model fit te verbeteren door zonder nadenken wat extra verbanden in het model te stoppen. Het gevaar bestaat dan dat je onzinnige connecties gaat maken (bv. effect van jobtevredenheid op leeftijd of geslacht). Je mag een effect dus enkel toevoegen als je er goede theoretische redenen voor hebt, als je echt reden hebt om te denken dat dat effect er in werkelijkheid zou kunnen zijn.


modificationIndices(fit,
                    sort=TRUE, # Sorteer van grootste naar kleinste effect op de model fit
                    maximum.number=5L # Toon enkel de eerste vijf
                    )

Toon/verberg de output van modificationIndices()

       lhs op                   rhs     mi    epc sepc.lv sepc.all sepc.nox
54   POFit  ~       intentieVertrek 25.869  2.517   2.517    6.730    6.730
78     GOK  ~       intentieVertrek 17.426 -3.186  -3.186   -4.864   -4.864
53 jobTevr  ~ perceptieWerkXjobTevr 16.720  0.112   0.112    0.127    0.173
79     GOK  ~               jobTevr 15.152  1.466   1.466    1.941    1.941
55   POFit  ~               jobTevr 15.113 -0.778  -0.778   -1.804   -1.804


Schattingen en toetsen van padcoëfficiënten

Verschillende padcoëfficiënten blijken significant te verschillen van nul.

Dat is het geval voor onder meer

  • het effect van POFit op jobTevr (label a1)
  • het effect van jobTevr op intentieVertrek (label b1)
  • het interactie-effect van perceptieWerk op de relatie tussen jobTevr en intentieVertrek (label b3)

Toon/verberg het model met labels

Vekeman hypothesen


Je kan ook schattingen aflezen voor de indirecte effecten die uitdrukkelijk in mijnModel werden gespecifieerd, bijvoorbeeld indirect (het product van de directe effecten met labels a1 en b1). Om te bepalen of een indirect effect significant verschillend is van nul kan je geen beroep doen op de toets die wordt uitgevoerd in de output van summary(). Daarvoor kijk je beter naar het (bootstrap-gebaseerde) betrouwbaarheidsinterval. Dit betrouwbaarheidsinterval kan je opvragen met de functie parameterEstimates(). In dit geval blijkt bijvoorbeeld dat 0 niet in het interval ligt bij indirect (lijn 47), dus kan je concluderen dat het effect significant verschillend is van 0.

parameterEstimates(fit)

Toon/verberg de output van parameterEstimates()

                     lhs op                   rhs    label     est    se       z pvalue ci.lower ci.upper
1        intentieVertrek  ~                 POFit       c1   0.080 0.085   0.934  0.350   -0.097    0.241
2        intentieVertrek  ~         perceptieWerk       b2   0.074 0.022   3.353  0.001    0.031    0.119
3        intentieVertrek  ~ perceptieWerkXjobTevr       b3  -0.082 0.039  -2.108  0.035   -0.156   -0.005
4                jobTevr  ~                 POFit       a1   0.581 0.072   8.075  0.000    0.440    0.720
5                jobTevr  ~                   GOK           -0.031 0.040  -0.771  0.441   -0.109    0.046
6                jobTevr  ~                  LFTD           -0.004 0.003  -1.221  0.222   -0.010    0.002
7                jobTevr  ~               JAARSCH            0.000 0.003   0.058  0.954   -0.007    0.007
8                jobTevr  ~                  GESL           -0.095 0.069  -1.363  0.173   -0.240    0.041
9        intentieVertrek  ~               jobTevr       b1  -0.529 0.042 -12.490  0.000   -0.614   -0.445
10       intentieVertrek  ~                   GOK           -0.014 0.044  -0.322  0.748   -0.094    0.070
11       intentieVertrek  ~                  LFTD            0.001 0.004   0.307  0.759   -0.006    0.008
12       intentieVertrek  ~               JAARSCH            0.004 0.004   1.087  0.277   -0.003    0.013
13       intentieVertrek  ~                  GESL            0.139 0.082   1.700  0.089   -0.005    0.310
14       intentieVertrek ~~       intentieVertrek            0.431 0.029  14.629  0.000    0.370    0.486
15               jobTevr ~~               jobTevr            0.394 0.021  18.369  0.000    0.350    0.436
16                 POFit ~~                 POFit            0.079 0.000      NA     NA    0.079    0.079
17                 POFit ~~         perceptieWerk           -0.001 0.000      NA     NA   -0.001   -0.001
18                 POFit ~~ perceptieWerkXjobTevr            0.015 0.000      NA     NA    0.015    0.015
19                 POFit ~~                   GOK           -0.017 0.000      NA     NA   -0.017   -0.017
20                 POFit ~~                  LFTD            0.015 0.000      NA     NA    0.015    0.015
21                 POFit ~~               JAARSCH           -0.149 0.000      NA     NA   -0.149   -0.149
22                 POFit ~~                  GESL           -0.003 0.000      NA     NA   -0.003   -0.003
23         perceptieWerk ~~         perceptieWerk            1.036 0.000      NA     NA    1.036    1.036
24         perceptieWerk ~~ perceptieWerkXjobTevr            0.025 0.000      NA     NA    0.025    0.025
25         perceptieWerk ~~                   GOK            0.012 0.000      NA     NA    0.012    0.012
26         perceptieWerk ~~                  LFTD           -1.578 0.000      NA     NA   -1.578   -1.578
27         perceptieWerk ~~               JAARSCH           -1.564 0.000      NA     NA   -1.564   -1.564
28         perceptieWerk ~~                  GESL            0.025 0.000      NA     NA    0.025    0.025
29 perceptieWerkXjobTevr ~~ perceptieWerkXjobTevr            0.538 0.000      NA     NA    0.538    0.538
30 perceptieWerkXjobTevr ~~                   GOK           -0.024 0.000      NA     NA   -0.024   -0.024
31 perceptieWerkXjobTevr ~~                  LFTD           -0.436 0.000      NA     NA   -0.436   -0.436
32 perceptieWerkXjobTevr ~~               JAARSCH           -0.388 0.000      NA     NA   -0.388   -0.388
33 perceptieWerkXjobTevr ~~                  GESL           -0.008 0.000      NA     NA   -0.008   -0.008
34                   GOK ~~                   GOK            0.242 0.000      NA     NA    0.242    0.242
35                   GOK ~~                  LFTD           -0.369 0.000      NA     NA   -0.369   -0.369
36                   GOK ~~               JAARSCH           -0.246 0.000      NA     NA   -0.246   -0.246
37                   GOK ~~                  GESL            0.008 0.000      NA     NA    0.008    0.008
38                  LFTD ~~                  LFTD          100.755 0.000      NA     NA  100.755  100.755
39                  LFTD ~~               JAARSCH           74.385 0.000      NA     NA   74.385   74.385
40                  LFTD ~~                  GESL            0.356 0.000      NA     NA    0.356    0.356
41               JAARSCH ~~               JAARSCH           86.336 0.000      NA     NA   86.336   86.336
42               JAARSCH ~~                  GESL            0.211 0.000      NA     NA    0.211    0.211
43                  GESL ~~                  GESL            0.101 0.000      NA     NA    0.101    0.101
44                  CIE1 :=      a1*(b1+b3*-1.02)     CIE1  -0.259 0.044  -5.853  0.000   -0.352   -0.172
45                  CIE2 :=          a1*(b1+b3*0)     CIE2  -0.308 0.045  -6.792  0.000   -0.399   -0.221
46                  CIE3 :=       a1*(b1+b3*1.02)     CIE3  -0.356 0.057  -6.222  0.000   -0.469   -0.248
47              indirect :=                 a1*b1 indirect  -0.308 0.045  -6.792  0.000   -0.399   -0.221
48                direct :=                    c1   direct   0.080 0.086   0.934  0.350   -0.097    0.241
49                 total :=            c1+(a1*b1)    total  -0.228 0.084  -2.704  0.007   -0.390   -0.065


De padcoëfficiënten moet je interpreteren zoals regressiecoëfficiënten in lineaire regressie. Het is het verschil dat we verwachten te zien in de verklaarde variabele wanneer de verklarende variabele één eenheid hoger is.

Wees dus voorzichtig en grijp niet te snel naar causale interpretaties. Als de richtingen van alle effecten correct gespecifieerd zijn en er geen gemeenschappelijke oorzaken ontbreken in het model, dan kan dit effect mogelijk causaal geïnterpreteerd worden. Voorzichtigheid blijft altijd geboden!



6 Visualiseren van een padanalysemodel

Met het package lavaanPlot kan je een padanalysemodel visueel weergeven.

install.packages("lavaanPlot") # eenmalig het package installeren

library(lavaanPlot) # package laden voor gebruik

lavaanPlot(model = fit, 
           node_options = list(shape = "box", fontname = "Helvetica"), 
           edge_options = list(color = "grey"), 
           coefs = TRUE,
           sig=.05 # toon enkel significante coëfficiënten
           )

Toon/verberg de plot


Een alternatief is het package semPlot.

install.packages('semPlot') # eenmalig het package installeren

library(semPlot) # package laden voor gebruik

semPaths(fit, layout='circle')

Toon/verberg de plot



7 Voetnoten

8 Referenties

Vekeman E., Devos G., Valcke M. & Rosseel Y. (2017). Do teachers leave the profession or move to another school when they don’t fit? Educational Review 69 (4), 411-434. doi: 10.1080/00131911.2016.1228610


  1. Denk bijvoorbeeld ook aan een IQ of lichaamslengte gelijk aan 0.↩︎

  2. In plaats van de volledige dataset wordt vaak enkel de variantie-covariantiematrix aan sem() gegeven.↩︎

  3. Bij de verbanden die al in je model zitten, staat er logischerwijs een waarde 0 in deze kolom.↩︎