14. Cochran’s Q toets#

14.1. Toepassing#

Gebruik Cochran’s Q toets om te toetsen of er verschillen zijn op een binaire variabele1 tussen drie of meer herhaalde metingen van één groep of tussen drie of meer gepaarde groepen.2

14.2. Onderwijscasus#

De opleidingsdirecteur van de bacheloropleiding Kunstmatige Intelligentie van een universiteit merkt dat er tijdens het eerste studiejaar veel studenten zijn die niet alle vakken voldoende afsluiten. Hij wil uitvinden in welke onderwijsperiode dit vooral plaatsvindt om te onderzoeken waardoor de studievertraging veroorzaakt wordt. Op deze universiteit bestaat het eerste jaar uit vier onderwijsperiodes. Daarom vraagt hij studieresultaten op van eerstejaars studenten uit het vorige collegejaar die niet zijn uitgevallen gedurende dat jaar. Met deze resultaten wil hij onderzoeken of er een effect is van de onderwijsperiodes op het wel of niet hebben van herkansingen voor de eerstejaars studenten.

Dit onderzoek vertaalt zich in de volgende combinatie van hypothesen, waarbij de nulhypothese zo geformuleerd is dat er geen effect of verschil is en de alternatieve hypothese zo geformuleerd is dat er wel een effect of verschil is.

H0: Er is geen effect van de onderwijsperiode op het wel of niet hebben van herkansingen voor eerstejaars studenten.

HA: Er is een effect van de onderwijsperiode op het wel of niet hebben van herkansingen voor eerstejaars studenten.

14.3. Assumpties#

Om Cochran’s Q toets uit te voeren, moeten de data aan een aantal voorwaarden voldoen. Er dient een categorische afhankelijke variabele te zijn met twee categorieën zonder overlap: elke observatie past slechts in een van beide categorieën. Daarnaast zijn er drie of meer herhaalde metingen van één groep of zijn er drie of meer gepaarde groepen. In beide gevallen zijn de deelnemers11 een willekeurige steekproef van de populatie.3

Cochran’s Q toets is te gebruiken wanneer het product van het aantal deelnemers en het aantal herhaalde metingen groter dan of gelijk aan 24 is.4 Gebruik de exacte versie van Cochran’s Q toets wanneer dit niet het geval is.5

14.4. Post-hoc toetsen#

Cochran’s Q toets toetst of er verschillen zijn tussen een percentage op drie of meer herhaalde metingen. Voer een post-hoc toets uit om te bepalen welke metingen van elkaar verschillen. Gebruik de McNemar toets of de exacte McNemar toets als post-hoc toets.[^6]

Gebruik een correctie voor de p-waarden, omdat er meerdere toetsen tegelijkertijd worden gebruikt. Meerdere toetsen tegelijkertijd uitvoeren verhoogt de kans dat een van de nulhypotheses onterecht wordt verworpen en er bij toeval een verband wordt ontdekt dat er niet is (type I fout). In deze toetspagina wordt de Bonferroni correctie gebruikt. Deze correctie past de p-waarde aan door de p-waarde te vermenigvuldigen met het aantal uitgevoerde toetsen en verlaagt hiermee de kans op een type I fout.9 Een andere uitleg hiervan is dat het significantieniveau gedeeld wordt door het aantal toetsen wat leidt tot een lager significantieniveau en dus een strengere toets. Er zijn ook andere opties voor een correctie op de p-waarden.9

14.5. De data bekijken#

Er is een dataset ingeladen genaamd dfHerkansingen_kunstmatige_intelligentie. In deze dataset is per onderwijsperiode aangegeven of een student wel of geen herkansingen heeft gemaakt.

## Importeer nuttige packages
import numpy as np

## Eerste 5 observaties
print(dfHerkansingen_kunstmatige_intelligentie.head(5))
   Studentnummer  Onderwijsperiode Herkansingen
0        4030927                 1          nee
1        4030927                 2          nee
2        4030927                 3          nee
3        4030927                 4          nee
4        4036999                 1          nee
## Laatste 5 observaties
print(dfHerkansingen_kunstmatige_intelligentie.tail(5))
     Studentnummer  Onderwijsperiode Herkansingen
195        4492777                 4           ja
196        4494467                 1          nee
197        4494467                 2           ja
198        4494467                 3           ja
199        4494467                 4          nee

