2 Marco conceptual
Este capítulo está en proceso de validación. Cualquier comentario es bienvenido
El objetivo principal de este capítulo es presentar los conceptos básicos que se utilizarán a lo largo de este trabajo, en específico en las secciones de antecedentes y metodología. En primer lugar se presentara un marco básico de inferencia en muestreo de poblaciones finitas para luego presentar diferentes métodos de estimación de parámetros poblacionales y sus respectivos errores estándar. Se hará una primera introducción a diseños sencillos y se propondrán diferentes estimadores y se hará mención a su diferencia con los diseños complejos, situación común en Encuestas Socioeconómicas. Luego, se presentarán los conceptos básicos de la programación funcional y orientada a objetos en R para luego enfocarnos en la meta-programación. Finalmente, se presentará un breve resumen de cómo crear un paquete en R, los componentes mínimos para su publicación en CRAN (repositorio donde se encuentran disponibles versiones estables de diferentes paquetes de R), y las herramientas que se pueden utilizar para su desarrollo.
2.1 Inferencia en muestreo de poblaciones finitas
Como fue mencionado anteriormente las encuestas por muestreo son la principal fuente de información para la construcción de indicadores socio-demográficos y económicos, en este sentido, es importante tener en cuenta un marco teórico para realizar estas inferencias. Es sumamente sencillo obtener estimaciones puntuales de estadísticos usuales aunque es importante considerar la variabilidad de los estimadores, tanto para poder realizar un proceso de inferencia completo así como también para poder cuantificar la confiabilidad de la estimación. A continuación, se definen los conceptos básicos de inferencia en muestreo de poblaciones finitas como son el diseño muestral, probabilidades de inclusión basadas en el diseño, estimadores de Horvitz-Thompson HT, ponderación, medidas de incertidumbre y errores estándar basados en (Särndal, Swensson, y Wretman 2003).
2.1.1 Diseño muestral
El concepto de diseño muestral refiere al mecanismo mediante el cual se selecciona una muestra e inducen propiedades estadísticas claves como puede ser la distribución en el muestreo, valores esperados y varianzas de estimadores poblacionales. En diseños sencillos es posible calcular la función de diseño o encontrar una expresión analítica con facilidad mientras que en diseños mas complejos como pueden ser los multietapicos es necesario abordar el problema de otra forma y asumir ciertas hipótesis para poder construir probabilidades de inclusión tanto de primer orden como segundo orden.
La definición matemática se basa en que dado un universo \(U\) de \(N\) elementos (puede ser conocido o no) \(\{u_{1},u_{2}, \cdots, u_{N}\}\) y se considera un conjunto de tamaño \(n\) de elementos de \(U\) que se denota como \(s = \{u_{1},u_{2}, \cdots, u_{n}\}\) al cual comúnmente denominamos muestra, el diseño muestral puede definirse de la siguiente forma:
\[ Pr(S = s) = p(s) \]
Realizando un poco de inspección en la definición anterior se puede observar que el diseño muestral es una función de probabilidad que asigna una probabilidad a cada subconjunto de \(U\) de tamaño \(n\). En este sentido, es posible definir diferentes tipos de diseño, entre ellos los mas comunes:.
- Diseño Aleatorio Simple (SI)
El diseño aleatorio simple es el diseño más sencillo y se define de la siguiente forma:
\[ p(s) = \frac{1}{\binom{N}{n}} \]
Donde \(\binom{N}{n}\) es el número de subconjuntos posibles de \(U\) de tamaño \(n\).
- Diseño Bernoulli (BE)
El (BE) es un diseño sencillo que se utiliza cuando se desea seleccionar una muestra de un universo de tamaño \(N\) además de considerar una una probabilidad de inclusión \(\pi\) para cada elemento de \(U\). Se define el diseño Bernoulli de la siguiente forma:
\[ p(s) = \underbrace{\pi \times \pi \times \cdots \times \pi}_{n_{s}} \times \underbrace{(1-\pi) \times (1-\pi) \times \cdots \times (1-\pi)}_{N-n_{s}} = \pi ^{n_{s}} (1-\pi)^{N-n_{s}} \]
Una diferencia fundamental entre el diseño (BE) y el diseño SI es que en el BE el tamaño de muestra es aleatorio y su distribución es binomial, mientras que en el diseño SI el tamaño de muestra es fijo.
- Diseño Estratificado (ST)
El diseño estratificado es un diseño que se utiliza cuando se desea seleccionar una muestra de tamaño \(n\) de un universo de tamaño \(N\) donde además se quiere dividir el universo en \(H\) estratos \(U_{1}, U_{2}, \cdots, U_{H}\). Dentro de cada estrato se selecciona una muestra de tamaño \(n_{h}\) y se define el diseño estratificado de la siguiente forma:
\[ p(s) = \prod_{l=1}^{H} p(s_{H}) \]
En cada estrato se puede utilizar un diseño diferente pero en general se utiliza el diseño SI, mas conocido STSI (Stratified Simple Random Sampling). En este caso cada \(p_{h}(s_{h})\) es el diseño aleatorio simple en el estrato \(h\).
2.1.2 Probabilidades de inclusión y estimador de Horvitz-Thompson
Una vez definido el concepto de diseño muestral es posible definir la probabilidad de que un elemento de la población sea seleccionado en la muestra, esta probabilidad se conoce como probabilidad de inclusión y se define de la siguiente forma:
- Probabilidad de inclusión de primer orden
\[ \pi_{k} = Pr(u_{k} \in s) = Pr(I_{k} = 1) \]
Donde \(I_{k}\) es una variable aleatoria que toma el valor de 1 si el elemento \(u_{k}\) es seleccionado en la muestra y 0 en caso contrario. Definir estas variables indicadoras son de utilizada para entender el comportamiento de los estimadores bajo el diseño muestral y nos permite definir los estimadores en \(U\) y no en \(S\). Es claro que \(I_{k} \sim Bernoulli(\pi_{k})\) y \(E(I_{k}) = Pr(I_{k}) = \pi_{k}\).
Esta probabilidad es importante ya que es la la base para la construcción de estimadores insesgados y eficientes, en este sentido, es posible definir el estimador de Horvitz-Thompson (HT) para estimar un total \(t = \sum_{U} {t_{k}}\) de la siguiente forma:
\[ \hat{t}_{y} = \sum_{k=1}^{N} \frac{y_{k}}{\pi_{k}} \times I_{k} \]
Este estimador es propuesto por Horvitz y Thompson en 1952 y es un estimador insesgado en el diseño, en el sentido de que \(E(\hat{t}_{y}) = t\) y es eficiente en el sentido de que \(Var(\hat{t}_{y})\) es el menor posible entre los estimadores insesgados. Este estimador es muy utilizado en la práctica y es la base para la construcción de otros estadísticos,como medias, proporciones, varianzas, entre otros. Para mas detalles sobre las propiedades de Horvitz-Thompson (HT) se puede consultar en (Särndal, Swensson, y Wretman 2003) y (Horvitz y Thompson 1952).
2.1.3 Ponderación basada en el diseño y estimadores más comunes
En general es utilizado el concepto de ponderador para realizar estimaciones de totales, medias, proporciones, varianzas, entre otros. En este sentido, es posible definir el ponderador inducido por el diseño muestral de la siguiente forma:
\[ w_{k} = \frac{1}{\pi_{k}} \]
Este ponderador puede interpretarse como el número individuos que representa el individuo \(k\) en la población. Este valor es el que comúnmente se publica junto a los microdatos y el estándar en los diferentes softwares para procesar encuestas. Junto al estimador de un total es posible definir el estimador de un promedio, proporción o razón en el contexto de la $-expansión.
Estimador de un promedio
\[ \hat{\bar{y}} = \frac{\sum_{k=1}^{N} w_{k} I_{k} y_{k}}{\sum_{k=1}^{N} w_{k} I_{k}} \]
Este estimador puede ser utilizados en encuestas de hogares, donde se desea estimar el ingreso promedio de los hogares de una región de forma anual, o mensual.
Estimador de una proporción
\[ \hat{p} = \frac{\sum_{k=1}^{N} I_{k} w_{k} y_{k}}{\sum_{k=1}^{N} w_{k} I_{k}} = \frac{\sum_{k=1}^{N} I_{k} w_{k} y_{k}}{\hat{N}} \]
Puede ser de interés estimar la proporción de hogares que tienen acceso a internet en una región, en este caso se puede utilizar el estimador de proporción.
Estimador de una razón
Se quiere estimar la razón \(R = \frac{\sum_{k=1}^{N} y_{k}}{\sum_{k=1}^{N} z_{k}}\). En este caso se puede definir el estimador de la razón de la siguiente forma:
\[ \hat{R} = \frac{\sum_{k=1}^{N} w_{k} y_{k}}{\sum_{k=1}^{N} w_{k}z_{k}} = \frac{\sum_{k=1}^{N} w_{k} y_{k}}{\hat{N}} \]
El estimador de razón es utilizado para construir variables de mercado de trabajo como la tasa de desempleo, tasa de ocupación, entre otros.
Inferencia sobre el tamaño de la población
Una vez definidos los estimadores, podemos ver que los estimadores de medias y proporciones son un caso particular del estimador de razón. Un detalle no menor es que asumimos \(N\) fijo pero desconocido, por esto al realizar proporciones se ajusta el total sobre un estimador del tamaño de la población:
\[ \hat{N} = \sum_{k=1}^{N} I_{k}w_{k} \]
Existen diseños denominados auto-ponderados donde por definición \(\sum_{k=1}^{N} w_{k} = N\), en este caso particular el estimador de medidas y proporciones es un caso particular del estimador de total, ya que el estadístico puede definirse de la siguiente forma:
\[ \hat{\bar{y}}_{s} = \frac{\sum_{k=1}^{N} I_{k} w_{k} y_{k}}{\sum_{k=1}^{N} w_{k} I_{k}} = \frac{\sum_{k=1}^{N} I_{k} w_{k} y_{k}}{N} = \frac{1}{N} \times \sum_{k=1}^{N} I_{k} w_{k} y_{k} = a \times \hat{t}_{y} \]
2.1.4 Medidas de incertidumbre y errores estándar
Se puede medir la variabilidad de los estimadores y calcular su varianza. Esto es útil para entender cuán confiables son estos estimadores. Veamos cómo se calcula la varianza de diferentes tipos de estimadores, como el total, promedio, proporción o razón.
2.1.4.1 Momentos muéstrales y estimadores de varianza
Para un estadístico \(\theta\), su varianza bajo un diseño muestral \(p(s)\) se define como:
\[ V(\hat{\theta}) = E((\theta - E(\hat{\theta}))^{2}) = \sum_{s \in S}{p(s)\left(\hat{\theta}_{s} - E(\hat{\theta}_{s})\right)} \]
La forma de calcular la varianza depende del estimador \(\hat{\theta}\). Por ejemplo, para el estimador de varianza de un total, se utiliza la siguiente fórmula:
\[ V(\hat{t}_{y}) = \sum_{U}{V(I_{k} \times y_{k} \times w_{k})} + \sum_{U}{\sum_{k \not{=} l }{Cov(I_{k} \times y_{k} \times w_{k}, I_{l} \times y_{l} \times w_{l})}} \]
Después de simplificar, obtenemos:
\[ V(\hat{t}_{y}) = \sum_{U}{V(I_{k}) \times w_{k} \times y_{k}^{2}} + \sum_{U}{\sum_{k \not{=} l }{Cov(I_{k}, I_{l}) \times y_{k} \times w_{k} \times y_{l} \times w_{l} }} \]
Donde definimos las siguientes identidades para simplificar cálculos:
\[ Cov(I_{k}, I_{l}) = \Delta_{kl} = \pi_{kl} - \pi_{k} \times \pi_{l} \]
\[ \check{y}_{k} = y_{k} \times w_{k} \]
\[ \check{\Delta}_{kl} = \Delta_{kl} \times \frac{1}{\pi_{kl}} = \Delta_{kl} \times w_{kl} \]
Una vez definida la varianza del estimador, necesitamos estimar su varianza. Para esto, utilizamos la técnica de \(\pi\)-expansión. Después de algunas manipulaciones algebraicas, obtenemos la varianza del estimador:
\[ V(\hat{t}_{y}) = \sum_{U}{\check{y}_{k}^{2}} + \sum_{U}{\sum_{k \not{=} l } \Delta_{kl} \times \check{y}_{k} \times \check{y}_{l} } = \sum_{U}{\sum{\Delta_{kl} \times \check{y}_{k} \times \check{y}_{l} }} \]
Podemos verificar que este estimador de varianza es insesgado con la definiciones de \(E(I_{k}I_{l})\) y tomando esperanzas. Es decir, se verifica que \(E(\hat{V}(\hat{t}_{y})) = V(\hat{t}_{y})\). Al ser un estimador insesgado, su eficiencia depende del diseño muestral y de la varianza de los ponderadores, es decir, de la varianza de las probabilidades de inclusión. En algunos casos es donde entra en juego dividir grupos heterogéneos en estratos o realizar muestreos en varias etapas.
Para el caso de un estimador de un promedio, la varianza se define de la siguiente forma: \[ V(\hat{\bar{y}}) = \frac{1}{N^{2}} \times \sum_{U}{\sum_{k \not{=} l } \Delta_{kl} \times \check{y}_{k} \times \check{y}_{l} } \]
Esto es válido en el caso de contar con un tamaño de población conocido, en otro caso el estimador de la media no es un estimador lineal y para calcular su varianza deben optar por métodos de estimación de varianzas más complejos como el de linealización de Taylor.
Es importante considerar que en esta sección se presenta un caso ideal donde la muestra es obtenida de un listado perfecto de la población objetivo denominado marco de muestreo. En la práctica, el marco de muestreo es imperfecto y se debe considerar la no respuesta, la cobertura y la falta de actualización del marco de muestreo. En general para la publicación de microdatos se publican ciertos ponderadores que no son precisamente los ponderadores originales definidos en la sección anterior sino que son sometidos a un proceso de calibración donde se intenta ajustar a ciertas variables de control y mejorar problemas causados por la no respuesta. Al realizar el proceso de calibración los ponderadores calibrados son lo mas cercano posible a los ponderadores originales, de forma que si los ponderadores originales son insesgados, los ponderadores calibrados serán próximos a ser insesgados.
En la practica para diseños complejos no se dispone de las probabilidades de selección de segundo orden insumo principal para calcular los errores estándar, por esto es que se requiere optar con metodologías alternativas como el método del ultimo conglomerado, método de replicación jackknife, método de bootstrap, entre otros. En este sentido, es importante tener en cuenta que la varianza de los estimadores es un componente fundamental para realizar inferencias y cuantificar la confiabilidad de los resultados.
En resumen, para realizar estimaciones puntuales ya sean totales, medias, proporciones o razones, simplemente debemos ponderar los datos con los estadísticos anteriormente mencionadas pero para realizar un proceso de inferencia completo se requiere calcular sus errores estándar, construir intervalos de confianza y/o poder medir estabilidad de nuestros resultados. En este sentido, es importante tener al alcance herramientas que permitan realizar este tipo de cálculos, ya que si bien en diferentes softwares estadísticos junto a la estimación puntual se presentan los errores estándar aunque por defecto se asumen diseños sencillos como por ejemplo, el diseño BE donde la probabilidad de inclusión de segundo orden es sencilla de calcular y unicamente es necesario las probabilidades de inclusión de primer orden para computar estimadores del error estándar, siendo un valor completamente erróneo.
Una vez presentado conceptos básicos de muestreo es importante entender como esto estará disponible en el paquete metasurvey, en este sentido, se presentarán los conceptos básicos de programación funcional y orientada a objetos en R para luego enfocarnos en la meta-programación.
2.2 Desarrollo de paquetes en R
R es un lenguaje de código abierto y además cuenta con una gran comunidad de usuarios, en diferentes áreas de investigación, esto ha permitido que se desarrollen una gran cantidad de paquetes que permiten realizar diferentes tareas de análisis de datos, visualización, bioinformática, aprendizaje automático y ramas afines a la estadística. Dentro de la comunidad existen diferentes organizaciones que se encargan de mantener la calidad de los paquetes y de asegurar que los paquetes cumplan con ciertos estándares de calidad, una de estas organizaciones es el Comprehensive R Archive Network (CRAN), que es un repositorio de paquetes de R que contiene versiones estables de los paquetes de R, bioconductor, que es un repositorio de paquetes de R que contiene paquetes para el análisis de datos biológicos, y rOpenSci que Para casi cualquier disciplina científica o en la industria se puede encontrar una comunidad de usuarios que desarrollan paquetes en R, en este sentido, el desarrollo de paquetes en R es una tarea que se ha vuelto muy común entre los usuarios de R y es muy sencillo de realizar. A continuación, se presentan los conceptos básicos para el desarrollo de paquetes en R.
2.2.1 ¿Por qué desarrollar un paquete en R?
Desarrollar un paquete en R tiene varias ventajas, entre las cuales se pueden mencionar las siguientes:
- Reutilización de código: Es importante tener en cuenta que existe una comunidad que hace cosas similares a las que uno hace, por lo que es posible que alguien ya haya escrito una función que uno necesita. Por lo tanto, siempre es buena buscar si existe algún paquete que ya tenga las funcionalidades que se requieren.
- Compartir código: La comunidad de R es muy activa y siempre está dispuesta a compartir código, por esta razón es que se mantienen en constante desarrollo de paquetes.
- Colaboración: El trabajo colaborativo es esencial en el desarrollo de paquetes en R, ya que permite que diferentes personas puedan aportar con nuevas funcionalidades, correcciones de errores, entre otros.
2.2.2 Elementos básicos de un paquete en R
Para que nuestro conjunto de funciones, datos y documentación sea considerado un paquete en R, es necesario que cumpla con ciertos requisitos mínimos. A continuación, se presentan los componentes mínimos que debe tener un paquete en R para ser publicado en CRAN.
Directorio: Un paquete en R debe estar contenido en un directorio que contenga al menos los siguientes archivos y directorios:
R/
: Directorio que contiene los archivos con las funciones que se desean incluir en el paquete.man/
: Directorio que contiene los archivos con la documentación de las funciones que se encuentran en el directorioR/
. En general se utiliza Roxygen2 (Wickham et al. 2024) para generar la documentación de las funciones.DESCRIPTION
: Archivo que contiene la descripción del paquete, incluyendo el nombre, versión, descripción, autor, entre otros.NAMESPACE
: Archivo que contiene la información sobre las funciones que se exportan y las dependencias del paquete.LICENSE
: Archivo que contiene la licencia bajo la cual se distribuye el paquete.README.md
: Archivo que contiene información general sobre el paquete.
Documentación: La documentación de las funciones es un componente esencial de un paquete en R, ya que permite que los usuarios puedan entender el funcionamiento de las funciones que se encuentran en el paquete. La documentación de las funciones se realiza utilizando el sistema de documentación de R, que se basa en el uso de comentarios en el código fuente de las funciones.
Pruebas: Es importante que el paquete tenga pruebas que permitan verificar que las funciones se comportan de la manera esperada. Las pruebas se realizan utilizando el paquete testthat (Wickham 2011) que permite realizar pruebas unitarias.
Control de versiones: Es importante que el paquete tenga un sistema de control de versiones que permita llevar un registro de los cambios que se realizan en el paquete. El sistema de control de versiones más utilizado en la comunidad de R es
git
.Licencia: Es importante que el paquete tenga una licencia que permita a los usuarios utilizar, modificar y distribuir el paquete. La licencia más utilizada en la comunidad de R es la licencia MIT.
El proceso de subir un paquete a CRAN es un proceso que puede ser tedioso, ya que se deben cumplir con ciertos requisitos que son revisados por los mantenedores de CRAN, no es trivial y puede tomar tiempo, sin embargo, es un proceso que vale la pena ya que permite que el paquete sea utilizado por una gran cantidad de usuarios.
El proceso de chequeo fue automatizado con GitHub actions, por lo que cada vez que se realiza un cambio en el repositorio, se ejecutan los chequeos de CRAN y se notifica si el paquete cumple con los requisitos para ser publicado en caso de que no cumpla con los requisitos se notifica el error y no puede ser incluido en la rama principal del repositorio hasta que se corrija el error.
Todo el proceso y código fuente del paquete se encuentra disponible en el repositorio de github del paquete. En el caso que este interesado en colaborar con el desarrollo del paquete puede consultar la guía de contribución.
2.3 Paradigmas de programación en R
R es un lenguaje de programación que permite realizar programación funcional y orientada a objetos (Chambers 2014), lo que permite que los usuarios puedan utilizar diferentes paradigmas de programación para resolver problemas. A continuación, se presentan los conceptos básicos de la programación funcional y orientada a objetos en R.
2.3.1 Programación funcional
La programación funcional es un paradigma de programación que se basa en el uso de funciones para resolver problemas. En R, las funciones son objetos de primera clase, lo que significa que se pueden utilizar como argumentos de otras funciones, se pueden asignar a variables, entre otros (Wickham 2019, 204-81). A continuación, se presentan los conceptos básicos de la programación funcional en R.
Funciones de orden superior: En R, las funciones de orden superior son funciones que toman como argumento una o más funciones y/o retornan una función. Un ejemplo de una función de orden superior en R es la función
lapply
que toma como argumento una lista y una función y retorna una lista con los resultados de aplicar la función a cada elemento de la lista.Funciones anónimas: En R, las funciones anónimas son funciones que no tienen nombre y se crean utilizando la función
function
. Un ejemplo de una función anónima en R es la funciónfunction(x) x^2
que toma como argumentox
y retornax^2
.Funciones puras: En R, las funciones puras son funciones que no tienen efectos secundarios y retornan el mismo resultado para los mismos argumentos. Un ejemplo de una función pura en R es la función
sqrt
que toma como argumento un número y retorna la raíz cuadrada de ese número.
Este paradigma de programación es muy útil para realizar análisis de datos, ya que permite que los usuarios puedan utilizar funciones para realizar operaciones sobre los datos de manera sencilla y eficiente, dentro de metasurvey no existe una presencia fuerte de programación funcional, sin embargo, se utilizan algunas funciones de orden superior para realizar operaciones sobre los datos.
2.3.2 Programación orientada a objetos
La programación orientada a objetos es un paradigma de programación que se basa en el uso de objetos para resolver problemas. En R, los objetos son instancias de clases que tienen atributos y métodos (Wickham 2019, 285-370; Mailund 2017). A continuación, se presentan los conceptos básicos de la programación orientada a objetos en R.
Clases y objetos: En R, las clases son plantillas que definen la estructura y el comportamiento de los objetos y los objetos son instancias de clases. En R, las clases se definen utilizando la función
setClass
y los objetos se crean utilizando la funciónnew
.Atributos y métodos: En R, los atributos son variables que almacenan información sobre el estado de un objeto y los métodos son funciones que permiten modificar el estado de un objeto. En R, los atributos se definen utilizando la función
setClass
y los métodos se definen utilizando la funciónsetMethod
.
Dentro de metasurvey se utiliza la programación orientada a objetos para definir las clases de los objetos que se utilizan para representar los datos de las encuestas mediante una creación de una clase especifica llamada Survey
que permite además de almacenar los datos de la encuesta añadir atributos y métodos que permiten realizar operaciones sobre los datos de manera sencilla y eficiente.
De forma similar se modelan las clases Step
, Recipe
y Survey
elementos cruciales en el ecosistema de metasurvey donde se definen los pasos de preprocesamiento, recetas de preprocesamiento y flujos de trabajo respectivamente. En este caso particular se utiliza el paquete R6 (Chang 2022) que permite definir clases de manera sencilla y eficiente además de permitir la herencia de clases y la definición de métodos y atributos de manera sencilla.
2.3.3 Meta-programación
La meta-programación es un paradigma de programación que se basa en el uso de código para manipular código (Wickham 2019, 373-500; Thomas Mailund 2017) . En R, la meta-programación se realiza utilizando el sistema de meta-programación de R que se basa en el uso de expresiones, llamadas y funciones. A continuación, se presentan los conceptos básicos de la meta-programación en R.
Expresiones: En R, las expresiones son objetos que representan código y se crean utilizando la función
quote
. Un ejemplo de una expresión en R es la expresiónquote(x + y)
que representa el códigox + y
.Llamadas: En R, las llamadas son objetos que representan la aplicación de una función a sus argumentos y se crean utilizando la función
call
. Un ejemplo de una llamada en R es la llamadacall("sum", 1, 2, 3)
que representa la aplicación de la funciónsum
a los argumentos1
,2
y3
.Funciones: En R, las funciones son objetos que representan código y se crean utilizando la función
function
. Un ejemplo de una función en R es la funciónfunction(x, y) x + y
que representa el códigox + y
.
En metasurvey se utiliza la meta-programación para generar código de manera dinámica y realizar operaciones sobre los datos de manera eficiente. En particular se utiliza la función eval
para evaluar expresiones y la función substitute
para reemplazar variables en expresiones. Además, se utilizan las funciones lapply
, sapply
, mapply
y do.call
para aplicar funciones a listas y vectores de manera eficiente. En general, la meta-programación es una técnica muy útil para realizar operaciones sobre los datos de manera eficiente y sencilla.
En el Capítulo 3 se presentarán los antecedentes de metodologías de estimación de varianzas, revisión de medidas de incertidumbre, paquetes similares y mejoras que son incorporadas en el paquete metasurvey. En el Capítulo 4 se hablara sobre la implementación de las diferentes partes que conforman el paquete, una breve reseña del esquema de test, la API para almacenar las recetas junto a su interacción con el usuario. Posteriormente se mostrara un ejemplo de uso del paquete y se presentarán las conclusiones y trabajos futuros.