12  Non-Parametrische Testen

Keywords

samenwerken, betrouwbaarheidsinterval, effect size, open onderwijsbron, open studiebeurs, open wetenschap

Soms zijn de aannames van parametrische modellen (bijvoorbeeld normaliteit van modelresiduen) verdacht. Dit is vaak het geval in de psychologie bij het gebruik van ordinale schalen. In deze gevallen kan een “niet-parametrische” benadering nuttig zijn. Een statistische test die niet-parametrisch is, betekent dat de parameters (d.w.z. gemiddelde en variantie voor een “normaal” Gaussiaans model) niet worden geschat; ondanks wat vaak wordt gedacht, zijn de gegevens zelf nooit niet-parametrisch. Bovendien zijn deze tests geen tests van de mediaan (Divine et al. 2018). Je kunt ze eerder beschouwen als rangordetests of proportionele kanstests. Als de scores die je analyseert niet metrisch zijn (d.w.z. ordinaal)

Als de scores die je analyseert niet metrisch (d.w.z. ordinaal) zijn door het gebruik van een Likert-schaal en je toch parametrische tests zoals t-tests gebruikt, loop je het risico op een hoge vals-positieve waarschijnlijkheid (bijv. Liddel & Kruschke, 2018). Merk op dat er in het Duits schaalankers zijn ontwikkeld die erg lijken op de Likert-schaal, maar geïnterpreteerd kunnen worden als metrisch (bijv. Rohrmann, 1978).

We zullen hier kort twee groepen tests bespreken die kunnen worden toegepast op de onafhankelijke en gepaarde steekproeven en vervolgens 3 effectgroottes presenteren die bij deze tests kunnen horen, evenals hun berekeningen en voorbeelden in R.

Hier is een tabel voor elke effect size in dit hoofdstuk besproken:

Type Beschrijving Sectie
Rang-Biseriële Correlatie Section 12.3.1
\(r_{rb}\) (afhankelijke groepen) - Rang-biseriële correlatie op afhankelijke groepen Een maat voor dominantie tussen afhankelijke groepen (d.w.z. herhaalde metingen). Section 12.3.1.1
\(r_{rb}\) (onafhankelijke groepen) - Rang Biseriële Correlatie op onafhankelijke groepen Een maat voor dominantie tussen twee onafhankelijke groepen. Section 12.3.1.1
Overeenstemmingswaarschijnlijkheid Section 12.3.2
\(p_c\) - Overeenstemmingswaarschijnlijkheid Een eenvoudige transformatie van de rang-biseriële correlatie en het vertegenwoordigt de waarschijnlijkheid van superioriteit in de ene groep ten opzichte van de andere groep. Deze sectie toont R-code voor zowel onafhankelijke als afhankelijke steekproeven. Section 12.3.2
Wilcoxon-Mann-Whitney Odds Section 12.3.3
\(O_{WMW}\) - Wilcoxon-Mann-Whitney Odds Ook bekend als de Generalized Odds Ratio, transformeert het de concordantiekans naar een Odds Ratio. Deze sectie toont R-code voor zowel onafhankelijke als afhankelijke steekproeven. Section 12.3.3

12.1 Wilcoxon-Mann-Whitney testen

Een niet-parametrisch alternatief voor de t-test is de Wilcoxon-Mann-Whitney (WMW) testgroep. Bij het vergelijken van twee onafhankelijke steekproeven wordt dit een Wilcoxon rank-sum test genoemd, maar soms ook een Mann-Whitney U-test. Bij gebruik op gepaarde steekproeven, of één steekproef, is het een ‘signed rank’-test. Deze worden over het algemeen “symmetrietesten” genoemd (Divine et al. 2018).

# gepaarde steekproeven ---- 

data(sleep)

# wilcoxon test
wilcox.test(extra ~ group,
            data = sleep,
            paired = TRUE)

    Wilcoxon signed rank test with continuity correction

