Chi-square goodness of fit Test

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

Antworten
eimichae
Beiträge: 36
Registriert: Mo Okt 10, 2016 8:48 pm

Chi-square goodness of fit Test

Beitrag von eimichae »

Hallo zusammen,
In einem kleine Verhaltensexperiment habe ich untersucht ob sich Käfer eine Präferenz für eine der beiden Futterquellen (B vs. C) aufweisen.
14 mal hat sich ein Käfer für B entschieden 7 mal für C.

Um zu testen ob sich das Verhältnis der Käfer welche B über C gewählt haben sich signifikant von 1:1 unterscheiden (H0: Beide Futterquellen sind gleich beliebt bei den Käfern) habe ich einen "chi-square goodness of fit test" durchgeführt.

Code: Alles auswählen

dta <- c(14, 7)
    res <- chisq.test(dta, p = c(1/2, 1/2))
    res$expected # If the "expected" numbers would be < 5 one would have to conduct a "Fishers exact test"
    res
Obwohl C dopplet so häufig wie B gewählt wurde erhalte ich jedoch keinen signifikanten P-Wert (p-value = 0.1266)
Daher meine Frage:

F1: ist der gewählte Test hier angemessen und wurde er richtig in R drucheführt?
F2: Wie kann es sein, dass ich keinen sign. P-Wert erhalte obwohl ein Futterquelle doppelt so häufig aufgesucht wurde?

Vielen Dank

Michi
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Chi-square goodness of fit Test

Beitrag von bigben »

Hallo Michi,

schön, dass Du den Weg hierher gefunden hast. Ich hatte Dir an anderer Stelle ja schonmal geschrieben, dass ich hier zu einem Binomialtest neigen würde. Nehmen wir für einen Moment mal an, dass die Wahrscheinlichkeit 50% beträgt, dass sich ein Käfer für B entscheidet. Wenn wir nun 21 Käfer an den Start lassen, dann ist die Zahl der B-Käfer binomial verteilt. Wir können daher mit dbinom() ausrechnen, wie wahrscheinlich welche Zahl von B-Käfern ist. Versuch mal folgendes auf Deinem Rechner:

Code: Alles auswählen

anzahlB <- 0:21
haeufigkeit <- dbinom(anzahlB, size = 21, prob = 0.5)
barplot( haeufigkeit, names.arg = anzahlB)
print(data.frame(anzahlB, haeufigkeit))
#>    anzahlB  haeufigkeit
#> 1        0 4.768372e-07
#> 2        1 1.001358e-05
#> 3        2 1.001358e-04
#> 4        3 6.341934e-04
#> 5        4 2.853870e-03
#> 6        5 9.703159e-03
#> 7        6 2.587509e-02
#> 8        7 5.544662e-02
#> 9        8 9.703159e-02
#> 10       9 1.401567e-01
#> 11      10 1.681881e-01
#> 12      11 1.681881e-01
#> 13      12 1.401567e-01
#> 14      13 9.703159e-02
#> 15      14 5.544662e-02
#> 16      15 2.587509e-02
#> 17      16 9.703159e-03
#> 18      17 2.853870e-03
#> 19      18 6.341934e-04
#> 20      19 1.001358e-04
#> 21      20 1.001358e-05
#> 22      21 4.768372e-07
Bild

So, um an einen p-Wert dran zu kommen, brauchen wir die Häufigkeit der B-Entscheidungen von 14 oder noch extremer als 14 und wenn wir einen zweiseitigen p-Wert haben wollen, dazu noch die von 7 und extremer als 7. Das kannst Du mit den Zahlenreihen oben leicht selbst ausrechnen, aber Du siehst auch schon, dass die Wahrscheinlichkeit des Wertes 14 selbst schon 0,0554 beträgt und damit allein schon mehr als die angestrebte Signifikanzgrenze von 0,05.
Wir müssen das nicht von Hand addieren, wir können das mit der Funktion binom.test() untersuchen:

Code: Alles auswählen

binom.test(x = c(14, 7))
#> 
#>  Exact binomial test
#> 
#> data:  c(14, 7)
#> number of successes = 14, number of trials = 21, p-value = 0.1892
#> alternative hypothesis: true probability of success is not equal to 0.5
#> 95 percent confidence interval:
#>  0.4303245 0.8541231
#> sample estimates:
#> probability of success 
#>              0.6666667
Der Binomialtest kommt also auf einen p-Wert der gar nicht soweit von Deinem Chiquadrattest liegt und zu den obigen manuellen Rechenschritten passt und damit lautet die Antwort leider: Selbst wenn es doppelt soviele B wie C sind, ist das bei n = 21 leider durchaus mit einem zufälligen Geschehen vereinbar, sprich: Die Nullhypothese kann wirklich nicht verworfen werden.

Der Output von binom.test() sagt uns, dass das 95%-Konfidenzintervall für die wahre Wahrscheinlichkeit von B von 43% bis 85% reicht und damit die 50% umfasst.

Zuletzt noch: Ja, Du hast den Chiquadrat-Verteilungstest korrekt in R gerechnet.

Ich hoffe, das hilft beim Verstehen, sonst gerne nochmal nachfragen.
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
eimichae
Beiträge: 36
Registriert: Mo Okt 10, 2016 8:48 pm

Re: Chi-square goodness of fit Test

Beitrag von eimichae »

Lieber Bernhard,
Vielen Dank für deine Erklärung. Den Binomialtest kannte ich bisher nicht. Er scheint etwas konservativer als der Chi-square Test zu sein.
Besten Dank und Grüsse
Michi
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Chi-square goodness of fit Test

Beitrag von bigben »

Hallo eimichae,

ich weiß nicht, ob der Chi-Quadrat-Test generell weniger konservativ ist. Er rechnet halt entweder approximativ mit der Chi-Quadrat-Verteilung oder per Monte-Carlo-Simulation. Ich weiß nicht so genau, was `approximativ` hier ganz genau bedeutet. Aber wenn man mit der Monte-Carlo-Simulation rechnet, dann kommen sehr ähnliche Werte wie beim Binomialtest heraus während der einfache chisq.test den Ausreißer bildet:

Code: Alles auswählen

binom.test(c(14, 7))$p.value
#> [1] 0.1892471
chisq.test(c(14, 7), simulate.p.value = TRUE, B = 100000)$p.value
#> [1] 0.1891281
chisq.test(c(14, 7), simulate.p.value = TRUE, B = 100000)$p.value
#> [1] 0.1911281
chisq.test(c(14, 7), simulate.p.value = TRUE, B = 100000)$p.value
#> [1] 0.1887381
chisq.test(c(14, 7))$p.value
#> [1] 0.1266305
Der Binomialtest ist halt exakt, er ist wie oben gesehen leicht zu erklären und wann man sich die Fläche der Balken anschaut, dann ist auch visuell noch auswertbar (weil die relevanten Balken gemeinsam mehr als ein 5% der Gesamtfläche ausmachen). Und dann gibt R dabei noch ein Konfidenzintervall aus. Für mich in der Summe ein klarer Fall. Nur wenn es dann mehr als zwei Kategorien werden, dann muss man halt doch wieder auf den Chi-Quadrat-Anpassungstest zurückgreifen.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten