Upload
cesar-embriz
View
53
Download
5
Tags:
Embed Size (px)
DESCRIPTION
Práctica de estadística bayeisana empleando el método ABC y el Mostrador de Gibbs
Citation preview
Prática 6César Embriz17/03/2015
Densidad del modelo:
Uniforme(a, b) a < b
d_m <- function(x,a,b) dunif(x,a,b) #Funcion de densidad del modelor_m <- function(n,a,b) runif(n,a,b) #simulacion del modelo
Funciones condicioales:
fa|b(a|b, x) = (n−1)(b−x(1))n−1
(b−a)n a ≤ X(1), b ≥ X(n)
fb|a(b|a, x) = (n−1)(x(n)−a)n−1
(b−a)n a ≤ X(1), b ≥ X(n)
#funcion de densidad f_a|bd_a.b <- function(a,b,n=length(muestra)) ((n-1)*(b-min(muestra))^(n-1))/((b-a)^n)*(b>=max(muestra))+(a<=min(muestra))
#funcion de densidad f_b|ad_b.a <- function(a,b,n=length(muestra)) ((n-1)*(max(muestra)-a)^(n-1))/((b-a)^n)*(a<=min(muestra))+(b>=max(muestra))
Simulación de las funciones condicionales:
fu|b = b− b−x(1)
u1
n−1, 0 < u < 1
fv|a = a + xn−a
v1
n−1, 0 < v < 1
#simulación f_a|ba.b <- function(b,U,n=length(muestra)) b-(b-min(muestra))/U^(1/(n-1))
#simulacion f_b|ab.a <- function(a,V,n=length(muestra)) a+(max(muestra)-a)/V^(1/(n-1))
Simulación de la muestra
# Simular muestraa<--2b<-3n <- 30 #tamaño de la muestraset.seed(1)muestra <- r_m(n,a,b)
1
Histograma de la muestra
par(mfrow=c(1,1))hist(muestra,prob=T,ylim=c(0,5))x <- seq(a,b,length=1000)lines(x,d_m(x,a,b),lwd=3)
Histogram of muestra
muestra
Den
sity
−2 −1 0 1 2 3
01
23
45
Simulando las variables aleatorios por medio del mostrador de Gibbs:
#AlgoritmoGibbs <- function(x, it=1000, semillas=c(1,2)){
mat = matrix(0,ncol=2,nrow=it)colnames(mat) <- c("x","y")mat[1] <- xset.seed(semillas[1])U <- runif(it)set.seed(semillas[2])V<- runif(it)for(t in 2:it){
mat[t,2] <- b.a(mat[t-1,1],V[t])mat[t,1] <- a.b(mat[t,2],U[t])
}return (mat)
}
2
#Simulandoit <- 10000semillas <- c(1,2)x <- c(0.5,1)MarkovChain <- Gibbs(x,it,semillas)
## Warning in mat[1] <- x: número de items para para sustituir no es un## múltiplo de la longitud del reemplazo
Calculando los cuantiles acumulados:
cuantiles <- function(V, min.k = 10){
tam <- nrow(V)quantx <- matrix(as.numeric(NA), tam, 3)colnames(quantx) <- c("25%", "Mediana", "75%")quanty <- quantxfor(i in min.k:tam){
quantx[i,] <- quantile(V[1:i,1], probs = c(0.25, 0.50, 0.75))quanty[i,] <- quantile(V[1:i,2], probs = c(0.25, 0.50, 0.75))
}return(list(X = quantx, Y = quanty))
}
quant <- cuantiles(MarkovChain)
Gráfica de los pares (a, b) con los cuantiles acumulados
par(mfrow=c(2,1))plot(MarkovChain[,1],type="l",main="x")lines(quant$X[,1], col="blue", lwd=2)lines(quant$X[,2], col="red", lwd=2)lines(quant$X[,3], col="blue", lwd=2)plot(MarkovChain[,2],type="l",main="y")lines(quant$Y[,1], col="blue", lwd=2)lines(quant$Y[,2], col="red", lwd=2)lines(quant$Y[,3], col="blue", lwd=2)
3
0 2000 4000 6000 8000 10000
−4
0
x
Index
Mar
kovC
hain
[, 1]
0 2000 4000 6000 8000 10000
04
y
Index
Mar
kovC
hain
[, 2]
Histogramas de todas las observaciones
x <- seq(0, 1, length = 1000)y <- seq(0, 1, length = 1000)
par(mfrow=c(1,2))hist(MarkovChain[,1],prob = T,main="marginal x")hist(MarkovChain[,2],prob = T,main="marginal y")
4
marginal x
MarkovChain[, 1]
Den
sity
−4 −3 −2 −1 0
0.0
0.2
0.4
0.6
0.8
1.0
1.2
marginal y
MarkovChain[, 2]
Den
sity
0 1 2 3 4 5
0.0
0.5
1.0
1.5
Despreciando los primeros k valores de nuestra lista de pares:
#despreciamos los primeros k valores y obtenemosk <- 2000lc <- nrow(MarkovChain)Chain <- MarkovChain[k:lc,]
Obteniendo la gráfica de dispersión de los datos y el estimador puntual
#Grafica dispersiónpar(mfrow=c(1,1))plot(Chain, pch=20)points(mean(Chain[,1]),mean(Chain[,2]),col="red",lwd=3)
5
−3.5 −3.0 −2.5 −2.0
3.0
3.5
4.0
4.5
5.0
x
y
Obteniendo los histogramas de las nuevas cadenas de markov
#histogramas margiales "x" y "y"par(mfrow=c(1,2))hist(Chain[,1],prob = T,main="marginal x")hist(Chain[,2],prob = T,main="marginal y")
marginal x
Chain[, 1]
Den
sity
−4.0 −3.0 −2.0
0.0
0.5
1.0
1.5
2.0
marginal y
Chain[, 2]
Den
sity
3.0 4.0 5.0
0.0
0.5
1.0
1.5
2.0
2.5
6
Obteniendo la autocorrealación de los datos
#Autocorrelacionesautocor <- function(V, brincos=20){
lc <- length(V)autcor <- numeric(brincos)names(autcor) <- 1:brincosfor (i in 1:brincos){
autcor[i] <- cor(V[1:(lc-i)],V[(i+1):lc],method="spearman")}barplot(autcor, main = "Autocorrelaciones de Spearman", xlab = "")return(autcor)
}
autcor.X <- autocor(Chain[,1])
1 2 3 4 5 6 7 8 9 11 13 15 17 19
Autocorrelaciones de Spearman
−0.
010.
000.
010.
02
autcor.Y <- autocor(Chain[,2])
7
1 2 3 4 5 6 7 8 9 11 13 15 17 19
Autocorrelaciones de Spearman−
0.03
−0.
010.
010.
03
Tomando sólo los datos que no son fuertemente dependientes:
brincos <- 6
#tomamos cada brincos elementoslc <- nrow(Chain)p <- floor((lc-1)/brincos)FChain <- Chain[1+(0:p)*brincos,]lc <- nrow(FChain)
Obteniendo las funciones predictivas a posteriori
dpred0 <- function(y) mean(mapply(dunif, rep(y, lc), FChain[,1], FChain[,2]))dpred <- function(y) sapply(y, dpred0)ppred0 <- function(y) mean(mapply(punif, rep(y, lc), FChain[,1], FChain[,2]))ppred <- function(y) sapply(y, ppred0)
Graficando la densidad predictiva a posteriori
y <- seq(a-2, b+2, length = 1000)par(mfrow=c(1,1))plot(y, dpred(y), type = "l", lwd = 2, main = "Densidad predictiva a posteriori")
8
−4 −2 0 2 4
0.00
0.05
0.10
0.15
Densidad predictiva a posteriori
y
dpre
d(y)
Obteniendo la estimación puntual
pp <- 0.95 # probabilidad del intervaloinferencia <- matrix(nrow = 2, ncol = 3)colnames(inferencia) <- c("inferior", "puntual", "superior")rownames(inferencia) <- c("a", "b")inferencia[1, ] <- quantile(FChain[,1], probs = c(0.5 - pp/2, 0.5, 0.5 + pp/2))inferencia[2, ] <- quantile(FChain[,2], probs = c(0.5 - pp/2, 0.5, 0.5 + pp/2))
Gráficas de las estimaciones para a y b
par(mfrow = c(1,2))hist(FChain[,1], main = "Marginal a posteriori", xlab = "a")rug(inferencia[1,],col = "blue", lwd = 2)hist(FChain[,2], main = "Marginal a posteriori", xlab = "b")rug(inferencia[2,],col = "blue", lwd = 2)
9
Marginal a posteriori
a
Fre
quen
cy
−3.0 −2.5 −2.0
010
020
030
040
0
Marginal a posteriori
b
Fre
quen
cy3.0 3.5 4.0 4.5
010
020
030
040
0
Gráfica de dispersión:
#Grafica dispersiónpar(mfrow=c(1,1))plot(FChain, pch=20)points(mean(FChain[,1]),mean(FChain[,2]),col="red",lwd=3)
−3.2 −3.0 −2.8 −2.6 −2.4 −2.2 −2.0
3.0
3.5
4.0
4.5
x
y
10
Estimación puntual de una observación futura
pp <- 0.95 # probabilidad del intervalointegrate(dpred, -10, 10, subdivisions =1000L)
## 0.9999935 with absolute error < 1e-04
Obteniendo la media predictiva
y.pred <- function(y) y*dpred(y)(media <- integrate(y.pred, -10, 10, subdivisions = 1000L)$value)
## [1] 0.5162403
g <- function(z, cuantil) ppred(z) - cuantil
La mediana predictiva
(mediana.pred <- uniroot(g, c(-10, 10), cuantil = 0.5)$root)
## [1] 0.5161542
Finalmente nuestro intervalo predictivo con probabilidad de .95 es:
#intervalopar(mfrow = c(1,1))inf.pred <- uniroot(g, c(-10, 10), cuantil = 0.5 - pp/2)$rootsup.pred <- uniroot(g, c(-10, 10), cuantil = 0.5 + pp/2)$rootc(inf.pred, sup.pred)
## [1] -1.978736 3.012554
plot(y, dpred(y), type = "l", lwd = 3, main = "Densidad predictiva a posteriori")rug(c(inf.pred, mediana.pred, sup.pred), col = "blue", lwd = 3)
11
−4 −2 0 2 4
0.00
0.05
0.10
0.15
Densidad predictiva a posteriori
y
dpre
d(y)
12