Willkommen bei Stats by Randolph. Hier geht es zur Hauptseite mit weiteren Informationen und Inhalten.

Autor:innen dieser Seite: An den Inhalten dieser Seite haben mitgearbeitet: Valentin Koob, Eva Röttger und Markus Janczyk. Der Inhalt dieser Seite wird in der Lehre in den Studiengängen Psychologie von der AG Forschungsmethoden und Kognitive Psychologie an der Universität Bremen verwendet, steht aber allen Interessierten zur Verfügung. Rückmeldungen/Fehler/Vorschläge können gesendet werden an .

Versionshistory:

  • v1.0: erste online-gestellte Version (20.09.2023)

1 Der Ursprung des Kontingenzkoeffizienten

In vielen Einführungsveranstaltungen der Statistik wird i.d.R zuerst der \(\chi^2\) Wert als Zusammenhangsmaß eingeführt. Das Problem ist allerdings, dass dieser nicht normiert ist, sondern er besitzt ein Maximum bei \(n \cdot [\min(I,J)-1]\) und ist somit abhängig von der Stichprobengröße sowie der Anzahl der Spalten \(J\) bzw. Zeilen \(I\). Dies macht natürlich einen Vergleich zwischen Studien mit unterschiedlichen Designs oder Stichprobengrößen schwierig. Als Argument wird deshalb oft aufgeführt, dass es normierte Koeffizienten braucht, wie beispielsweise den korrigierten Kontingenzkoeffizienten, den wir in Teil 5 über den Kontingenzkoeffizienten

\[ K = \sqrt{\frac{\chi^2}{n + \chi^2}} \]

hergeleitet haben. Auch wenn die Forderung nach einem normierten Koeffizienten an sich natürlich richtig ist, so hinkt die Argumentation allerdings, da man auch einfach \(\chi^2\) durch sein Maximum von \(n \cdot [min(I,J)-1]\) teilen könnte um eine normierte Statistik zwischen \(0\) und \(1\) zu erhalten.

Tatsächlich hat der Kontingenzkoeffizient andere, vornehmlich historische, Gründe. Pearson (1904) zeigte nämlich, dass der Kontingenzkoeffizient ein Spezialfall der Pearson Korrelation ist. Folgen zwei Merkmale einer bestimmten gemeinsamen Verteilung, der sog. multivariaten Normalverteilung (wird erst in Statistik 2; siehe allerdings hier für eine Visualisierung), dann nähert sich \(K\) mit zunehmender Anzahl von Klassen der Pearson-Korrelation \(r\) an. In anderen Worten: Unterteilt man zwei metrische Variablen in sehr viele einzelne Bereiche, sodass sich letztlich zwei nominalskalierte Variablen ergeben, so entspricht der auf Basis dieser Klassen berechnete Kontingenzkoeffizient \(K\) der Pearson-Korrelation \(r\) der beiden Ursprungsvariablen.

Dies wollen wir einmal praktisch mit R zeigen: Hierfür ziehen wir zunächst aus einer multivariaten Normalverteilung eine sehr große Stichprobe. Die Pearson-Korrelation zwischen den beiden Merkmalen \(X\) und \(Y\) ist hier genau \(0.5\).

library(MASS)
set.seed(2)                        # zur exakten Reproduzierbarkeit der Ergebnisse 
n <- 100000                        # Stichprobengröße 
R <- matrix(c(1, 0.5,              # Korrelationsstruktur der beiden Variablen
              0.5, 1), 
            nrow = 2,
            ncol = 2) 
mu <- c(X = 0, Y = 0)              # Mittelwerte der beiden Variablen (hier irrelevant)
dat <- mvrnorm(n = n,              # ziehen der Stichproben
               mu = mu, 
               Sigma = R, 
               empirical = TRUE) 
dat <- as.data.frame(dat)
head(dat)                          # Ausgabe der ersten Zeilen der Stichprobe
cor(dat$X, dat$Y)                  # Korrelation
## [1] 0.5

Nun können wir mit Hilfe der Funktion cut() die Variablen klassieren, z.B. in 2 Teile:

x_classed <- cut(dat[,1],
                 breaks = 2) # Klassieren von X in 2 Teile
levels(x_classed)
## [1] "(-4.76,0.0506]" "(0.0506,4.86]"
y_classed <- cut(dat[,2],
                 breaks = 2) # Klassieren von Y in 2 Teile
levels(y_classed)
## [1] "(-4.35,-0.104]" "(-0.104,4.14]"

Auf Basis der klassierten Variablen können wir nun eine Kontingenztafel erstellen und den Kontingenzkoeffizienten ausrechnen:

library(vcd)
## Lade nötiges Paket: grid
tab <- table(x_classed, y_classed) # Kontingenztabelle erstellen
tab
##                 y_classed
## x_classed        (-4.35,-0.104] (-0.104,4.14]
##   (-4.76,0.0506]          32099         19887
##   (0.0506,4.86]           13730         34284
assocstats(tab)$contingency       # Kontingenzkoeffizient
## [1] 0.3154249

Dieses Vorgehen können wir nun für verschiedene Anzahlen von Klassen nClass (= Klassenbreiten) wiederholen und anschließend das Ergebnis plotten:

nClass <- c(3:25)        # Anzahl der Klassen
ks <- c()                # Container zur Speicherung der Ergebnisse

for (oneNClass in nClass) {
  x_classed <- cut(dat[,1],
                   breaks = oneNClass) # Klassieren von X
  y_classed <- cut(dat[,2],
                   breaks = oneNClass) # Klassieren von Y
  tab <- table(x_classed, y_classed)   # Kontingenztabelle erstellen
  k <- assocstats(tab)$contingency     # Kontingenzkoeffizienten ausrechnen ...
  ks <- c(ks, k)                       # ... und abspeichern 
}

plot(ks ~ nClass, 
     type = "l", 
     ylab = "K",
     xlab = "Anzahl der Klassen", 
     ylim = c(0,0.51))
abline(h = 0.5,
       col = "green") # Korrelation von X und Y