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.
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.
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.
Cambie los nombres de las columnas de la data.frame: “Anio” y “Poblacion” en lugar de “Y” y “P” respectivamente.
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.
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
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
A partir del vector lambda
obtener los siguientes objetos:
lprom
: el valor promediolmed
: la medianalq
: vector con los percentiles 2.5 y 97.5 de la distribución de valores. Vea la función quantile
para hacer la estimación.Finalmente deberá guardar todos estos (4) valores en un vector llamado lest
.
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.
Utilizando la equación 2 y los cuatro valores de \( \lambda \) obtenidos construya los siguientes vectores:
Nprom
: tamaños poblacionales esperados para un crecimiento exponencial con una tasa de crecimiento constante igual a lprom
.Nmed
: tamaños poblacionales esperados para un crecimiento exponencial con una tasa de crecimiento constante igual a lmed
.Nq1
: tamaños poblacionales esperados para un crecimiento exponencial con una tasa de crecimiento constante igual a lq1
.Nq2
: tamaños poblacionales esperados para un crecimiento exponencial con una tasa de crecimiento constante igual a lq2
.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
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:
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 …
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
…).
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"
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”.