Simulation des wiederholten Stichprobenziehens

1 Vorbereitung

library(tidyverse)  # Datenjudo
library(infer)  # Inferenzstatistik

2 Kann man wirklich von einer Stichprobe auf eine Grundgesamtheit schließen?

Alle Welt behauptet, dass man von einer Stichprobe auf eine Grundgesamtheit schließen könne. Aber stimmt das wirklich? Welcher von den Profs, die das tagaus, tagein gebetsmühlenartig von sich geben, hat das eigentlich bewiesen?

Tja.

Probieren wir es einfach aus.

3 Hier ist eine Population

Wir definieren uns eine Population bzw. eine Verteilung für eine Variable.

Sagen wir, um es konkret zu machen, uns interessiert die Zeit, die mittelfränkisch junge Erwachsene pro Tag am Handy verbringen (im Schnitt). Um uns Tipperei zu sparen, geben wir dieser Variablen den Namen \(X\).

Sagen wir weiter, wir würden die die Handy-Daddel-Zeiten aller Menschen minütiös nachverfolgen und kennen also die wahre Daddelzeit, \(X\).

Sagen wir, um die Sache einfach zu halten, \(X\) ist normalverteilt mit Mittelwert 120 und Streuung 20 (in Minuten):

\[X \sim \mathcal{N}(\mu = 120,\sigma = 20).\]

Auf dieser Basis “erzeugen” wir uns die täglichen mittleren Daddelzeiten. Sagen wir, die Population umfasse \(n=10^6\) Personen.

set.seed(42)  # Zufallszahlen festlegen
d <- tibble(
  x = rnorm(1e6, mean = 120, sd = 20)
)

4 Wir ziehen eine Stichprobe

Wir ziehen eine Stichprobe (sample, smple), sagen wir der Größe \(n=50\):

set.seed(42)
smple <- 
  d %>% 
  sample_n(size = 50)
smple %>% 
  summarise(x_mean = mean(x),
            x_sd = sd(x))
#> # A tibble: 1 × 2
#>   x_mean  x_sd
#>    <dbl> <dbl>
#> 1   122.  18.3

Ah! Unsere Stichprobe gibt die Population (synonym: Grundgesamtheit ordentlich wieder).

5 Moment

Halt, könnten Sie jetzt sagen. Das war ja bestimmt nur Zufall. Glück gehabt. Blindes Huhn und so weiter.

6 Also gut, ziehen wir viele Stichproben

Um uns zu überzeugen, ob es sich um einen Zufallsbefund gehandelt hat oder nicht, ziehen wir also viele (sagen wir, \(k=1000\)) Stichproben (mit Zurücklegen) aus der Population und schauen uns dann deren Mittelwerte und Streuungen an. Dann werden wir sehen, ob die Stichproben überwiegend die Population gut wiedergeben bzw. wie eng die Stichproben-Mittelwerte um den wahren Populationsparameter, also dem Mittelwert der Population, herum streuen.

Dazu hilft uns das Paket infer:

library(infer)

Mit rep_sample_n() können wir viele Stichproben ziehen:

set.seed(42)
viele_stipros <-
  d %>% 
  rep_sample_n(size = 50,
               replace = TRUE,
               reps = 1000)

head(viele_stipros)
#> # A tibble: 6 × 2
#> # Groups:   replicate [1]
#>   replicate     x
#>       <int> <dbl>
#> 1         1 156. 
#> 2         1 153. 
#> 3         1 117. 
#> 4         1 135. 
#> 5         1 132. 
#> 6         1  95.9

Ach ja, das Schließen von einer Stichprobe auf eine Grundgesamtheit nennt man

Interferenzstatistik, Inderfernestatistik – schließende Statistik oder Inferenzstatistik.

7 Zusammenfassen der Stichproben

viele_stipros_zfsg <- 
  viele_stipros %>%
  group_by(replicate) %>% 
  summarise(x_mean = mean(x),
            x_sd = sd(x))

head(viele_stipros_zfsg)
#> # A tibble: 6 × 3
#>   replicate x_mean  x_sd
#>       <int>  <dbl> <dbl>
#> 1         1   122.  17.2
#> 2         2   121.  22.3
#> 3         3   120.  19.1
#> 4         4   121.  20.0
#> 5         5   122.  18.3
#> 6         6   124.  18.6

Ein paar Statistiken:

viele_stipros_zfsg %>% 
  summarise(mu_dach = mean(x_mean),
            sigma_dach = mean(x_sd),
            q05 = quantile(x_mean, .05),
            q95 = quantile(x_mean, .90))
#> # A tibble: 1 × 4
#>   mu_dach sigma_dach   q05   q95
#>     <dbl>      <dbl> <dbl> <dbl>
#> 1    120.       19.9  115.  124.

8 Visualisierung