data:  extra by group
V = 0, p-value = 0.009091
alternative hypothesis: true location shift is not equal to 0
# Twee steekproeven ------
# data geïmporteerd van likert
data(mass, package = "likert")
df_mass = mass |>
  as.data.frame() |>
  janitor::clean_names() 

# Functie heeft invoer nodig als numeriek
# geordende factoren kunnen worden geconverteerd naar rangen
# Nogmaals, de waarschuwing kan worden genegeerd
wilcox.test(rank(math_relates_to_my_life) ~ gender,
            data = df_mass)

    Wilcoxon rank sum test with continuity correction

data:  rank(math_relates_to_my_life) by gender
W = 23, p-value = 0.1104
alternative hypothesis: true location shift is not equal to 0

12.2 Brunner-Munzel Testen

De tests van Brunner-Munzel kunnen worden gebruikt in plaats van de WMW-tests. De belangrijkste reden hiervoor is de interpretatie van de test (Munzel and Brunner 2002; Brunner and Munzel 2000; Neubert and Brunner 2007). Recentelijk heeft (karch2021psychologen?) betoogd dat de Mann-Whitney test geen fatsoenlijke test is voor gelijkheid van medianen, verdelingen of stochastische gelijkheid. De Brunner-Munzel test daarentegen biedt een zinnige benadering om te testen op stochastische gelijkheid.

De Brunner-Munzeltests meten een op rang gebaseerd “relatief effect” of “stochastische superioriteitskans”. De teststatistiek (\(hat p\)) is in wezen de waarschijnlijkheid dat een waarde in de ene conditie groter is dan in de andere terwijl de banden worden gesplitst1. Brunner-Munzel tests kunnen echter niet worden toegepast op ontwerpen met één groep of één steekproef.

Deze tests zijn relatief nieuw, dus er zijn maar weinig pakketten die Brunner-Munzel aanbieden. Bovendien stelt (karch2021psychologen?) dat de stochastische superioriteitseffectgrootte (\(hat{p}\)) een genuanceerde manier biedt om groepsverschillen te interpreteren door observaties te visualiseren als concurrenten in een wedstrijd. Deze methode, bedacht door wetenschappers als Cliff (1993) en Divine et al. (2018), ziet elke observatie van de ene groep in een duel met elke observatie van een andere groep. Als een observatie van de eerste groep zijn tegenhanger overtreft, “wint” deze en krijgt de groep een punt; gelijke observaties leveren een half punt op voor elke groep. Dit concept kan verder worden uitgelegd aan de hand van een bellenplot, waar plaatsing boven, onder of op de diagonaal de dominantie van de waarneming van de ene groep over de andere aangeeft. Andere interpretaties, zoals p transformeren naar de Wilcoxon-Mann-Whitney (WMW) odds of Cliff’s δ bieden diepere inzichten. Er zijn implementaties van de Brunner-Munzel test in een paar pakketten in R (namelijk lawstat, rankFD en brunnermunzel). Karch (2021) raadt de functie brunnermunzel.permutation.test uit het pakket brunnermunzel aan. Het TOSTER R pakket kan ook dekking bieden (Läkens 2017; Caldwell 2022).

# Installeer pakket voor data opschoning
# install.packages('janitor')
library(janitor)

# Gepaarde steekproeven
library(TOSTER)
data(sleep)

# Als de steekproefomvang klein is
# moet een permutatieversie gebruikt worden.
# Wanneer dit wordt gedaan, moet er een 'seed' worden ingesteld.
set.seed(2124)
brunner_munzel(extra ~ group,
               data = sleep,
               paired = TRUE,
               perm = TRUE)

    Paired Brunner-Munzel permutation test

data:  extra by group
t = -3.7266, df = 9, p-value = 0.003906
alternative hypothesis: true relative effect is not equal to 0.5
95 percent confidence interval:
 0.1233862 0.3866138
sample estimates:
p(X<Y) + .5*P(X=Y) 
             0.255 
# Twee steekproeven
# data importeren van likert
data(mass, package = "likert")
df_mass = mass |>
  as.data.frame() |>
  clean_names() 

