Examen Diciembre 2012

Curso IMSER 2012

Instrucciones

La carpeta comprimida “examen-dic-2012.zip” tiene un script de R (“examen.R”) en el cual usted deberá guardar todos los comandos del ejercicio, siguiendo la demarcación que se muestra en el archivo mismo.

Los ejercicios marcados con un asterísco (*) valen 1.5 veces lo que el resto.

Nota: los ejercicios del parcial son dependientes de los anteriores en el sentido de que en ocasiones se construyen objetos a partir de otros creados en partes anteriores, pero no implica que no se puedan tratar de resolver independientemente.

Una vez terminado el parcial usted deberá subir el archivo “examen.R” al EVA en la página correspondiente.


Punto de partida: Modelo Discreto para la funcion del Crecimiento Exponencial

Bajo condiciones muy poco realistas o de corta duración, las poblaciones naturales tienen el potencial de crecer exponencialmente en el medio donde viven. El crecimiento de una población esta determinado por el aumento de su número de individuos por unidad de tiempo, i.e.: tasa de crecimiento. En el modelo discreto de Thomas R. Malthus, se considera que dicha tasa es constante en términos relativos y suele representarse por el parámetro \( \lambda \). Considerando los \( N_t \) como los tamaños poblacionales (número de individuos) para intervalos de tiempo \( t \) discretos, entonces lambda se obtiene así:

\[ \frac{N_t}{N_{t - 1}} = \lambda \; \text{(ec. 1)} \]

(nota: si esta ecuación no se ve correctamente, descargue el pdf con la letra)

donde \( \lambda \) (lambda) es el parámetro poblacional de crecimiento exponencial discreto y su valor determina crecimiento (\( \lambda > 1 \)), decrecimiento (\( \lambda < 1 \)) o estásis (\( \lambda = 1 \)). Nótese además que la ecuación 1 implica que el tamaño de la población para el tiempo \( t \) es equivalente al tamaño en el tiempo \( t - 1 \) multiplicado por el valor de una constante \( \lambda \), es decir que \( N_{t} = \lambda \cdot N_{t - 1} \).

A partir de la ecuación 1.1 es posible encontrar una solución de \( N \) para todos los \( t \) posibles, a partir de un valor inicial \( N_0 \), asumiendo que la tasa de crecimiento \( \lambda \) es constante. Dicha solución es:

\[ N_t = N_0 \cdot \lambda ^ t \; \text{(ec. 2)} \]

En los siguientes ejercicios usted tomará los datos de la población humana global para estimar el parámetro de crecimiento anual y comparar gráficamente la predicción de este modelo con los datos reales.

a. Importar los datos

Los datos de población humana se encuentran en el archivo “poblacion.humana.csv”. Escriba el comando correcto para importar esta tabla en una data.frame llamada poblacion.humana en la sesión de R. Estos son los datos de la población humana (número estimado de personas en el planeta) para todos los años entre 1950 y 2012.

b. Cambio de nombres

Cambie los nombres de las columnas de la data.frame: “Anio” y “Poblacion” en lugar de “Y” y “P” respectivamente.

c. Vectores N

Debe crear el vector N numérico con los valores de población que se encuentran en la data.frame. Debe crear además N0 y N1, vectores idénticos a N, pero a sin el último y primer elemento respectivamente.

d. Estimar los \( \lambda_t \)

Con estos datos, calcule para cada par de años consecutivos el valor de \( \lambda \) usando la primer ecuación indicada (ec. 1). Nótese que se obtendrán un total de \( n - 1 \) valores de lambda, siendo \( n \) el total de datos (en este caso 63). Entonces para evitar confusiones, llamaremos de aquí en más \( \lambda_t \) al cociente \( N_t / N_{t - 1} \) (y no al cociente \( N_{t + 1} / N_t \)).

El vector de todos estos \( \lambda \) se llamará lambda.

Nota: este ejercicio se puede realizar de varias maneras, utilice la que le resulte más cómoda. Abajo se muestra el resultado de hacer el summary de lambda (con valores redondeados):

summary(lambda)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.01    1.01    1.02    1.02    1.02    1.02

e. (*) Función para calcular los \( \lambda_t \)

Aprovechando el código creado para el ejercicio anterior diseñe una función llamada calcLambda que tome como argumento datos de población (un vector numérico como puede ser N, no la data.frame completa) y devuelva un vector con las tasas de crecimiento de los mismos, siguendo el mismo criterio del ejercicio anterior.

Nota: la función (como corresponde) no debe asumir en su código la existencia de ninguno de los vectores anteriormente creados (a saber: N, N0 y N1).

Recuerde que calcLambda debe funcionar correctamente para cualquier vector numérico que se use como argumento, sin importar su nombre, longitud o valor de los datos. En particular, utilizando los valores de N debería dar como salida el vector lambda.

Ejemplo de referencia (puede tener redondeos):

set.seed(0)
a <- rpois(24, 19)
l <- calcLambda(a)
l
##  [1] 0.7083 1.4118 1.0000 0.8333 0.6000 1.7500 1.0476 0.9545 0.8095 1.4706
## [11] 0.8000 0.8000 1.0625 1.0000 1.1765 0.7500 1.4667 0.9545 1.0952 0.9565
## [21] 0.8636 0.5263 2.1000

f. Estadísticos

A partir del vector lambda obtener los siguientes objetos:

Finalmente deberá guardar todos estos (4) valores en un vector llamado lest.

g. (*) Armar una lista

