Simple Random Walk
Introducción
La caminata aleatoria en Z, es la más simple de todas, de ahí su nombre. \(X_1\) toma valores en \(\{-1; 1\}\), y la caminata comienza en \(0\) y está definida para valores en Z. Las probabilidades se denotan como:
\[\begin{equation} P(X_1 = 1) = P(X_1 = -1) = 1/2 \end{equation}\]
Considerando el caso más general, se tiene que
\[\begin{equation} P(X_1 = 1) = p \ \ y \ \ P(X_1 = -1) = 1 - p \end{equation}\]
A este respecto, vamos a obtener la probabilidad de que el caminante se encuentre en la posición \(m\) después de \(N\) pasos.
Para \(m < N\) hay muchas maneras de empezar en \(0\) y pasar por \(N\) saltos a sitios vecinos más cercanos y terminar en \(m\). Sabemos que el número de pasos viene dado por la posición final más el número de pasos a la izquierda, es decir, \(n_1 = m + n_2\), y a parte sabemos que \(n_1 + n_2 = N\), solucionando para \(n_1\) y \(n_2\), se tiene
\[\begin{equation} n_1 = \frac{1}{2} (N + m) \\ n_2 = \frac{1}{2} (N - m) \\ \end{equation}\]
La probabilidad de una secuencia de saltos a la izquierda y a la derecha es el producto de las probabilidades de los saltos individuales. Como los saltos individuales son independientes, todos los caminos que empiezan en \(0\) y terminan en \(m\) tienen la misma probabilidad global.
\[\begin{equation} p^{n_1} q^{n_2} = p^{\frac{1}{2} (N + m)} q^{\frac{1}{2} (N + m)} \end{equation}\]
Esta probabilidad debe multiplicarse por el número total de trayectorias con \(n_1\) pasos a la derecha y \(n_2\) pasos a la izquierda.
Esto viene dado por el número de formas de poner \(n_1\) objetos de \(N\) en una caja y \(n_2 = N - n_1\) objetos en otra caja. El primer objeto se puede elegir de \(N\) maneras, el segundo de \(N - 1\) maneras y así sucesivamente. Por lo tanto, el número total de elección de \(n_1\) objetos es \(N(N - 1)(N - 2)(N - n_1 - 1)\). Pero los \(n_1\) objetos son idénticos y pueden disponerse en cualquier orden.
\[\begin{equation} \frac{N!}{n_1! n_2!} = \frac{N!}{n_1!(N-n_1)!} \end{equation}\]
La probabilidad de estar en la posición m después de \(N\) saltos viene dada, por
\[\begin{equation} p(m, N) = \frac{N!}{\left(\frac{N+m}{2}\right)! \left(\frac{N-m}{2}\right)!} p^{\frac{1}{2} (N + m)} q^{\frac{1}{2} (N - m)} \end{equation}\]
Si conocieramos la distribución de probabilidad podríamos obtener todos los momentos. Note que la ecuación anterior se parece mucho a la distribución binomial, si consideramos el número de pasos hacia la derecha como \(n = (N +m)/2\) podemos escribir
\[\begin{equation} p(n, N) = \frac{N!}{n! (N-n)!} p^{n} q^{N - m} \end{equation}\]
Suponemos que ya conocemos los momentos de la distribución binomial, entonces
\[\begin{equation} E(n) = NP \\ Var(n) = Npq \end{equation}\]
Como \(n = (N + m)/2! \rightarrow m = 2n - N\), el valor esperado de la posición del caminante después de \(N\) pasos viene dada ahora por
\[\begin{eqnarray} E(m) & = & 2E(n) - N \\ & = & 2Np - N \\ & = & N(2p - 1) \end{eqnarray}\]
y la varianza viene dada por
\[\begin{eqnarray} Var[m] & = & 4Var(n) \\ & = & 4Npq \end{eqnarray}\]
Simulación
Caminata aleatoria simple (1-D)
# Function para simular una caminata aleatoria simple
<- function(n.steps, n.sim, prob.r=0.5){
simple.random.walk <- n.steps
n <- prob.r
a # movimiento
= -1
x.left = 1
x.right # iteración
<- matrix(0,ncol=n+1,nrow=n.sim)
Sn_mat for(i in 1:n.sim){
for(j in 2:(n+1)){
<- sample(c(x.left,x.right), 1, prob=c(1-a,a), replace=F)
step <- Sn_mat[i,j-1] + step
Sn_mat[i,j]
}
}# names
<- sapply(1:(n+1),function(i) paste('step',i,sep=''))
names # data frame
<- data.frame('sim'=sapply(1:n.sim, function(i) paste('sim',i,sep='')),
result_df 'Sn'=Sn_mat)
return(result_df)
}
Ejemplo 1: \(p = 0.5\)
####### Ejemplo:
<- 10000 # número de pasos
n.steps <- 1000 # número de trayectorias
n.sim <- 0.5 # probabilidad de moverse a la derecha
p
<- simple.random.walk(n.steps, n.sim, prob.r=p)
df
## trayectorias
<- df %>%
df_rw gather(key='t',value='valor',-sim) %>%
mutate(t = as.numeric(substring(t,4,10))) %>%
arrange(sim)
# valores teóricos
<- data.frame('t'=c(1:n.steps),'p'=p) %>%
moments_rw mutate('mean'=t*(p-(1-p)),
'sd_sup'=mean + 2*sqrt(4*t*p*(1-p)),
'sd_inf'=mean - 2*sqrt(4*t*p*(1-p)))
<- ggplot(df_rw,aes(x=t,y=valor,color=sim)) +
p1 geom_line() +
geom_line(moments_rw, mapping=aes(x=t,y=mean),col='red',size=0.7) +
geom_line(moments_rw, mapping=aes(x=t,y=sd_sup),col='blue',size=0.7,linetype = "dashed") +
geom_line(moments_rw, mapping=aes(x=t,y=sd_inf),col='blue',size=0.7,linetype = "dashed") +
scale_colour_grey(start = 0.2,end = 0.6) +
theme(legend.position="none") +
ggtitle(paste(n.sim," trayectorias del camino aleatorio simple.",sep=''))
p1
Ejemplo 2: \(p = 0.6\)
####### Ejemplo
<- 10000 # número de pasos
n.steps <- 1000 # número de trayectorias
n.sim <- 0.6 # probabilidad de moverse a la derecha
p
<- simple.random.walk(n.steps, n.sim, prob.r=p)
df
# trayectorias
<- df %>%
df_rw gather(key='t',value='valor',-sim) %>%
mutate(t = as.numeric(substring(t,4,10))) %>%
arrange(sim)
# valores teóricos
<- data.frame('t'=c(1:n.steps),'p'=p) %>%
moments_rw mutate('mean'=t*(p-(1-p)),
'sd_sup'=mean + 2*sqrt(4*t*p*(1-p)),
'sd_inf'=mean - 2*sqrt(4*t*p*(1-p)))
<- ggplot(df_rw,aes(x=t,y=valor,color=sim)) +
p2 geom_line() +
geom_line(moments_rw, mapping=aes(x=t,y=mean),col='red',size=0.7) +
geom_line(moments_rw, mapping=aes(x=t,y=sd_sup),col='blue',size=0.7,linetype = "dashed") +
geom_line(moments_rw, mapping=aes(x=t,y=sd_inf),col='blue',size=0.7,linetype = "dashed") +
scale_colour_grey(start = 0.2,end = 0.6) +
theme(legend.position="none") +
ggtitle(paste(n.sim," trayectorias del camino aleatorio simple.",sep=''))
p2
Ejemplo 3: \(p = 0.4\)
####### Ejemplo
<- 10000 # número de pasos
n.steps <- 1000 # número de trayectorias
n.sim <- 0.4 # probabilidad de moverse a la derecha
p
<- simple.random.walk(n.steps, n.sim, prob.r=p)
df
# trayectorias
<- df %>%
df_rw gather(key='t',value='valor',-sim) %>%
mutate(t = as.numeric(substring(t,4,10))) %>%
arrange(sim)
# valores teóricos
<- data.frame('t'=c(1:n.steps),'p'=p) %>%
moments_rw mutate('mean'=t*(p-(1-p)),
'sd_sup'=mean + 2*sqrt(4*t*p*(1-p)),
'sd_inf'=mean - 2*sqrt(4*t*p*(1-p)))
<- ggplot(df_rw,aes(x=t,y=valor,color=sim)) +
p3 geom_line() +
geom_line(moments_rw, mapping=aes(x=t,y=mean),col='red',size=0.7) +
geom_line(moments_rw, mapping=aes(x=t,y=sd_sup),col='blue',size=0.7,linetype = "dashed") +
geom_line(moments_rw, mapping=aes(x=t,y=sd_inf),col='blue',size=0.7,linetype = "dashed") +
scale_colour_grey(start = 0.2,end = 0.6) +
theme(legend.position="none") +
ggtitle(paste(n.sim," trayectorias del camino aleatorio simple.",sep=''))
p3
Caminata aleatoria simple (2-D)
# Caminata aleatoria simple en dos dimensiones
<- function(base, n.steps){
randomWalk2d_plot
<- base
df <- df %>%
df_2d gather(key='t',value='valor',-sim) %>%
filter(sim == 'sim1' | sim=='sim2') %>%
spread(sim,valor) %>%
mutate(t = as.numeric(substring(t,4,10))) %>%
arrange(t) %>%
filter(t <= n.steps)
<- ggplot(df_2d,aes(x=sim1,y=sim2))+
b2 geom_point(color="blue") +
geom_point(df_2d%>%filter(t == 1),mapping=aes(x=sim1,y=sim2),color="green") +
geom_point(df_2d%>%filter(t == max(t)),mapping=aes(x=sim1,y=sim2),color="red") +
geom_path() +
theme(axis.title.x = element_blank(),
axis.title.y = element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank(),
axis.ticks.x=element_blank(),
axis.ticks.y=element_blank())
return(b2)
}
Ejemplo 1:
# valores iniciales
<- 10000 # numero de pasos
n.steps <- 1000 # número de trayectorias
n.sim <- 0.5 # probabilidad de moverse a la derecha
p # Gráfico
<- simple.random.walk(n.steps,n.sim,prob.r=p)
df <- randomWalk2d_plot(df, n.steps)
b4 b4