# Functie heeft invoer nodig als numeriek
# geordende factoren kunnen worden geconverteerd naar rangen
# Nogmaals, de waarschuwing kan worden genegeerd
set.seed(24111)
TOSTER::brunner_munzel(
  rank(math_relates_to_my_life) ~ gender,
  data = df_mass,
  paired = FALSE,
  perm = TRUE
)

    two-sample Brunner-Munzel permutation test

data:  rank(math_relates_to_my_life) by gender
t = -2.1665, df = 17.953, p-value = 0.0642
alternative hypothesis: true relative effect is not equal to 0.5
95 percent confidence interval:
 0.04761905 0.54961243
sample estimates:
p(X<Y) + .5*P(X=Y) 
         0.2738095 

12.3 Rang-gebaseerde Effect Sizes

Aangezien het gemiddelde en de standaarddeviatie niet worden geschat voor een WMW- of Brunner-Munzeltest, zou het ongepast zijn om een gestandaardiseerd gemiddeld verschil (bijvoorbeeld Cohen’s d) te presenteren bij deze tests. In plaats daarvan kan een effectgrootte op basis van rangorde (d.w.z. gebaseerd op de rangorde van de waargenomen waarden) worden gerapporteerd bij de niet-parametrische statistische tests.

12.3.1 Rang-Biseriële correlatie

De rang-biseriële correlatie (\(r_{rb}\)) wordt beschouwd als een maat voor dominantie. De correlatie vertegenwoordigt het verschil tussen het aandeel gunstige en ongunstige paren of ondertekende rangordes. Grotere waarden geven aan dat meer van \(X\) groter is dan meer van \(Y\), waarbij een waarde van (-1) aangeeft dat alle waarnemingen in de tweede groep, \(Y\), groter zijn dan de eerste groep, \(X\), en een waarde van (+1) aangeeft dat alle waarnemingen in de eerste groep groter zijn dan de tweede.

12.3.1.1 Afhankelijke groepen

  1. Bereken verschilscores tussen paren:

\[ D = X_2 - X_1 \]

  1. Bereken de positieve en negatieve rang sommen:

\[ \text{When } D_i>0,\;\; R_{\oplus} = \sum_{i=1} -1\cdot \text{sign}(D_i) \cdot \text{rank}(|D_i|) \]

\[ \text{When } D_i<0,\;\; R_{\ominus} = \sum_{i=1} -1\cdot \text{sign}(D_i) \cdot \text{rank}(|D_i|) \]

  1. We kunnen een constante, \(H\), op -1 zetten als de positieve rangorde groter of gelijk is aan de negatieve rangorde (\(R_{\oplus} \ge R_{\ominus}\)) of we kunnen \(H\) op 1 zetten als de positieve rangorde kleiner is dan de negatieve rangorde (\(R_{\oplus} < R_{\ominus}\)).

\[ H = \begin{cases} -1 & R_{\oplus} \ge R_{\ominus} \\ 1 & R_{\oplus} < R_{\ominus} \end{cases} \]

  1. Bereken de rang-biseriële correlatie:

\[ r_{rb} = 4H\times \left| \frac{\min( R_{\oplus}, R_{\ominus}) - .5\times ( R_{\oplus} + R_{\ominus})}{n(n + 1)} \right| \]

  1. Voor gepaarde steekproeven, of één steekproef, wordt de standaardfout als volgt berekend:

\[ SE_{r_{rb}} = \sqrt{ \frac {2(2 n^3 + 3 n^2 + n)} {6(n^2 + n)} } \]

  1. De betrouwbaarheidsintervallen kunnen dan worden berekend door de correlatie te Z-transformeren.

\[ Z_{rb} = \text{arctanh}(r_{rb}) \]

  1. Bereken de standaardfout van de Z-getransformeerde correlatie

\[ SE_{Z_{rb}} = \frac{SE_{r_{rb}}}{1-r_{rb}^2} \]

  1. Dan kan het betrouwbaarheidsinterval worden berekend en terugvertaald.

