-
Notifications
You must be signed in to change notification settings - Fork 0
/
04_if_label.Rmd
225 lines (182 loc) · 9.24 KB
/
04_if_label.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
# if-Bedingungen {#iflab}
```{r setup4, echo = F, message=F, warning = F}
.libPaths("D:/R-library4")
knitr::opts_chunk$set(collapse = TRUE)
knitr::opts_chunk$set(dpi=800)
library(Statamarkdown)
library(tidyverse)
library(kableExtra)
# stataexe <- "C:/Program Files (x86)/Stata13/StataSE-64.exe"
stataexe <- "C:/Program Files/Stata16/StataSE-64.exe"
knitr::opts_chunk$set(engine.path=list(stata=stataexe))
# baua <- readstata13::read.dta13("D:/Datenspeicher/BIBB_BAuA/BIBBBAuA_2018_suf1.0.dta",convert.factors = F)
```
## if-Bedingungen - nur manche Zeilen ansehen
Bisher haben wir uns immer auf den gesamten Datensatz bezogen.
Häufig möchten wir aber nur bestimmte Beobachtungen berücksichtigen.
Ein Beispiel war gerade eben schon der `fastgini`-Befehl, der keine `by`-Option hat. Wir können mit einer `if`-Bedingung mitteilen, dass wir lediglich die Beobachtungen mit `S1==2` berücksichtigen möchten (also Frauen):
```{stata gini5F, eval = F}
fastgini F518_SUF if S1 == 2
```
Stata geht dann also alle Zeilen durch und verwendet nur diejenigen mit der entsprechenden Ausprägung.
Einige Beispiele `list` zeigen die Möglichkeiten vielleicht etwas besser:
Mit einer `if`-Bedingung können wir uns die Variablen `S1` `S3` `S2_j` und `zpalter` für 81-jährigen Befragten anzeigen lassen:
```{stata if1, eval = F}
list S1 S3 S2_j zpalter if zpalter == 81
```
```{stata if2, eval = F}
+--------------------------------------+
| S1 S3 S2_j zpalter |
|--------------------------------------|
5114. | männlic Abitur / 1936 81 |
5179. | männlic Abitur / 1936 81 |
6118. | männlic Realschu 1936 81 |
9045. | männlic Abitur / 1936 81 |
10517. | weiblich Hauptsch 1936 81 |
+--------------------------------------+
```
Wichtig ist hier `==` - ein einfaches `=` wird in Stata für die Zuweisung von Werten verwendet wie wir noch sehen werden.
Für `if`-Bedingungen stehen uns die üblichen Operatoren zur Verfügung:
`>`, `<`, `==`, `>=`, `<=`, `!=` (ungleich)
Dementsprechend können wir so Befragte auswählen, die vor 1936 geboren wurden:
```{stata if3, eval = F}
list S1 S3 S2_j zpalter if S2_j < 1936
```
Das funktioniert auch mit anderen Befehlen, wie z.B. `tabulate` - so können wir beispielsweise auszählen, wie viele 81-jährige Frauen und Männer im Datensatz vorhanden sind:
```{stata if4, eval = F}
tabulate S1 if zpalter == 81
```
```{stata if5, echo = F, collectcode = F}
set linesize 80
qui use "D:\Datenspeicher\BIBB_BAuA/BIBBBAuA_2018_suf1.0.dta", clear
tab S1 if zpalter == 81
```
Wir sehen unter anderem an der Fallzahl (Total) in dieser Tabelle, dass hier nicht alle Fälle aus dem Datensatz berücksichtigt werden.
Wir können auch mehrere Bedingungen setzen. Sollen beide zutreffen, verbinden wir die Bedingungen mit `&` - zB. wenn wir 81-jährige Befragte mit einem Bruttoverdienst von unter 1000 Euro auswählen möchten:
```{stata if6, eval = F}
list S1 if zpalter > 81 & F518_SUF < 1000
```
Mit `|` können wir hingegen Fälle auswählen, für welche die ein *oder* die andere Bedingung zutrifft:
```{stata if7, eval = F}
tabulate S1 if zpalter == 81 | F518_SUF < 1000 // 81 Jahre alt oder unter 1000EUR Einkommen
```
Mit `inrange` können wir Auswahlen auf einen Wertebereich eingrenzen - d.h. diese beiden Auswahlen führen zum gleichen Ergebnis (nur Befragte, die zwischen 20 und 30 Jahre alt sind):
```{stata tabif1, eval = F}
tabulate S1 if zpalter >= 20 & zpalter <= 30
tabulate S1 if inrange(zpalter,20,30)
```
Mit `inlist` können wir spezifische Werte angeben und so lange Folgen von `|` vermeiden:
```{stata browseif, eval = F}
tabulate S1 if zpalter == 15 | zpalter == 79 | zpalter == 80 | zpalter == 82
tabulate S1 if inlist(zpalter,15,79,80,82)
```
## Labels
Genauso könnten wir auch vorgehen wenn wir nur männliche oder weibliche Befragte betrachten möchten. Hier nochmal die Auszählung der Variable `S1`:
```{stata tab3, eval = F}
tabulate S1
```
```{stata tab3b, echo = F, collectcode=F}
qui use "D:\Datenspeicher\BIBB_BAuA/BIBBBAuA_2018_suf1.0.dta", clear
tab S1
```
Allerdings sind `männlich` und `weiblich` lediglich *Variablenlabels*. D.h. hier wurden Zahlencodes wieder mit Beschreibungen verbunden. Wir können diese Labels nicht für `if`-Bedingungen verwenden:
```{stata if_lab, eval = F}
tab S1 if S1 == "weiblich"
```
<span style="color:red">`type mismatch`</span>
<span style="color:blue">`r(109);`</span>
Im Hintergrund ist `S1` nämlich eine numerische Variable
```{stata if_lab2, eval = F}
describe S1
```
```{stata if_lab2b, echo = F, collectcode=F}
set linesize 90
qui use "D:\Datenspeicher\BIBB_BAuA/BIBBBAuA_2018_suf1.0.dta", clear
describe S1
```
Unter `value label` sehen wir, dass hier das Label `S1` angefügt wurde.
Wir können die eigentlichen Werte in `tabulate` mit der Option `,nol` ausblenden:
```{stata if_lab3, eval = F}
tabulate S1, nol
```
```{stata if_lab3b, echo = F, collectcode=F}
qui use "D:\Datenspeicher\BIBB_BAuA/BIBBBAuA_2018_suf1.0.dta", clear
tabulate S1,nol
```
Wenn wir also nach Frauen filtern möchten, müssen wir den entsprechenden Zahlencode angeben:
```{stata keep_l3, eval = F}
tab S1 if S1 == 2
```
```{stata keep_l4, echo = F, collectcode=F}
qui use "D:\Datenspeicher\BIBB_BAuA/BIBBBAuA_2018_suf1.0.dta", clear
tabulate S1 if S1 == 2
```
Mehr zu labels [hier](#adva)
## Fehlende Werte {#miss_if}
Eine häufige Fehlerquelle bei fehlende Werten in Stata ist deren Verhältnis zu `>`.
Fehlende Werte werden nämlich von Stata als "unendlich groß" gewertet!
Wenn wir uns Befragte mit einem Alter über 92 ausgeben lassen, dann bekommen wir auch diejenigen ohne Altersangabe ausgegegeben:
```{stata list_if, eval = F}
list S1 S3 zpalter if zpalter > 81
```
```{stata list_if2, eval = F}
+-------------------------------+
| S1 S3 zpalter |
|-------------------------------|
39. | weiblich Abitur / . |
514. | weiblich Abitur / 83 |
657. | männlic Hauptsch . |
823. | weiblich Realschu . |
982. | weiblich keine An . |
|-------------------------------|
| 150 weitere Zeilen |
```
Es gibt zwei Möglichkeiten, dies zu umgehen:
+ entweder wir verwenden `inrange` - wobei wir hier eine Obergrenze angeben müssen und außerdem die Untergrenze immer mit eingeschlossen wird. Wenn wir also nur Fälle sehen wollen, die *älter* als 81 sind, dann müssen wir einen Wert über 81 angeben:
```{stata list_if3, eval = F}
list S1 Bula zpalter if inrange(zpalter,81.5,100)
```
+ oder wir hängen den `missing()`-Operator an die Bedingung an. Mit `missing(zpalter)` können wir alle Zeilen auswählen, für die `zpalter` *missing* ist. Wenn wir diesen mit Hilfe eines `!` verneinen, können wir die fehlende Fällen ausschließen:
```{stata list_if5, eval = F}
list S1 Bula zpalter if zpalter > 81 & !missing(zpalter)
```
Beide Befehle führen zum gleichen Ergebnis:
```{stata list_if6, eval = F}
+-------------------------------+
| S1 Bula zpalter |
|-------------------------------|
514. | weiblich Hamburg 83 |
6438. | männlic Nordrhei 82 |
11786. | männlic Berlin 87 |
+-------------------------------+
```
## keep & drop: Fälle dauerhaft löschen
Manchmal möchten wir nur bestimmte Beobachtungen im Datensatz behalten. Beispielsweise möchten wir für eine Analyse nur Befragte, die jünger als 30 Jahre sind, im Datensatz behalten. Dazu können wir `keep` oder `drop` die gewünschten Fälle behalten bzw. die ungewünschten ausschließen:
```{stata keep, eval = F}
keep if zpalter < 30
```
Alternativ können wir auch mit `drop` alle Befragten aus dem Datensatz löschen, die 60 Jahre oder älter sind:
```{stata drop, eval = F}
drop if zpalter >= 30
```
Mit `describe, short` sehen wir, dass wir jetzt deutlich weniger Fälle im Speicher haben:
```{stata dropdesc1, eval = F}
describe, short
```
```{stata dropdesc, echo = F,collectcode=F}
qui use "D:\Datenspeicher\BIBB_BAuA/BIBBBAuA_2018_suf1.0.dta", clear
qui drop if zpalter >= 30
describe, short
```
## Übungen 4 {#ifue}
(@) Laden Sie den BIBB/BAuA Erwerbstätigenbefragung 2018 (`BIBBBAuA_2018_suf1.dta`).
(@) In der Variable `intnr` ist die Interviewnummer abgelegt. Lassen Sie sich die Interviewnummer (`intnr`), Alter (`zpalter`), Geschlecht (`S1`) und die Wohnortgröße (`gkpol`) für den\*die Befragte mit der Interviewnummer 2388097 ausgeben.
(@) Ersetzen Sie die Werte 9999 in `zpalter` mit `.`: `mvdecode zpalter, mv(9999)`
(@) Lassen Sie sich die Wohngröße (`gkpol`) für alle Befragte mit fehlender Altersangabe ausgeben.
(@) Lassen Sie sich eine Häufigkeitsauszählung der Wohnortgröße (`tab gkpol`) für folgende Gruppen ausgeben:
+ Befragte, die jünger als 30 Jahre alt sind (das Alter ist in `zpalter` abgelegt)
+ Befragte, die älter als 60 Jahre alt sind (Denken Sie an den Umgang mit Missings!)
+ Befragte, die jünger als 30 Jahre alt und weiblich sind (das Geschlecht ist in `S1` erfasst)
+ Befragte, die zwischen 30 und 60 Jahre alt sind
+ Befragte, die jünger als 30 Jahre alt sind oder älter als 60 Jahre alt sind
(@) Löschen Sie alle Beobachtungen von Befragten aus Städten mit 500.000 Einwohnern und mehr aus dem Speicher. Denken Sie an die Unterscheidung zwischen Labels und Zahlenwerten.