domingo, 9 de octubre de 2016

18-Cadenas de Markov 1

Simulación de Cadenas de Markov 1 de 10

Simulación de una trayectoria de una cadena de Markov.

Caminata aleatoria simple.

Damos una definición breve de una cadena de Markov con espacio de estados y espacio temporal discretos. Además simulamos el fácil ejemplo de la caminata aleatoria simple.

Definición 1.

Supongamos una sucesión de v.a.’s \(X_0, X_1, X_2, \ldots\) cuyo soporte es un subconjunto \(\mathcal{S}\) de los números naturales. Si para cualesquiera números enteros \(n\ge 1\) y \(m\ge 0\) se cumple que

  1. \[P(X_n = \alpha_n\mid X_{n-1}=\alpha_{n-1},\ldots, X_0=\alpha_0) = P(X_n = \alpha_n\mid X_{n-1}=\alpha_{n-1}),\]
  2. \[P(X_{n+m} =y\mid X_m = x) = P(X_n = y \mid X_0 = x),\]

donde \(\alpha_0, \alpha_1 , \ldots, \alpha_n, x, y \in \mathcal{S}\), entonces diremos que \(\left\{X_i\right\}_{i=0}^{\infty}\) es una cadena de Markov homogénea en el tiempo (CMHT). La primer condición es conocida como propiedad de Markov, y la segunda es la condición de homogeneidad en el tiempo.

Ejemplo 1.

Supongamos que \(\xi_1, \xi_2, \ldots\) es una sucesión de v.a.i.i.d. tales que \(P(\xi_k= 1)= p\) y \(P(\xi_k= -1)= 1 - p\) para \(k\ge 1\). Sea \(X_n = X_{n-1}+\xi_n\) para \(n\ge 1\) y definimos \(X_0=0\). Se puede demostrar que \(\left\{X_i\right\}_{i=0}^{\infty}\) es una CMHT. Esta cadena es conocida como caminata aleatoria simple.

## Simulación del valor de la cadena al tiempo n con probabilidad p de
## incrementar en uno el valor de la cadena después de un paso.

set.seed(123)
n <- 10
p <- 0.54
X0 <- 0
tornillos <- 2*rbinom(n,1,p)-1
X <- numeric(n)
X[1] <- X0 + tornillos[1]
for(i in 2:n){
        X[i] <- X[i-1] + tornillos[i]
}
paste('Valor de la cadena al tiempo', 0:n , '=',  c(X0,X))
##  [1] "Valor de la cadena al tiempo 0 = 0" 
##  [2] "Valor de la cadena al tiempo 1 = 1" 
##  [3] "Valor de la cadena al tiempo 2 = 0" 
##  [4] "Valor de la cadena al tiempo 3 = 1" 
##  [5] "Valor de la cadena al tiempo 4 = 0" 
##  [6] "Valor de la cadena al tiempo 5 = -1"
##  [7] "Valor de la cadena al tiempo 6 = 0" 
##  [8] "Valor de la cadena al tiempo 7 = 1" 
##  [9] "Valor de la cadena al tiempo 8 = 0" 
## [10] "Valor de la cadena al tiempo 9 = -1"
## [11] "Valor de la cadena al tiempo 10 = 0"
## Otra forma más rápida.
set.seed(123)
n <- 10
p <- 0.54
X0 <- 0
tornillos <- 2*rbinom(n,1,p)-1
Xn <- c(X0, (X0 + cumsum(tornillos)))
paste('Valor de la cadena al tiempo', 0:n , '=',  Xn)
##  [1] "Valor de la cadena al tiempo 0 = 0" 
##  [2] "Valor de la cadena al tiempo 1 = 1" 
##  [3] "Valor de la cadena al tiempo 2 = 0" 
##  [4] "Valor de la cadena al tiempo 3 = 1" 
##  [5] "Valor de la cadena al tiempo 4 = 0" 
##  [6] "Valor de la cadena al tiempo 5 = -1"
##  [7] "Valor de la cadena al tiempo 6 = 0" 
##  [8] "Valor de la cadena al tiempo 7 = 1" 
##  [9] "Valor de la cadena al tiempo 8 = 0" 
## [10] "Valor de la cadena al tiempo 9 = -1"
## [11] "Valor de la cadena al tiempo 10 = 0"

Ahora un gráfico simple de la trayectoria.

## Simulación del valor de la cadena al tiempo n con probabilidad p de
## incrementar en uno el valor de la cadena después de un paso.

