Kapitel 42 Sampling Methoden
Unkorrigierte, unfertige Version 24 December, 2022
Sie lernen in diesem Kapitel folgendes:
- Repräsentative Stichprobe
- Missing At Random
- Missing Not At Random
42.1 Pakete
library(tidyverse)
library(summarytools)
library(DescTools)
library(naniar)
library(Statamarkdown)
To Do:
42.2 Erstellen einer Population
Für die Übungen in diesem Kapitel müssen wir zuerst eine Population erstellen. Wir simulieren die Schweizer Bevölkerung. Achtung: diese Simulation dient wirklich nur der Illustration und ist keinesfalls eine korrekte Abbildung der Schweizer Bevölkerung.
Wir erstellen folgende Variablen
- Kanton
- Alter
- Körpergrösse
<-c("Zurich", "Bern", "Luzern", "Uri", "Schwyz", "Obwalden", "Nidwalden" ,"Glarus","Zug", "Fribourg", "Solothurn", "Basel-Stadt", "Basel-Landschaft", "Schaffhausen", "Appenzell Ausserrhoden","Appenzell Innerrhoden", "St.Gallen")
text
<-c("Graubuenden","Aargau","Thurgau","Ticino","Vaud","Valais", "Neuchatel", "Geneve", "Jura")
textb<-c(text, textb)
cantons
<- rep(cantons, c(1129722,869681,337132,32073,126227,32475,36996,30753,91736,250287,212535,124151,222404,61267,46135,14420,387398,161989,517015,210840,254109,544045,268980,131671,302731,62740))
Canton
<-data.frame(Canton)
data<-rep(c("Man","Woman"), times=26)
Gender Gender
[1] "Man" "Woman" "Man" "Woman" "Man" "Woman" "Man" "Woman" "Man"
[10] "Woman" "Man" "Woman" "Man" "Woman" "Man" "Woman" "Man" "Woman"
[19] "Man" "Woman" "Man" "Woman" "Man" "Woman" "Man" "Woman" "Man"
[28] "Woman" "Man" "Woman" "Man" "Woman" "Man" "Woman" "Man" "Woman"
[37] "Man" "Woman" "Man" "Woman" "Man" "Woman" "Man" "Woman" "Man"
[46] "Woman" "Man" "Woman" "Man" "Woman" "Man" "Woman"
<-rep(Gender, times=c(550305,579417,420965,448716,165367,171765, 16145, 15928,63715,62512,16180,16295,18726,18270,15139,15614,45457,46279,122792,127495,103987, 108548,58252,65899,107097,115307,29632,31635,22912,23223,7331,7089,189901,197497,79521,82468,253789,263226,103889,106951,120317,133792,258757,285288,130568,138412,62585,69086,141703,161028,30630,32110))
Gender
<-data.frame(Canton, Gender) data
::ctable(data$Canton, data$Gender) summarytools
Cross-Tabulation, Row Proportions
Canton * Gender
Data Frame: data
------------------------ -------- ----------------- ----------------- ------------------
Gender Man Woman Total
Canton
Aargau 253789 (49.1%) 263226 (50.9%) 517015 (100.0%)
Appenzell Ausserrhoden 22912 (49.7%) 23223 (50.3%) 46135 (100.0%)
Appenzell Innerrhoden 7331 (50.8%) 7089 (49.2%) 14420 (100.0%)
Basel-Landschaft 107097 (48.2%) 115307 (51.8%) 222404 (100.0%)
Basel-Stadt 58252 (46.9%) 65899 (53.1%) 124151 (100.0%)
Bern 420965 (48.4%) 448716 (51.6%) 869681 (100.0%)
Fribourg 122792 (49.1%) 127495 (50.9%) 250287 (100.0%)
Geneve 141703 (46.8%) 161028 (53.2%) 302731 (100.0%)
Glarus 15139 (49.2%) 15614 (50.8%) 30753 (100.0%)
Graubuenden 79521 (49.1%) 82468 (50.9%) 161989 (100.0%)
Jura 30630 (48.8%) 32110 (51.2%) 62740 (100.0%)
Luzern 165367 (49.1%) 171765 (50.9%) 337132 (100.0%)
Neuchatel 62585 (47.5%) 69086 (52.5%) 131671 (100.0%)
Nidwalden 18726 (50.6%) 18270 (49.4%) 36996 (100.0%)
Obwalden 16180 (49.8%) 16295 (50.2%) 32475 (100.0%)
Schaffhausen 29632 (48.4%) 31635 (51.6%) 61267 (100.0%)
Schwyz 63715 (50.5%) 62512 (49.5%) 126227 (100.0%)
Solothurn 103987 (48.9%) 108548 (51.1%) 212535 (100.0%)
St.Gallen 189901 (49.0%) 197497 (51.0%) 387398 (100.0%)
Thurgau 103889 (49.3%) 106951 (50.7%) 210840 (100.0%)
Ticino 120317 (47.3%) 133792 (52.7%) 254109 (100.0%)
Uri 16145 (50.3%) 15928 (49.7%) 32073 (100.0%)
Valais 130568 (48.5%) 138412 (51.5%) 268980 (100.0%)
Vaud 258757 (47.6%) 285288 (52.4%) 544045 (100.0%)
Zug 45457 (49.6%) 46279 (50.4%) 91736 (100.0%)
Zurich 550305 (48.7%) 579417 (51.3%) 1129722 (100.0%)
Total 3135662 (48.5%) 3323850 (51.5%) 6459512 (100.0%)
------------------------ -------- ----------------- ----------------- ------------------
Jetzt simulieren wir noch die Körpergrösse. Männer sind im Durchschnitt 7% grösser als Frauen und die Grössen für die jeweiligen Kantone entnehmen wir von hier https://www.swissinfo.ch/ger/die-appenzeller-bleiben-die-kleinsten-schweizer/6889036#:~:text=M%C3%A4nner%20im%20Ostschweizer%20Kanton%20Appenzell,Basler%2C%20die%20Gr%C3%B6ssten%20der%20Schweiz..
<-data %>%
datamutate(Koerpergroesse=case_when(
=="Zurich"~rnorm(n(), 1.782, 0.04*1.782),
Canton=="Basel-Stadt"~rnorm(n(), 1.789, 0.04*1.789),
Canton=="Zug"~rnorm(n(), 1.788, 0.04*1.788),
Canton=="Schwyz"~rnorm(n(), 1.787, 0.04*1.787),
Canton=="Luzern"~rnorm(n(), 1.785, 0.04*1.785),
Canton=="Schaffhausen"~rnorm(n(), 1.785, 0.04*1.785),
Canton=="Basel-Landschaft"~rnorm(n(), 1.784, 0.04*1.784),
Canton=="Graubuenden"~rnorm(n(), 1.783, 0.04*1.783),
Canton=="Vaud"~rnorm(n(), 1.783, 0.04*1.783),
Canton=="Bern"~rnorm(n(), 1.782, 0.04*1.782),
Canton=="Thurgau"~rnorm(n(), 1.781, 0.04*1.781),
Canton=="Jura"~rnorm(n(), 1.781, 0.04*1.781),
Canton=="Nidwalden"~rnorm(n(), 1.780, 0.04*1.780),
Canton=="Aargau"~rnorm(n(), 1.780, 0.04*1.780),
Canton=="Appenzell Ausserrhoden"~rnorm(n(), 1.782, 0.04*1.782),
Canton=="St.Gallen"~rnorm(n(), 1.780, 0.04*1.780),
Canton=="Solothurn"~rnorm(n(), 1.777, 0.04*1.777),
Canton=="Valais"~rnorm(n(), 1.777, 0.04*1.777),
Canton=="Fribourg"~rnorm(n(), 1.776, 0.04*1.776),
Canton=="Neuchatel"~rnorm(n(), 1.776, 0.04*1.776),
Canton=="Ticino"~rnorm(n(), 1.776, 0.04*1.776),
Canton=="Uri"~rnorm(n(), 1.776, 0.04*1.776),
Canton=="Glarus"~rnorm(n(), 1.775, 0.04*1.775),
Canton=="Geneve"~rnorm(n(), 1.774, 0.04*1.774),
Canton=="Obwalden"~rnorm(n(), 1.769, 0.04*1.769),
Canton=="Appenzell Innerrhoden"~rnorm(n(), 1.761, 0.04*1.761)
Canton ))
::export(data, "switzerland_cantons.csv")
rio::export(data, "switzerland_cantons.dta") rio
42.3 Beschreibende Statistik der Population
Jetzt tun wir etwas, was wir in der Realität praktisch nie tun können: Wir beschreiben die gesamte Population.
<-data %>%
summarygroup_by(Canton) %>%
summarise(mean=mean(Koerpergroesse), na.rm=TRUE)
::vis_miss(data, warn_large_data=FALSE) naniar
Warning: `gather_()` was deprecated in tidyr 1.2.0.
ℹ Please use `gather()` instead.
ℹ The deprecated feature was likely used in the visdat package.
Please report the issue at <]8;;https://github.com/ropensci/visdat/issueshttps://github.com/ropensci/visdat/issues]8;;>.
MeanCI(data$Koerpergroesse)
mean lwr.ci upr.ci
1.780877 1.780822 1.780932
42.4 Simple Random Sample
=666
set.seed<-data[sample(nrow(data), 100), ]
sr_sample
freq(sr_sample$Canton)
Frequencies
sr_sample$Canton
Type: Character
Freq % Valid % Valid Cum. % Total % Total Cum.
---------------------- ------ --------- -------------- --------- --------------
Aargau 8 8.00 8.00 8.00 8.00
Basel-Landschaft 1 1.00 9.00 1.00 9.00
Basel-Stadt 2 2.00 11.00 2.00 11.00
Bern 12 12.00 23.00 12.00 23.00
Fribourg 2 2.00 25.00 2.00 25.00
Geneve 3 3.00 28.00 3.00 28.00
Graubuenden 2 2.00 30.00 2.00 30.00
Luzern 8 8.00 38.00 8.00 38.00
Neuchatel 5 5.00 43.00 5.00 43.00
Nidwalden 1 1.00 44.00 1.00 44.00
Obwalden 1 1.00 45.00 1.00 45.00
Schaffhausen 2 2.00 47.00 2.00 47.00
Schwyz 3 3.00 50.00 3.00 50.00
Solothurn 7 7.00 57.00 7.00 57.00
St.Gallen 4 4.00 61.00 4.00 61.00
Thurgau 2 2.00 63.00 2.00 63.00
Ticino 4 4.00 67.00 4.00 67.00
Valais 2 2.00 69.00 2.00 69.00
Vaud 14 14.00 83.00 14.00 83.00
Zug 2 2.00 85.00 2.00 85.00
Zurich 15 15.00 100.00 15.00 100.00
<NA> 0 0.00 100.00
Total 100 100.00 100.00 100.00 100.00
Wir haben jetzt natürlich eine zu kleine Stichprobe um eine Aussage über die Körpergrösse in den Kantonen zu machen. Bei so kleinen Stichproben ist es nicht sicher, dass wir aus allen Kantonen Personen haben.
In Bezug auf die statistische Präzision haben wir mit 100 Personen schon weniger ein Problem.
MeanCI(sr_sample$Koerpergroesse, na.rm=TRUE)
mean lwr.ci upr.ci
1.781725 1.767209 1.796242
Jetzt nehmen wir eine grössere Stichprobe. Wir haben immer noch kleine Stichproben in den kleineren Kantonen.
= 666
set.seed<-data[sample(nrow(data), 1000), ]
sr_sample
freq(sr_sample$Canton)
Frequencies
sr_sample$Canton
Type: Character
Freq % Valid % Valid Cum. % Total % Total Cum.
---------------------------- ------ --------- -------------- --------- --------------
Aargau 84 8.40 8.40 8.40 8.40
Appenzell Ausserrhoden 11 1.10 9.50 1.10 9.50
Basel-Landschaft 38 3.80 13.30 3.80 13.30
Basel-Stadt 16 1.60 14.90 1.60 14.90
Bern 145 14.50 29.40 14.50 29.40
Fribourg 43 4.30 33.70 4.30 33.70
Geneve 38 3.80 37.50 3.80 37.50
Glarus 4 0.40 37.90 0.40 37.90
Graubuenden 21 2.10 40.00 2.10 40.00
Jura 11 1.10 41.10 1.10 41.10
Luzern 58 5.80 46.90 5.80 46.90
Neuchatel 30 3.00 49.90 3.00 49.90
Nidwalden 4 0.40 50.30 0.40 50.30
Obwalden 6 0.60 50.90 0.60 50.90
Schaffhausen 7 0.70 51.60 0.70 51.60
Schwyz 13 1.30 52.90 1.30 52.90
Solothurn 30 3.00 55.90 3.00 55.90
St.Gallen 59 5.90 61.80 5.90 61.80
Thurgau 35 3.50 65.30 3.50 65.30
Ticino 21 2.10 67.40 2.10 67.40
Uri 10 1.00 68.40 1.00 68.40
Valais 42 4.20 72.60 4.20 72.60
Vaud 77 7.70 80.30 7.70 80.30
Zug 14 1.40 81.70 1.40 81.70
Zurich 183 18.30 100.00 18.30 100.00
<NA> 0 0.00 100.00
Total 1000 100.00 100.00 100.00 100.00
MeanCI(sr_sample$Koerpergroesse, na.rm=TRUE)
mean lwr.ci upr.ci
1.780795 1.776406 1.785183
42.5 Geschichtetes (stratifiziertes) Sampling
Wir können jetzt die Zufallsstichprobe pro Kanton ziehen. Wir benutzen dafür einen Befehl aus dem dplyr Paket.
<- data %>%
stratified group_by(Canton) %>%
sample_n(size=50)
freq(stratified$Canton)
Frequencies
stratified$Canton
Type: Character
Freq % Valid % Valid Cum. % Total % Total Cum.
---------------------------- ------ --------- -------------- --------- --------------
Aargau 50 3.85 3.85 3.85 3.85
Appenzell Ausserrhoden 50 3.85 7.69 3.85 7.69
Appenzell Innerrhoden 50 3.85 11.54 3.85 11.54
Basel-Landschaft 50 3.85 15.38 3.85 15.38
Basel-Stadt 50 3.85 19.23 3.85 19.23
Bern 50 3.85 23.08 3.85 23.08
Fribourg 50 3.85 26.92 3.85 26.92
Geneve 50 3.85 30.77 3.85 30.77
Glarus 50 3.85 34.62 3.85 34.62
Graubuenden 50 3.85 38.46 3.85 38.46
Jura 50 3.85 42.31 3.85 42.31
Luzern 50 3.85 46.15 3.85 46.15
Neuchatel 50 3.85 50.00 3.85 50.00
Nidwalden 50 3.85 53.85 3.85 53.85
Obwalden 50 3.85 57.69 3.85 57.69
Schaffhausen 50 3.85 61.54 3.85 61.54
Schwyz 50 3.85 65.38 3.85 65.38
Solothurn 50 3.85 69.23 3.85 69.23
St.Gallen 50 3.85 73.08 3.85 73.08
Thurgau 50 3.85 76.92 3.85 76.92
Ticino 50 3.85 80.77 3.85 80.77
Uri 50 3.85 84.62 3.85 84.62
Valais 50 3.85 88.46 3.85 88.46
Vaud 50 3.85 92.31 3.85 92.31
Zug 50 3.85 96.15 3.85 96.15
Zurich 50 3.85 100.00 3.85 100.00
<NA> 0 0.00 100.00
Total 1300 100.00 100.00 100.00 100.00
Doch Achtung! Was ist jetzt das Problem? Ja genau, jetzt ist die Stichprobe nicht mehr repräsentativ für die gesamte Schweiz. Für die Berechnung auf Kantonsebene wäre es jedoch nicht verfälscht.
MeanCI(stratified$Koerpergroesse, na.rm=TRUE)
mean lwr.ci upr.ci
1.782828 1.779049 1.786607
Wir haben zwei Möglichkeiten: Wir ziehen die zufällige Stichprobe so, dass aus jedem Kanton proportional zur Gesamtgrösse gezogen wird, d.h. aus kleineren Kantonen werden weniger Personen gezogen.
=666
set.seed<-data %>%
proportional_stratifiedmutate(Total_N=n()) %>%
group_by(Canton) %>%
mutate(Canton_N=n()) %>%
mutate(sampling_weight=mean(Canton_N)/mean(Total_N)) %>%
mutate(sample_N=round(1000*mean(sampling_weight))) %>%
sample_n(size=mean(sample_N)) %>%
ungroup()
freq(data$Canton)
Frequencies
data$Canton
Type: Character
Freq % Valid % Valid Cum. % Total % Total Cum.
---------------------------- --------- --------- -------------- --------- --------------
Aargau 517015 8.00 8.00 8.00 8.00
Appenzell Ausserrhoden 46135 0.71 8.72 0.71 8.72
Appenzell Innerrhoden 14420 0.22 8.94 0.22 8.94
Basel-Landschaft 222404 3.44 12.38 3.44 12.38
Basel-Stadt 124151 1.92 14.31 1.92 14.31
Bern 869681 13.46 27.77 13.46 27.77
Fribourg 250287 3.87 31.64 3.87 31.64
Geneve 302731 4.69 36.33 4.69 36.33
Glarus 30753 0.48 36.81 0.48 36.81
Graubuenden 161989 2.51 39.32 2.51 39.32
Jura 62740 0.97 40.29 0.97 40.29
Luzern 337132 5.22 45.51 5.22 45.51
Neuchatel 131671 2.04 47.54 2.04 47.54
Nidwalden 36996 0.57 48.12 0.57 48.12
Obwalden 32475 0.50 48.62 0.50 48.62
Schaffhausen 61267 0.95 49.57 0.95 49.57
Schwyz 126227 1.95 51.52 1.95 51.52
Solothurn 212535 3.29 54.81 3.29 54.81
St.Gallen 387398 6.00 60.81 6.00 60.81
Thurgau 210840 3.26 64.07 3.26 64.07
Ticino 254109 3.93 68.01 3.93 68.01
Uri 32073 0.50 68.50 0.50 68.50
Valais 268980 4.16 72.67 4.16 72.67
Vaud 544045 8.42 81.09 8.42 81.09
Zug 91736 1.42 82.51 1.42 82.51
Zurich 1129722 17.49 100.00 17.49 100.00
<NA> 0 0.00 100.00
Total 6459512 100.00 100.00 100.00 100.00
freq(proportional_stratified$Canton)
Frequencies
proportional_stratified$Canton
Type: Character
Freq % Valid % Valid Cum. % Total % Total Cum.
---------------------------- ------ --------- -------------- --------- --------------
Aargau 80 8.00 8.00 8.00 8.00
Appenzell Ausserrhoden 7 0.70 8.70 0.70 8.70
Appenzell Innerrhoden 2 0.20 8.90 0.20 8.90
Basel-Landschaft 34 3.40 12.30 3.40 12.30
Basel-Stadt 19 1.90 14.20 1.90 14.20
Bern 135 13.50 27.70 13.50 27.70
Fribourg 39 3.90 31.60 3.90 31.60
Geneve 47 4.70 36.30 4.70 36.30
Glarus 5 0.50 36.80 0.50 36.80
Graubuenden 25 2.50 39.30 2.50 39.30
Jura 10 1.00 40.30 1.00 40.30
Luzern 52 5.20 45.50 5.20 45.50
Neuchatel 20 2.00 47.50 2.00 47.50
Nidwalden 6 0.60 48.10 0.60 48.10
Obwalden 5 0.50 48.60 0.50 48.60
Schaffhausen 9 0.90 49.50 0.90 49.50
Schwyz 20 2.00 51.50 2.00 51.50
Solothurn 33 3.30 54.80 3.30 54.80
St.Gallen 60 6.00 60.80 6.00 60.80
Thurgau 33 3.30 64.10 3.30 64.10
Ticino 39 3.90 68.00 3.90 68.00
Uri 5 0.50 68.50 0.50 68.50
Valais 42 4.20 72.70 4.20 72.70
Vaud 84 8.40 81.10 8.40 81.10
Zug 14 1.40 82.50 1.40 82.50
Zurich 175 17.50 100.00 17.50 100.00
<NA> 0 0.00 100.00
Total 1000 100.00 100.00 100.00 100.00
Mit dieser Methode haben wir jedoch wieder das Problem, das wir eher zu wenig Personen aus den kleinen Kantonen haben. Entweder ziehen wir insgesamt eine grössere Stichprobe, oder wir machen ein oversampling, d.h. wir ziehen proportional zu viele Personen aus den kleineren Kantonen. Wir könnten zum Beispiel bestimmen, dass wir mindestens 30 Personen aus jedem Kanton möchten. In dieser einfachen Variante hier akzeptieren wir, dass wir am Schluss mehr als die 1000 Personen haben.
Wir müssen dies dann beim Analysieren natürlich berücksichtigen und die Analyse dementsprechend gewichten.
=666
set.seed<-data %>%
proportional_stratifiedmutate(Total_N=n()) %>%
group_by(Canton) %>%
mutate(Canton_N=n()) %>%
mutate(sampling_weight=mean(Canton_N)/mean(Total_N)) %>%
mutate(sample_N=round(1000*mean(sampling_weight))) %>%
mutate(oversampled_N=ifelse(sample_N<30, 30, sample_N)) %>%
sample_n(size=mean(oversampled_N)) %>%
ungroup()
freq(data$Canton)
Frequencies
data$Canton
Type: Character
Freq % Valid % Valid Cum. % Total % Total Cum.
---------------------------- --------- --------- -------------- --------- --------------
Aargau 517015 8.00 8.00 8.00 8.00
Appenzell Ausserrhoden 46135 0.71 8.72 0.71 8.72
Appenzell Innerrhoden 14420 0.22 8.94 0.22 8.94
Basel-Landschaft 222404 3.44 12.38 3.44 12.38
Basel-Stadt 124151 1.92 14.31 1.92 14.31
Bern 869681 13.46 27.77 13.46 27.77
Fribourg 250287 3.87 31.64 3.87 31.64
Geneve 302731 4.69 36.33 4.69 36.33
Glarus 30753 0.48 36.81 0.48 36.81
Graubuenden 161989 2.51 39.32 2.51 39.32
Jura 62740 0.97 40.29 0.97 40.29
Luzern 337132 5.22 45.51 5.22 45.51
Neuchatel 131671 2.04 47.54 2.04 47.54
Nidwalden 36996 0.57 48.12 0.57 48.12
Obwalden 32475 0.50 48.62 0.50 48.62
Schaffhausen 61267 0.95 49.57 0.95 49.57
Schwyz 126227 1.95 51.52 1.95 51.52
Solothurn 212535 3.29 54.81 3.29 54.81
St.Gallen 387398 6.00 60.81 6.00 60.81
Thurgau 210840 3.26 64.07 3.26 64.07
Ticino 254109 3.93 68.01 3.93 68.01
Uri 32073 0.50 68.50 0.50 68.50
Valais 268980 4.16 72.67 4.16 72.67
Vaud 544045 8.42 81.09 8.42 81.09
Zug 91736 1.42 82.51 1.42 82.51
Zurich 1129722 17.49 100.00 17.49 100.00
<NA> 0 0.00 100.00
Total 6459512 100.00 100.00 100.00 100.00
freq(proportional_stratified$Canton)
Frequencies
proportional_stratified$Canton
Type: Character
Freq % Valid % Valid Cum. % Total % Total Cum.
---------------------------- ------ --------- -------------- --------- --------------
Aargau 80 6.44 6.44 6.44 6.44
Appenzell Ausserrhoden 30 2.41 8.85 2.41 8.85
Appenzell Innerrhoden 30 2.41 11.26 2.41 11.26
Basel-Landschaft 34 2.74 14.00 2.74 14.00
Basel-Stadt 30 2.41 16.41 2.41 16.41
Bern 135 10.86 27.27 10.86 27.27
Fribourg 39 3.14 30.41 3.14 30.41
Geneve 47 3.78 34.19 3.78 34.19
Glarus 30 2.41 36.60 2.41 36.60
Graubuenden 30 2.41 39.02 2.41 39.02
Jura 30 2.41 41.43 2.41 41.43
Luzern 52 4.18 45.62 4.18 45.62
Neuchatel 30 2.41 48.03 2.41 48.03
Nidwalden 30 2.41 50.44 2.41 50.44
Obwalden 30 2.41 52.86 2.41 52.86
Schaffhausen 30 2.41 55.27 2.41 55.27
Schwyz 30 2.41 57.68 2.41 57.68
Solothurn 33 2.65 60.34 2.65 60.34
St.Gallen 60 4.83 65.16 4.83 65.16
Thurgau 33 2.65 67.82 2.65 67.82
Ticino 39 3.14 70.96 3.14 70.96
Uri 30 2.41 73.37 2.41 73.37
Valais 42 3.38 76.75 3.38 76.75
Vaud 84 6.76 83.51 6.76 83.51
Zug 30 2.41 85.92 2.41 85.92
Zurich 175 14.08 100.00 14.08 100.00
<NA> 0 0.00 100.00
Total 1243 100.00 100.00 100.00 100.00
Wir können das erstellen der Stichprobe auch etwas eleganter gestalten. https://rstudio-pubs-static.s3.amazonaws.com/268281_cc370bbbbbfb437b8650b22d208734d1.html.
Hier zuerst die falsche Analyse für die Durschnittliche Grösse in der Schweiz. Der Fehler ist extrem gering, aber die Analyse ist trotzdem nicht korrekt.
Mean(data$Koerpergroesse, na.rm=TRUE)
[1] 1.780877
MeanCI(proportional_stratified$Koerpergroesse, na.rm=TRUE)
mean lwr.ci upr.ci
1.780370 1.776363 1.784377
Jetzt die korrekte Analyse.
42.6 Random sampling mit oversampling in Stata
Der Befehl sample zieht n Personen, ohne Ersetzen (Replacement), d.h. eine Person kann nur einmal gezogen werden. Ohne Option count, ist die Zahl nach sample Prozente der Population, d.h. sample 5 würde 5% der Population ziehen.
Wir könnten jetzt ausrechnen, wie viel 1000 Personen in Prozenten von der gesamten Population sind und dementsprechend samplen.
use switzerland_cantons.dta
local perc_sample = 1000/_N*100
`perc_sample'
dis
bysort Canton: sample `perc_sample'
tab Canton
.01548105
(6,458,512 observations deleted)
Canton | Freq. Percent Cum.
-----------------------+-----------------------------------
Aargau | 80 8.00 8.00
Appenzell Ausserrhoden | 7 0.70 8.70
Appenzell Innerrhoden | 2 0.20 8.90
Basel-Landschaft | 34 3.40 12.30
Basel-Stadt | 19 1.90 14.20
Bern | 135 13.50 27.70
Fribourg | 39 3.90 31.60
Geneve | 47 4.70 36.30
Glarus | 5 0.50 36.80
Graubuenden | 25 2.50 39.30
Jura | 10 1.00 40.30
Luzern | 52 5.20 45.50
Neuchatel | 20 2.00 47.50
Nidwalden | 6 0.60 48.10
Obwalden | 5 0.50 48.60
Schaffhausen | 9 0.90 49.50
Schwyz | 20 2.00 51.50
Solothurn | 33 3.30 54.80
St.Gallen | 60 6.00 60.80
Thurgau | 33 3.30 64.10
Ticino | 39 3.90 68.00
Uri | 5 0.50 68.50
Valais | 42 4.20 72.70
Vaud | 84 8.40 81.10
Zug | 14 1.40 82.50
Zurich | 175 17.50 100.00
-----------------------+-----------------------------------
Total | 1,000 100.00
Wir sehen, dass wir jetzt in den kleinen Kantonen zu wenig grosse Stichproben haben. Wir könnten jetzt unseren Code etwas anpassen.
Wir müssen jedoch dafür zwei Programme in Stata installieren:
- ssc install moremata
- ssc install gsample
Alternativ könnten wir auch in jedem Kanton separat eine Stichprobe ziehen und die Grösse dieser Stichprobe manuell bestimmen. Danach müssten wir die Stichproben wieder zusammensetzen.
use switzerland_cantons.dta, clear
scalar perc_sample = 1000/_N*100
dis perc_sample local total_N = _N
bysort Canton: gen double weight_Canton= _N/`total_N'
bysort Canton: gen population=_N
bysort Canton: gen double sample_canton=_N * perc_sample /100
gen double oversampled_n = sample_canton
replace oversampled_n= oversampled_n * 30/sample_canton if sample_canton<30
replace oversampled_n=. if sample_canton>30
bysort Canton: replace oversampled_n=. if _n>1
egen double rest_to_sample = total(oversampled_n)
replace rest_to_sample= 1000-rest_to_sample
replace oversampled_n = weight_Canton*rest_to_sample if sample_canton>30
bysort Canton: replace oversampled_n= oversampled_n/_N
bysort Canton: replace oversampled_n =oversampled_n[_n-1] if missing(oversampled_n)
w=oversampled_n], wor
gsample 1000 [
bysort Canton: gen double oversampled_n_per_canton=_N
bysort Canton: gen double weight_for_analysis = sample_canton / oversampled_n_per_canton
mean Koerpergroesse [pweight=weight_for_analysis]
.01548105
(952,633 real changes made)
(5,506,879 real changes made, 5,506,879 to missing)
(952620 real changes made, 952620 to missing)
(6,459,512 real changes made)
(5,506,879 real changes made)
(5506892 real changes made)
(952620 real changes made)
(6,458,512 observations deleted)
Mean estimation Number of obs = 1,000
----------------------------------------------------------------
| Mean Std. err. [95% conf. interval]
---------------+------------------------------------------------
Koerpergroesse | 1.782698 .0026426 1.777512 1.787883
----------------------------------------------------------------
Nur um zu überprüfen, ob das gewichtete Mittel jetzt stimmt:
use switzerland_cantons.dta, clear
mean Koerpergroesse
Mean estimation Number of obs = 6,459,512
----------------------------------------------------------------
| Mean Std. err. [95% conf. interval]
---------------+------------------------------------------------
Koerpergroesse | 1.780877 .0000281 1.780822 1.780932
----------------------------------------------------------------