Modelos Estadísticos 1

Obteniendo resultados estadísticos con R, parte III

Posted in Tutoriales, Uncategorized by hector on abril 28, 2009

Esta es la tercera parte de una breve introducción a los comandos del sistema estadístico R. El objetivo hasta ahora ha sido obtener fácilmente resultados de estadísticas descriptivas; en esta parte nos concentraremos en desarrollar simulaciones de probabilidades.


Recordemos los problemas de la Hoja de Trabajo 5…

Disco duro I. Considere la posición inicial de un disco duro como cero (0) y la posición final como uno (1). La cabeza del disco duro lee archivos en posiciones aleatorias del disco. Luego de cada lectura, la cabeza del disco regresa a la posición inicial, i.e. cero (0). ¿Cuál es la distancia promedio que se mueve la cabeza del disco duro? Ayuda: asuma una distribución uniforme.

En clase respondimos esta pregunta de dos formas: la manera analítica y la manera computacional. Sin embargo, en ese entonces empleamos el lenguaje Python por tener una sintaxis clara y porque algunos de ustedes ya lo habían utilizado antes. Recordemos que en Python el script se veía así:

from pylab import *

def disco1(N=1000):
    """Resuelve el Problema 1 de la Hoja de Trabajo 5.

    Input: un numero grande (N) de lecturas en el disco.
    """
    dist_acum = 0   # distancia acumulada
    for k in range(N):   # loop para un numero grande (N) de lecturas
        pos = random()   # posicion de lectura
        dist = 2*pos     # distancia de ida y vuelta
        dist_acum = dist_acum + dist   # acumula la distancia
    return dist_acum / N   # normaliza para el numero de lecturas realizadas

En una terminal de Python podemos cargar el archivo con el comando run, de la siguiente manera:

In [23]: run 2009-cu109-hoja05.py

In [24]: disco1(10000)
Out[24]: 1.0039466111356798

In [25]: disco1(10000)
Out[25]: 1.0055115295663883

In [26]: disco1(10000)
Out[26]: 0.99116255989859414

In [27]: disco1(10000)
Out[27]: 1.0023458574057422

Vemos también que varias corridas de la función disco1 nos devuelven valores que tienden a 1, la respuesta esperada.

Ahora bien, en el sistema estadístico R el script no cambia mucho. Antes de ver el script completo, vale la pena mencionar un caso sencillo del enunciado de iteración for en R:

> seq(5)
[1] 1 2 3 4 5
> for (k in seq(5)) print(k*k)
[1] 1
[1] 4
[1] 9
[1] 16
[1] 25

Acá está el script en R:

disco1 = function(N)
# Resuelve el Problema 1 de la Hoja de Trabajo 5
{
dist_acum = 0   # distancia acumulada
for (k in seq(N))   # loop para un numero grande (N) de lecturas
    {
    pos = runif(1)   # posicion de lectura
    dist = 2*pos     # distancia de ida y vuelta
    dist_acum = dist_acum + dist   # acumula la distancia
    }
return(dist_acum/N)   # normaliza para el numero de lecturas realizadas
}

Pregunta 0.

Explique cómo funciona el comando runif en el código anterior.

En una terminal de R podemos cargar el archivo con el comando source (noten la similitud con el comando run de Python). Además, varias corridas de la funcion disco1 (con un número grande de lecturas) nos devuelven nuevamente valores cercanos a 1.

> source('2009-cu109-hoja05.R')
> disco1(100000)
[1] 1.000558
> disco1(100000)
[1] 1.000702
> disco1(100000)
[1] 0.9997121
> disco1(100000)
[1] 1.003375

Aclaración: ustedes obtendrán respuestas ligeramente distintas debido a la naturaleza de los algoritmos que generan números aleatorios.

Nota: asegúrense de que directorio actual sea el adecuado, i.e. File / Change dir…, o bien, en la terminal de R pueden usar los comandos getwd y
setwd (vean la documentación de éstos para ver cómo funcionan).


