Übungsblatt 2 Numerische Methoden in der Bayes-Inferenz WiSe 2006/07 Michael Höhle Übung: Montag 06.11.2006 Aufgabe 1 (MCMC Schätzung eines Mixturparameters) Angenommen Sie beobachten Daten y = (y 1,..., y n ), die unabhängig aus der Mischverteilung mit Dichte f(y δ) = δf 1 (y 7, 0.5 2 ) + (1 δ)f 2 (y 10, 0.5 2 ), 0 < δ < 1, stammen, wobei f i (y µ i, σi 2), i = 1, 2, die Dichte der Normalverteilung mit Erwartungswert µ i und Varianz σi 2 ist. Des Weiteren wird angenommen, dass a priori δ U(0, 1). Mittels MCMC-Methoden wird nun eine Markov-Kette erzeugt, deren stationäre Verteilung gleich der posteriori Verteilung von δ y ist. a) Schreiben Sie eine R-Funktion rmixture(size,delta), die einen Vektor mit size iid. Werten aus der obigen Mischverteilung mit δ =delta erzeugt und zurückgibt. > rmixture <- function(size, delta) { + mean <- c(7, 10) + indicator <- sample(1:2, size = size, rep = T, prob = c(delta, 1 - delta)) + return(rnorm(size, mean = mean[indicator], sd = 0.5)) b) Erzeugen Sie eine Stichprobe y = (y 1,..., y 100 ) mit δ = 0.7. > dmixture <- function(x, delta) { + delta * dnorm(x, 7, 0.5) + (1 - delta) * dnorm(x, 10, 0.5) > y <- rmixture(size = 100, delta = 0.7) > hist(y, nclass = 25, prob = T) > lines(x <- seq(min(y), max(y), length = 1000), dmixture(x, delta = 0.7), col = 2) Histogram of y 0.0 0.2 0.4 0.6 6 7 8 9 10 11 y c) Schreiben Sie eine R-Funktion rdeltapost.mh(size,y,dq,rq), die eine Markov-Kette der Länge size mit f(δ y) als stationärer Verteilung durch den Metropolis-Hastings Algorithmus erzeugt. Dabei ist dq(delta) die Proposal-Dichte und rq() eine Funktion, die einen Independence-Proposal aus der Proposal-Dichte simuliert. Die Funktion rdeltapost.mh soll die size Werte als Vektor zurückgeben. 1
> rdeltapost.mh <- function(size, y, dq, rq) { + res <- numeric(size) + res[1] <- delta <- 0.5 + for (i in 1:(size - 1)) { + deltanew <- rq() + alpha <- exp(sum(log(dmixture(y, deltanew)) - log(dmixture(y, delta)))) * + dq(delta)/dq(deltanew) + if (runif(1) <= alpha) { + delta <- deltanew + res[i + 1] <- delta + return(res) d) Erzeugen Sie je 10000 Werte der Markov-Kette für die Proposal-Dichte 1) Be(1, 1) 2) Be(2, 7) Erstellen Sie für jede Proposal-Dichte einen Plot von (t, δ (t) ) und ein Histogramm der δ (t). Schätzen Sie auch den posteriori Erwartungswert E(δ y) und den posteriori Median. > analyze <- function(delta) { + plot(delta, type = "l", ylab = expression(delta^((t))), xlab = "") + hist(delta, prob = T, nclass = 100, xlab = expression(delta)) + lines(dens <- density(delta), col = 2) + cat("posterior mean: ", mean(delta), "\n") + cat("posterior mode: ", dens$x[which.max(dens$y)], "\n") + cat("posterior median: ", quantile(delta, probs = c(0.5)), "\n") > rq1 <- function(deltaold) rbeta(1, 1, 1) > dq1 <- function(delta) dbeta(delta, 1, 1) > rq2 <- function(deltaold) rbeta(1, 2, 7) > dq2 <- function(delta) dbeta(delta, 2, 7) > delta1 <- rdeltapost.mh(10000, y, dq = dq1, rq = rq1)[-c(1:100)] > delta2 <- rdeltapost.mh(10000, y, dq = dq2, rq = rq2)[-c(1:100)] > par(mfcol = c(2, 2), mar = c(3, 4, 1, 1)) > analyze(delta1) Posterior mean: 0.6545905 Posterior mode: 0.6470166 Posterior median: 0.6539986 > analyze(delta2) Posterior mean: 0.6429631 Posterior mode: 0.6486957 Posterior median: 0.6473165 > par(mfcol = c(1, 1)) 2
δ ((t)) δ ((t)) 0.55 0.65 0.75 0 2000 6000 10000 0 2000 6000 10000 0 2 4 6 8 10 Histogram of delta 0 10 20 30 40 Histogram of delta 0.55 0.60 0.65 0.70 0.75 e) Schätzen Sie für Teil d1) auch f(δ y) mittels eines Kerndichteschätzers. Hinweis: Benutzen Sie dazu die Funktion density. Danach benutzen Sie das Resultat, um den posteriori Modus zu schätzen. Lösung in der letzten Teilaufgabe. Prinzipiell ist der Ansatz etwas ad-hoc. Viel besser wäre es die Posteriori-Dichte mit numerischen Methoden zu maximieren. Dabei stört es nicht, dass die Posteriori nur bis hin zur Proportionalitätskonstante bekannt ist. f) Würde δ (t+1) N(δ (t), σ 2 ) mit σ 2 bekannt als Proposal-Dichte funktionieren? Ja, dieser random-walk proposal funktioniert. Falls δ (t) (0, 1) sorgt die priori Verteilung dafür, dass dieser Wert nicht akzeptiert wird. > rq.rw <- function(delta,...) rnorm(1, mean = delta, sd = list(...)$sigma.rw) > dq.rw <- function(deltanew, deltaold,...) { + dnorm(deltanew, mean = deltaold, sd = list(...)$sigma.rw) > sigma.rw1 <- 0.001 > sigma.rw2 <- 0.1 > delta.rw1 <- rdeltapost.mh2(10000, y, dq = dq.rw, rq = rq.rw, sigma.rw = sigma.rw1) > delta.rw2 <- rdeltapost.mh2(10000, y, dq = dq.rw, rq = rq.rw, sigma.rw = sigma.rw2) > par(mfcol = c(1, 2)) > plot(delta.rw1, type = "l", main = paste("random Walk N(0,", sigma.rw1, "^2)", + sep = "")) > plot(delta.rw2, type = "l", main = paste("random Walk N(0,", sigma.rw2, "^2)", + sep = "")) > par(mfcol = c(1, 1)) 3
Random Walk N(0,0.001^2) Random Walk N(0,0.1^2) delta.rw1 0.50 0.60 0.70 delta.rw2 0 4000 8000 0 4000 8000 Index Index g) Bestimmen Sie f(δ y) und E(δ y) mittels der integrate-funktion und vergleichen Sie einen Plot von f(δ y) mit dem Histogramm aus Teil d). > udpost <- function(delta) { + sapply(delta, function(delta) prod(dmixture(y, delta))) > norm <- integrate(udpost, lower = 0, upper = 1)$val > dpost <- function(delta) { + 1/norm * udpost(delta) > delta.grid <- seq(0, 1, length = 1000) > hist(delta1, prob = T, nclass = 100) > lines(delta.grid, dpost(delta.grid), type = "l") > integrate(dpost, lower = 0, upper = 1) 1 with absolute error < 1.9e-08 > integrate(function(delta) delta * dpost(delta), lower = 0, upper = 1) 0.6568998 with absolute error < 8e-08 4
Histogram of delta1 0 2 4 6 8 10 delta1 h) Welche anderen Verfahren kennen Sie, um Zufallszahlen aus der posteriori Dichte von δ y zu ziehen? Rejection-Sampling. Posteriori bis zu proportionalität genügt, jedoch muss eine Vorschlagsdichte bestimmt werden, so dass δ : M q(δ) π(δ). Aufgabe 2 (Markov-Ketten) Betrachten Sie eine homogene Markovkette X 0, X 1, X 2,... mit den möglichen Zuständen S = {1, 2} sowie der Übergangsmatrix ( ) 0.7 x P =, y 0.8 wobei x und y unbekannt sind. a) Welchen Wert muss x beziehungsweise y haben? x = 0.3, y = 0.2. b) Schreiben Sie eine R-Funktion sim.markov2(p,x0,n=100), die einen Pfad der Länge n einer Markovkette mit 2 2 Übergangsmatrix P in Abhängigkeit vom Startwert X 0 = x 0 simuliert und (x 1,..., x n ) als Vektor zurückgibt. Testen Sie die Funktion mit dem obigen P, x 0 = 1 und n = 100. Erstellen Sie auch einen Plot des Pfades. Hinweis: Benutzen Sie eventuell discrete-mh.r als Inspirationsquelle. 5
> sim.markov2 <- function(p, x0, n = 100) { + x <- numeric(n + 1) + states <- 1:dim(P)[1] + x[1] <- x0 + for (t in 1:n) { + x[t + 1] <- sample(states, size = 1, prob = P[x[t], ]) + return(x[-1]) > P <- matrix(c(0.7, 0.3, 0.2, 0.8), 2, 2, byrow = T) > plot(sim.markov2(p, 1, 100), type = "s") sim.markov2(p, 1, 100) 1.0 1.2 1.4 1.6 1.8 2.0 0 20 40 60 80 100 Index c) Bestimmen Sie die stationäre Verteilung der Markovkette. Konvergiert die Kette gegen ihre stationäre Verteilung? Die stationäre Verteilung einer Markov-Kette mit endlichem Zustandsraum kann durch die Formel π = 1(I P + Q) 1 berechnet werden, wobei 1 ein Zeilenvektor von Einsen ist, I die Einheitsmatrix, P die Übergangsmatrix der Markov-Kette und Q eine Matrix, die nur aus Einsen besteht. Die Markov-Kette ist irreduzibel und aperiodisch und konvergiert deswegen gegen π. > pi <- matrix(rep(1, 2), 1, 2) %*% solve(diag(rep(1, 2)) - P + matrix(1, 2, 2)) > pi [,1] [,2] [1,] 0.4 0.6 Homepage: http://www.stat.uni-muenchen.de/institut/ag/biostat/teaching/numbay2006/ LaMo: 6. November 2006@13:29 6