--- title: "MCMC - Tuning und Kovergenzdiagnostik" author: "Volker Schmid" date: "29. Mai 2017" output: beamer_presentation: default ioslides_presentation: default --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = FALSE) ``` ## Beispiel MCMC bei Poisson-Lognormal ```{r, echo=TRUE} require(coda) data <- read.table("kaiserschnitt.raw.txt", header=TRUE) n <-dim(data)[1] sumx <- sum(data$n) source("poisson-lognormal.R") mcmc.simple<-poisson.lognormal.mcmc(sumx,n) ``` ## Konvergenz MCMC-Algorithmen erzeugen eine Markovkette aus Ziehungen aus der Posteriori-Verteilung. Probleme: * Der Algorithmus muss konvergieren, damit er aus der stationären Verteilung zieht * Ziehungen sind automatisch abhängig. Damit ist der Algoritmus ineffizienter als unabhängiges Ziehen * Die Effizienz hängt stark vom genauen Algorithmus ab, z.B. Metropolis-Hastings oder Gibbs-Sampler, Wahl der Vorschlagsdichte, etc.. ## MCMC mit coda {.allowframebreaks} ```{r, echo=TRUE} summary(mcmc.simple) ``` ## MCMC mit coda ```{r, echo=TRUE} plot(mcmc.simple) ``` ## Längere Ketten ```{r, cache=TRUE, echo=TRUE} mcmc.laenger<-poisson.lognormal.mcmc(sumx,n, I=10000) plot(mcmc.laenger) ``` ## Tuning des Random Walk Proposals Random Walk Proposal: $$\theta^* = \theta^{(i-1)} + u$$ oft mit $u\sim N(0,c)$. Wie wählt man $c$? Akzeptanzrate = Anteil akzeptierter Vorschläge * Niedrige Akzeptanzrate: Kette bleibt oft im selben Zustand $\to$ schlecht * Zu hohe Akzeptanzrate: Kette bewegt sich (eventuell) nur langsam $\to$ schlecht Tuning: Finde optimalen Wert für $c$. Für Random Walk Proposal gelten Akzeptanzraten zwischen ca. 30% und 60% als optimal (?) ## Beispiel zu hohe Akzeptranzrate ```{r, cache=TRUE} plot(as.vector(mcmc.simple[,1]),type="l",ylab="mu") ``` ## Poisson-Lognormal mit Tuning ```{r, cache=TRUE, echo=TRUE} mcmc.tuning<-poisson.lognormal.mcmc(sumx,n,do.tuning=TRUE) ``` ## Poisson-Lognormal mit Tuning ```{r, cache=TRUE} plot(as.vector(mcmc.tuning[,1]),type="l",ylab="mu") ``` ## Running mean plots ```{r, cache=TRUE, echo=TRUE} par(mfrow=c(1,2)) I=1000 plot(cumsum(mcmc.simple[,1])/1:I,type="l") plot(cumsum(mcmc.simple[,2])/1:I,type="l") ``` ## Running mean plots ```{r, cache=TRUE, echo=TRUE} par(mfrow=c(1,2)) I=1000 plot(cumsum(mcmc.tuning[,1])/1:I,type="l",) plot(cumsum(mcmc.tuning[,2])/1:I,type="l") ``` ## Auto correlation function ```{r, cache=TRUE, echo=TRUE} par(mfrow=c(1,2)) acf(mcmc.simple[,1]) acf(mcmc.simple[,2]) ``` ## Auto correlation function ```{r, cache=TRUE, echo=TRUE} par(mfrow=c(1,2)) acf(mcmc.tuning[,1]) acf(mcmc.tuning[,2]) ``` # Konvergenzdiagnostik ## Gelman-Rubin-Diagnostik * Idee: vergleiche die Varianz von mehreren parallel gelaufenen Ketten * Bei Konvergenz sollte die Varianz in den Ketten der Varianz zwischen den Ketten entsprechen * Within Chain Variance (unterschätzt die wahre Varianz, wenn Ketten noch nicht konvergiert) $$ W=\frac{1}{m}\sum_{j=1}^ms_j^2, s_j^2=\frac{1}{n-1}\sum_{i=1}^n(\theta_{ij}-\bar{\theta_j})^2 $$ * Between Chain Variance $$ B=\frac{n}{m-1}\sum_{j=1}^m(\bar{\theta}_j-\bar{\bar{\theta}})^2; \bar{\bar{\theta}}=\frac{1}{m}\sum_{j=1}^m\bar{\theta} = j $$ ## Gelman-Rubin-Diagnostik * Geschätzte Varianz $$ \hat{Var}(\theta)=(1-\frac{1}{n}W+\frac{1}{n}B) $$ * Potential scale reduction factor $$ \hat{R}=\sqrt\frac{\bar{Var}(\theta)}{W} $$ * Ist $\hat{R}$ zu groß ($>1.1$?), sollten die Ketten länger laufen. ## Gelman-Rubin-Diagnostik ```{r, echo=TRUE, cache=TRUE} require(coda) mc.list<-parallel::mclapply(rep(sumx, 5), poisson.lognormal.mcmc,n=n) print(gelman.diag(mc.list)) ``` ## Gelman-Rubin-Diagnostik ```{r, echo=TRUE, cache=TRUE} require(coda) mc.list<-parallel::mclapply(rep(sumx, 5), poisson.lognormal.mcmc,n=n,I=10000) print(gelman.diag(mc.list)) ``` ## Gelman-Rubin-Diagnostik * Gelman-Rubins R muss für jeden Parameter geschätzt werden * Ziehungen aller Ketten werden dann zusammengeworfen * Alternativ auch Aufteilung einer Kette möglich ## Geweke-Diagnostik * Idee: Teste, ob zwei Teile einer Kette aus der selben Verteilung stammen (Teste Differenz der Mittelwerte) * In der Regel erste 10% und letzte 50% der Kette ```{r, echo=TRUE, cache=TRUE} print(geweke.diag(mcmc.simple)) ``` ## Geweke-Diagnostik ```{r, echo=TRUE, cache=TRUE} print(geweke.diag(mcmc.tuning)) ``` ## Raftery und Lewis Diagnostik * Wir interessieren uns für ein Quantil $q$. * Wieviele Iterationen $N$ und welchen burn-in $M$ brauchen wir, um mit Wahrscheinlichkeit $s$ innerhalb der Toleranz $r$ das Quantil $q$ zu schätzen? * Nach einer Pilotkette lassen wir die längere Kette entsprechend laufen. ## Raftery und Lewis Diagnostik ```{r, echo=TRUE, cache=TRUE} print(raftery.diag(mcmc.simple, q = 0.5, r = 0.05, s = 0.9)) ``` ## Heidelberg und Welch Diagnostik * Teste, ob die Kette aus einer stationären Verteilung kommt * Zuerst: Cramer-von Mises-Test mit Niveau $\alpha$ auf ganzer Kette * Falls Nullhypothese abgelehnt, verwirf erste 10%, 20%, ..., bis zu 50% * Falls Nullhypothese angenommen: Half-width-test * Berechne $(1-\alpha)$-Kredibilitätsintervall (KI) * Teststatistik: Hälfte der Breite des KI durch Mittelwert ## Heidelberg und Welch Diagnostik ```{r, echo=TRUE, cache=TRUE} print(heidel.diag(mcmc.simple)) ``` ## Heidelberg und Welch Diagnostik ```{r, echo=TRUE, cache=TRUE} print(heidel.diag(mcmc.tuning)) ```