Een kruistabel geeft weer hoeveel eerstejaars studenten wel of geen herkansingen hebben in de vier onderwijsperiodes. Maak de kruistabel met de functie .crosstab() van het package pandas met als argumenten de variabele dfHerkansingen_kunstmatige_intelligentie['Herkansingen'] die aangeeft of eerstejaars studenten wel of geen herkansing hebben en de variabele dfHerkansingen_kunstmatige_intelligentie['Onderwijsperiode'] die aangeeft in welke onderwijsperiode een observatie is gedaan.

## Maak een kruistabel
Herkansingen_kruistabel = pd.crosstab(dfHerkansingen_kunstmatige_intelligentie['Herkansingen'], dfHerkansingen_kunstmatige_intelligentie['Onderwijsperiode'])

## Print de kruistabel 
print(Herkansingen_kruistabel)

## Print een tabel met proporties, tweede argument 'columns' zorgt ervoor dat de 
## proporties per kolom berekend worden
Prop_Herkansingen_kruistabel =  pd.crosstab(dfHerkansingen_kunstmatige_intelligentie['Herkansingen'], dfHerkansingen_kunstmatige_intelligentie['Onderwijsperiode'], normalize = 'columns')

## Print de tabel met proporties
print(Prop_Herkansingen_kruistabel)
Onderwijsperiode   1   2   3   4
Herkansingen                    
ja                11  26  15  18
nee               39  24  35  32
Onderwijsperiode     1     2    3     4
Herkansingen                           
ja                0.22  0.52  0.3  0.36
nee               0.78  0.48  0.7  0.64

De kruistabel en bijbehorende tabel met proporties laten zien dat het aantal eerstejaars studenten dat een herkansing doet in onderwijsperiode 1 (r py$Herkansingen_kruistabel[1,1]) relatief laag is en relatief hoog is in onderwijsperiode 2 (r py$Herkansingen_kruistabel[1,2]). Onderwijsperiode 3 en 4 (r py$Herkansingen_kruistabel[1,3] en r py$Herkansingen_kruistabel[1,4]) zitten qua aantal herkansende eerstejaars studenten ertussenin.

14.6. Uitvoering#

14.6.1. Assumptie steekproefgrootte#

Een assumptie van Cochran’s Q toets is dat het product van het aantal deelnemers en het aantal herhaalde metingen groter dan of gelijk is aan 24. In deze casus gaat het om het product van het aantal eerstejaars studenten en het aantal onderwijsperiodes. Toets deze assumpties door dit product te berekenen.

# Bereken het aantal eerstejaars studenten
N = len(set(dfHerkansingen_kunstmatige_intelligentie['Studentnummer']))

# Bereken het aantal onderwijsperiodes
k = len(set(dfHerkansingen_kunstmatige_intelligentie['Onderwijsperiode']))

# Bereken het product van beide
Product = N * k

# Print het resultaat
print(Product)
200

Het product van het aantal eerstejaars studenten en het aantal onderwijsperiodes is r py$Product. Aangezien dit aantal groter dan 24 is, is aan de assumptie wat betreft de steekproefgrootte voldaan.

14.6.2. Cochran’s Q toets#

Voer Cochran’s Q toets uit om te onderzoeken of er effect is van de onderwijsperiodes op het wel of niet hebben van herkansingen van eerstejaars studenten van de bachelor Kunstmatige Intelligentie. Maak eerst een numerieke variabele voor de variabele Herkansingen met de functie np.where() van het package numpy. Zet daarna de dataset om in een wijd formaat met behulp van de functie pd.pivot_table() van het package pandas. Op deze manier ontstaat een nieuwe dataset dfHerkansingen_kunstmatige_intelligentie_wijd met in de eerste kolom de studentnummers en in de tweede kolom een numerieke indicator die aangeeft of de student wel of geen herkansing heeft in onderwijsperiode 1 waarbij de variabele de waarde 1 heeft als de student wel een herkansing heeft en de waarde 0 heeft als de student geen herkansing heeft. De kolommen 3, 4 en 5 zijn hetzelfde als kolom 2, maar dan voor onderwijsperiode 2, 3 en 4.

Voer ten slotte Cochran’s Q toets uit met behulp van de functie sms.contingency_tables.cochrans_q() van het package statsmodels.stats met als argumenten de wijde dataset dfHerkansingen_kunstmatige_intelligentie_wijd en return_object = True om de output overzichtelijk weer te geven.

from statsmodels import api

## Maak numeriek
dfHerkansingen_kunstmatige_intelligentie['Herkansingen_dummy'] = np.where(dfHerkansingen_kunstmatige_intelligentie['Herkansingen'] == 'ja', 1, 0)

## Maak dataset wijd
dfHerkansingen_kunstmatige_intelligentie_wijd = pd.pivot_table(data = dfHerkansingen_kunstmatige_intelligentie, index='Studentnummer', columns='Onderwijsperiode', values='Herkansingen_dummy')

