forked from luebby/WWWEKI
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Modul_01.Rmd
387 lines (257 loc) · 17.6 KB
/
Modul_01.Rmd
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
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
---
title: "Modul 01: An der Weggabelung: Einen Weg gehen – und einen nicht"
output:
learnr::tutorial:
language:
de: js/tutorial_de.json
progressive: true
css: "css/style.css"
runtime: shiny_prerendered
---
<a href="https://ki-campus.org/">
<img border="0" alt="KICampusLogo" src="images/KIcampusLogo.png" width="100" height="30" style="float: right">
</a>
```{r setup, include=FALSE}
library(learnr)
library(mosaic)
library(tidyr)
library(knitr)
library(ggthemes)
theme.fom <- theme_classic(22*1.04)
theme.fom <- theme.fom
theme_set(
theme.fom
)
# deutsche Version von random_praise
source("random-praise_de/translation_random-praise_de.R")
# Daten simulieren
set.seed(1896)
n <- 10
Schulung <- tibble(finteresse = rnorm(n)) %>%
rowwise() %>%
mutate(pteilnahme = pnorm((finteresse+rnorm(1)))) %>%
mutate(teilnahme = sample(c("Ja", "Nein"),
size = 1, prob = c(pteilnahme, 1-pteilnahme))) %>%
mutate(gehalt0 = 2000 * (1 + pnorm((finteresse + rnorm(1)))/10)) %>%
mutate(gehalt1 = gehalt0 * (0.95 + rbeta(1,1,10))) %>%
mutate(across(where(is.numeric), ~ round(.x, -2))) %>%
mutate(effekt = gehalt1 - gehalt0) %>%
mutate(gehalt = case_when(teilnahme == "Ja" ~ gehalt1,
teilnahme == "Nein" ~ gehalt0)) %>%
ungroup() %>%
mutate(i=row_number()) %>%
select(i, teilnahme, gehalt0, gehalt1, effekt, gehalt)
```
## Lernziele
In diesem Modul lernen Sie:
- was ein **potenzielles Ergebnis (Potential Outcome)** ist;
- was ein **Counterfactual** ist;
- wie **kausale Effekte** definiert werden können;
- warum die Bestimmung von kausalen Effekten so herausfordernd ist.
## Individueller kausaler Effekt
Stellen Sie sich folgende Situation vor: Am Ende Ihrer Ausbildungszeit wird Ihnen die Teilnahme an einer freiwilligen Schulung zum Thema Gehaltsverhandlungen angeboten.
Würden Sie teilnehmen?
Für Ihre Entscheidung ist vermutlich relevant, ob Sie davon ausgehen, dass die Teilnahme Ihr zukünftiges Gehalt tatsächlich verbessern wird.
Wie würden Sie für sich diesen **individuellen kausalen Effekt** der Teilnahme an der Schulung auf Ihr Gehalt definieren, d. h., was *bringt* Ihnen die Schulung finanziell?
*Denken Sie bitte kurz darüber nach und klicken Sie erst dann auf `Weiter`*
##
Eine mögliche Idee wäre es, einfach die Differenz des Gehaltes vor und nach der Schulung zu bilden: *Gehalt nach der Schulung minus Gehalt vor der Schulung*.
Hier ergibt sich aber ein Problem, denn es ist natürlich gut möglich, dass unabhängig von der Schulung Ihr Gehalt mit der Zeit angestiegen wäre.
(Eine ganz ähnliche Situation ergibt sich, wenn man zum Beispiel rausfinden möchte, ob ein bestimmtes Medikament gegen eine Krankheit hilft:
Einige Erkrankungen werden von alleine mit der Zeit besser und es wäre ein Fehler, diese Verbesserung spezifischen Maßnahmen zuzuschreiben.
Daher spielen Kontrollgruppen in klinischen Studien eine so zentrale Rolle.)
Eine andere Möglichkeit ist es, diesen Effekt als
$$\text{Gehalt mit Schulung} - \text{Gehalt ohne Schulung}$$
zu definieren.
Wenn Sie vor der Entscheidung stehen: *Nehme ich an der Schulung teil?* gibt es für Ihr Gehalt zwei **potenzielle Ergebnisse (englisch: Potential Outcomes)**:
- $\color{blue}{\text{Gehalt}}$ ohne $\color{DarkGreen}{\text{Schulung}}$: $\color{blue}{Y}^{\color{DarkGreen}{X=0}}$
- $\color{blue}{\text{Gehalt}}$ mit $\color{DarkGreen}{\text{Schulung}}$: $\color{blue}{Y}^{\color{DarkGreen}{X=1}}$
$\color{blue}{Y}$ ist die *Wirkung*, das Ergebnis, also hier das $\color{blue}{\text{Gehalt}}$.
Das hochgestellte $\color{DarkGreen}{X}$ soll symbolisieren für welche Wert der *Ursache* das Ergebnis betrachtet wird.
Ohne $\color{DarkGreen}{\text{Schulung}}$ nimmt $\color{DarkGreen}{X}$ den Wert 0 an, mit $\color{DarkGreen}{\text{Schulung}}$ den Wert 1.
![](images/Weggabel.png){width="65%"}
##
Der **individuelle kausale Effekt** ${\color{orange}{\Delta}}_i$ (griechisch: Delta) der Schulung ergibt sich dann als die Differenz zwischen diesen beiden potenziellen Ergebnissen:
$${\color{orange}{\Delta}}_i = {\color{blue}{Y}}_{i}^{{\color{DarkGreen}{X=1}}} - {\color{blue}{Y}}_{i}^{{\color{DarkGreen}{X=0}}}$$
Wobei
- $i$ für die einzelne Beobachtung, hier die einzelne Person, steht;
- ${\color{blue}{Y}}_i$ für das $\color{blue}{\text{Gehalt}}$ von $i$;
- $\color{DarkGreen}{X}$ für die Teilnahme an der $\color{DarkGreen}{\text{Schulung}}$; dabei ist $\color{DarkGreen}{X_i=1}$ wenn $i$ teilnimmt und $\color{DarkGreen}{X_i=0}$ wenn $i$ nicht teilnimmt.
## Ein fiktives Beispiel
Schauen wir uns einmal eine fiktive Gehaltstabelle mit potenziellen Ergebnissen an:
- `i`: Nummer der Person;
- `gehalt1`: $\color{blue}{Y}^{\color{DarkGreen}{X=1}}$, Gehalt mit Schulung;
- `gehalt0`: $\color{blue}{Y}^{\color{DarkGreen}{X=0}}$, Gehalt ohne Schulung.
```{r gehaltstabelle, echo=FALSE}
Schulung %>%
select(i, gehalt1, gehalt0) %>%
kable()
```
Der individuelle kausale Effekt ${\color{orange}{\Delta}}_i$ lässt sich dann innerhalb der Datentabelle `Schulung` berechnen als `gehalt1 - gehalt0` (hier in `R`):
***
*Anmerkung:* `R` ist eine freie Software für die Datenanalyse.
Sie kann von der Seite <https://cran.r-project.org/> für gängige Betriebssysteme heruntergeladen werden.
Ergänzend ist die Nutzung des `RStudio Desktop` empfehlenswert <https://www.rstudio.com/products/rstudio/download/>.
Im Rahmen dieser Module wird außerdem u.a. das Paket `mosaic` <https://cran.r-project.org/package=mosaic> verwendet.
***
```{r}
# Paket laden
library(mosaic)
# Datentabelle Schulung um neue Variable "effekt" ergänzen
Schulung <- Schulung %>%
mutate(effekt = gehalt1 - gehalt0)
```
Und damit:
```{r gehaltstabelleeffekt, echo=FALSE}
Schulung %>%
select(i, gehalt1, gehalt0, effekt) %>%
kable()
```
```{r visualisierung, echo=FALSE}
Schulung_Long <- Schulung %>%
select(i, gehalt0, gehalt1) %>%
pivot_longer(c(gehalt0, gehalt1), values_to = "Gehalt", names_to = "Schulung") %>%
mutate(Schulung = ifelse(Schulung == "gehalt0", "0: Nein", "1: Ja"))
gf_point(Gehalt ~ Schulung, data = Schulung_Long,
position = "jitter", width = 0.01, height = 0,
color = ~ Schulung,
show.legend = FALSE) %>%
gf_line(Gehalt ~ Schulung, group = ~ i,
color = "blue", alpha = 0.25) +
scale_color_colorblind()
```
```{r ike, echo=FALSE}
question("Können Sie diese individuellen kausalen Effekte in der Realität beobachten?",
answer("Ja"),
answer("Nein", correct = TRUE, message = "Für jede Beobachtung $i$ liegt nur ein Gehaltswert vor: der mit Schulung oder der ohne Schulung, aber niemals beide gleichzeitig, da Personen entweder teilnehmen oder nicht. $\\Delta_i$ kann daher nicht beobachtet werden."),
allow_retry = TRUE,
correct = random_praise(),
incorrect = random_encouragement()
)
```
Sie sehen: häufig sind die individuellen kausalen Effekte positiv – sie können aber auch neutral oder sogar negativ sein.
## Das fundamentale Problem der kausalen Inferenz
Das fundamentale Problem der kausalen Inferenz ist, dass wir den individuellen kausalen Effekt ${\color{orange}{\Delta}}_i = {\color{blue}{Y}}_{i}^{{\color{DarkGreen}{X=1}}} - {\color{blue}{Y}}_{i}^{{\color{DarkGreen}{X=0}}}$ **nicht** beobachten können.
Es liegt je Beobachtung $i$ immer nur eines der beiden Potential Outcomes vor:
Entweder $\color{blue}{Y}^{\color{DarkGreen}{X=1}}$ ($\color{blue}{\text{Gehalt}}$ mit $\color{DarkGreen}{\text{Schulung}}$) **oder** $\color{blue}{Y}^{\color{DarkGreen}{X=0}}$ ($\color{blue}{\text{Gehalt}}$ ohne $\color{DarkGreen}{\text{Schulung}}$).
- Wenn Person $i$ an der Schulung teilnimmt, liegt uns das Gehalt mit Schulung vor, ${\color{blue}{Y}}_{i}^{{\color{DarkGreen}{X=1}}}$, und nicht ${\color{blue}{Y}}_{i}^{{\color{DarkGreen}{X=0}}}$
- Wenn Person $i$ nicht an der Schulung teilnimmt, liegt uns das Gehalt ohne Schulung vor, ${\color{blue}{Y}}_{i}^{{\color{DarkGreen}{X=0}}}$, und nicht ${\color{blue}{Y}}_{i}^{{\color{DarkGreen}{X=1}}}$
Der Wert, der nicht beobachtet wird, wird jeweils als **Counterfactual** bezeichnet; er ist kontrafaktisch in dem Sinne, dass er in der Realität nicht vorliegt.
Für jemanden, der nicht an der Schulung teilgenommen hat, ist das Counterfactual die Antwort auf die Frage: *Wie hoch wäre mein Gehalt, wenn ich an der Schulung teilgenommen hätte?*
Für jemanden der teilgenommen hat, ist das Counterfactual die Antwort auf die Frage: *Wie hoch wäre mein Gehalt, wenn ich nicht an der Schulung teilgenommen hätte?*
```{r cf, echo=FALSE}
question("Kann das Counterfactual beobachtet werden?",
answer("Ja", message = "Je Beobachtung $i$ liegt nur ein Wert vor: der mit Schulung oder der ohne Schulung, nicht beide gleichzeitig. Das Counterfactual ist das nicht beobachtete der Potential Outcomes."),
answer("Nein", correct = TRUE, message = "Das Counterfactual ist das nicht Beobachtete der Potential Outcomes."),
allow_retry = TRUE,
correct = random_praise(),
incorrect = random_encouragement()
)
```
```{r cfi, echo=FALSE}
question("Person $i$ nimmt an der Schulung teil. Was ist dann das Counterfactual?",
answer("$\\color{blue}{Y}^{\\color{DarkGreen}{X=0}}_i$", correct = TRUE, message = "Teilnahme an der Schulung bedeutet $X=1$, d. h. für das Counterfactual $X=0$."),
answer("$\\color{blue}{Y}^{\\color{DarkGreen}{X=1}}_i$"),
allow_retry = TRUE,
correct = random_praise(),
incorrect = random_encouragement()
)
```
## Durchschnittlicher kausaler Effekt
Mal angenommen, wir würden die individuellen kausalen Effekte $\color{orange}{\Delta}_i$ aber doch kennen (Variable `effekt` in unserem `R`-Beispiel).
Dann könnten wir aus ihnen weitere Größen ableiten, beispielsweise den *durchschnittlichen* kausalen Effekt $\bar{\color{orange}{\Delta}}$, indem wir alle $i$ individuellen kausalen Effekte addieren und diese Summe ($\sum$) durch die Anzahl der Beobachtungen ($n$) dividieren:
$$\bar{\color{orange}{\Delta}} = \frac{\sum_{i=1}^n {\color{orange}{\Delta}}_i}{n} = \frac{\sum_{i=1}^n({\color{blue}{Y}}_{i}^{{\color{DarkGreen}{X=1}}} - {\color{blue}{Y}}_{i}^{{\color{DarkGreen}{X=0}}})}{n} = \frac{\sum_{i=1}^n{\color{blue}{Y}}_{i}^{{\color{DarkGreen}{X=1}}} - \sum_{i=1}^n{\color{blue}{Y}}_{i}^{{\color{DarkGreen}{X=0}}}}{n} = \overline{\color{blue}{Y}}^{{\color{DarkGreen}{X=1}}} - \overline{\color{blue}{Y}}^{\color{DarkGreen}{X=0}}.$$
Die `R`-Funktion, die diesen arithmetischen Mittelwert berechnet, lautet `mean()`.
Klicken Sie auf `Ausführen`, um den durchschnittlichen kausalen Effekt in unserem fiktiven Beispiel zu berechnen, in dem beide Potential Outcomes vorliegen.
```{r ate, exercise=TRUE}
mean( ~ effekt, data = Schulung)
```
***
*Anmerkung:* In `mosaic` ist die `R`-Syntax vereinheitlicht:
`analyse(y ~ x, data = Daten)`
Analysiere die Variable `y` in Abhängigkeit der Variable `x` aus der Datentabelle `Daten`. Welche Funktion `analyse()` zur Anwendung kommt, hängt vom Ziel unser Analyse ab.
Sollte es, wie im vorliegenden Fall, nur eine Variable geben, die zusammengefasst werden soll, kann auch kurz geschrieben werden:
`analyse( ~ y, data = Daten)`
***
Beachten Sie: Der durchschnittliche kausale Effekt ist positiv, auf Individualebene kann er aber auch negativ sein. $\bar{\color{orange}{\Delta}}$ ist eine aggregierte Datenzusammenfassung.
##
Das fundamentale Problem der kausalen Inferenz ist, dass nur eines der Potential Outcomes vorliegt und das nicht vorliegende ein Counterfactual ist.
Daher kennen wir in der Praxis weder den individuellen noch den durchschnittlichen kausalen Effekt.
Letzterer liegt in unserem Beispiel bei $\bar{\color{orange}{\Delta}}=\frac{\sum_{i=1}^n \color{orange}{\Delta}_i}{n}$ = `mean(~ effekt, data = Schulung)`.
## Fehlende Werte
In der Praxis kennen wir zwar nicht beide Potential Outcomes, aber wir wissen innerhalb einer Beobachtungsgruppe, wer an der Schulung teilgenommen hat und wer nicht.
Daraus ergibt sich, welches der beiden Potential Outcomes beobachtet ist und welches uns fehlt (das Counterfactual).
In der Praxis sähe unsere fiktive Gehaltstabelle also anders aus -- fehlende Werte werden in `R` als `NA` (engl.: not available, nicht verfügbar) dargestellt.
```{r teilnahme, echo=FALSE}
Schulung %>%
select(i, teilnahme, gehalt0, gehalt1) %>%
mutate(gehalt0 = ifelse(teilnahme=="Ja", NA, gehalt0)) %>%
mutate(gehalt1 = ifelse(teilnahme=="Nein", NA, gehalt1)) %>%
kable()
```
In der Regel strukturiert man die Daten so, dass nur eine Gehaltsvariable -- das beobachtete `gehalt` -- sowie eine Variable zur `teilnahme` existiert.
```{r gehalt, echo=FALSE}
Schulung %>%
select(i, teilnahme, gehalt) %>%
kable()
```
```{r bias, echo=FALSE}
question("Die Teilnahme an der Schulung war freiwillig. Können Sie davon ausgehen, dass, unabhängig von der Schulung, Teilnehmende und Nichtteilehmende ein ähnliches erstes Gehalt haben würden?",
answer("Ja"),
answer("Nein", correct = TRUE, message = "Teilnehmende und Nichtteilnehmende könnten sich in vielerlei Hinsicht unterscheiden. Um nur ein Beispiel zu nennen: Personen, denen ihr Gehalt besonders wichtig ist, werden eher an der Schulung teilnehmen. Diese Personen werden aber vielleicht auch ohne Schulung anders in Gehaltsverhandlungen auftreten."),
allow_retry = TRUE,
correct = random_praise(),
incorrect = random_encouragement()
)
```
## Schätzung des kausalen Effektes
Anhand der tatsächlich beobachteten Daten können wir zwei Durchschnittsgehälter berechnen:
Das Durchschnittsgehalt derjenigen, die teilgenommen haben, und das Durchschnittsgehalt derjenigen, die nicht teilgenommen haben.
```{r gehaltteilnahme}
round( mean(gehalt ~ teilnahme, data = Schulung), 2)
```
<!-- NOTE: Is it possible to use inline code eval here? -->
- $\bar{\color{blue}{y}}^{\color{DarkGreen}{x=1}}$ = `round(mean(gehalt ~ teilnahme, data = Schulung)[1], 2)`
- $\bar{\color{blue}{y}}^{\color{DarkGreen}{x=0}}$ = `round(mean(gehalt ~ teilnahme, data = Schulung)[2], 2)`
***
*Anmerkung*: `round( mean(gehalt ~ teilnahme, data = Schulung), 2)` bedeutet aus `R mosaic` *übersetzt*:
Berechne den arithmetischen Mittelwert (Funktion `mean()`) der Variable `gehalt` ($y$) in Abhängigkeit der Variable `teilnahme` ($x$). Die dazugehörigen Daten sind in der Datentabelle `Schulung`.
***
Nun könnte man versuchen, den durchschnittlichen kausalen Effekt mithilfe dieser beobachteten Werte zu schätzen:
$\bar{\color{blue}{y}}^{\color{DarkGreen}{x=1}} - \bar{\color{blue}{y}}^{\color{DarkGreen}{x=0}}$ = `round(mean(gehalt ~ teilnahme, data = Schulung)[1],2)` - `round(mean(gehalt ~ teilnahme, data = Schulung)[2],2)` = `round(-diffmean(gehalt ~ teilnahme, data = Schulung),2)`
Dieser Wert weicht aber substanziell vom wahren durchschnittlichen kausalen Effekt ab, den wir zuvor mithilfe der Potential Outcomes berechnet hatten: $\bar{\color{orange}{\Delta}}$ = `round(mean(~ effekt, data = Schulung),2)`.
Bei dieser Abweichung handelt es sich um eine systematische Verzerrung, die auch als **Bias** bezeichnet wird.
Der naive Vergleich der Mittelwerte überschätzt hier den wahren durchschnittlichen Effekt.
In unserem fiktiven Beispiel liegt das daran, dass Personen mit einem höherem Gehaltsinteresse eher an der Schulung teilgenommen haben als die mit einem niedrigeren Interesse.
Erstere hätten aber so oder so, also unabhängig von der Schulung, ein höheres Gehalt erhalten.
Hier sind unterschiedliche inhaltliche Erklärungen denkbar (z.B. ein höheres Interesse am Gehalt und damit auch ein anderes Auftreten in Gehaltsverhandlungen).
Kontrollieren Sie diese Aussage, indem Sie den Code so abändern, dass Sie die Mittelwerte der, auch unbeobachteten, Potential Outcomes berechnen.
Diese befinden sich in der gleichen Datentabelle und tragen die Namen `gehalt0` und `gehalt1`:
*Tipp*: Einen Lösungshinweis erhalten Sie über den `Hinweise`-Button über dem R Code.
Anschließend `Nächster Tipp` und Sie sehen die Lösung.
```{r po, exercise=TRUE}
mean(gehalt ~ teilnahme, data = Schulung)
```
```{r po-solution}
cat("Potential Outcomes: Durchschnittliches Gehalt ohne Teilnahme:\n")
cat("Für die, die teilnehmen ('Ja') das Counterfactual.\n")
mean(gehalt0 ~ teilnahme, data = Schulung)
cat("Potential Outcomes: Durchschnittliches Gehalt mit Teilnahme:\n")
cat("Für die, die nicht teilnehmen ('Nein') das Counterfactual.\n")
mean(gehalt1 ~ teilnahme, data = Schulung)
```
```{r po-hint}
"gehalt0 bzw. gehalt1 sind die Variablennamen. Ändern Sie die Variable gehalt entsprechend."
```
##
Das fundamentale Problem der kausalen Inferenz ist universell.
In vielen Situationen kann es dazu führen, dass die Daten uns in die Irre führen: Vielleicht vermuten wir einen kausalen Effekt, wo es nicht wirklich einen gibt, oder wir erkennen real existierende Effekte nicht.
Die Gefahr solcher Fehlschlüsse verringert sich aber, wenn wir uns darüber Gedanken machen, wie unsere Daten überhaupt entstanden sind.
In unserem fiktiven Beispiel kann man die zusätzliche Information heranziehen, dass Personen sich frei auswählen konnten, ob sie teilnehmen oder nicht.
Dann erkennt man schnell, dass der naive Mittelwertvergleich kein angemessener Weg ist, den durchschnittlichen kausalen Effekt zu schätzen.
In den folgenden Modulen werden Sie verschiedene datengenerierende Mechanismen kennenlernen und erfahren, wie diese kausale Schlüsse beeinflussen.
## Hinweis
**Dieser Kurs ist aktuell noch in der Entwicklung!**
Bitte melden Sie Fehler, Unklarheiten und Verbesserungsvorschläge [hier](https://github.com/luebby/WWWEKI/issues).
Das Vorhaben *Was, wie, warum? Einstiegskurs Kausale Inferenz (WWWEKI)* wird mit Mitteln des Bundesministeriums für Bildung und Forschung unter dem Förderkennzeichen 16DHBQP040 gefördert.
![](images/csm_Logo-BMBF.jpg)