Cursus
Als we vragenlijsten beantwoorden met stellingen als "Ik ben tevreden over ons werk" of "Ik werk graag met mijn collega’s", helpen we onderzoekers informatie te verzamelen over concepten die we niet direct kunnen meten. Denk bijvoorbeeld aan werktevredenheid, motivatie of angst. Dit noemen onderzoekers latente constructen. Het zijn abstracte begrippen die we niet rechtstreeks kunnen meten, maar die we indirect kunnen afleiden uit antwoorden, gedrag of testitems.
De vraag is echter of deze vragen wel echt het beoogde concept meten, en niet iets anders.
Hier komt confirmatieve factoranalyse (CFA) in beeld. CFA is een statistische techniek die nagaat of er een relatie is tussen geobserveerde variabelen (denk aan vragen in een enquête) en niet-geobserveerde constructen (bijvoorbeeld motivatie). Terwijl we dieper ingaan op CFA, is het belangrijk het te onderscheiden van exploratieve factoranalyse (EFA). In tegenstelling tot EFA, die zonder voorafgaande hypothesen naar patronen zoekt, vertrekt CFA vanuit een theorie en toetst of de data deze bevestigen.
Als een cruciaal onderdeel van structurele vergelijkingsmodellen (SEM) zorgt CFA ervoor dat, voordat we relaties tussen concepten onderzoeken, de concepten zelf betrouwbaar en valide gemeten worden.
Wat is confirmatieve factoranalyse (CFA)?
CFA beantwoordt de vraag: Past mijn meetmodel bij de werkelijkheid?
Om dit beter te begrijpen, moeten we weten wat een meetmodel is. Het is een blauwdruk die geobserveerde indicatoren (zoals enquête-items) koppelt aan latente constructen (zoals depressie, motivatie of tevredenheid). In CFA leggen onderzoekers deze blauwdruk vooraf vast, gebaseerd op theorie of eerder onderzoek, en testen daarna of de data bij die structuur passen.
Vergelijk EFA en CFA met een metafoor: EFA is als rondlopen in een nieuwe stad zonder kaart. CFA is controleren of onze GPS-instructies overeenkomen met de daadwerkelijke straten.
Belangrijke componenten van CFA
Latente constructen en geobserveerde indicatoren
- Latente constructen zijn conceptuele begrippen die je niet direct kunt meten, zoals intelligentie, burn-out en geluk.
- Geobserveerde indicatoren zijn wat we gebruiken om te meten, zoals testscores, enquête-items en gedragsbeoordelingen.
Om werktevredenheid te meten, zouden we het volgende kunnen gebruiken:
- Ik ben tevreden met mijn werk.
- Ik ben tevreden met mijn salaris.
- Ik heb een goede werkrelatie met mijn collega’s.
Deze verschillende antwoorden weerspiegelen allemaal dezelfde onderliggende factor, namelijk werktevredenheid.
Factorladingen
Factorladingen laten zien in welke mate elke indicator het onderliggende construct oppikt. Hoge ladingen, typisch boven 0,7, duiden op een sterke weergave, terwijl middelhoge ladingen tussen 0,4 en 0,7 in de meeste gevallen voldoende zijn.
Denk aan factorladingen als de signaalsterkte op onze mobiele telefoon. Hoe sterker het signaal, hoe beter de indicator van het construct.
Meetmodel
Het meetmodel specificeert volgens de theorie welke geobserveerde variabelen bij welke latente constructen horen. In tegenstelling tot EFA, waar de data leidend zijn, legt CFA deze structuur vooraf op en is daardoor confirmatief in plaats van exploratief.
Het CFA-proces
Nu we de kernbegrippen hebben geïntroduceerd, lopen we stap voor stap door het CFA-proces. Deze Python-demo gebruikt het semopy-pakket.
Stap 1: Modelspecificatie
De eerste stap in CFA is het definiëren van het theoretische model. Onderzoekers bepalen welke latente constructen bestaan en hoe die via indicatoren worden geobserveerd.
Stel dat we een studie arbeidspsychologie uitvoeren. We willen twee constructen meten:
-
Werktevredenheid (
JobSat), gemeten met drie enquête-items: -
JS1: Ik ben tevreden met mijn werk. -
JS2: Ik ben tevreden met mijn salaris. -
JS3: Ik heb goede relaties met collega’s. -
Werkbetrokkenheid (WorkEng), gemeten met drie enquête-items:
-
WE1: Ik voel me energiek op mijn werk. -
WE2: Ik ben enthousiast over mijn baan. -
WE3: Ik ga helemaal op in mijn werk.
We verwachten ook dat Werktevredenheid en Werkbetrokkenheid correleren.
In semopy, een gespecialiseerde Python-bibliotheek, kan dit model als volgt worden uitgedrukt:
model_desc = """
JobSat =~ JS1 + JS2 + JS3
WorkEng =~ WE1 + WE2 + WE3
JobSat ~~ WorkEng
"""
Waarbij:
-
=~aangeeft welke geobserveerde items laden op een specifieke latente factor. -
~~een correlatie tussen twee latente factoren definieert.
Stap 2: Dataverzameling
CFA vereist relatief grote steekproeven voor goede schattingen. Een veelgebruikte vuistregel is minimaal 200 proefpersonen of minimaal 10 metingen per te schatten parameter.
Om het proces te illustreren, werken we met een klein voorbeeldbestand:
import pandas as pd
df = pd.DataFrame({
"JS1": [3, 4, 5, 2, 4, 5, 3, 4],
"JS2": [4, 5, 4, 3, 5, 4, 3, 5],
"JS3": [2, 3, 4, 2, 3, 4, 2, 3],
"WE1": [5, 4, 5, 3, 4, 5, 4, 5],
"WE2": [4, 4, 5, 2, 3, 5, 3, 4],
"WE3": [3, 5, 4, 3, 4, 5, 3, 4]
})
In een echte studie zou de dataset honderden enquête-antwoorden bevatten.
Stap 3: Modelschatting
Nu we de data en het model hebben, is het tijd om parameters te schatten. Schatting levert de factorladingen op die de sterkte van de relatie tussen constructen en items aangeven, samen met andere parameters.
De meest gebruikte schattingsmethode is Maximum Likelihood (ML). Deze veronderstelt dat de geobserveerde data continu zijn en een multivariate normale verdeling volgen. Voor situaties waarin deze aanname niet geldt, zoals bij scheve of categorische data, worden schatters als Weighted Least Squares (WLS) aanbevolen.
In Python, met semopy:
from semopy import Model
mod = Model(model_desc)
mod.fit(df)
Dit past het CFA-model op de data en schat factorladingen, correlaties en varianties.
Stap 4: Beoordeling van de model fit
Zodra het model is geschat, is de volgende stap beoordelen of het model goed bij de data past.
De fit wordt beoordeeld met statistische indices:
- Chi-kwadraat (χ²): Een niet-significante waarde duidt op goede fit, maar deze is zeer gevoelig voor steekproefgrootte.
- RMSEA (< 0.06): Lagere waarden duiden op een betere benaderende fit.
- CFI (> 0.95): Vergelijkt het doelmodel met een basismodel.
- SRMR (< 0.08): Schat de gemiddelde verschillen tussen voorspelde en geobserveerde correlaties.
In Python:
from semopy import calc_stats
stats = calc_stats(mod)
print("Chi-square:", stats.get('chi2'))
print("Degrees of Freedom:", stats.get('df'))
print("CFI:", stats.get('cfi'))
print("RMSEA:", stats.get('rmsea'))
print("SRMR:", stats.get('srmr'))
Deze output laat zien of het theoretische model overeenkomt met de geobserveerde data. Als de indices binnen de aanbevolen grenzen vallen, wordt het model als een goede fit beschouwd.
Stap 5: Modelverfijning
Als de fit slecht is, bekijken onderzoekers vaak modificatie-indices. Deze geven suggesties hoe de modelfit kan verbeteren als bepaalde parameters, zoals foutcovarianties tussen specifieke items of extra factorladingen, vrijgegeven worden voor schatting.
Belangrijk is wel dat aanpassingen door theorie geleid moeten worden en niet enkel door statistiek. Anders kan het model op één dataset overfitten en elders falen.
Geschatte parameters (bijv. factorladingen) kun je als volgt bekijken:
estimates = mod.inspect()
print(estimates[['lval', 'op', 'rval', 'Estimate']])
Dit toont in welke mate elk item laadt op zijn onderliggende construct. Items met een lage lading (< 0,4) kunnen qua betrouwbaarheid in de meting van de ware score in twijfel worden getrokken en komen mogelijk in aanmerking voor verwijdering of herziening.
Chi-square: Value 7.086071
Name: chi2, dtype: float64
DF: None
p-value: None
RMSEA: None
CFI: None
SRMR: None
Parameter estimates:
lval op rval Estimate Std. Err z-value p-value
0 JS1 ~ JobSat 1.000000 - - -
1 JS2 ~ JobSat 0.991985 0.079766 12.436258 0.0
2 JS3 ~ JobSat 0.901155 0.074451 12.103973 0.0
3 WE1 ~ WorkEng 1.000000 - - -
4 WE2 ~ WorkEng 0.879609 0.083147 10.578944 0.0
5 WE3 ~ WorkEng 0.758832 0.072321 10.492585 0.0
6 JobSat ~~ WorkEng -0.014492 0.017919 -0.808725 0.418674
7 JobSat ~~ JobSat 0.283181 0.033256 8.515047 0.0
8 WorkEng ~~ WorkEng 0.332945 0.042414 7.849889 0.0
9 JS1 ~~ JS1 0.182918 0.022465 8.142378 0.0
10 JS2 ~~ JS2 0.215892 0.023358 9.242882 0.0
11 JS3 ~~ JS3 0.293970 0.0243 12.097738 0.0
12 WE1 ~~ WE1 0.225318 0.030959 7.277931 0.0
13 WE2 ~~ WE2 0.304496 0.028694 10.611756 0.0
14 WE3 ~~ WE3 0.269805 0.023279 11.590123 0.0
Een kort voorbeeld in context
De CFA-resultaten laten zien dat Werktevredenheid sterk laadt op JS1 (1,00) en JS2 (0,992), en iets lager op JS3 (0,901). Dit suggereert dat alle drie de enquêtevragen zinvol bijdragen aan het meten van Werktevredenheid. Geen van de items lijkt problematisch, aangezien alle factorladingen duidelijk boven de gangbare grens van 0,7 liggen.
Op vergelijkbare wijze laadt Werkbetrokkenheid sterk op WE1 (1,00) en WE2 (0,880), met een iets lagere lading voor WE3 (0,759), al is die nog steeds acceptabel.
Werktevredenheid hangt nauwelijks samen met WorkEng (-0,014), wat aangeeft dat de constructen in deze steekproef tamelijk onafhankelijk van elkaar zijn.
Op basis van deze resultaten is onze aanpak:
-
Behoud alle drie de items voor Werktevredenheid (
JS1,JS2,JS3), omdat ze allemaal sterk laden op het construct. -
Behoud alle drie de items voor Werkbetrokkenheid (
WE1,WE2,WE3), aangezien elk item betekenisvolle ladingen laat zien. -
Er zijn geen inhoudelijke aanpassingen nodig, aangezien de factorladingen hoog zijn en alle geschatte parameters significant.
Dit bevestigt dat het meetmodel werkt zoals bedoeld. De geobserveerde indicatoren weerspiegelen hun latente constructen betrouwbaar.
Vereisten en aannames van CFA
CFA berust op een aantal belangrijke aannames om geldige en interpreteerbare resultaten te verkrijgen. Begrip van deze aannames helpt te bepalen wanneer CFA geschikt is en wat te doen als de data er niet volledig aan voldoen.
Multivariate normaliteit
CFA gebruikt doorgaans Maximum Likelihood (ML)-schatting, wat veronderstelt dat de geobserveerde variabelen een multivariate normale verdeling volgen.
Wanneer de antwoorden echter sterk scheef verdeeld of categorisch zijn, gaat deze aanname niet op. In zulke gevallen kunnen factorladingen, standaardfouten en fit-indices vertekend zijn. Om dit te ondervangen worden alternatieve schattingsmethoden zoals Weighted Least Squares (WLS) of een robuuste aanpak zoals de Satorra-Bentler-correctie gebruikt, die geen strikte normaliteit vereisen.
Voldoende steekproefgrootte
CFA schat meerdere parameters (factorladingen, varianties, covarianties). Kleine steekproeven kunnen leiden tot instabiele schattingen en onbetrouwbare conclusies.
Een gangbare richtlijn adviseert minstens 200 deelnemers of 10 observaties per te schatten parameter. Hoe groter de steekproef, hoe preciezer en generaliseerbaarder de resultaten.
Correcte modelspecificatie
CFA toetst een vooraf gespecificeerd theoretisch model. Als het model verkeerd gespecificeerd is, bijvoorbeeld door indicatoren aan de verkeerde latente factor toe te wijzen, kan CFA dat niet herstellen.
Aselecte steekproef
Idealiter zijn de data afkomstig uit een aselecte steekproef, zodat de bevindingen generaliseerbaar zijn voorbij de dataset die in de studie is gebruikt.
Niet-aselecte of bevooroordeelde steekproeven kunnen resultaten opleveren die kenmerken van de steekproef weerspiegelen en niet het onderzochte concept.
Bayesiaanse CFA is bovendien zeer flexibel en kan kleine steekproeven, complexe modellen of niet-normale data verwerken op basis van a-priori-kennis.
Vergelijking met exploratieve factoranalyse (EFA)
Laten we de vergelijking tussen EFA en CFA nog eens bekijken. EFA is datagedreven en onthult latente structuren zonder voorafgaande aannames. Alle factorladingen worden vrij geschat, zodat de data "voor zichzelf kunnen spreken". CFA is theoriedreven en toetst vooraf gespecificeerde veronderstelde structuren met beperkingen op ladingen.
Onderzoekers gebruiken de twee methoden vaak na elkaar: EFA om mogelijke structuren te verkennen en CFA om ze te bevestigen. Deze aanpak biedt ruimte voor zowel empirische ontdekking als theoretische validatie.
Geavanceerde onderwerpen en uitbreidingen in CFA
Multilevel en longitudinale CFA
- Multilevel CFA houdt rekening met geneste data, bijvoorbeeld studenten binnen klassen.
- Longitudinale CFA bekijkt hoe constructen zich ontwikkelen, wat helpt bij het beoordelen van meetstabiliteit, verandering en temporele invariantie.
Tweede-orde en bifactor-modellen
- Tweede-orde CFA modelleert relaties tussen latente variabelen door eerste-orde factoren te modelleren, bijvoorbeeld verbale, ruimtelijke en numerieke vaardigheden als indicatoren van een hoger-orde construct, zoals algemene intelligentie.
- Bifactor-modellen scheiden de variantie die toe te schrijven is aan algemene factoren van die door specifieke subdimensies.
Bayesiaanse CFA
Bayesiaanse CFA is een flexibel alternatief voor traditionele methoden. Het gebruikt priorverdelingen bij het schatten van parameters, wat de modelstabiliteit vergroot en het nuttig maakt voor kleine steekproeven, complexe modellen of niet-normale data.
Toepassingen van CFA
CFA wordt veel gebruikt voor:
- Schaalvalidatie om te verifiëren dat een set geobserveerde items het theoretische construct dat ze moeten meten, nauwkeurig weerspiegelt, bijvoorbeeld een nieuwe angstvragenlijst.
- Toetsen van theoretische modellen om te evalueren of de structuur van relaties tussen latente constructen overeenkomt met theoretische verwachtingen.
- Vergelijking tussen groepen om meetinvariantie te testen. Zo kun je bepalen of een tevredenheidsschaal hetzelfde werkt over culturen of genders heen.
- Verfijnen en verbeteren van psychometrische tools door zwakke of redundante items te identificeren. Dit verbetert de betrouwbaarheid en validiteit van tests en enquêtes.
Beperkingen en uitdagingen
Na deze uitgebreide bespreking van CFA is het belangrijk te erkennen dat er ook beperkingen zijn. De effectiviteit hangt af van de volgende factoren:
- Kwaliteit van de onderliggende theorie: Zwakke of slecht gespecificeerde theoretische basis kan leiden tot modellen met een slechte fit.
- Aannames: Niet-normale verdelingen of kleine steekproeven kunnen schattingen verstoren, wat de interpreteerbaarheid beïnvloedt.
- Risico op overfitting door modellen te veel aan te passen om een betere fit te bereiken. Zulke tweaks voegen gecorreleerde fouten toe die voor één dataset werken, maar elders niet generaliseren.
Conclusie
Confirmatieve factoranalyse slaat een brug tussen theorie en data en maakt het mogelijk het onmeetbare nauwkeurig te meten in bijvoorbeeld psychologie, onderwijs, marketing of organisatieonderzoek. Het biedt een kader om latente constructen te valideren en sterke fundamenten voor meting te leggen. Als onderdeel van structurele vergelijkingsmodellen blijft CFA zich ontwikkelen met nieuwe uitbreidingen zoals multilevel-, longitudinale en Bayesiaanse benaderingen.
Ik ben een AI-strateeg en -ethicus die op het snijvlak van data science, product en engineering werkt aan schaalbare machinelearningsystemen. Genoteerd als een van de "Top 200 Business and Technology Innovators" ter wereld, heb ik als missie machine learning te democratiseren en het jargon te doorbreken, zodat iedereen deel kan uitmaken van deze transformatie.
FAQs
Wat is confirmatieve factoranalyse (CFA) en hoe verschilt het van exploratieve factoranalyse (EFA)?
CFA is een statistische techniek om te testen of een veronderstelde factorstructuur past bij de geobserveerde data, terwijl EFA mogelijke structuren verkent zonder vooraf gespecificeerde modellen.
Wat zijn latente constructen en geobserveerde indicatoren in CFA?
Latente constructen zijn niet-observeerbare concepten zoals motivatie of werktevredenheid. Geobserveerde indicatoren zijn meetbare items, zoals enquêtevragen of testscores, die deze latente constructen weerspiegelen.
Wat zijn de belangrijkste aannames van CFA?
CFA gaat uit van een correct gespecificeerd meetmodel, multivariate normaliteit (voor ML-schatting), voldoende steekproefgrootte en idealiter aselect getrokken data.
Hoe beoordeel ik of mijn CFA-model bij de data past?
De modelfit wordt beoordeeld met indices zoals Chi-kwadraat, RMSEA, CFI en SRMR. Acceptabele drempels geven aan of het theoretische model in lijn is met de geobserveerde data.
Hoe kan CFA in Python worden geïmplementeerd?
CFA kan in Python worden uitgevoerd met pakketten zoals semopy. Het artikel geeft een stapsgewijze demo met modelspecificatie, schatting en interpretatie van factorladingen en fit-indices.

