class: right, bottom, test, title-slide # Stichproben aus der Posteriori-Verteilung ziehen ## QM2, Thema 3 --- <style> .center2 { margin: 0; position: absolute; top: 50%; left: 50%; -ms-transform: translate(-50%, -50%); transform: translate(-50%, -50%); } </style> ## Gliederung .xlarge[ 1. [Mit Stichproben die Post-Verteilung zusammenfassen](#teil-1) 2. [Mit Stichproben neue Beobachtungen simulieren](#teil-2) 3. [Hinweise](#hinweise) ] --- name: teil-1 class: center, middle, inverse # Teil 1 ## Mit Stichproben die Post-Verteilung zusammenfassen --- ## Zur Erinnerung: Gitterwerte in R berechnen ```r n <- 10 n_success <- 6 n_trials <- 9 d <- tibble(p_grid = seq(from = 0, to = 1, length.out = n), prior = 1) %>% mutate(likelihood = dbinom(n_success, size = n_trials, prob = p_grid)) %>% mutate(unstand_post = (likelihood * prior), post = unstand_post / sum(unstand_post)) ``` ``` ## Rows: 10 ## Columns: 5 ## $ p_grid <dbl> 0.00, 0.11, 0.22, 0.33, 0.44,… ## $ prior <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ## $ likelihood <dbl> 0.00, 0.00, 0.00, 0.03, 0.11,… ## $ unstand_post <dbl> 0.00, 0.00, 0.00, 0.03, 0.11,… ## $ post <dbl> 0.00, 0.00, 0.01, 0.04, 0.12,… ``` --- name: posttab ## Zur Erinnerung, die Gittermethode Die Gittermethode ist ein Weg, die Posteriori-Verteilung zu berechnen. Die Posteriori-Verteilung birgt viele nützliche Informationen. Modell: `\(W=6\)` Wasser, `\(N=9\)` Würfen und `\(k=10\)` Gitterwerten. .left-column[ <img src="chunk-img/plot-post-d-1.png" width="100%" style="display: block; margin: auto;" /> ] .right-column[ Die ersten paar Zeilen (von 10) aus der Tabelle `d`:
Tabelle
d
mit Daten zur Posteriori-Verteilung
p_grid
prior
likelihood
unstand_post
post
0
1
0
0
0
1 × 10
−1
1
1 × 10
−4
1 × 10
−4
1 × 10
−4
2 × 10
−1
1
5 × 10
−3
5 × 10
−3
5 × 10
−3
3 × 10
−1
1
3 × 10
−2
3 × 10
−2
4 × 10
−2
4 × 10
−1
1
1 × 10
−1
1 × 10
−1
1 × 10
−1
6 × 10
−1
1
2 × 10
−1
2 × 10
−1
2 × 10
−1
] --- ## Befragen wir die Posteriori-Verteilung Beispiele für Fragen an die Post-Verteilung<sup>*</sup>: - Mit welcher Wahrscheinlichkeit liegt der Parameter unter einem bestimmten Wert? - Mit welcher Wahrscheinlichkeit liegt der Parameter zwischen zwei bestimmten Werten? - Mit 5% Wahrscheinlichkeit liegt der Parameterwert nicht unter welchem Wert? - Welcher Parameterwert hat die höchste Wahrscheinlichkeit? - Wie ungewiss ist das Modell über die Parameterwerte? Solche Fragen kann man in drei Gruppen aufteilen: 1. Fragen zu Bereichen von Parametern 2. Fragen zu Bereichen von Wahrscheinlichkeitsmassen 3. Fragen zu Punktschätzern von Parametern .footnote[*Post-Verteilung: Posteriori-Verteilung] --- name:haeufig ## Häufigkeiten sind einfacher als Wahrscheinlichkeiten Tabelle mit Stichprobendaten aus der Posteriori-Verteilung (Tabelle `d`): ```r samples <- d %>% # nimmt die Tabelle mit Posteriori-Daten, slice_sample( # Ziehe daraus eine Stichprobe, n = 1e4, # mit insgesamt n=10000 Elementen, weight_by = post, # Gewichte nach Spalte mit Post-Wskt., replace = T) # Ziehe mit Zurücklegen ``` Die Wahrscheinlichkeit, einen Parameterwert aus Tabelle `d` zu ziehen, ist proportional zur Posteriori-Wahrscheinlichkeit (`post`) dieses Werts. Ziehen mit Zurücklegen hält die Wahrscheinlichkeiten während des Ziehens konstant.
Stichprobendaten aus der Post-Verteilung
Nur die ersten Zeilen abgebildet
p_grid
prior
likelihood
unstand_post
post
0.667
1
0.273
3 × 10
−1
0.303
0.444
1
0.111
1 × 10
−1
0.123
0.556
1
0.217
2 × 10
−1
0.241
--- ## Visualierung von `samples` Die ersten 100 gesampelten Gitterwerte (`p_grid`): ``` ## [1] 0.67 0.44 0.56 0.67 0.56 0.78 0.22 0.67 0.56 ## [10] 0.67 0.67 0.89 0.67 0.44 0.67 0.67 0.89 0.67 ## [19] 0.56 0.78 0.67 0.67 0.44 0.78 0.67 0.67 0.78 ## [28] 0.56 0.67 0.56 0.78 0.67 0.67 0.67 0.67 0.89 ## [37] 0.78 0.67 0.44 0.56 0.56 0.67 0.78 0.67 0.78 ## [46] 0.56 0.78 0.56 0.67 0.44 0.78 0.78 0.67 0.56 ## [55] 0.56 0.67 0.44 0.67 0.78 0.78 0.56 0.78 0.89 ## [64] 0.56 0.78 0.56 0.78 0.67 0.78 0.67 0.44 0.67 ## [73] 0.56 0.78 0.67 0.67 0.33 0.78 0.56 0.78 0.78 ## [82] 0.56 0.78 0.89 0.56 0.78 0.44 0.67 0.56 0.56 ## [91] 0.89 0.89 0.89 0.67 0.56 0.56 0.78 0.67 0.44 ## [100] 0.67 ``` <img src="chunk-img/QM2-Thema3-Teil1-3-1.png" width="70%" style="display: block; margin: auto;" /> --- ## Visualisierung der Stichprobendaten mit `\(k=100\)` Gitterwerten Datensatz `samples`, `\(n=10^3\)`, `\(k=100\)` Gitterwerte, basierend auf dem [Modell oben](#posttab). <img src="chunk-img/samplesplot-1.png" width="100%" height="400px" style="display: block; margin: auto;" /> Die Stichprobendaten nähern sich der Posteriori-Verteilung an. --- ## Mehr Stichproben und mehr Gitterwerte glätten die Verteilung `\(n=10^6\)` Stichproben bei `\(k=100\)` Gitterwerten aus der Posteriori-Verteilung ```r d_k100 %>% slice_sample(n = 1e6, weight_by = post, replace = T) %>% ggplot(aes(x = p_grid)) + geom_density(fill = "black") + scale_x_continuous("Anteil Wasser (p)", limits = c(0, 1)) + labs(y = "") ``` <img src="chunk-img/QM2-Thema3-Post-befragen-5-1.png" width="50%" style="display: block; margin: auto;" /> --- ## Fragen zu Bereichen von Parametern 1 Wie groß ist die Wahrscheinlichkeit, dass der Wasseranteil unter 50% liegt? .pull-left[ .center[Aus der Posteriori-Verteilung mit der Gridmethode:] ```r d %>% filter(p_grid < .5) %>% summarise(sum = sum(post)) ``` ``` ## # A tibble: 1 × 1 ## sum ## <dbl> ## 1 0.167 ``` ] .pull-right[ .center[Aus den Stichproben der Posteriori-Verteilung:] ```r samples %>% filter(p_grid < .5) %>% summarise(sum = n() / 1e4) ``` ``` ## # A tibble: 1 × 1 ## sum ## <dbl> ## 1 0.163 ``` ] Einfach wie 🍰 essen. Die Gridmethode funktioniert bei großen Modellen nicht gut (im Gegensatz zur quadratischen Approximation `quap`). Daher werden wir ab jetzt mit den Stichproben arbeiten, weil das für `quap` auch funktioniert. Das ist außerdem einfacher. --- ## Fragen zu Bereichen von Parametern 2 Mit welcher Wahrscheinlichkeit liegt der Parameter zwischen 0.5 und 0.75? ```r samples %>% filter(p_grid > .5 & p_grid < .75) %>% summarise(sum = n() / 1e4, percent = 100 * n() / 1e4) # In Prozent ``` ``` ## # A tibble: 1 × 2 ## sum percent ## <dbl> <dbl> ## 1 0.553 55.3 ``` Mit welcher Wahrscheinlichkeit liegt der Parameter zwischen 0.9 und 1? ```r samples %>% filter(p_grid >= .9 & p_grid <= 1) %>% summarise(sum = n() / 1e4, percent = 100 * n() / 1e4) # In Prozent ``` ``` ## # A tibble: 1 × 2 ## sum percent ## <dbl> <dbl> ## 1 0 0 ``` --- ## Fragen zu Bereichen von Wahrscheinlichkeitsmassen - Schätzbereiche von Parameterwerten nennt man auch *Konfidenz- oder Vertrauensintervall* (synonym: *Kompatibilitätsintervall* oder *Passungsbereich*). .pull-left[ Welcher Parameterwert wird mit 80% Wahrscheinlichkeit nicht überschritten, laut unserem Modell? (Gesucht sind also die unteren 80% Posteriori-Wahrscheinlichkeit) ```r samples %>% summarise( quantil80 = quantile( p_grid, p = .8)) ``` ``` ## # A tibble: 1 × 1 ## quantil80 ## <dbl> ## 1 0.778 ``` ] .pull-right[ Was ist das *mittlere* Intervall, das mit 80% Wahrscheinlichkeit den Parameterwert enthält, laut dem Modell? ```r samples %>% summarise( quant_10 = quantile(p_grid, 0.1), quant_90 = quantile(p_grid, 0.9)) ``` ``` ## # A tibble: 1 × 2 ## quant_10 quant_90 ## <dbl> <dbl> ## 1 0.444 0.778 ``` ] Solche Fragen lassen sich mit Hilfe von *Quantilen* beantworten. --- ## Zur Erinnerung: Quantile Beispiel: Wie groß sind die Studentis ([Quelle des Datensatzes](https://rdrr.io/cran/openintro/man/speed_gender_height.html))? Das Quantil von z.B. 25% zeigt die Körpergröße der 25% kleinsten Studentis an, analog für 50%, 75%:
q25
q50
q75
63
66
69
Visualisierung der Quantile: <img src="chunk-img/QM2-Thema3-Teil1-6-1.png" width="100%" style="display: block; margin: auto;" /> --- ## Visualisierung der Massen-Intervalle Intervalle (Bereiche), die die Wahrscheinlichkeitsmasse hälftig auf die beiden Ränder aufteilen, nennen wir *Perzentilintervalle*. <img src="chunk-img/piplot-1.png" width="100%" style="display: block; margin: auto;" /> --- ## Schiefe Posteriori-Verteilungen sind möglich ```r d_33 <- tibble(p_grid = seq(0,1, by =.01), prior = 1) %>% mutate(likelihood = dbinom(3, size = 3, prob = p_grid)) %>% mutate(unstand_post = likelihood * prior) %>% mutate(post_33 = unstand_post / sum(unstand_post)) samples_33 <- d_33 %>% slice_sample(n = 1e4, weight_by = post_33, replace = T) ```
p_grid
prior
likelihood
unstand_post
0.70
1
0.34
0.34
0.84
1
0.59
0.59
0.63
1
0.25
0.25
0.84
1
0.59
0.59
0.96
1
0.88
0.88
0.91
1
0.75
0.75
--- ## Intervalle höchster Dichte Daten: 3 Würfe mit 3 Treffern .pull-left[ ### 50%-Perzentil-Intervall <img src="chunk-img/QM2-Thema3-Post-befragen-15-1.png" width="100%" style="display: block; margin: auto;" /> Der wahrscheinlichste Parameterwert (1) ist *nicht* im Intervall enthalten! ] .pull-right[ ### 50%-Intervall höchster Dichte <img src="chunk-img/QM2-Thema3-Post-befragen-16-1.png" width="100%" style="display: block; margin: auto;" /> Der wahrscheinlichste Paramterwert (1) *ist* im Intervall enthalten! Es ist das schmälste Intervall, das 50% enthält. ] --- ## Intervalle höchster Dichte vs. Perzentilintervalle - Bei symmetrischer Posteriori-Verteilung sind beide Intervalle ähnlich - Perzentilintervalle sind verbreiteter - *Intervalle höchster Dichte* (Highest Posteriori Density Interval, HPDI) sind bei schiefen Post-Verteilungen zu bevorzugen - Intervalle höchster Dichte sind die *schmalsten* Intervalle für eine gegebene Wahrscheinlichkeitsmasse Intervallbreite HDPI: 0.16 ```r rethinking::HPDI(samples$p_grid, prob = .5) ``` ``` ## |0.5 0.5| ## 0.5555556 0.6666667 ``` Intervallbreite PI: 0.23 (Quantile) ```r rethinking::PI(samples$p_grid, prob = .5) ``` ``` ## 25% 75% ## 0.5555556 0.7777778 ``` --- ## Punktschätzungen Datendatz `samples`, 6 Treffer bei 9 Würfen. .pull-left[ ### Lageparameter Z.B. Welchen mittleren Wasseranteil muss man annehmen? ```r library(tidybayes) samples %>% summarise( mean = mean(p_grid), median = median(p_grid), # Mode() ist aus tidybayes: modus = Mode(p_grid)) ``` ``` ## # A tibble: 1 × 3 ## mean median modus ## <dbl> <dbl> <dbl> ## 1 0.636 0.667 0.667 ``` ] .pull-right[ ### Streuungsparameter Z.B. "Wie unsicher sind wir in der Schätzung des mittleren Wasseranteils?" ```r samples %>% summarise( p_sd = sd(p_grid), p_iqr = IQR(p_grid), p_mad = mad(p_grid)) ``` ``` ## # A tibble: 1 × 3 ## p_sd p_iqr p_mad ## <dbl> <dbl> <dbl> ## 1 0.137 0.222 0.165 ``` ] --- ## Visualisierungen der Punktschätzer <img src="chunk-img/pointestimators-1.png" width="100%" style="display: block; margin: auto;" /> Je symmetrischer die Verteilung, desto näher liegen die Punktschätzer aneinander (und umgekehrt). --- ## Der zwielichte Dozent: Stichproben-Vert. vs. Post-Vert. Daten: 9 von 10 Treffern beim Münzwurf. Ist die Münze fair? .pull-left[ <img src="chunk-img/QM2-Thema3-Post-befragen-21-1.png" width="100%" style="display: block; margin: auto;" /> Die *Stichprobenverteilung* zeigt, wie Wahrscheinlich der empirischen Daten `\(D\)` (z.B. 9 von 10 Treffer) ist *gegeben* eines Parameterwerts `\(p\)` (z.B. `\(p=0.5\)`): `\(Pr(D|p)\)`. ] .pull-right[ <img src="chunk-img/QM2-Thema3-Post-befragen-22-1.png" width="100%" style="display: block; margin: auto;" /> Die *Posteriori-Verteilung* gibt die Wahrscheinlichkeit jedes Parameterwerts `\(p\)` wider, gegeben der empirischen Daten `\(D\)`: `\(Pr(p|D)\)`. ] Die meisten Forschungsfragen lassen sich mit der Post-Verteilung beantworten, nicht mit der Stichprobenverteilung. --- name: teil-2 class: center, middle # Teil 2 ## Mit Stichproben neue Beobachtungen simulieren --- ## Wir simulieren die Wasserzahl bei Globuswürfen Likelihood (L): Wahrscheinlichkeit für `\(w=0,1,2\)` bei `\(N=2\)` und `\(p = 0.7\)`: ```r L <- dbinom(0:2, size = 2, prob = 0.7) ``` ``` ## [1] 0.09 0.42 0.49 ``` Wir simulieren `\(n=1\)` neuen Globusversuch mit `\(N=2, p=0.7\)` und zählen die (Wasser-)Treffer: ```r rbinom(n = 1, size = 2, prob = .7) # 0 Treffer (Wasser) ``` ``` ## [1] 0 ``` Warum nicht `\(n=10\)` neue Globusversuche simulieren: ```r rbinom(n = 10, size = 2, prob = 0.7) ``` ``` ## [1] 0 2 1 1 1 1 2 1 1 2 ``` Diese Versuche geben Aufschluss, welche Daten (wie oft Wasser) man bei einem bestimmten Modell, `\(p,N\)`, erwarten kann. --- ## Never trust a Golem .pull-left[ <a href="https://imgflip.com/i/5qmhmo"><img src="https://i.imgflip.com/5qmhmo.jpg" title="made at imgflip.com"/></a><div><a href="https://imgflip.com/memegenerator">from Imgflip Meme Generator</a></div> Quelle: https://imgflip.com/i/5qmhmo ] .pull-right[ ### Traue niemals einem Golem (einem Modell) Immer prüfen und wachsam bleiben: - (Inwieweit) decken sich die simulierten Daten mit den tatsächlichen Beobachtungen? - Wie realistisch sind die Modellannahmen? - Kann man das Modell aus verschiedenen Perspektiven prüfen? ] --- ## Mit guten Simulationen kommt man den wahren Werten nahe .pull-left[ Warum nicht `\(n=10^6\)` neue Globusversuche simulieren: ```r draws <- tibble( draws = rbinom(1e6, size = 2, prob = .7)) draws %>% count(draws) %>% mutate(proportion = n / nrow(d)) ``` ``` ## # A tibble: 3 × 3 ## draws n proportion ## <int> <int> <dbl> ## 1 0 89770 8977 ## 2 1 420629 42063. ## 3 2 489601 48960. ``` ] .pull-left[ Diese simulierten Häufigkeiten sind sehr ähnlich zu den theoretisch bestimmten Häufigkeiten mit `dbinom`: Unser Modell liefert plausible Vorhersagen. ```r dbinom(0:2, size = 2, prob = .7) ``` ``` ## [1] 0.09 0.42 0.49 ``` ] --- ## Stichprobenverteilung Wir ziehen viele ($n=10^6$) Stichproben für den Versuch `\(N=9\)` Globuswürfe mit `\(p=0.7\)`. Wie viele Wasser (W) erhalten wir wohl typischerweise? .pull-left[ ```r n_draws <- 1e6 draws <- tibble(draws = rbinom( n_draws, size = 9, prob = .7 )) plot1 <- draws %>% ggplot(aes(x = draws)) + geom_histogram() ``` ] .pull-right[ <img src="chunk-img/QM2-Thema3-Post-befragen-31-1.png" width="100%" style="display: block; margin: auto;" /> Die *Stichprobenverteilung* zeigt, welche Stichprobendaten laut unserem Modell zu erwarten sind. Wir können jetzt prüfen, ob die echten Daten zu den Vorhersagen des Modells passen. ] --- ## Visualisierung der PPV <img src="https://github.com/sebastiansauer/QM2-Folien/raw/main/img/ppv.png" width="100%" style="display: block; margin: auto;" /> .footnote[Quelle: [McElreath (2020)](#bib-mcelreath_statistical_2020)] --- ## So viele Verteilungen... - Die *Posteriori-Verteilung* gibt Aufschluss zur Häufigkeit (Wahrscheinlichkeit) von Parameterwerten: - Wie wahrscheinlich ist es, dass "in Wirklichkeit" der Wasseranteil 70% beträgt, also `\(\pi=.7\)` - In der Wissenschaft ist man meist an den Parametern interessiert. - Die *PPV* gibt Aufschluss zur Häufigkeit von neuen Beobachtungen: - Welche Beobachtungen (wie viele Wasser/Treffer) sind in Zukunft, bei erneuter Durchführung, zu erwarten. - Für die Praxis kann das eine interessante Frage sein. - Der *Likelihood* gibt Aufschluss, wie gut eine bestimmte Hypothese die Datenlage erklärt. - Wie gut passt die Hypothese `\(\pi=0.7\)` auf die Datenlage 6 von 9 Treffern beim Globusversuch? - Der Likelihood kann aus der Stichprobenverteilung herausgelesen werden. --- ## PPV berechnen .pull-left[ [Tabelle `samples`](#haeufig) ```r ppv <- rbinom(1e4, size = 9, prob = samples$p_grid) %>% as_tibble() ppv_plot2 <- ppv %>% ggplot() + aes(x = value) + geom_bar() + scale_x_continuous( breaks = 0:9) ``` ] .pull-right[ <img src="chunk-img/QM2-Thema3-Teil2-2-1.png" width="100%" style="display: block; margin: auto;" /> ] - Die PPV unseres Modells zeigt uns, dass wir in künftigen Versuchen zumeist 6 Treffer zu erwarten haben. - Aber ein relativer breiter Bereich an Treffern ist ebenfalls gut laut unserer PPV erwartbar. --- ## Vorhersagen sind schwierig ... gerade wenn sie die Zukunft betreffen, so ein Sprichtwort. Das zeigt uns die PPV: Der PPV unseres Modells gelingt es zwar, der theoretisch wahrscheinlichste Parameterwert ist auch der häufigste in unseren Stichproben, aber die Vorhersagen haben eine große Streuung, birgt also hohe Ungewissheit. Die PPV zeigt also, welche Beobachtungen laut unserem Modell künftig zu erwarten sind. .pull-left[ <img src="chunk-img/QM2-Thema3-Post-befragen-37-1.png" width="100%" style="display: block; margin: auto;" /> ] .pull-right[ Würde man die Vorhersagen nur anhand eines bestimmten Parameterwertes (z.B `\(p=0.6\)`) vornehmen, hätten die Vorhersagen zu wenig Streuung, würden also die Ungewissheit nicht ausreichend abbilden (Übergewissheit, Overconfidence). ] --- ## Zwei Arten von Ungewissheit in Vorhersagen von Modellen 1. *Ungewissheit innerhalb des Modells*: Auch wenn der (oder die) Modellparameter eines Modells mit Sicherheit bekannt sind, so bleibt Unsicherheit, welche Beobachtung eintreten wird: Auch wenn man sicher weiß, dass `\(p=1/4\)` Murmeln blau sind, so kann man nicht sicher sagen, welche Farbe die nächste Murmel haben wird (Ausnahme: `\(p=1\)` oder `\(p=0\)`). 2. *Ungewissheit in den Modellparametern*: Wir sind uns nicht sicher, welchen Wert `\(p\)` (bzw. die Modellparameter) haben. Diese Unsicherheit ist in der Post-Verteilung dargestellt. Um zu realistischen Vorhersagen zu kommen, möchte man beide Arten von Ungewissheit berücksichtigen: Das macht die *Posteriori-Prädiktiv-Verteilung (PPV)*. Die PPV zeigt, welche Daten das Modell vorhersagt (prädiktiv) und mit welcher Häufigkeit, basierend auf der Post-Verteilung. --- ## Vergleich der Verteilungen <img src="https://github.com/sebastiansauer/QM2-Folien/raw/main/img/post-pred-ppv-anim.gif" width="100%" style="display: block; margin: auto;" /> - Links - *Posterior-Verteilung*: Wahrscheinlichkeiten der Parameterwerte - Mitte - *Stichprobenverteilung*: Wahrscheinlichkeiten der Beobachtungen gegeben eines bestimmten Parameterwertes - Rechts - *Posterior-Prädiktiv-Verteilung*: Wahrscheinlichkeiten der Beobachtungen unter Berücksichtigung der Unsicherheit der Posteriori-Verteilung [Bild](https://sebastiansauer.github.io/QM2-Folien/Themen/QM2-Thema3-Post-befragen.html#1) .footnote[[Quelle: R. McElreath](https://twitter.com/rlmcelreath/status/1448978045247893505)] --- name: hinweise class: center, middle, inverse # Hinweise --- ## Zu diesem Skript - Dieses Skript bezieht sich auf folgende [Lehrbücher](#literatur): - *Statistical Rethinking*, Kap. 3 - Dieses Skript wurde erstellt am 2021-11-05 16:57:19 - Lizenz: [CC-BY](https://creativecommons.org/licenses/by/4.0/) - Autor ist Sebastian Sauer. - Um diese HTML-Folien korrekt darzustellen, ist eine Internet-Verbindung nötig. - Mit der Taste `?` bekommt man eine Hilfe über Shortcuts. - Wenn Sie die Endung `.html` in der URL mit `.pdf` ersetzen, bekommen Sie die PDF-Version der Datei. Wenn Sie mit `.Rmd` ersetzen, den Quellcode. - Eine PDF-Version kann erzeugt werden, indem man im Chrome-Browser druckt (Drucken als PDF). --- name: literatur ## Literatur <a name=bib-mcelreath_statistical_2020></a>[McElreath, R.](#cite-mcelreath_statistical_2020) (2020). _Statistical rethinking: a Bayesian course with examples in R and Stan_. 2nd ed. CRC texts in statistical science. Taylor and Francis, CRC Press.