class: center, middle, inverse, title-slide # Sampling ### Niels Richard Hansen ### 17. september, 2022 --- ## De tre hovedspørgsmål i dag * Hvad har stikprøveudtagning (sampling) med sandsynlighedsteori og tilfældighed at gøre? * Hvordan kan vi emulere sampling på computeren (virtuel sampling)? * Hvad er en samplingfordeling af en stikprøvefunktion? En stikprøvefunktion (gennemsnit/sample mean): `$$(x_1, \ldots, x_n) \mapsto \frac{1}{n} \sum_{i=1}^n x_i.$$` --- ## Tre korte svar * Sandsynlighedsteorien er den teoretiske ramme for at formulere en matematisk *sampling model*. Modellen giver os mulighed for at svare på spørgsmål såsom: - hvilke forventninger har vi til data? - hvad kunne vi med rimelighed ellers have observeret? - hvordan fitter vi bedst en fordeling til data? * Pseudotilfældige tal. * Samplingfordelingen er den fordeling som en stikprøvefunktion, f.eks. gennemsnittet, har under vores sampling model. --- ## Stikprøveudtagning/sampling ```r # You need to install the package moderndive library(moderndive) ``` <img src="sampling_bowl_1.jpeg" width="600" style="display: block; margin: auto;" /> --- ## Sampling framework I dag ser vi på: * En endelig mængde `\(\mathcal{\Omega}\)` med `\(N\)` elementer, som vi kalder **populationen**. Det kunne være `\(N = 2.400\)` kugler i en skål. * En måling eller observation `\(X(\omega) \in \mathbb{R}\)` for ethvert individ `\(\omega \in \Omega\)` i populationen. F.eks. `$$X(\omega) = 1(\omega \text{ er rød}).$$` * En metode til at udvælge en **stikprøve**/**sample** på `\(n\)` individer fra populationen og indsamle observationerne `\(x_1 = X(\omega_1), \ldots, x_n = X(\omega_n)\)`. F.eks. en skovl med `\(n = 50\)` huller. <img src="sampling_bowl_3_cropped.jpeg" width="300" style="display: block; margin: auto;" /> --- ## Hvad er formålet? Formålet er, at vi vil vide noget om `\(X(\omega)\)` for hele populationen, men en udtømmende indsamling (census) af `\(X(\omega)\)` for alle `\(\omega \in \Omega\)` er umulig. Vi vil f.eks. gerne vide hvad **populationsparameteren** `$$p = \frac{1}{N} \sum_{\omega \in \Omega} X(\omega)$$` er. Håbet er, at gennemsnittet `$$\hat{p} = \frac{1}{n} \sum_{i=1}^n x_i$$` er et godt **estimat** (point estimate) for `\(p\)`. --- ## Populationsparameteren ```r bowl ``` ``` ## # A tibble: 2,400 × 2 ## ball_ID color ## <int> <chr> ## 1 1 white ## 2 2 white ## 3 3 white ## 4 4 red ## 5 5 white ## 6 6 white ## 7 7 red ## 8 8 white ## 9 9 red ## 10 10 white ## # … with 2,390 more rows ``` ```r bowl %>% summarize(red = mean(color == "red")) ``` ``` ## # A tibble: 1 × 1 ## red ## <dbl> ## 1 0.375 ``` --- ## En stikprøve ```r bowl %>% filter(ball_ID <= 100) %>% summarize(red = mean(color == "red")) ``` ``` ## # A tibble: 1 × 1 ## red ## <dbl> ## 1 0.3 ``` ```r bowl %>% * slice(1:100) %>% summarize(red = mean(color == "red")) ``` ``` ## # A tibble: 1 × 1 ## red ## <dbl> ## 1 0.3 ``` --- ## En stikprøve ```r bowl %>% * arrange(color) %>% slice(1:100) %>% summarize(red = mean(color == "red")) ``` ``` ## # A tibble: 1 × 1 ## red ## <dbl> ## 1 1 ``` Hmm... --- ## Gennemsnit ```r # Observations in the order they came bowl %>% * mutate(n = 1:length(color), mean = cummean(color == "red")) %>% ggplot(aes(x = n, y = mean)) + geom_point() + geom_hline(yintercept = 0.375, color = "blue") + ylim(0, 1) ``` <img src="17022022_Torsdag_files/figure-html/unnamed-chunk-9-1.png" width="500" style="display: block; margin: auto;" /> --- ## Gennemsnit ```r bowl %>% * arrange(color) %>% mutate(n = 1:length(color), mean = cummean(color == "red")) %>% ggplot(aes(x = n, y = mean)) + geom_point() + geom_hline(yintercept = 0.375, color = "blue") + ylim(0, 1) ``` <img src="17022022_Torsdag_files/figure-html/unnamed-chunk-10-1.png" width="500" style="display: block; margin: auto;" /> --- ## Tilfældighed Lad `\(\mathbb{P}\)` være **ligefordelingen** på `\(\Omega\)`, dvs. `$$\mathbb{P}(\omega) = \frac{1}{N}$$` for alle `\(\omega \in \Omega\)`. Så er `$$p = \int X(\omega) \mathbb{P}(\mathrm{d} \omega) = \int x X(\mathbb{P})(\mathrm{d}x)$$` Tilfældig udvælgelse (random sampling) er en udbredt metode til at udvælge en stikprøve, som sikrer at stikprøven er **repræsentativ**, og at vi kan **generalisere** fra stikprøve til population. Men hvorfor? --- ## Quiz Diskuter følgende to spørgsmål: På MatStat i 2021 svarede `\(n = 33\)` studerende på kursusevalueringen. * Var det en tilfældigt udvalgt stikprøve af studerende, der svarede på kursusevalueringen? (Og hvad er populationen?) En journalist skal afdække om danske kommuner bruger en speciel paragraf i loven til aktivering af arbejdsløse. Hun skriver de 98 kommuner op i en rækkefølge og slår med en terning for hver kommune. Slår hun en sekser, ringer hun til kommunen. Hun ender med at snakke med 15 kommuner. * Var de 15 kommuner en tilfældigt udvalgt stikprøve? * Gør det nogen forskel om der faktisk var 18 seksere, men for 3 kommuner var der ingen, der tog telefonen? --- ## Hvad er "tilfældighed" (randomness)? * Tilfældighed er uforudsigelighed og irregularitet - Kaos? * Kvantemekaniske hændelser er da ægte tilfældige! - Måske * Tilfældighed er en illusion - Uforudsigelighed er uvidenhed Sandsynligheder beskriver: * Relative frekvenser: Frekventistisk fortolkning * Grader af tiltro: Subjektivistisk bayesiansk fortolkning En vigtig forskel: I den bayesianske verden er det kontrafaktiske spørgsmål .center[*Hvad kunne vi ellers have observeret?*] irrelevant. --- ## Mekanisk kaos <img src="kort.jpeg" width="33%" /><img src="terninger.jpeg" width="33%" /><img src="coin.jpeg" width="33%" /> <img src="lottery.jpeg" width="40%" style="display: block; margin: auto;" /> --- ## Pragmatisk frekventisme * Aksiomatisk tilgang til den matematiske sandsynlighedsteori. * Sandsynlighedsmodeller giver en række prædiktioner, bl.a. omkring relative frekvenser. * Teoretiske prædiktioner sammenholdes med data fra angiveligt "tilfældige" kilder * Hvis ikke vi kan **afvise** de teoretiske prædiktioner er modellerne som minimum nyttige beskrivelser af de "tilfældige" kilder. * Vi udelukker på ingen måde at sandsynligheder kan have ikke-frekventistiske fortolkninger, f.eks. være subjektive. Vic Barnett. [Comparative Statistical Inference](https://www.wiley.com/en-us/Comparative+Statistical+Inference%2C+3rd+Edition-p-9780471976431) (Sober og balanceret) Edwin Thompson Jaynes. [Probability Theory: The Logic of Science](https://bayes.wustl.edu/etj/prob/book.pdf) (Polemisk og intelligent, "den tredje vej": bayesiansk fortolkning som udvidet logik) Alan Hájek. [Interpretations of Probability](https://plato.stanford.edu/entries/probability-interpret/), The Stanford Encyclopedia of Philosophy Avi Wigderson. [Mathematics and Computation](https://www.math.ias.edu/avi/book) (Algoritmer og tilfældighed) --- ## Virtuel sampling Computeren frembringer virtuel tilfældighed ved .center[*symbolsk kaos*] Kernen i *pseudotilfældige tal* er kaotiske symbolske dynamiske systemer. ```r # Random sample sample(2400, 10) ``` ``` ## [1] 806 2180 1299 322 2250 43 183 2022 639 1079 ``` ```r set.seed(17022022) sample(2400, 10) ``` ``` ## [1] 82 1428 524 151 1580 2 305 1481 945 742 ``` ```r set.seed(17022022) sample(2400, 10) ``` ``` ## [1] 82 1428 524 151 1580 2 305 1481 945 742 ``` --- ## Gennemsnit, tilfældig rækkefølge 1 ```r bowl %>% * mutate(ball_ID = sample(2400)) %>% arrange(ball_ID) %>% mutate(n = ball_ID, mean = cummean(color == "red")) %>% ggplot(aes(x = n, y = mean)) + geom_point() + geom_hline(yintercept = 0.375, color = "blue") + ylim(0, 1) ``` <img src="17022022_Torsdag_files/figure-html/unnamed-chunk-16-1.png" width="500" style="display: block; margin: auto;" /> --- ## Gennemsnit, tilfældig rækkefølge 2 ```r bowl %>% * mutate(ball_ID = sample(2400)) %>% arrange(ball_ID) %>% mutate(n = ball_ID, mean = cummean(color == "red")) %>% ggplot(aes(x = n, y = mean)) + geom_point() + geom_hline(yintercept = 0.375, color = "blue") + ylim(0, 1) ``` <img src="17022022_Torsdag_files/figure-html/unnamed-chunk-17-1.png" width="500" style="display: block; margin: auto;" /> --- ## Gennemsnit, tilfældig rækkefølge 3 ```r bowl %>% * mutate(ball_ID = sample(2400)) %>% arrange(ball_ID) %>% mutate(n = ball_ID, mean = cummean(color == "red")) %>% ggplot(aes(x = n, y = mean)) + geom_point() + geom_hline(yintercept = 0.375, color = "blue") + ylim(0, 1) ``` <img src="17022022_Torsdag_files/figure-html/unnamed-chunk-18-1.png" width="500" style="display: block; margin: auto;" /> --- ## Gennemsnit, tilfældig rækkefølge 4 ```r bowl %>% * mutate(ball_ID = sample(2400)) %>% arrange(ball_ID) %>% mutate(n = ball_ID, mean = cummean(color == "red")) %>% ggplot(aes(x = n, y = mean)) + geom_point() + geom_hline(yintercept = 0.375, color = "blue") + ylim(0, 1) ``` <img src="17022022_Torsdag_files/figure-html/unnamed-chunk-19-1.png" width="500" style="display: block; margin: auto;" /> --- ## Gennemsnit, tilfældig rækkefølge 5 ```r bowl %>% * mutate(ball_ID = sample(2400)) %>% arrange(ball_ID) %>% mutate(n = ball_ID, mean = cummean(color == "red")) %>% ggplot(aes(x = n, y = mean)) + geom_point() + geom_hline(yintercept = 0.375, color = "blue") + ylim(0, 1) ``` <img src="17022022_Torsdag_files/figure-html/unnamed-chunk-20-1.png" width="500" style="display: block; margin: auto;" /> --- # Pause <img src="coffee.jpeg" width="400" style="display: block; margin: auto;" /> --- ## Gentagne stikprøveudtagninger ```r rep_sample_n(bowl, 25) ``` ``` ## # A tibble: 25 × 3 ## # Groups: replicate [1] ## replicate ball_ID color ## <int> <int> <chr> ## 1 1 1027 red ## 2 1 329 white ## 3 1 2156 white ## 4 1 1001 white ## # … with 21 more rows ``` ```r rep_sample_n(bowl, 25, reps = 100) ``` ``` ## # A tibble: 2,500 × 3 ## # Groups: replicate [100] ## replicate ball_ID color ## <int> <int> <chr> ## 1 1 689 red ## 2 1 1922 white ## 3 1 79 white ## 4 1 609 white ## # … with 2,496 more rows ``` --- ## Stikprøvefunktion (statistic) En stikprøvefunktion (statistic) er en funktion af data, som regel med reelle værdier. ```r rep_sample_n(bowl, 25) %>% summarize(mean = mean(color == "red")) ``` ``` ## # A tibble: 1 × 2 ## replicate mean ## <int> <dbl> ## 1 1 0.36 ``` ```r rep_sample_n(bowl, 25, reps = 5) %>% summarize(mean = mean(color == "red")) ``` ``` ## # A tibble: 5 × 2 ## replicate mean ## <int> <dbl> ## 1 1 0.24 ## 2 2 0.56 ## 3 3 0.52 ## 4 4 0.44 ## 5 5 0.32 ``` --- ## Samplingfordeling, `\(n = 25\)` Samplingfordelingen er stikprøvefunktionens fordeling ved gentagne stikprøveudtagninger. ```r rep_sample_n(bowl, 25, reps = 5000) %>% summarize(mean = mean(color == "red")) %>% ggplot(aes(x = mean, y = ..density..)) + geom_histogram(binwidth = 0.04, boundary = 0.4, color = "white") + ylim(0, 12) + xlim(0, 1) + geom_vline(xintercept = 0.375, color = "blue") ``` <img src="17022022_Torsdag_files/figure-html/unnamed-chunk-29-1.png" width="500" style="display: block; margin: auto;" /> --- ## Samplingfordeling, `\(n = 50\)` Fordelingen for gennemsnittet koncentrerer sig om populationsværdien når `\(n\)` vokser. ```r rep_sample_n(bowl, 50, reps = 5000) %>% summarize(mean = mean(color == "red")) %>% ggplot(aes(x = mean, y = ..density..)) + geom_histogram(binwidth = 0.02, boundary = 0.4, color = "white") + ylim(0, 12) + xlim(0, 1) + geom_vline(xintercept = 0.375, color = "blue") ``` <img src="17022022_Torsdag_files/figure-html/unnamed-chunk-30-1.png" width="500" style="display: block; margin: auto;" /> --- ## Samplingfordeling, `\(n = 100\)` Fordelingen for gennemsnittet koncentrerer sig om populationsværdien når `\(n\)` vokser. ```r rep_sample_n(bowl, 100, reps = 5000) %>% summarize(mean = mean(color == "red")) %>% ggplot(aes(x = mean, y = ..density..)) + geom_histogram(binwidth = 0.02, boundary = 0.4, color = "white") + ylim(0, 12) + xlim(0, 1) + geom_vline(xintercept = 0.375, color = "blue") ``` <img src="17022022_Torsdag_files/figure-html/unnamed-chunk-31-1.png" width="500" style="display: block; margin: auto;" /> --- ## Samplingfordeling, `\(n = 200\)` Fordelingen for gennemsnittet koncentrerer sig om populationsværdien når `\(n\)` vokser. ```r rep_sample_n(bowl, 200, reps = 5000) %>% summarize(mean = mean(color == "red")) %>% ggplot(aes(x = mean, y = ..density..)) + geom_histogram(binwidth = 0.02, boundary = 0.4, color = "white") + ylim(0, 12) + xlim(0, 1) + geom_vline(xintercept = 0.375, color = "blue") ``` <img src="17022022_Torsdag_files/figure-html/unnamed-chunk-32-1.png" width="500" style="display: block; margin: auto;" /> --- ## Standard error Standard error af en stikprøvefunktion er standardafvigelsen for dens fordeling. ```r se <- function(n, reps = 1000) { rep_sample_n(bowl, n, reps = reps) %>% summarize(mean = mean(color == "red")) %>% summarize(se = sd(mean)) %>% pull(se) } ``` ```r se(20) ``` ``` ## [1] 0.1069768 ``` ```r se(200) ``` ``` ## [1] 0.03254077 ``` --- ## Standard error ```r se_data <- tibble( n = seq(10, 200, by = 5), se = map_dbl(n, se) ) ``` ```r se_data %>% ggplot(aes(n, se)) + geom_line() + geom_point() + ylim(0, 0.2) ``` <img src="17022022_Torsdag_files/figure-html/unnamed-chunk-37-1.png" width="500" style="display: block; margin: auto;" /> --- ## Standard error, log-log scale ```r se_data %>% ggplot(aes(n, se)) + geom_line() + geom_point() + scale_y_log10() + scale_x_log10() + geom_line(aes(y = sqrt(0.375 * (1 - 0.375))/sqrt(n)), linetype = 2) ``` <img src="17022022_Torsdag_files/figure-html/unnamed-chunk-38-1.png" width="500" style="display: block; margin: auto;" /> --- ## Quiz Diskuter følgende to udsagn: * Det er en god ide at sample 10 datasæt af 20 observationer, så vi kan estimere standard error, i stedet for at sample et datasæt af 200 observationer. * Vi får aldrig et gennemsnit mindre end 0.25 for `\(n = 200\)`. <img src="17022022_Torsdag_files/figure-html/unnamed-chunk-39-1.png" width="500" style="display: block; margin: auto;" /> --- ## Biased versus unbiased sampling Hvis vi sampler fra `\(\tilde{\mathbb{P}}\)` i stedet for `\(\mathbb{P}\)` er vores sampling biased (skæv), og `$$\tilde{p} = \int X(\omega) \tilde{\mathbb{P}}(\mathrm{d}\omega) \neq p.$$` Med `$$W(\omega) = \frac{\mathbb{P}(\omega)}{\tilde{\mathbb{P}}(\omega)} = \frac{1}{N\tilde{\mathbb{P}}(\omega)} \quad \text{er} \quad p = \int X(\omega) W(\omega) \tilde{\mathbb{P}}(\mathrm{d}\omega).$$` Ved biased sampling estimeres populationsparameteren `\(p\)` ved et *vægtet* gennemsnit `$$\frac{1}{n} \sum_{i=1}^n x_i w_i$$` givet vi kan observere vægtene `$$w_i = W(\omega_i).$$` --- ### Nøjagtighed vs præcision (accuracy vs precision) <img src="accuracy_vs_precision.jpeg" width="400" style="display: block; margin: auto;" /> Ikke-tilfældig el. biased sampling: tab af nøjagtighed (systematisk fejl, bias) Øget sample size giver øget præcision. --- ## Case: meningsmåling (poll) * Population: Amerikanere i alderen 18–29, `\(N = ?\)` * Populationsparameter: Andelen der mener Obama har gjort det godt * Sampling: `\(n = 2089\)` * Statistic: `\(\hat{p} = 0.41\)` Præcisionen er høj (teoretisk standard error: `\(\sqrt{0.41 \times (1 - 0.41) / 2089} = 0.0108\)`) Kritisk spørgsmål: Generaliserer 0.41 til populationen af alle amerikanere i alderen 18–29? Implementerede *Kennedy School’s Institute of Politics* faktisk tilfældig stikprøveudtagning korrekt? --- ## Sampling med og uden tilbagelægning Alle ovenstående stikprøveudtagninger var *uden* tilbagelægning. ```r rep_sample_n(bowl, 100, replace = TRUE, reps = 5) %>% summarize(mean = mean(color == "red")) ``` ``` ## # A tibble: 5 × 2 ## replicate mean ## <int> <dbl> ## 1 1 0.37 ## 2 2 0.42 ## 3 3 0.38 ## 4 4 0.41 ## 5 5 0.34 ``` Se også SupEx 6 baseret på base R funktionen `sample()`. --- ## Samplingfordeling med tilbagelægning ```r rep_sample_n(bowl, 100, replace = TRUE, reps = 5000) %>% summarize(mean = mean(color == "red")) %>% ggplot(aes(x = mean, y = ..density..)) + geom_histogram(binwidth = 0.02, boundary = 0.4, color = "white") + ylim(0, 12) + xlim(0, 1) + geom_vline(xintercept = 0.375, color = "blue") ``` <img src="17022022_Torsdag_files/figure-html/unnamed-chunk-42-1.png" width="500" style="display: block; margin: auto;" /> --- ## Samplingfordeling, med tilbagelægning ```r rep_sample_n(bowl, 200, replace = TRUE, reps = 5000) %>% summarize(mean = mean(color == "red")) %>% ggplot(aes(x = mean, y = ..density..)) + geom_histogram(binwidth = 0.02, boundary = 0.4, color = "white") + ylim(0, 12) + xlim(0, 1) + geom_vline(xintercept = 0.375, color = "blue") ``` <img src="17022022_Torsdag_files/figure-html/unnamed-chunk-43-1.png" width="500" style="display: block; margin: auto;" /> --- ## Abstraktionen Vi abstraherer populationen og samplingsmekanismen ind i `\((\Omega, \mathbb{F}, \mathbb{P})\)` således at vores sample beskrives af `\(n\)` stokastiske variable `$$X_1, \ldots, X_n : \Omega \to \mathbb{R}$$` Den standard samplingmodel, som vi vil bruge er: * `\(X_1, \ldots, X_n\)` har alle samme fordeling * `\(X_1, \ldots, X_n\)` er uafhængige Vi siger også at `\(X_1, \ldots, X_n\)` er uafhængige og identisk fordelte. --- ## Centrale grænseværdisætning (CLT) Hvis `\(X_1, \ldots, X_n\)` er uafhængige og identisk fordelte reelle stokastiske variable med en fordeling der har middelværdi `\(\mu\)` og varians `\(\sigma^2\)`, så er gennemsnittet `$$\frac{1}{n} \sum_{i=1}^n X_i \overset{\text{approx}}{\sim} \mathcal{N}\left(\mu, \frac{\sigma^2}{n} \right).$$` * I den sidste halvdel af kurset spiller CLT en afgørende rolle for at forstå teoretiske fordelingsapproksimationer for en række standard stikprøvefunktioner. * I den første halvdel af kurset dukker CLT op som en gæst fra tid til anden for at belyse andre dele af teorien. F.eks. forklarer CLT at standard error opfører sig som `\(\sigma / \sqrt{n}\)`.