CUANDO LA INTUICIÓN FALLA - SOBRE LA LEY FUERTE DE LOS GRANDES NÚMEROS
La ley fuerte de los grandes números, grosso modo, establece que si tiramos infinitas monedas (no trucadas), el número de caras y el de cruces tenderá a ser el mismo.
Ahora bien, hay que tener mucho cuidado con lo que uno deduce de ese endemoniado "tenderá". Por la propia naturaleza del problema pensaríamos que, si jugamos a cara o cruz, no tenemos peligro de perder, dado que en media saldrán las mismas caras que cruces. Esperaríamos una serie de partidas repetitivas, con valores próximos al cero todo el rato, donde no podemos perder demasiado.
Y no es así.
En realidad, la incorrecta interpretación de este problema es por dos causas principales:
La ley fuerte de los grandes números habla de promedios. Es decir, número de caras dividido por número de tiradas. Y cuando dividimos por un número grande todo parece más cercano de lo que es.
Que algo tienda a equilibrarse cuando el número de tiradas tiende a infinito quiere decir que se acercará a cero tanto como queramos … en el infinito. No en N=100, 1000 o 1000.000. En el infinito. Antes, puede hacer lo que le dé la gana.
Veamos qué sucede en la práctica cuando simulamos este problema.
Parámetros genéricos, definición de las funciones
Necesitaremos definir estas variables
set.seed(12345)
# cara=1, cruz=0
CARA = 1
CRUZ = -1
La función para dibujar las trayectorias.
Debajo, podemos encontrar la función dibujar_grafica que, dadas las trayectorias, nos creará una gráfica con todas ellas, con las escalas de los ejes ajustadas, para que podamos entender qué sucede. No voy a extenderme en esta función, dado que es una simple función auxiliar para dibujar una líneas con R básico.
# dibujamos las curvas
dibujar_grafica<-function(ncaras_acum, N, n_trayectorias)
{
titulo<-paste("Evolución para N=",N,sep="")
maximo <- max(ncaras_acum)
minimo <- min(ncaras_acum)
n_tiradas_acum<-rep(1:N)
for(curva in 1:n_trayectorias)
{
plot(n_tiradas_acum, ncaras_acum[curva,],
type="l",lwd=.25,col=curva, xlab="número de tiradas",
ylab="caras - cruces",main=titulo,
xlim=c(1,N),ylim=c(maximo,minimo))
par(new=TRUE)
}
#marcamos la media esperada
abline(h=0,col="black",lwd=3)
}
El cálculo de las trayectorias
Más interesante resulta la función calcular_trayectorias. Esta función lo que hace es tira N monedas al azar e ir sumando: CARA=+1, CRUZ=-1. La función rellena una matriz de dimensiones n_trayectorias filas y N columnas con el acumulado de caras.
calcular_trayectorias<-function(N,n_trayectorias)
{
ncaras_acum<-matrix(0,nrow=n_trayectorias,ncol=N)
for(curva in 1:n_trayectorias)
for(i in 2:N)
{
MI_TIRADA<-sample(c(CARA,CRUZ),1)
ncaras_acum[curva,i] <-ncaras_acum[curva,i-1]+MI_TIRADA
}
return(ncaras_acum)
}
Toma de contacto - Trayectorias para N=100
Para empezar, vamos a generar distintas trayectorias para el caso N=100. Del gráfico, está claro que no le da la gana de converger para N=100 y tendremos que buscar valores más grandes. Esto no sorprende a nadie.
N<-100 #numero de tiradas
n_trayectorias<-20 #generamos 10 curvas
ncaras_acum<-calcular_trayectorias(N,n_trayectorias)
dibujar_grafica(ncaras_acum,N,n_trayectorias)
El caso N=1000
Ahora ya no podremos decir que N es demasiado pequeño.
N<-1000 #numero de tiradas
n_trayectorias<-20 #generamos 20 curvas
ncaras_acum<-calcular_trayectorias(N,n_trayectorias)
dibujar_grafica(ncaras_acum,N,n_trayectorias)
Con N=1000 se empieza a ver la realidad de la convergencia. Sí, es cierto. Andan alrededor de cero, pero nadie diría que están convergiendo al cero.
N=10.000
Este número de tiradas ya empieza a ser importante. Y también nuestra sorpresa al comprobar el resultado.
N<-10000 #numero de tiradas
n_trayectorias<-20 #generamos 20 curvas
ncaras_acum<-calcular_trayectorias(N,n_trayectorias)
dibujar_grafica(ncaras_acum,N,n_trayectorias)
N enorme. N=10^6
Ya al límite de las capacidades de un ordenador doméstico, N=10^6 confirma nuestras sospechas. Cierto: algún día convergerá, pero es muy diferente a tener un equilibrio en las trayectorias.
N<-10^6 #numero de tiradas
n_trayectorias<-20 #generamos 20 curvas
ncaras_acum<-calcular_trayectorias(N,n_trayectorias)
dibujar_grafica(ncaras_acum,N,n_trayectorias)
20 trayectorias y cada una diferente. En contra de nuestra intuición, las trayectorias no cruzan el cero una y otra vez. Puede verse cómo la mayoría de ellas se mantienen por encima o por debajo, con varianza acotada pero se van ramificando.
Comentarios
Publicar un comentario