Die folgende 2x2 Tabelle zeigt die Daten einer Studie, welche durchgeführt wurde, um die Wirksamkeit von Aspirin zur Prävention eines frühzeitigen Todes nach einem Herzinfarkt zu evaluieren. Hier findest du weitere Informationen zum den Daten.
## outcome
## treatment survived death
## placebo 354 52
## aspirin 725 85
outcome
) mit den Ausprägungen
“survived” = 0 und “death” = 1treatment
) mit den Ausprägungen
“placebo” = 0 und “aspirin” = 1my_tab
.
Diese 2x2 Tabelle sollte gleich aussehen, wie diese oben.<- factor(c(rep(0, 406), rep(1, 810)), levels = c(0, 1), labels = c("placebo", "aspirin"))
treatment <- factor(c(rep(1, 52), rep(0, 406-52), rep(1, 85), rep(0,810-85)), levels = c(0, 1), labels = c("survived", "death")) outcome
Falls dir nicht klar ist, wie man anhand der Tabelle die Rohwerte erhält, hilft dir vielleicht dieses Video
<- table(treatment, outcome)
my_tab my_tab
## outcome
## treatment survived death
## placebo 354 52
## aspirin 725 85
Verwende für alle Berechnungen die prop.test()
Funktion.
prop.test(my_tab[1,2], sum(my_tab[1,]))
##
## 1-sample proportions test with continuity correction
##
## data: my_tab[1, 2] out of sum(my_tab[1, ]), null probability 0.5
## X-squared = 223.16, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.09793556 0.16545553
## sample estimates:
## p
## 0.1280788
Anmerkung: “null probability 0.5” hat in diesem Fall keine Bedeutung. Dies bedeutet lediglich, dass die Nullhypothese in diese Fall besagt, dass \(prop = 0.5\)
prop.test(my_tab[2,2], sum(my_tab[2,]))
##
## 1-sample proportions test with continuity correction
##
## data: my_tab[2, 2] out of sum(my_tab[2, ]), null probability 0.5
## X-squared = 504.1, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.08510476 0.12860969
## sample estimates:
## p
## 0.1049383
Anmerkung: “null probability 0.5” hat in diesem Fall keine Bedeutung. Dies bedeutet lediglich, dass die Nullhypothese in diese Fall besagt, dass \(prop = 0.5\)
prop.test(c(my_tab[1,2], my_tab[ 2,2]), c(sum(my_tab[1,]), sum(my_tab[2,])))
##
## 2-sample test for equality of proportions with continuity correction
##
## data: c(my_tab[1, 2], my_tab[2, 2]) out of c(sum(my_tab[1, ]), sum(my_tab[2, ]))
## X-squared = 1.2264, df = 1, p-value = 0.2681
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## -0.01746498 0.06374608
## sample estimates:
## prop 1 prop 2
## 0.1280788 0.1049383
Mit der manuellen Eingabe
prop.test(c(52,85), c(52+354, 85+725))
kommt genau das
Selbe heraus.
Die Wahrscheinlichkeit für einen Unterschied von -2.3% (oder einen extremeren) unter der Annahme, dass H0 stimmt, ist 26.81%. Das 95% CI sagt uns, dass die Differenz sowohl negativ wie positiv sein kann. Die Evidenz gegen H0 ist also nicht sehr stark.
Mit der prop.test()
Funktion hast du oben untersucht, ob
sich die die Differenz der Proportionen von zwei Gruppen von 0
unterscheidet. Man könnte auch sagen, du hast untersucht, ob es einen
Zusammenhang zwischen den Variablen treatment
und
death
gibt. Um Zusammenhänge zwischen zwei dichotomen
Variablen zu untersuchen, gibt es noch weitere Möglichkeiten. Eine
Möglichkeit ist das Odds Ratio.
oddsratio()
Funktion aus dem package epitools
brauchen. Schau im Hilfemenü mit ?oddsratio
zuerst nach,
wie die 2x2 Tabelle ausgerichtet sein muss. Entspricht
my_tab
diesen Vorgaben?Der Event ist death == "death"
und die Exposition ist
treatment == "aspirin"
oddsratio()
Funktion aus dem package epitools
brauchen. Schau im Hilfemenü mit ?oddsratio
zuerst nach,
wie die 2x2 Tabelle ausgerichtet sein muss. Entspricht my_tab diesen
Vorgaben?library(epitools)
# ?oddsratio # So das Hilfemenü abrufen
my_tab
## outcome
## treatment survived death
## placebo 354 52
## aspirin 725 85
Ja, die Anordnung entspricht den Vorgaben der Funktion (obwohl es für das Odds Ratio eigentlich keine Rolle spielt, siehe weiter unten).
oddsratio(my_tab)
## $data
## outcome
## treatment survived death Total
## placebo 354 52 406
## aspirin 725 85 810
## Total 1079 137 1216
##
## $measure
## odds ratio with 95% C.I.
## treatment estimate lower upper
## placebo 1.0000000 NA NA
## aspirin 0.7974502 0.5535838 1.158314
##
## $p.value
## two-sided
## treatment midp.exact fisher.exact chi.square
## placebo NA NA NA
## aspirin 0.2321007 0.2485889 0.228752
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Das Odds Ratio ist 0.7975. Die Odds in der Aspirin-Gruppe, um zu sterben entspricht 79.75% der Odds in der Placebo-Gruppe. Oder anders gesagt, die Odds in der Aspirin-Gruppe, um zu sterben sind 20.25% tiefer als in der Placebo-Gruppe.
Das 95% CI sagt uns, dass unsere beobachtete Stichprobe mit einem
wahren OR (in der Population) von zwischen 0.55 und 1.15 kompatibel ist.
Genauer: wir haben eine Sicherheit von 95%, dass das wahre OR zwischen
0.55 und 1.15 ist. Ein Wert von 1 ist also durchaus kompatibel mit den
Daten. Möglicherweise sterben in der Population sogar mehr Leute mit
Aspirin als ohne (OR >1). Der Chi-squared Test testet, ob OR = 1, was
gleichbedeutend ist mit keinem Unterschied zwischen den Gruppen. Wenn
wir den p-Wert vom Chi-squared Test anschauen, beträgt dieser 22.88%. Es
gibt wenig Evidenz gegen H0. Anmerkung: Der prop.test() oben hat
automatisch eine Korrektur gemacht (“continuity correction”). Hätten wir
diesen Test ohne diese Korrektur gemacht (correct = FALSE), wären die
p-Werte von oddsratio()
und prop.test()
identisch.
Odds Ratios sind symmetrisch. Demnach ist das Odds Ratio, um in der Placebo-Gruppe zu überleben das Gleiche, wie das Odds Ratio, um in der Aspirin-Gruppe zu sterben. Siehe die Outputs unten: obwohl die Tabelle umgekehrt angeordnet ist, bleibt das OR gleich:
oddsratio(my_tab) # Wie oben
## $data
## outcome
## treatment survived death Total
## placebo 354 52 406
## aspirin 725 85 810
## Total 1079 137 1216
##
## $measure
## odds ratio with 95% C.I.
## treatment estimate lower upper
## placebo 1.0000000 NA NA
## aspirin 0.7974502 0.5535838 1.158314
##
## $p.value
## two-sided
## treatment midp.exact fisher.exact chi.square
## placebo NA NA NA
## aspirin 0.2321007 0.2485889 0.228752
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
oddsratio(my_tab, rev = "both") # Umgekehrte Anordnung der Tabelle
## $data
## outcome
## treatment death survived Total
## aspirin 85 725 810
## placebo 52 354 406
## Total 137 1079 1216
##
## $measure
## odds ratio with 95% C.I.
## treatment estimate lower upper
## aspirin 1.0000000 NA NA
## placebo 0.7974502 0.5535838 1.158314
##
## $p.value
## two-sided
## treatment midp.exact fisher.exact chi.square
## aspirin NA NA NA
## placebo 0.2321007 0.2485889 0.228752
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
?oddsratio
Eine weitere Möglichkeit, um einen Zusammenhang zwischen zwei dichotomen Variablen zu untersuchen ist das Risk Ratio. Voraussetzung ist natürlich, dass wir überhaupt über Risiken sprechen können. Die Daten müssen also von einer longitudinalen Studie stammen (z.B. Kohortenstudie oder RCT). Wir nehmen an, dass bei unserem Beispiel diese Voraussetzung erfüllt ist und wir demnach etwas über Risiken aussagen können.
riskratio()
Funktion aus dem package
epitools
, um das Risk Ratio zu berechnen, in der
Aspirin-Gruppe zu sterben. Oben haben wir bereits sichergestellt, dass
die Tabelle richtig orientiert ist.riskratio()
Funktion aus dem package
epitools
, um das Risk Ratio zu berechnen. Oben haben wir
bereits sichergestellt, dass die Tabelle richtig orientiert ist.riskratio(my_tab)
## $data
## outcome
## treatment survived death Total
## placebo 354 52 406
## aspirin 725 85 810
## Total 1079 137 1216
##
## $measure
## risk ratio with 95% C.I.
## treatment estimate lower upper
## placebo 1.0000000 NA NA
## aspirin 0.8193257 0.5926804 1.132642
##
## $p.value
## two-sided
## treatment midp.exact fisher.exact chi.square
## placebo NA NA NA
## aspirin 0.2321007 0.2485889 0.228752
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Das Risk Ratio beträgt 0.82. Das Risiko für einen frühzeitigen Tod nach einem Herzinfarkt ist in der Aspirin-Gruppe 18% tiefer. Oder anders: das Risiko für einen frühzeitigen Tod nach einem Herzinfarkt in der Aspirin-Gruppe entspricht 82% desjenigen in der Placebo-Gruppe.
Das 95% CI sagt uns, dass unsere beobachtet Stichprobe mit einem wahren RR (in der Population) zwischen 0.59 und 1.13 kompatible ist. Genauer: wir haben eine Sicherheit von 95%, dass das wahre Risk Ratio zwischen 0.59 und 1.13 ist. Ein Wert von 1 ist also durchaus kompatibel mit den Daten. Möglicherweise sterben in der Population sogar mehr Leute mit Aspirin als ohne (RR >1). Der Chi-squared Test testet ob RR = 1, was gleichbedeutend ist mit keinem Unterschied zwischen den Gruppen. Wenn wir den p-Wert vom Chi-squared Test anschauen, beträgt dieser 22.88%. Es gibt keine Evidenz gegen H0.
Anmerkung: Der prop.test() oben hat automatisch eine Korrektur
gemacht (“continuity correction”). Hätten wir diesen Test ohne diese
Korrektur gemacht (correct = FALSE), wären die p-Werte von
prop.test()
und riskratio()
identisch.
Im Gegensatz zu Odds Ratios sind Risk Ratios eben nicht symmetrisch. Demnach ist das Risk Ratio, um in der Placebo-Gruppe zu überleben nicht das Gleiche, wie das Risk Ratio, um in der Aspirin-Gruppe zu sterben. Siehe die Outputs unten: die Tabelle wurde umgekehrt angeordnet und das Risk Ratio (aber nicht der p-Wert) verändert sich:
riskratio(my_tab) # Wie oben
## $data
## outcome
## treatment survived death Total
## placebo 354 52 406
## aspirin 725 85 810
## Total 1079 137 1216
##
## $measure
## risk ratio with 95% C.I.
## treatment estimate lower upper
## placebo 1.0000000 NA NA
## aspirin 0.8193257 0.5926804 1.132642
##
## $p.value
## two-sided
## treatment midp.exact fisher.exact chi.square
## placebo NA NA NA
## aspirin 0.2321007 0.2485889 0.228752
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
riskratio(my_tab, rev = "both") # Umgekehrte Anordnung der Tabelle
## $data
## outcome
## treatment death survived Total
## aspirin 85 725 810
## placebo 52 354 406
## Total 137 1079 1216
##
## $measure
## risk ratio with 95% C.I.
## treatment estimate lower upper
## aspirin 1.0000000 NA NA
## placebo 0.9741464 0.9321088 1.01808
##
## $p.value
## two-sided
## treatment midp.exact fisher.exact chi.square
## aspirin NA NA NA
## placebo 0.2321007 0.2485889 0.228752
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
<- c(rep("delir", 514), rep("control", 1417))
group <- c(rep("yes", 63), rep("no",514-63), rep("yes", 39), rep("no", 1417-39))
fall
table(group,fall)
## fall
## group no yes
## control 1378 39
## delir 451 63
library(epitools)
riskratio(table(group,fall))
## $data
## fall
## group no yes Total
## control 1378 39 1417
## delir 451 63 514
## Total 1829 102 1931
##
## $measure
## risk ratio with 95% C.I.
## group estimate lower upper
## control 1.000000 NA NA
## delir 4.453307 3.026076 6.553685
##
## $p.value
## two-sided
## group midp.exact fisher.exact chi.square
## control NA NA NA
## delir 2.087219e-14 2.466358e-14 1.552347e-16
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Warum die Autoren beim Risk Ratio nicht auf 4.5 aufgerundet haben, habe ich nicht herausgefunden.
Der Chi-Quadrat Test ist eine weitere Möglichkeit, Zusammenhänge zwischen zwei kategorialen Variablen zu untersuchen. Wenn wir den Chi-squared Test auf das Aspirin-Beispiel von oben anwenden, sieht das wie folgt aus:
chisq.test(my_tab)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: my_tab
## X-squared = 1.2264, df = 1, p-value = 0.2681
Nehmen wir die Yates’ continuity correction raus, erhalten wir
wiederum den gleichen p-Wert wie bei der oddratio()
Funktion und der riskratio()
Funktion, weil dort bereits
ein Chi-Quadrat Test gemacht wurde:
chisq.test(my_tab, correct = FALSE)
##
## Pearson's Chi-squared test
##
## data: my_tab
## X-squared = 1.4486, df = 1, p-value = 0.2288
Bei dichotomen Daten bietet sich die Berechnung von Odds Ratios und Risk Ratios an, da sie als Effektgrössen dienen. Sie geben uns also einen Hinweis zur grösse eines Effekts. Analysiert man hingegen kategoriale Variablen mit mehr als zwei Ausprägungsgeraden, dann ist eine Berechnung von Odds Ratios oder Risk Ratios nicht mehr möglich. In dieser Situation ist ein Chi-squared Test hilfreich.
Wir erstellen die Daten direkt in R. Kopiere den Code unten und lass ihn laufen.
<- c(rep("Coop", 32), rep("Denner", 19), rep("Migros", 19))
einkaufen <- c(rep("Allesfresser", 17), rep("Veganer", 6), rep("Vegetarier", 9),
ernaehrung rep("Allesfresser", 8), rep("Veganer", 7), rep("Vegetarier", 4),
rep("Allesfresser", 4), rep("Veganer", 7), rep("Vegetarier", 8))
cbind(einkaufen, ernaehrung)
## einkaufen ernaehrung
## [1,] "Coop" "Allesfresser"
## [2,] "Coop" "Allesfresser"
## [3,] "Coop" "Allesfresser"
## [4,] "Coop" "Allesfresser"
## [5,] "Coop" "Allesfresser"
## [6,] "Coop" "Allesfresser"
## [7,] "Coop" "Allesfresser"
## [8,] "Coop" "Allesfresser"
## [9,] "Coop" "Allesfresser"
## [10,] "Coop" "Allesfresser"
## [11,] "Coop" "Allesfresser"
## [12,] "Coop" "Allesfresser"
## [13,] "Coop" "Allesfresser"
## [14,] "Coop" "Allesfresser"
## [15,] "Coop" "Allesfresser"
## [16,] "Coop" "Allesfresser"
## [17,] "Coop" "Allesfresser"
## [18,] "Coop" "Veganer"
## [19,] "Coop" "Veganer"
## [20,] "Coop" "Veganer"
## [21,] "Coop" "Veganer"
## [22,] "Coop" "Veganer"
## [23,] "Coop" "Veganer"
## [24,] "Coop" "Vegetarier"
## [25,] "Coop" "Vegetarier"
## [26,] "Coop" "Vegetarier"
## [27,] "Coop" "Vegetarier"
## [28,] "Coop" "Vegetarier"
## [29,] "Coop" "Vegetarier"
## [30,] "Coop" "Vegetarier"
## [31,] "Coop" "Vegetarier"
## [32,] "Coop" "Vegetarier"
## [33,] "Denner" "Allesfresser"
## [34,] "Denner" "Allesfresser"
## [35,] "Denner" "Allesfresser"
## [36,] "Denner" "Allesfresser"
## [37,] "Denner" "Allesfresser"
## [38,] "Denner" "Allesfresser"
## [39,] "Denner" "Allesfresser"
## [40,] "Denner" "Allesfresser"
## [41,] "Denner" "Veganer"
## [42,] "Denner" "Veganer"
## [43,] "Denner" "Veganer"
## [44,] "Denner" "Veganer"
## [45,] "Denner" "Veganer"
## [46,] "Denner" "Veganer"
## [47,] "Denner" "Veganer"
## [48,] "Denner" "Vegetarier"
## [49,] "Denner" "Vegetarier"
## [50,] "Denner" "Vegetarier"
## [51,] "Denner" "Vegetarier"
## [52,] "Migros" "Allesfresser"
## [53,] "Migros" "Allesfresser"
## [54,] "Migros" "Allesfresser"
## [55,] "Migros" "Allesfresser"
## [56,] "Migros" "Veganer"
## [57,] "Migros" "Veganer"
## [58,] "Migros" "Veganer"
## [59,] "Migros" "Veganer"
## [60,] "Migros" "Veganer"
## [61,] "Migros" "Veganer"
## [62,] "Migros" "Veganer"
## [63,] "Migros" "Vegetarier"
## [64,] "Migros" "Vegetarier"
## [65,] "Migros" "Vegetarier"
## [66,] "Migros" "Vegetarier"
## [67,] "Migros" "Vegetarier"
## [68,] "Migros" "Vegetarier"
## [69,] "Migros" "Vegetarier"
## [70,] "Migros" "Vegetarier"
chisq.test()
Funktion).<- table(ernaehrung, einkaufen)
my_km_table my_km_table
## einkaufen
## ernaehrung Coop Denner Migros
## Allesfresser 17 8 4
## Veganer 6 7 7
## Vegetarier 9 4 8
chisq.test(my_km_table)$expected
## einkaufen
## ernaehrung Coop Denner Migros
## Allesfresser 13.257143 7.871429 7.871429
## Veganer 9.142857 5.428571 5.428571
## Vegetarier 9.600000 5.700000 5.700000
Die erwarteten Häufigkeiten entsprechen \(H_{0}\)
chisq.test(my_km_table)
##
## Pearson's Chi-squared test
##
## data: my_km_table
## X-squared = 6.4256, df = 4, p-value = 0.1695
Der p-Wert ist 16.95%. Die Wahrscheinlichkeit für die Differenz (oder eine extremere) zwischen den erwarteten und beobachteten Häufigkeiten, wenn \(H_{0}\) wahr ist, beträgt 16.95%. Somit gibt es keine starke Evidenz gegen \(H_{0}\). N ist grösser als 40 und es haben weniger als 20% der Zellen eine erwartete Häufigkeit von <5. Somit sind die Voraussetzungen für einen Chi-squared Test erfüllt.
chisq.test(my_km_table)$residuals
## einkaufen
## ernaehrung Coop Denner Migros
## Allesfresser 1.02796489 0.04582661 -1.37989001
## Veganer -1.03940230 0.67445327 0.67445327
## Vegetarier -0.19364917 -0.71205164 0.96336399
Das grösste Residuum findet sich in der Zelle “Allesfresser”/“Migros”. Dieses ist negativ was bedeutet, dass die beobachtete Häufigkeit für diese Kombination tiefer ist, als erwartet. Diese Differenz ist jedoch statistisch nicht signifikant.