/
stat-modeling-meta.qmd
277 lines (207 loc) · 13.1 KB
/
stat-modeling-meta.qmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
```{r echo = FALSE}
pacman::p_load(tidyverse, readxl, knitr, kableExtra)
```
# Metaanalysen {#sec-meta}
*Letzte Änderung am `r format(fs::file_info("stat-modeling-meta.qmd")$modification_time, '%d. %B %Y um %H:%M:%S')`*
::: callout-caution
## Stand des Kapitels
![](images/caution.png){fig-align="center" width="50%"}
**Das Thema Metaanalysen ist erstmal auf Stand-By gesetzt, bis mir klar ist, wohin ich mit dem Kapitel zum Ende hin will. Die Daten sind da und der Code funktioniert auch. Zur Interpretation bitte dann die verlinkten Tutorien besuchen.**
:::
> *"The only way to test a hypothesis is to look for all the information that disagrees with it." --- Karl Popper*
In diesem Kapitel wollen wir uns einmal die Metaanalyse oder indirekte Vergleiche anschauen. Wir halten das Kapitel bewusst kurz, denn wenn wir das Thema *ausführlich* behandeln wollten, dann wäre es ein eigenes Buch. Das wollen wir aber nicht, es reicht, wenn wir hier die Grundlagen verstehen. Das heißt vor allem, dass wir die Daten so erstellt kriegen, dass wir selber eine Marktanalyse rechnen können. Der Fokus ist hier auf den Agrarwissenschaften, aber die Beispiele wurden von mir aus dem "Doing Meta-Analysis with R: A Hands-On Guide" von @harrer2021doing adaptiert und in einen neuen Kontext gesetzt. Wenn du wirklich eine Metaanalyse rechnen willst, dann musst du nochmal durch das Buch von @harrer2021doing oder den Artikel von @balduzzi2019perform durcharbeiten.
Also gut, was macht also eine Metananalyse oder warum heißt es den indirekter Vergleich? Wenn wir normalerweise ein Experiment durchführen, dann messen wir verschiedene Outcomes und Einflussvariablen, rechnen ein Modell oder einen einfacheren statistischen Test und berichten die Effektschätzer und den $p$-Wert in einer wissenschaftlichen Veröffentlichung. Hier setzt die Metaanalyse dann an. Wir kombinieren nämlich die Ergebnisse und damit die Effektschätzer verschiedener Studien in einer riesigen Studie. Und diese riesige Studie nennen wir dann Metaanalyse. Wir kombinieren hierbei nur die Effektschätzer aus den verschiedenen Studien. Der algorithmische Prozess ist nicht so simple, basiert aber auf der wichtigen Annahme, dass die Studien alle in etwa homogen sind. Der Begriff ist hier sehr weit gefasst. Alle Studien müssen natürlich das gleiche Outcome haben, die gleichen Menschen, Tiere oder Pflanzen beobachten sowie das statistische Modell muss das Gleiche sein. Du siehst schnell, bevor du eine Metaanalyse rechnen kannst, geht sehr viel Zeit in die Suche nach passenden wissenschaftlichen Veröffentlichungen. Daher ist jeder Metaanalyse eigentlich eine systematische Literaturrecherche (*eng. systematic review*) vorgeschaltet. Wenn du mehr darüber lesen möchtest, dann kann dir @tawfik2019step einen Einstieg liefern.
::: {layout="[15,85]" layout-valign="top"}
![](images/angel_01.png){fig-align="center" width="100%"}
> Das ist hier natürlich eine Metanalyse für Arme. Wie man es richtig umfangreich macht, findest du in einem sehr gutem und umfangreichen Tutorial zu [Doing Meta-Analysis in R: A Hands-on Guide](https://bookdown.org/MathiasHarrer/Doing_Meta_Analysis_in_R/)
:::
Noch als kleine Randbemerkung, wenn du aus den medizinischen Bereich kommst, dann solltest du die Leitlinien in den [Allgemeinen Methoden des Institut für Qualität und Wirtschaftlichkeit im Gesundheitswesen (IQWiG)](https://www.iqwig.de/ueber-uns/methoden/methodenpapier/) zu den Metaanalysen oder indirketen Vergleichen kennen. Wir können hier leider nicht in die Tiefe der Leitlinien abtauchen.
## Genutzte R Pakete
Wir wollen folgende R Pakete in diesem Kapitel nutzen.
```{r echo = TRUE}
#| message: false
pacman::p_load(tidyverse, magrittr, meta, conflicted)
```
An der Seite des Kapitels findest du den Link *Quellcode anzeigen*, über den du Zugang zum gesamten R-Code dieses Kapitels erhältst.
## Daten
Woher kommen eigentlich die Daten einer Metaanalyse? Wir können [Google Scholar](https://scholar.google.com/) nutzen um zu einem Thema systematisch wissenschaftliche Veröffentlichungen zu suchen. Der Fokus liegt hier auf *systematisch* und beschreibt einen strukturierten Reviewprozess. In diesem Kapitel nutzen wir die Daten von @harrer2021doing modifiziert auf ein agrarwissenschaftliches Beispiel. Wie immer liefert die originale Quelle noch mehr Informationen, wir kürzen hier einmal ab, damit wir die Kerngedanken verstehen.
::: column-margin
[A step by step guide for conducting a systematic review and meta-analysis with simulation data](https://tropmedhealth.biomedcentral.com/articles/10.1186/s41182-019-0165-6)
:::
Beginnen wir mit einer Datensatz in dem wir uns den Effekt von *mittleren* Erträgen in Weizen unter der Gabe von Eisen anschauen. Wir haben uns hier für eine Eisendosis mit $10\mu mol$ entschieden, die in allen Studien vorgekommen ist. Dann haben wir noch geschaut wie viele Pflanzen in der Gruppe untersucht wurden und wie die mitteleren Effekte plus die Standardabweichung waren.
```{r}
drymatter_tbl <- read_excel("data/meta/drymatter_iron_studies.xlsx")
```
Schauen wir uns nochmal die Daten genauer an. Hier ist es besonders wichtig zu beachten, dass wir uns einen Wert aus einem ganzen Experiment anschauen und verschiedene Werte aus verschiedenen Experimenten dann miteinander in Verbindung setzen wollen.
```{r}
#| echo: false
#| message: false
#| warning: false
#| label: tbl-meta-drymatter
#| tbl-cap: "Daten zu den Weizenerträgen nach der Gabe von einer Eisendosis mit $10\\mu mol$. In allen Studien wurde die gleiche Dosis auf die $n$ Pflanzen gegeben."
drymatter_tbl |>
kable(align = "lrrr", "pipe")
```
Ein weiterer Effekt den wir uns anschauen können ist der Vergleich von *Anteilen*. In diesem Fall haben wir Ereignisse (eng. *event*) gezählt und wissen aber auch die Gesamtzahl an möglichen Ereignissen. Konkret haben wir die Anzahl an infizierten Sonnenblumensamen mit Mehltau nach der Behandlung mit MoldEx betrachtet. Dabei haben wir richtig viele Pflanzen ($n$) angeschaut und gezählt wie viele Samen dann mit Mehltau infiziert waren (*event*).
```{r}
sunflower_tbl <- read_excel("data/meta/infected_sunflower_studies.xlsx")
```
Auch hier haben wir einmal in die ganzen Studien zu dem Wirkstoff MoldEx geschaut und jeweils rausgeschrieben, wie viele Sonnenblumensamen ($n$) betrachtet wurden und wie viele von den Sonnenblumen dann infiziert waren (*event*).
```{r}
#| echo: false
#| message: false
#| warning: false
#| label: tbl-meta-sunflower
#| tbl-cap: "Daten zu den mit Mehltau infizierten Sonnenblumensamen nach der Behandlung mit MoldEx."
sunflower_tbl |>
kable(align = "lrr", "pipe")
```
Häufig kann es vorkommen, dass wir weder die Mittelwerte *und* die Standardabweichung vorliegen haben oder aber die Anteile. Meist haben wir dann Glück, dass wir Effektschätzer wie das Odds ratio ($OR$), Risk ratio ($RR$) für die Anteile vorliegen haben. Oder aber wir finden Cohen's $d$ oder Hedge's $g$ für den Effekt der standardisierten Mittelwertsunterschiede.
In unserem Fall haben wir jetzt Euterkrebsdaten von Kühen und die entsprechenden Hedge's $g$ Werte für die Differenz der Kontrolle zur Chemotherapie. Auch hier haben alle Kühe die gleiche Chemotherapie erhalten und wir sind nur an dem Effekt zu der Kontrolle interessiert. Es gibt also nur einen paarweisen Gruppenvergleich.
```{r}
cow_tbl <- read_excel("data/meta/cow_cancer_studies.xlsx")
```
Schauen wir uns nochmal einen Ausschnitt der Daten in der zu dem Euterkrebs von Kühen an.
```{r}
#| echo: false
#| message: false
#| warning: false
#| label: tbl-meta-cow
#| tbl-cap: "Daten zum Euterkrebs von Kühen nach der Behandlung mit einer Chemotherapie zu einer Kontrolle."
cow_tbl |>
mutate_if(is.numeric, round, 2) |>
kable(align = "lrr", "pipe")
```
Wir haben jetzt also insgesamt drei Datensätze. Einmal einen Datensatz zu Weizenerträgen mit dem Effekt der Mittelwerte, einen Datensatz der Infektionen von Sonnenblumen mit Anteilen sowie einem Datensatz mit Euterkrebs mit vorausberechneten Effektmaß Hedge's $g$.
## Das Modell mit fixen Effekten
Die Idee hinter dem Modell mit fixen Effekten (*eng. fixed effect*) ist, dass die beobachteten Effektgrößen von Studie zu Studie variieren können, was aber nur auf den Stichprobenfehler zurückzuführen ist. In Wirklichkeit sind die wahren Effektgrößen alle gleich: die Effekte sind fix. Aus diesem Grund wird das Modell mit festen Effekten manchmal auch als Modell mit "gleichen Effekten" oder "gemeinsamen Effekten" bezeichnet.
Das Modell der festen Effekte geht davon aus, dass alle unsere Studien Teil einer homogenen Population sind und dass die einzige Ursache für Unterschiede in den beobachteten Effekten der Stichprobenfehler der Studien ist. Wenn wir die Effektgröße jeder Studie ohne Stichprobenfehler berechnen würden, wären alle wahren Effektgrößen absolut gleich.
## Das Modell mit zufälligen Effekten
Das Modell der zufälligen Effekte (*eng. random effect*) geht davon aus, dass es nicht nur eine wahre Effektgröße gibt, sondern eine Verteilung der wahren Effektgrößen. Das Ziel des Modells mit zufälligen Effekten ist es daher nicht, die eine wahre Effektgröße aller Studien zu schätzen, sondern den Mittelwert der Verteilung der wahren Effekte.
In der Praxis ist es sehr ungewöhnlich, eine Auswahl von Studien zu finden, die vollkommen homogen ist. Dies gilt selbst dann, wenn wir uns an bewährte Verfahren halten und versuchen, den Umfang unserer Analyse so präzise wie möglich zu gestalten.
In vielen Bereichen, einschließlich der Medizin und der Sozialwissenschaften, ist es daher üblich, immer ein Modell mit zufälligen Effekten zu verwenden, da ein gewisses Maß an Heterogenität zwischen den Studien praktisch immer zu erwarten ist. Ein Modell mit festen Effekten kann nur dann verwendet werden, wenn keine Heterogenität zwischen den Studien festgestellt werden konnte und wenn wir sehr gute Gründe für die Annahme haben, dass der wahre Effekt fest ist. Dies kann zum Beispiel der Fall sein, wenn nur exakte Replikationen einer Studie betrachtet werden oder wenn wir Teilmengen einer großen Studie meta-analysieren. Natürlich ist dies nur selten der Fall, und Anwendungen des Modells mit festem Effekt "in freier Wildbahn" sind eher selten.
## Indirekte Vergleiche in R
```{r}
#| message: false
#| warning: false
m.mean <- metamean(n = n,
mean = mean,
sd = sd,
studlab = author,
data = drymatter_tbl,
sm = "MRAW",
fixed = FALSE,
random = TRUE,
method.tau = "REML",
hakn = TRUE,
title = "Ertrag von Weizen nach Eisenbehandlung")
summary(m.mean)
```
```{r}
#| message: false
#| warning: false
m.prop <- metaprop(event = event,
n = n,
studlab = author,
data = sunflower_tbl,
method = "GLMM",
sm = "PLOGIT",
fixed = FALSE,
random = TRUE,
hakn = TRUE,
title = "Befall von Sonnenblumen mit Mehltau")
summary(m.prop)
```
```{r}
#| message: false
#| warning: false
m.gen <- metagen(TE = TE,
seTE = seTE,
studlab = Author,
data = cow_tbl,
sm = "SMD",
fixed = FALSE,
random = TRUE,
method.tau = "REML",
hakn = TRUE,
title = "Third Wave Psychotherapies")
summary(m.gen)
```
## Forest Plots
::: column-margin
[Forest Plots](https://bookdown.org/MathiasHarrer/Doing_Meta_Analysis_in_R/forest.html)
:::
```{r}
#| message: false
#| echo: true
#| warning: false
#| label: fig-meta-1
#| fig-align: center
#| fig-height: 6
#| fig-width: 9
#| fig-cap: "foo."
forest(m.mean,
sortvar = TE,
prediction = TRUE,
print.tau2 = FALSE)
```
```{r}
#| message: false
#| echo: true
#| warning: false
#| label: fig-meta-3
#| fig-align: center
#| fig-height: 6
#| fig-width: 8
#| fig-cap: "foo."
forest(m.prop,
sortvar = TE,
prediction = TRUE,
print.tau2 = FALSE,
leftlabs = c("Author", "event", "n"))
```
```{r}
#| message: false
#| echo: true
#| warning: false
#| label: fig-meta-4
#| fig-align: center
#| fig-height: 6
#| fig-width: 9
#| fig-cap: "foo."
forest(m.gen,
sortvar = TE,
prediction = TRUE,
print.tau2 = FALSE,
leftlabs = c("Author", "g", "SE"))
```
## Publication Bias
::: column-margin
[Publication Bias](https://bookdown.org/MathiasHarrer/Doing_Meta_Analysis_in_R/pub-bias.html)
:::
```{r}
#| echo: true
#| message: false
#| warning: false
#| fig-align: center
#| fig-height: 5
#| fig-width: 6
#| label: fig-meta-5
#| fig-cap: "dst."
#| fig-subcap:
#| - "Verteilung der beobachteten Werte."
#| - "Verteilung der theoretischen Werte."
#| - TEst
#| layout-nrow: 2
#| column: page
funnel(m.prop,
xlim = c(-3, -1.5),
studlab = TRUE)
funnel(m.mean,
xlim = c(27, 35),
studlab = TRUE)
funnel(m.gen,
xlim = c(-0.5, 2),
studlab = TRUE)
```
## Referenzen {.unnumbered}