set.seed(123)
n <- 10
p <- 0.54
X0 <- 0
tornillos <- 2*rbinom(n,1,p)-1
X <- numeric(n)
X[1] <- X0 + tornillos[1]
for(i in 2:n){
        X[i] <- X[i-1] + tornillos[i]
}
plot( 0:n ,  c(X0,X), type = 'b',col = 'red', lwd = 2, las = 2, ylab = '')
title(main = 'Caminata aleatoria simple')
abline(h=0,v=0)

## Otra forma más rápida.
set.seed(123)
n <- 10
p <- 0.54
X0 <- 0
tornillos <- 2*rbinom(n,1,p)-1
Xn <- c(X0, (X0 + cumsum(tornillos)))
plot( 0:n ,  Xn , type = 'o' ,col = 'blue', lwd = 2, las = 2, ylab = '')
title(main = 'Caminata aleatoria simple')
abline(h=0,v=0)

Ahora, vemos al mismo tiempo varias trayectorias simuladas. Primero en varias gráficas y después en una sola gráfica.

set.seed(123)
n <- 10
p <- 0.54
X0 <- 0
Xn <- matrix(0,(n+1),9)
for(i in 1:9){
        tornillos <- 2*rbinom(n,1,p)-1
        Xn[,i] <- c(X0, (X0 + cumsum(tornillos)))
}
par(mfrow = c(3,3),mar = rep(0, 4),cex.axis=0.8,
           oma = rep(4.1, 4),bg = 'lightyellow')
miny <- min(Xn)
maxy <- max(Xn)
for(i in 1:9){
        if(i<7){
                plot( 0:n ,  Xn[,i] , type = 'o',
                      lwd = 2, axes = F,ylim = c(miny,maxy),
                      col=rainbow(9)[i],ylab = '', xlab = '')
                abline(h=0,v=0)
                box()
        }else{
                plot( 0:n ,  Xn[,i] , type = 'o',
                      lwd = 2, axes = F,ylim = c(miny,maxy),
                      col=rainbow(9)[i],ylab = '', xlab = '')
                axis(1,0:n)
                abline(h=0,v=0)
                box()
        }
        
}
mtext('Caminata aleatoria simple', side = 3, line = 3,font = 2, outer = TRUE)

par(mfrow=c(1,1), bg='white')
#############
#############
matplot(0:n,Xn, type = 'o',pch=16, lty=1,col = rainbow(9))
abline(h=miny:maxy,v=0:n,col = 'lightgray')
abline(h=0,v=0)
axis(2,c(miny,maxy))
mtext('Caminatas aleatorias simples', side = 3, line = 1,font = 3, outer = TRUE)

Por último, ahora simulamos las caminatas durante 50 pasos únicamente cambiando \(n\) a 50.

# set.seed(123) Sin semilla
n <- 50
p <- 0.54
X0 <- 0
Xn <- matrix(0,(n+1),9)
for(i in 1:9){
        tornillos <- 2*rbinom(n,1,p)-1
        Xn[,i] <- c(X0, (X0 + cumsum(tornillos)))
}
par(mfrow = c(3,3),mar = rep(0, 4),cex.axis=0.8,
           oma = rep(4.1, 4),bg = 'lightyellow')
miny <- min(Xn)
maxy <- max(Xn)
for(i in 1:9){
        if(i<7){
                plot( 0:n ,  Xn[,i] , type = 'o',
                      lwd = 2, axes = F,ylim = c(miny,maxy),
                      col=rainbow(9)[i],ylab = '', xlab = '')
                abline(h=0,v=0)
                box()
        }else{
                plot( 0:n ,  Xn[,i] , type = 'o',
                      lwd = 2, axes = F,ylim = c(miny,maxy),
                      col=rainbow(9)[i],ylab = '', xlab = '')
                axis(1,0:n)
                abline(h=0,v=0)
                box()
        }
        
}
mtext('Caminata aleatoria simple', side = 3, line = 3,font = 2, outer = TRUE)

par(mfrow=c(1,1), bg='white')
#############
#############
matplot(0:n,Xn, type = 'o',pch=16, lty=1,col = rainbow(9))
abline(h=miny:maxy,v=0:n,col = 'lightgray')
abline(h=0,v=0)
axis(2,c(miny,maxy))
mtext('Caminatas aleatorias simples', side = 3, line = 1,font = 3, outer = TRUE)

No hay comentarios:

Publicar un comentario