# Voer Cochran's Q toets uit
Cochrans_Q  = api.stats.cochrans_q(dfHerkansingen_kunstmatige_intelligentie_wijd, return_object = True)
print(Cochrans_Q)
df          3
pvalue      0.012647602253252125
statistic   10.835820895522389
  • Q (r py$df, N = r py$N) = r Round_and_format(py$stat), p = r Round_and_format(py$pval, 3)

  • Aantal vrijheidsgraden is gelijk aan aantal herhaalde metingen minus één, in deze casus r py$k - 1 = r py$df

  • De p-waarde is kleiner dan 0,05, dus de H0 wordt verworpen.10

  • Er is een significant effect van de vier onderwijsperiodes op het wel of niet hebben van herkansingen van eerstejaars studenten van de bachelor Kunstmatige Intelligentie

14.6.3. Post-hoc toets#

Voer post-hoc toetsen uit om te onderzoeken tussen welke onderwijsperiodes er verschillen zijn in de verdeling van de eerstejaars studenten die wel of geen herkansingen hebben. Gebruik de McNemar toets als post-hoc toets. Maak eerst een aparte variabele aan voor iedere onderwijsperiode waarin is aangegeven of een student wel of geen herkansing heeft gehad in die periode. Gebruik daarna om een McNemar toets uit te voeren de zelfgeschreven12 functie McNemar_toets() met als argumenten de te vergelijken onderwijsperiodes (bijvoorbeeld P1 en P2) en het argument 'mid' om aan te geven dat de mid p-value methode gebruikt moet worden.

Voer de McNemar toets uit voor alle zes de combinaties van onderwijsperiodes. Hiervoor is het nodig om handmatig een correctie uit te voeren voor meerdere toetsen. Voer de Bonferroni correctie uit door het significantieniveau te delen door het aantal uitgevoerde toetsen. Het significatieniveau voor deze post-hoc toetsen wordt dan 0,05 / 6 ≈ 0,008. Vergelijk de p-waarden van de McNemar toetsen daarna met dit significantieniveau.

## Importeer het package scipy.stats
import scipy.stats as sps
import numpy as np
import pandas as pd

## Maak voor elke onderwijsperiode een variabele
P1 = np.array(dfHerkansingen_kunstmatige_intelligentie_wijd[1])
P2 = np.array(dfHerkansingen_kunstmatige_intelligentie_wijd[2])
P3 = np.array(dfHerkansingen_kunstmatige_intelligentie_wijd[3])
P4 = np.array(dfHerkansingen_kunstmatige_intelligentie_wijd[4])

## Maak een frequentiematrix

## Definieer een functie om de mid p-waarde of de exacte p-waarde voor de McNemar toets te berekenen
def McNemar_toets(Variabele_1, Variabele_2, p_waarde):
  
  ## Maak een frequentiematrix
  Frequentiematrix =  np.array(pd.crosstab(Variabele_1, Variabele_2))

  ## Sla de niet-diagonale elementen op
  n12 = Frequentiematrix[0,1]
  n21 = Frequentiematrix[1,0]
  
  ## Bereken de som van de niet-diagonale elementen
  n = n12 + n21
  
  ## Bepaal het minimum van beide niet-diagonale elementen 
  n_min = min(n12,n21)
  
  ## Bereken de p-waarde als beide elementen gelijk zijn
  if n12 == n21:
    exact_p_value
    mid_p_value = 1 - sps.binom.pmf(n_min, n, 0.5)

  ## Bereken de p-waarde als beide elementen niet gelijk zijn
  else:
    exact_p_value = 2 * sps.binom.cdf(n_min, n, 0.5)
    mid_p_value = exact_p_value - sps.binom.pmf(n_min, n, 0.5)
  
  ## Retourneer de juiste p-waarde op basis van de gekozen methode
  if p_waarde == 'exact':
    return exact_p_value
  if p_waarde == 'mid':
    return mid_p_value

## Voer de McNemar toets uit voor elke combinatie van onderwijsperiodes
print(McNemar_toets(P1, P2, 'mid'))
print(McNemar_toets(P1, P3, 'mid'))
print(McNemar_toets(P1, P4, 'mid'))
print(McNemar_toets(P2, P3, 'mid'))
print(McNemar_toets(P2, P4, 'mid'))
print(McNemar_toets(P3, P4, 'mid'))
0.0037191659212112453
0.3592834472656249
0.11531829833984378
0.03569813817739488
0.10775214433670041
0.5034446716308593
  • Er is een significant verschil gevonden in de verdeling van eerstejaars studenten wat betreft herkansingen tussen onderwijsperiode 1 en onderwijsperiode 2 (p = r Round_and_format(py$Pval_P1_P2, 3))

  • Er zijn geen significante verschillen gevonden bij de overige vergelijkingen tussen onderwijsperiodes