Crear una lista llamada lista con la data.frame poblacion.humana, el vector lambda y el vector lest con la siguiente estrucutra (según la salida de la función str):

str(lista)
## List of 2
##  $ data  :'data.frame':  63 obs. of  2 variables:
##   ..$ Anio     : int [1:63] 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 ...
##   ..$ Poblacion: num [1:63] 2.56e+09 2.59e+09 2.64e+09 2.68e+09 2.73e+09 ...
##  $ lambda:List of 2
##   ..$ values: num [1:62] 1.01 1.02 1.02 1.02 1.02 ...
##   ..$ stats : Named num [1:4] 1.02 1.02 1.01 1.02
##   .. ..- attr(*, "names")= chr [1:4] "" "" "2.5%" "97.5%"

Nota: debe deducir de este ejemplo tanto la estructura, es decir la estructura jerárquica del “árbol” de datos de la lista, así como los nombres y clases de objeto que se esperan para los distintos componentes.

h. (*) Modelo

Utilizando la equación 2 y los cuatro valores de \( \lambda \) obtenidos construya los siguientes vectores:

Tome a consideración los siguientes detalles: (1) la población inicial (\( N_0 \)) debe ser la correspondiente a 1950, (2) los cuatro vectores tendrán la misma longitud y esta será igual a la cantidad de datos de población (63) (de forma que haya un valor distinto correspondiente a cada año de la serie original) y (3) el ejercicio se puede realizar tanto con y sin el uso de loops, aprovechando las capacidades de vectorización de R.

Ejemplo de referencia (redondeos al segundo decimal):

Nprom / 1e8
##  [1] 25.58 26.00 26.42 26.86 27.30 27.75 28.20 28.66 29.14 29.61 30.10
## [12] 30.59 31.10 31.61 32.13 32.65 33.19 33.73 34.29 34.85 35.42 36.00
## [23] 36.60 37.20 37.81 38.43 39.06 39.70 40.35 41.01 41.69 42.37 43.07
## [34] 43.77 44.49 45.22 45.97 46.72 47.49 48.27 49.06 49.87 50.68 51.52
## [45] 52.36 53.22 54.10 54.98 55.89 56.80 57.74 58.68 59.65 60.63 61.62
## [56] 62.63 63.66 64.71 65.77 66.85 67.95 69.06 70.20

i. (*) Gráfico

Para este ejercicio se comenzará graficando los datos originales con el siguiente comando:

plot(poblacion.humana, xlab = "Año", ylab = "N", pch = 19, col = '#696969', cex = 1.5)

Posteriormente usted deberá agregar 4 curvas al gráfico utilizando un loop: las correspondientes a los vectores creados en el ejercicio anterior (h). El gráfico final será similar al siguiente:

plot of chunk unnamed-chunk-14

Nótese que para agregar las líneas se utilizó el comando lines y que para hacerlo es necesario especificar en todos los casos los valores de ambos ejes … (y nótese también que en el caso particular del plot inicial, tal como se ve en el código pegado aquí, al usar una data.frame de 2 columnas R no necesita que esto sea especificado).

Sugerencias: (1) juntar los cuatro vectores en una matriz o data.frame, (2) crear vectores con los valores de los parámetros que se quieran usar para las diferentes curvas, como col o lty (la elección de colores y tipos de línea son opcionales, el único requisito importante es que se pueda distinguir Nprom de Nmed) y (3) utilizar una variable que vaya indicando que columna plotear y con qué parámetros gráficos …

j. (*) Otra estimación de \( \lambda \)

Hasta ahora nuestro abordaje consideró todos los \( \lambda_{t} \) y se usaron estadísticos tomados de este conjunto de valores para modelar el crecimiento exponencial humano.

Ahora usaremos otro abordaje: una regresión lineal. Dado que \( N_{t} = \lambda \cdot N_{t - 1} \) la pendiente que describe la relación entre los vectores N0 y N1 es una estimación válida para el valor de \( \lambda \).

Haga una regresión lineal entre estos dos vectores para obtener una estimación del valor de \( \lambda \). Considere cuidadosamente cuál debe ser la variable explicativa y cuál la de respuesta en esta regresión, así como si es apropiado o no el uso de intercepto. Puede argumentar su desición si lo cree necesario.

El valor de lambda estimado por este método debe guardarse en el objeto lreg a partir del objeto de salida de la regresión (es decir, no debe usarse una asignación del tipo: lreg <- 1.014618 …).

k. Agregar a la lista

Agregar el nuevo valor lreg a la sublista lambda de la lista lista creada anteriormente, bajo el nombre est.reg (ver ejemplo).

str(lista)
## List of 2
##  $ data  :'data.frame':  63 obs. of  2 variables:
##   ..$ Anio     : int [1:63] 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 ...
##   ..$ Poblacion: num [1:63] 2.56e+09 2.59e+09 2.64e+09 2.68e+09 2.73e+09 ...
##  $ lambda:List of 3
##   ..$ values : num [1:62] 1.01 1.02 1.02 1.02 1.02 ...
##   ..$ stats  : Named num [1:4] 1.02 1.02 1.01 1.02
##   .. ..- attr(*, "names")= chr [1:4] "" "" "2.5%" "97.5%"
##   ..$ est.reg: Named num 1.01
##   .. ..- attr(*, "names")= chr "N0"

l. Guardar en disco

Escribir el código necesario para salvar la lista lista en un archivo en el formato nativo de R (extensión “.RData”), utilizando la función save. Dicho archivo se llamará “lista.RData”.