viele_stipros_zfsg %>% 
  ggplot(aes(x = x_mean)) +
  geom_histogram() +
  geom_vline(xintercept = 119.91) +
   geom_rect(xmin = 115.23, xmax = 123.57, 
            ymin = 0, ymax = 5,
            fill = "blue",
            alpha = .5) +
  labs(caption = "Die vertikale Linie zeigt den Mittelwert.\nDer horizontale Balken zeigt das 90%-PI.")

9 Fazit

Hey, das Zeug scheint zu klappen!

Das könnte auch der Grund sein, warum ein Koch einfach nur einen kleinen Löffel seiner Supper abschmeckt (nachdem er gut umgerüht hat), und nicht eine “Vollerhebung” seiner Supper machen muss, um sich zu vergewissern, dass sie gut schmeckt.

10 Reproduzierbarkeit

#> ─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────
#>  setting  value                       
#>  version  R version 4.1.3 (2022-03-10)
#>  os       macOS Big Sur/Monterey 10.16
#>  system   x86_64, darwin17.0          
#>  ui       X11                         
#>  language (EN)                        
#>  collate  en_US.UTF-8                 
#>  ctype    en_US.UTF-8                 
#>  tz       Europe/Berlin               
#>  date     2022-03-28                  
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────
#>  package     * version date       lib source                            
#>  assertthat    0.2.1   2019-03-21 [1] CRAN (R 4.1.0)                    
#>  backports     1.4.1   2021-12-13 [1] CRAN (R 4.1.0)                    
#>  blogdown      1.8     2022-02-16 [2] CRAN (R 4.1.2)                    
#>  bookdown      0.24.2  2021-10-15 [1] Github (rstudio/bookdown@ba51c26) 
#>  brio          1.1.3   2021-11-30 [1] CRAN (R 4.1.0)                    
#>  broom         0.7.12  2022-01-28 [1] CRAN (R 4.1.2)                    
#>  bslib         0.3.1   2021-10-06 [1] CRAN (R 4.1.0)                    
#>  cachem        1.0.6   2021-08-19 [1] CRAN (R 4.1.0)                    
#>  callr         3.7.0   2021-04-20 [1] CRAN (R 4.1.0)                    
#>  cellranger    1.1.0   2016-07-27 [1] CRAN (R 4.1.0)                    
#>  cli           3.2.0   2022-02-14 [1] CRAN (R 4.1.2)                    
#>  codetools     0.2-18  2020-11-04 [2] CRAN (R 4.1.3)                    
#>  colorout    * 1.2-2   2022-01-04 [1] Github (jalvesaq/colorout@79931fd)
#>  colorspace    2.0-3   2022-02-21 [1] CRAN (R 4.1.2)                    
#>  crayon        1.5.0   2022-02-14 [1] CRAN (R 4.1.2)                    
#>  DBI           1.1.2   2021-12-20 [1] CRAN (R 4.1.0)                    
#>  dbplyr        2.1.1   2021-04-06 [1] CRAN (R 4.1.0)                    
#>  desc          1.4.0   2021-09-28 [1] CRAN (R 4.1.0)                    
#>  devtools      2.4.3   2021-11-30 [1] CRAN (R 4.1.0)                    
#>  digest        0.6.29  2021-12-01 [1] CRAN (R 4.1.0)                    
#>  dplyr       * 1.0.8   2022-02-08 [1] CRAN (R 4.1.2)                    
#>  ellipsis      0.3.2   2021-04-29 [1] CRAN (R 4.1.0)                    
#>  evaluate      0.14    2019-05-28 [1] CRAN (R 4.1.0)                    
#>  fansi         1.0.2   2022-01-14 [1] CRAN (R 4.1.2)                    
#>  farver        2.1.0   2021-02-28 [1] CRAN (R 4.1.0)                    
#>  fastmap       1.1.0   2021-01-25 [2] CRAN (R 4.1.0)                    
#>  forcats     * 0.5.1   2021-01-27 [1] CRAN (R 4.1.0)                    
#>  fs            1.5.2   2021-12-08 [1] CRAN (R 4.1.0)                    
#>  generics      0.1.2   2022-01-31 [1] CRAN (R 4.1.2)                    
#>  ggplot2     * 3.3.5   2021-06-25 [2] CRAN (R 4.1.0)                    
#>  glue          1.6.2   2022-02-24 [1] CRAN (R 4.1.2)                    
#>  gtable        0.3.0   2019-03-25 [1] CRAN (R 4.1.0)                    
#>  haven         2.4.3   2021-08-04 [1] CRAN (R 4.1.0)                    
#>  highr         0.9     2021-04-16 [1] CRAN (R 4.1.0)                    
#>  hms           1.1.1   2021-09-26 [1] CRAN (R 4.1.0)                    
#>  htmltools     0.5.2   2021-08-25 [1] CRAN (R 4.1.0)                    
#>  httr          1.4.2   2020-07-20 [1] CRAN (R 4.1.0)                    
#>  infer       * 1.0.0   2021-08-13 [1] CRAN (R 4.1.0)                    
#>  jquerylib     0.1.4   2021-04-26 [1] CRAN (R 4.1.0)                    
#>  jsonlite      1.7.3   2022-01-17 [1] CRAN (R 4.1.2)                    
#>  knitr         1.37    2021-12-16 [1] CRAN (R 4.1.0)                    
#>  labeling      0.4.2   2020-10-20 [1] CRAN (R 4.1.0)                    
#>  lifecycle     1.0.1   2021-09-24 [1] CRAN (R 4.1.0)                    
#>  lubridate     1.8.0   2021-10-07 [1] CRAN (R 4.1.0)                    
#>  magrittr      2.0.2   2022-01-26 [1] CRAN (R 4.1.2)                    
#>  memoise       2.0.0   2021-01-26 [2] CRAN (R 4.1.0)                    
#>  modelr        0.1.8   2020-05-19 [1] CRAN (R 4.1.0)                    
#>  munsell       0.5.0   2018-06-12 [1] CRAN (R 4.1.0)                    
#>  pillar        1.7.0   2022-02-01 [1] CRAN (R 4.1.2)                    
#>  pkgbuild      1.2.0   2020-12-15 [2] CRAN (R 4.1.0)                    
#>  pkgconfig     2.0.3   2019-09-22 [1] CRAN (R 4.1.0)                    
#>  pkgload       1.2.4   2021-11-30 [1] CRAN (R 4.1.0)                    
#>  prettyunits   1.1.1   2020-01-24 [1] CRAN (R 4.1.0)                    
#>  processx      3.5.2   2021-04-30 [1] CRAN (R 4.1.0)                    
#>  ps            1.6.0   2021-02-28 [1] CRAN (R 4.1.0)                    
#>  purrr       * 0.3.4   2020-04-17 [1] CRAN (R 4.1.0)                    
#>  R6            2.5.1   2021-08-19 [1] CRAN (R 4.1.0)                    
#>  Rcpp          1.0.8   2022-01-13 [1] CRAN (R 4.1.2)                    
#>  readr       * 2.1.2   2022-01-30 [1] CRAN (R 4.1.2)                    
#>  readxl        1.3.1   2019-03-13 [1] CRAN (R 4.1.0)                    
#>  remotes       2.4.0   2021-06-02 [2] CRAN (R 4.1.0)                    
#>  reprex        2.0.1   2021-08-05 [1] CRAN (R 4.1.0)                    
#>  rlang         1.0.2   2022-03-04 [1] CRAN (R 4.1.2)                    
#>  rmarkdown     2.11    2021-09-14 [1] CRAN (R 4.1.0)                    
#>  rprojroot     2.0.2   2020-11-15 [2] CRAN (R 4.1.0)                    
#>  rstudioapi    0.13    2020-11-12 [1] CRAN (R 4.1.0)                    
#>  rvest         1.0.2   2021-10-16 [1] CRAN (R 4.1.0)                    
#>  sass          0.4.0   2021-05-12 [1] CRAN (R 4.1.0)                    
#>  scales        1.1.1   2020-05-11 [1] CRAN (R 4.1.0)                    
#>  sessioninfo   1.1.1   2018-11-05 [2] CRAN (R 4.1.0)                    
#>  stringi       1.7.6   2021-11-29 [1] CRAN (R 4.1.0)                    
#>  stringr     * 1.4.0   2019-02-10 [1] CRAN (R 4.1.0)                    
#>  testthat      3.1.2   2022-01-20 [1] CRAN (R 4.1.2)                    
#>  tibble      * 3.1.6   2021-11-07 [1] CRAN (R 4.1.0)                    
#>  tidyr       * 1.2.0   2022-02-01 [1] CRAN (R 4.1.2)                    
#>  tidyselect    1.1.2   2022-02-21 [1] CRAN (R 4.1.2)                    
#>  tidyverse   * 1.3.1   2021-04-15 [1] CRAN (R 4.1.0)                    
#>  tzdb          0.1.2   2021-07-20 [2] CRAN (R 4.1.0)                    
#>  usethis       2.0.1   2021-02-10 [2] CRAN (R 4.1.0)                    
#>  utf8          1.2.2   2021-07-24 [1] CRAN (R 4.1.0)                    
#>  vctrs         0.3.8   2021-04-29 [1] CRAN (R 4.1.0)                    
#>  withr         2.5.0   2022-03-03 [1] CRAN (R 4.1.2)                    
#>  xfun          0.29    2021-12-14 [1] CRAN (R 4.1.0)                    
#>  xml2          1.3.3   2021-11-30 [1] CRAN (R 4.1.0)                    
#>  yaml          2.2.2   2022-01-25 [1] CRAN (R 4.1.2)                    
#> 
#> [1] /Users/sebastiansaueruser/Library/R/x86_64/4.1/library
#> [2] /Library/Frameworks/R.framework/Versions/4.1/Resources/library