Disco duro II. Considere el escenario del problema anterior con la variante que la cabeza del disco duro no regresa a la posición inicial (cero) luego de cada lectura. ¿Cuál es la distancia promedio que se mueve la cabeza del disco duro ahora?

De manera similar al problema Disco duro I, respondemos acá con una comparación entre lenguajes: Python versus R.

El script en Python:

from pylab import *

def disco2(N=1000):
    """Resuelve el Problema 2 de la Hoja de Trabajo 5.

    Input: un numero grande (N) de lecturas en el disco.
    """
    dist_acum = 0   # distancia acumulada
    pos_antes = random()   # posicion anterior de lectura
                           # es igual que empezar en la posicion cero (0)
    for k in range(N):   # loop para un numero grande (N) de lecturas
        pos = random()   # posicion actual de lectura
        dist = abs(pos - pos_antes)   # distancia entre posiciones
        dist_acum = dist_acum + dist   # acumula la distancia
        pos_antes = pos   # la posicion actual es ahora la pos. anterior
    return dist_acum / N

En una terminal de Python, las respuestas de la función disco2 tienden a 0.333 (la respuesta teórica es 1/3):

In [36]: run 2009-cu109-hoja05.py

In [37]: disco2(10000)
Out[37]: 0.33279175920353116

In [38]: disco2(10000)
Out[38]: 0.33385206536325829

In [39]: disco2(10000)
Out[39]: 0.33342096518733244

Nuevamente el script en R se ve bastante similar:

disco2 = function(N)
# Resuelve el Problema 2 de la Hoja de Trabajo 5
{
dist_acum = 0   # distancia acumulada
pos_antes = runif(1)   # posicion anterior de lectura
                       # podemos tambien empezar en cero (0)
for (k in seq(N))   # loop para un numero grande (N) de lecturas
    {
    pos = runif(1)    # posicion actual de lectura
    dist = abs(pos - pos_antes)     # distancia entre posiciones
    dist_acum = dist_acum + dist    # acumula la distancia
    pos_antes = pos   # la posicion actual es ahora la pos. anterior
    }
return(dist_acum/N)   # normaliza para el numero de lecturas realizadas
}

En una terminal de R los resultados obtenidos son similares a los siguientes:

> source('2009-cu109-hoja05.R')
> disco2(100000)
[1] 0.3333376
> disco2(100000)
[1] 0.333403
> disco2(100000)
[1] 0.3327578

Pregunta 1.

Disco duro III. Considere la posición inicial de un disco duro como cero (0) y la posición final como uno (1). La cabeza del disco duro lee archivos en posiciones aleatorias del disco. Luego de cada lectura, la cabeza del disco regresa a su posición de reposo. Si dicha posición de reposo es cero (0) tenemos el mismo problema que en Disco duro I. ¿Cuál es la distancia promedio que se mueve la cabeza del disco duro dadas las siguientes posiciones de reposo? Ayuda: nuevamente asuma una distribución uniforme.

  1. Posición de reposo en 1.
  2. Posición de reposo en 0.5.
  3. Posición de reposo en 0.25.
  4. Posición de reposo en 0.75.

Ayuda: Para responder esta pregunta debe escribir una función en R en base a la siguiente función en Python:

def disco3(N, pos_reposo):
    dist_acum = 0
    for k in range(N):
        pos = random()
        dist = 2*abs(pos_reposo - pos)
        dist_acum = dist_acum + dist
    return dist_acum / N

Nota: no olviden comentar cada línea adecuadamente (como en los ejemplos anteriores).


Pregunta 2.

En la pregunta anterior, ¿encuentran algún patrón al cambiar la posición de reposo? ¿cómo cambia la distancia promedio al barrer dicha posición de reposo del inicio (0) hasta el final (1)? ¿será acaso una función lineal, una función cuadrática, o talvez una función exponencial?

Tagged with: , ,

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: