Statistische Informationsverarbeitung - Übung 6
From StatWiki
Contents |
11. A random walk with absorbing barriers
Sei
eine Irrfahrt auf
bei der Sie zu jedem Zeitschritt mit Wahrscheinlichkeit p einen Schritt nach links (-1) und mit Wahrscheinlichkeit r ein Schritt
nach rechts (+1) machen, oder aber mit Wahrscheinlichkeit q auf der Stelle treten.
(Es gilt p + q + r = 1.) Erreichen Sie allerdings einen der beiden "Ränder" (0 bzw. N) machen Sie mit Sicherheit einen Schritt zurück (also +1 bzw. -1).
(a)
Schreiben Sie die Übergangsmatrix
von
auf.
(b)
Berechne Sie für
und
die stationäre Verteilung
.
(c)
Ist
ergodisch?
Ja, weil die Markovkette aus einer Klasse besteht und aperiodisch ist. (Zeichnung)
(d)
MCMC!
Generieren Sie
indem Sie sich auf die (oben definierte) Irrfahrt begeben.
Starten Sie in einem
Ihrer Wahl starten und führen Sie dann n Zeitschritte
durch.
Wiederholen Sie diesen Vorgang jeweils, um 1000 und 10000 X's, also Werte in
zu erzeugen.
Probieren Sie jeweils n = 10 und n = 100 Zeitschritte. Vergleichen Sie Ihre Ergebnisse
(die relativen Häufigkeiten der Werte in
) mit dem in (b)
errechneten
.
library(distrEx)
distroptions("WarningSim" = FALSE)
p=matrix(c(0,1,0,0,1/4,1/2,1/4,0,0,1/4,1/2,1/4,0,0,1,0),nrow=4,byrow=T)
finv=matrix(unlist(mapply(rep, 1:4, t(p*100))), byrow=T, ncol=100)
p.dd = sapply(1:4,function(x) DiscreteDistribution(supp = c(1:4), prob = p[x,]) )
genpath = function(x0,n) {
# I need 1 <= x <= 100 for the indicies
ru = 1 + floor(runif(n,max=100))
# path = rep(1,n)
# path[1] = x0
tab = rep(0,4)
tab[x0] = tab[x0] + 1
for(j in 2:n) {
# path[j] = finv[path[j-1], ru[j]]
x0 = finv[x0, ru[j]]
# x0 = r(p.dd[[x0]])(1)
tab[x0] = tab[x0] + 1
}
# path
tab
}
plot.res = function(res,main) {
# prop.table(rowSums(res))
d=data.frame(count=c(apply(res, 2, prop.table)),state=rep(1:4,1000))
boxplot(count~state, data=d, names=c("z 0","z 1","z 2","z 3"),main=main,ylim=c(0,1),
ylab="Relative Frequency in State")
for(i in 1:4) segments(i-.5,statdist[i], i+.5, statdist[i], col=2)
}
# stationary distribution
statdist=c(1/10,2/5,2/5,1/10)
statdist.inv = unlist(mapply(rep, 1:4, statdist*10))
statdist.dd=DiscreteDistribution(supp = c(1:4), prob = statdist)
#
Die roten Balken sind jeweils die Werte der stationären Verteilung
mit 1000 X's und 10000 X's sowie
mit 1000 X's und 10000 X's
pdf(rpdf,width=12,height=12) par(mfrow=c(2,2)) plot.res(replicate(1000, genpath(1,10)), "n=10 und 1000 X's") plot.res(replicate(10000, genpath(1,10)), "n=10 und 10000 X's") plot.res(replicate(1000, genpath(1,100)), "n=100 und 1000 X's") plot.res(replicate(10000, genpath(1,100)), "n=100 und 10000 X's") #
(e)
Was passiert, wenn Sie Ihre Irrfahrt mit
starten und einen Zeitschritt
(n = 1) durchführen?
Simulieren Sie so 1000 (oder mehr) Werte. Wie sieht die Verteilung der generierten Zahlen aus? War dies zu erwarten?
library(distrEx) # prop.table(rowSums(replicate(1000, genpath(statdist.inv[1+runif(1,max=10)],100) ))) replicate(1000, genpath(r(statdist.dd)(1),100)) pdf(rpdf) plot.res(replicate(1000, genpath(r(statdist.dd)(1),100)), "n=100 und 1000 X's") #
Die Verteilung ist sehr ähnlich zu
.
Ja, weil sich
mit einen neuem Schritt nicht verändert
.
Metropolis-Hastings
Berechnen Sie die Übergangswahrscheinlichkeiten
für den Metropolis-Hastings
Algorithmus mit target density
und
ACHTUNG Buchstaben sind hier vertauscht!!!
Laut Definition ist![]()
mit
(a) einer symmetrischen candidate density
für
und 0 sonst
(b) einer unabängigen candidate density
für
und 0 sonst
Bemerkung (a) führt zum sog. Metropolis Algorithmus, (b) zum independence sampler.
für
und 0 sonst
für 