\[ CI_{r_{rb}} = \text{tanh}(Z_{rb} \pm 1.96 \cdot SE_{Z_{rb}}) \] In R kunnen we de functie ses_calc() uit het pakket TOSTER gebruiken (Läkens 2017). In het volgende voorbeeld berekenen we de rang-biseriële correlatie in de slaapdataset:

# Afhankelijke groepen

data(sleep)
library(TOSTER)

# Als de steekproefomvang klein is
# moet een permutatieversie gebruikt worden.
# Wanneer dit wordt gedaan, moet er een zaad worden ingesteld.
set.seed(2124)
ses_calc(extra ~ group,
         data = sleep,
         paired = TRUE)
                           estimate lower.ci  upper.ci conf.level
Rank-Biserial Correlation 0.9818182 0.928369 0.9954785       0.95

Het voorbeeld toont een rang-biseriële correlatie van \(r_{rb}\) = .982 [.938, .995]. Dit suggereert dat bijna elk individu in de steekproef een toename vertoonde in toestand 2 ten opzichte van toestand 1. Zoals je in de onderstaande figuur kunt zien, vertoonde slechts één individu een achteruitgang (individu in rood weergegeven).

12.3.1.2 Onafhankelijke Groepen

  1. Bereken de rangorde voor elke observatie over alle observaties van groep 1 en 2

\[ R = \text{rank}(X) \]

  1. Bereken de rangordesommen van elke groep

\[ U_1 = \left(\sum_{i=1}^{n_1} R_{1i}\right) - n_1 \cdot \frac{n_1 + 1}{2} \]

\[ U_2 = \left(\sum_{i=1}^{n_2} R_{2i}\right) - n_2 \cdot \frac{n_2 + 1}{2} \]

  1. Rang biseriële correlatie berekenen

\[ r_{rb} = \frac{U_1}{n_1 n_2} - \frac{U_2}{n_1 n_2} \]

  1. Voor onafhankelijke steekproeven wordt de standaardfout als volgt berekend:

\[ SE_{rb} = \sqrt{\frac {n_1 + n_2 + 1} { 3 n_1 n_2}} \]

  1. De betrouwbaarheidsintervallen kunnen dan worden berekend door de schatting te transformeren.

\[ Z_{rb} = \text{arctanh}(r_{rb}) \]

  1. Bereken de standaardfout van de Z-getransformeerde correlatie

\[ SE_{Z_{rb}} = \frac{SE_{r_{rb}}}{1-r_{rb}^2} \]

  1. Dan kan het betrouwbaarheidsinterval worden berekend en terugvertaald.

\[ CI_{r_{rb}} = \text{tanh}(Z_{rb} \pm 1.96 \cdot SE_{Z_{rb}}) \]

In R kunnen we ses_calc in het pakket TOSTER gebruiken om \(r_{rb}\) te berekenen.

# Twee steekproeven
# installeer het janitor-pakket voor het opschonen van gegevens
# gegevens opschonen en importeren uit likert
data(mass, package = "likert")
df_mass = mass |>
  as.data.frame() |>
  janitor::clean_names() 

# Functie heeft invoer nodig als numeriek
# geordende factoren kunnen worden geconverteerd naar rangen
# Nogmaals, de waarschuwing kan worden genegeerd
set.seed(24111)
ses_calc(
  rank(math_relates_to_my_life) ~ gender,
  data = df_mass,
  paired = FALSE
)
                           estimate   lower.ci   upper.ci conf.level
Rank-Biserial Correlation -0.452381 -0.7831567 0.07794462       0.95

Het voorbeeld toont een rang-biseriële correlatie van \(r_{rb}\) = -.45 [-.78, .08].

12.3.2 Overeenstemmingswaarschijnlijkheid