14.7. Rapportage#

Cochran’s Q toets is uitgevoerd om te onderzoeken of er een effect is van de vier onderwijsperiodes op het wel of niet hebben van herkansingen van eerstejaars studenten van de bachelor Kunstmatige Intelligentie. Het percentage eerstejaars studenten dat een of meerdere herkansingen heeft is per onderwijsperiode weergegeven in Tabel 1. Cochran’s Q toets toont aan dat er een significant effect is van de onderwijsperiodes op het wel of niet hebben van herkansingen, Q (r py$df, N = r py$N) = r Round_and_format(py$stat), p = r Round_and_format(py$pval, 3).

Om te bepalen tussen welke onderwijsperiodes er verschillen zijn, is de McNemar toets als post-hoc toets uitgevoerd met een Bonferroni correctie voor meerdere toetsen. Uit de post-hoc toetsen blijkt dat er alleen een significant verschil is tussen onderwijsperiode 1 (r Round_and_format(100*py$Prop_Herkansingen_kruistabel[1,1], 1)% eerstejaars studenten met herkansingen) en onderwijsperiode 2 (r Round_and_format(100*py$Prop_Herkansingen_kruistabel[1,2], 1)% eerstejaars studenten met herkansingen) met als p-waarde r Round_and_format(py$Pval_P1_P2, 3). Er zijn dus significant meer eerstejaars studenten met een of meerdere herkansingen in periode 2 in vergelijking tot periode 1, maar verder zijn er geen verschillen tussen de onderwijsperiodes.

| | Periode 1 | Periode 2 | Periode 3 | Periode 4 | |————-| ——————– | ————-| ————|————-| ————| |Herkansingen (%) | r Round_and_format(100*py$Prop_Herkansingen_kruistabel[1,1], 1) | r Round_and_format(100*py$Prop_Herkansingen_kruistabel[1,2], 1) | r Round_and_format(100*py$Prop_Herkansingen_kruistabel[1,3], 1) | r Round_and_format(100*py$Prop_Herkansingen_kruistabel[1,4], 1) | |Geen herkansingen (%) | r Round_and_format(100*py$Prop_Herkansingen_kruistabel[2,1], 1) | r Round_and_format(100*py$Prop_Herkansingen_kruistabel[2,2], 1) | r Round_and_format(100*py$Prop_Herkansingen_kruistabel[2,3], 1) | r Round_and_format(100*py$Prop_Herkansingen_kruistabel[2,4], 1) |

Tabel 1. Het percentage eerstejaars studenten van de bachelor Kunstmatige Intelligentie dat wel of geen herkansingen heeft voor de vakken in de vier onderwijsperiodes.


1

Binaire variabelen: twee elkaar uitsluitende waarden, zoals ja of nee, 0 of 1, aan of uit.

2

Allen, P. & Bennett, K. (2012). SPSS A practical Guide version 20.0. Cengage Learning Australia Pty Limited.

11

Met een deelnemer wordt het object bedoeld dat geobserveerd wordt, bijvoorbeeld een student, een inwoner van Nederland, een opleiding of een organisatie. Met een observatie wordt de waarde bedoeld die de deelnemer heeft voor een bepaalde variabele. Een deelnemer heeft dus meestal een observatie voor meerdere variabelen.

3

Laerd statistics (2018). Cochran’s Q test using SPSS Statistics. Laerd statistics

4

Statistics How To (18 juli 2016). Cochran’s Q Test. Statistics How to.

5

Er is geen package gevonden om de exacte versie van Cochran’s Q toets uit te voeren in R. De exacte versie is echter wel uit te voeren in SPSS.

9(1,2)

Field, A., Miles, J., & Field, Z. (2012). Discovering statistics using R. London: Sage publications.

10

In dit voorbeeld wordt uitgegaan van een waarschijnlijkheid van 95% c.q. een p-waardegrens van 0,05. De grens is naar eigen inzicht aan te passen; houd hierbij rekening met type I en type II fouten.

12

Additional file 1 van Fagerland, M.W., Lydersen, S., & Laake, P. (2013). The McNemar test for binary matched-pairs data: mid-p and asymptotic are better than exact conditional. BMC medical research methodology, 13, 91. https://doi.org/10.1186/1471-2288-13-91 . Te vinden op https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3716987/#S1