In het geval van twee steekproeven is de concordantiekans de kans dat een willekeurig gekozen proefpersoon uit de ene groep een respons heeft die groter is dan die van een willekeurig gekozen proefpersoon uit de andere groep. In het geval van twee steekproeven is dit ongeveer gelijk aan de statistiek van de Brunner-Munzel test. In het geval van gepaarde steekproeven is het de kans dat een willekeurig gekozen verschilscore (\(D\)) een positief (+) teken heeft plus 0,5 keer de kans op een gelijkspel (geen/nul verschil). De concordantiekans kan vele namen hebben. Het wordt ook wel de c-index, de niet-parametrische waarschijnlijkheid van superioriteit of de niet-parametrische gemeenschappelijke taal effectgrootte (CLES) genoemd. De berekening van concordantie kan worden afgeleid uit de rang-biseriële correlatie. De concordantiekans (\(p_c\)) kan worden geconverteerd uit de correlatie.

\[ p_c = \frac{r_{rb} + 1 }{2} \]

In R kunnen we de ses_calc() functie weer gebruiken samen met de slaapdataset. Voor experimenten met herhaalde metingen kan de concordantiekans in afhankelijke groepen worden berekend met het paired=TRUE argument in de ses_calc() functie:

# Afhankelijke Groepen
library(TOSTER)

data(sleep)

ses_calc(extra ~ group,
         data = sleep,
         paired = TRUE,
         ses = "c")
             estimate  lower.ci  upper.ci conf.level
Concordance 0.9909091 0.9641845 0.9977392       0.95

Voor twee onafhankelijke groepen kan de concordantiekans op dezelfde manier worden berekend zonder het gepaarde argument te specificeren:

# Onafhankelijke Groepen
# data importeren van likert
data(mass, package = "likert")
df_mass = mass |>
  as.data.frame() |>
  janitor::clean_names()

ses_calc(rank(math_relates_to_my_life) ~ gender,
         data = df_mass,
         ses = "c")
             estimate  lower.ci  upper.ci conf.level
Concordance 0.2738095 0.1084217 0.5389723       0.95

12.3.3 Wilcoxon-Mann-Whitney Odds

De Wilcoxon-Mann-Whitney odds (O’Brien and Castelloe 2006), ook bekend als de “Generalized Odds Ratio” (Agresti 1980), transformeert in wezen de concordantiekans in een oddsratio.

De kansen kunnen worden geconverteerd uit de concordantie door de logit van de concordantie te nemen. Dit geeft de log odds.

\[ O_{WMW} = \exp \left[\text{logit}(p_c)\right] \]

De exponentiële waarde van de log-kansen geeft de kansen op een meer interpreteerbare schaal. Als we alleen de logit van de concordantiekans nemen, krijgen we de logkans op zo’n manier dat,

\[ \log(O_{WMW}) = \text{logit}(p_c) \]

In R kunnen we \(O_{WMW}\) berekenen met de ses_calc() functie uit het TOSTER pakket:

# Afhankelijke Groepen

data(sleep)

TOSTER::ses_calc(extra ~ group,
                       data = sleep,
                       paired = TRUE,
                 ses = "odds")
         estimate lower.ci upper.ci conf.level
WMW Odds      109 26.92087 441.3305       0.95

We kunnen ook \(O_{WMW}\) in onafhankelijke groepen berekenen met dezelfde functie:

# Onafhankelijke Groepen

# data importeren van likert
data(mass, package = "likert")
df_mass = mass |>
  as.data.frame() |>
  janitor::clean_names()

TOSTER::ses_calc(  rank(math_relates_to_my_life) ~ gender,
  data = df_mass,
                 ses = "odds")
          estimate  lower.ci upper.ci conf.level
WMW Odds 0.3770492 0.1216064 1.169067       0.95

  1. Merk op dat dit voor gepaarde steekproeven niet verwijst naar de waarschijnlijkheid van een toename/afname in de gepaarde steekproef, maar eerder naar de waarschijnlijkheid dat een willekeurig gekozen waarde van X groter/minder zal zijn dan Y. Dit wordt in de literatuur ook wel het “relatieve” effect genoemd. Daarom zullen de resultaten verschillen van de concordantiekans. \[ \hat{p} = P(X<Y)+ \frac{1}{2} \cdot P(X=Y) \]↩︎