Curso para las Maestrías en Ciencias de Datos y Ciencias en Computación. Aquí encontrarán código y materiales del curso.
- Número aleatorios
- Números verdaderamente aleatorios y pseudoaleatorios
- Calidad de los números pseudoaleatorios
- Métodos de generación de números pseudoaleatorios
- Ejemplo en clase: código y app para crear número aleatorios usando el generador congruencial lineal
- Simulación de variables aleatorias
- Simulación de variableas aleatorias discretas
- Simulación de variables aleatorias continuas: método de la función inversa, método de aceptación-rechazo y overview de otros métodos
- Simulación por Monte Carlo
- Intuición como método de integración numérica y como método de inferencia estadística no paramétrica
- Intervalos de confianza asintóticos para los estimadores de Monte Carlo
- Overview de métodos de reducción de varianza
- Ejemplo en clase: problema del cumpleaños
- Introducción a la Teoría de Cadenas de Markov
- Procesos estocásticos y la propiedad de Markov
- Propiedades elementales
- Comportamiento largo plazo. Teorema Ergódico y Teorema Límite de Cadenas de Markov
- Aplicaciones: Google PageRank, simulación de texto
- Ejemplo en clase: simulación de cadenas de Markov usando C++ con R a través del paquete
Rcpp
- Cadenas reversibles
- Extensión a cadenas a conjunto de espacios continuo
- Markov Chain Monte Carlo
- Aplicación de cadenas reversible al algoritmo de Metropolis-Hastings
- Ejemplo: Programación del método de Random-walk Metropolis en Rcpp
- Selección de parámetros en Metropolis Hastings
- Aplicación: Inferencia Bayesiana
- Aplicación: Solución de un problema de cálculo de medias y varianzas usando inferencia bayesiana
- Diagnóstico de un problema de MCMC
- Slice sampling
- Gibbs sampling
- Boostrapping
Más temas serán agregados conforme los vayamos cubriendo en el curso.
Rubro | Peso |
---|---|
Tareas | 50% |
Proyecto final | 45% |
Examen final presencial | 5% |
Voy a calificar sus tareas usando la función shiny::runGithub(repo, username)
en R
. El nombre del repositorio debe ser compstat2016
y yo solo debo cambiar su nombre de usuario de Github para poder abrir la aplicación que contendrá sus tareas y que se elaborará como explico a continuación.
En esta sección encontrarán una descripción de las tareas que deben entregar. Habrá varios tipos de tareas; la mayoría de ellas implicarán la creación de una app de shiny. El objetivo es juntar todas las apps en un shiny formando un showcase de los temas aprendidos en el curso.
Deberán crear un repositorio llamado compstat2016
. Aquí, deberán tener un proyecto de shiny con archivos ui.R
y server.R
que contentan una aplicación en la que muestren todas sus tareas. Es importante que los arhicos del shiny no pueden estar en ninguna subcarpeta. Pueden tener subcarpetas dentro de su repositorio y tener otros archivos o datos ahí, pero el la app de shiny debe estar en la carpeta raíz.
Yo recomiendo que en su proyecto tengan la siguiente estructura, de manera que trabajen cada app de manera independiente y al final solo incluyan el mismo código en su showcase usando herramientos como tabBox
, conditionalPanel
, etc. La utilización de shinydashboard
es decisión de ustedes.
readme.md ui.R shiny.R // contiene en un showcase con la misma información que app1, app2, etc... data/ |-- data.Rd // incluyan todos los archivos de datos que puedan necesitar sus apps. |-- data.csv
No importa que su proyecto tengo subcarpetas y archivos adicionales mientras tenga lo mínimo para que corra su app usando la función shiny::runGithub
.
Noten que la creatividad e iniciativa propia son elementos importantes de este curso, por lo que los estudiantes que incluyan mejoras no incluidas inicialmente por el profesor serán recompensandos.
- Forma de entrega: Como una pestaña de su shiny app showcase
- Fecha recomendada de terminación: agosto
- Objetivo: Crear una app simple para familiarizarse con shiny y reforzar el método de la función inversa como una técnica para simular variables aleatorias independientes.
-
- Output mínimo
- Un véctor numérico de simulaciones de una x ~ Exp(lambda).
- Un histograma de x.
- Output mínimo
- Input mínimo
nsim
: número de simulacioneslambda
: parámetro de la densidad exponencial que se quiere simularnbin
: un parámetro para el número de cajones de un histograma de las simulaciones
- Instrucciones adicionales: Se recomienda incluir una prueba de bondad de ajusta para verificar que los números creados tienen la distribución deseada. Pueden incluirse prueba gráficas como densidades empíricas vs densidades teóricas. Puede incluirse un botón para descargar la muestra simulada. Sean creativos.
- Forma de entrega: Como una pestaña de su shiny app showcase
- Fecha recomendada de terminación: septiembre
- Objetivo: Practicar el entendimiento de Monte Carlo como técnica de integración numérica y usar el enfoque de valor esperado para crear intervalos de precisión. Practicar las funciones
eval
yparse
de R que permite recibir una expresións
de R en format de string y ejecutarla con el comandoeval(parse(text = s))
- Output mínimo
- El resultado de calcular int_a^b f(x) dx
- Un gráfico que muestre los resultados de la simulación usando
N =10, 100, 1000, 10000, 100000
puntos. En el eje y incluir el resultado de la estimación conN
puntos y en el eje x ponerlog_10(N)
(logaritmo base 10). - El gráfico debe incluir intervalos de confianza al nivel
c %
- Input mínimo
a
: límite inferior para la integraciónb
: límite superior para la integraciónfun
: El usario debe introducir en un área de texto la funcíon que debe quiere integrarc
: El parámetro para crear intervalso de confianza alc %
- Instrucciones adicionales: Para un programa aún mejor, una dificultad es escribir el código de forma que no se rehaga la simulación una vez que se cambia el valor de
c
. Un excelente proyecto incluirá una comparación con un método numérico como el trapecio. Un programa que me deje completamente boquiabierto permitirá integrales múltiples (no es necesario esforzarse tanto).
- Forma de entrega: Documento físico
- Instrucciones: Leer el artículo The MCMC revolution (link) y hacer una síntesis de la lectura y su opinión sobre ella en máximo una cuartilla.
- Fecha de entrega 16 de noviembre en clase
- Forma de entrega: Como una pestaña de su shiny app showcase
- Fecha recomendada de terminación: octubre (tarea 4) noviembre (tarea 5 y 6)
- Objetivo: Esta tarea estará divida en varias tareas. El objetivo es hacer un análisis regresión lineal simple bayesiana usando Markov Chain Monte Carlo. El tipo de regresión es 'simple' porque solo vamos a usar una variable explicativa, pero si ustedes desean, pueden hacer todo para regresión múltiple. El objetivo es predecir una variable Y usando otra variable aleatoria X. El modelo está dado por
Y = a + X*beta + eps con eps ~ N(0, sigma^2)
L(theta) = f(e | theta) = = sqrt(2 pi sigma^ 2)^(-N/2) exp(-e^te/(2 sigma^2)) = sqrt(2 pi sigma^ 2)^(-N/2) exp((Y-Xb-a)^t(Y-Xb-a)/(2 sigma^2))donde `e=Y-Xb-a=(e_1,...,e_N)` es el vector de errores. Asegúrense de entender de dónde viene este modelo y porque es como es la verosimilitud. Entenderlo es lo más importante. Si no no deben avanzar.
En un análisis bayesiano suponemos una distribución inicial para estos parámetros. La distribución inicial debe ser un reflejo de su certidumbre o incertidumbre de cierto valor que podría tomar. El usuario debe dar sus suposiciones iniciales.
En la primera entrega de la app deben:
- Escoger una base de datos que quieran usar para problemas de regresión. Pueden usar una base de su trabajo o de otro curso. Si no tienen alguna base que les interese, pueden entrar al repositorio de UCL para darse algunas ideas. Esta base la usaran para todas las siguientes tareas.
- Crear una interface de shiny que utilice las funciones
DT::renderDataTable
yDT::dataTableOutput
para mostrar su base de datos (vean el tutorial enhttp://shiny.rstudio.com/gallery/basic-datatable.html
). - En su interface deben elegir dos variables, la variable independiente
Y
y la variable dependienteX
. Para esto pueden usar la funciónselectInput
de Shiny (en caso de que estén haciendo regresión múltiple, pueden usarcheckboxInput
). - Hagan un scatterplot/gráfico de dispersión. Pueden usar
plotly
oggplot2
. - Deben elegir una distribución a priori para los parámetros de su modelo. Los parámetros de su modelo son el vector
theta=(a, b, sigma^2)
. Ustedes pienses en cómo asignar a prioris. - Hagan una gráfica de la función de densidad de su a prioris (una por parámetro)!
En esta fase de la tarea deben hacer el MCMC. Deben programar una serie de funciones usando el paquete Rcpp
(go ahead si quieren hacerlo en C/C++ puro... it's up to you.. I would not): la verosimilitud, su a priori, su a posteriori o función objetivo para simular y el MCMC. La función debe regresar la simulación.
El shiny debe recibir como parámetros (inputs de shiny, vean funciones como slideInput
y numericInput
)
- El número de cadenas que se quieren simular
- La longitud de las cadenas
El output debe ser:
- Las simulación de las cadenas. Una matriz numérica de número de filas el número objetivo de simulaciones y de número de columnas el número de cadenas que pidieron simular.
- Deben hacer histogramas de las simulaciones de cada parámetro de su modelo.
- En una gráfica deben comparar la densidad a priori que dieron con la posterior. Para esto, deben estimar la densidad posterior usando la función
density
de R. Aquí hay un ejemplo de como pueden graficar una densidad click here. Pero ustedes deben poner la a apriori y la posterior en la misma gráfica. Puede ser bastante laborioso atinarle a los límites de graficación; plotly o ggplot lo hacen por ustedes. Pueden hacer la paquetería de graficación que gusten. Sean creativos; ¡disfrútenlo!
¡El reto más grande que van a tener es elegir el parámetro de brinco! Es difícil, discútanlo conmigo para ver una solución. Una propuesta muy muy sencilla la pueden encontrar en la página 3 de clink here. Está basado en la estimación de la matriz de covarianza. Vamos a ver en clase cómo aplicarlo.
Recomendación (solo enfóquense en esto si ya tienen lo demás) Su cadena sólo debe calcularse cuándo precionen un boton*. Para incluir botones hay que usar las funciones actionButton
y observeEvent
o eventReactive
de shiny. Pueden ver ejemplos en click here.
Si quieren usar programación paralela pueden chechar RcppParallel
o doParallel
, en este caso lo dejaremos como optativo.
En esta tarea deben mejorar su MCMC.
Las tareas las voy a revisar el día siguiente del examen final. Pero si quieren feedback de sus tareas pueden entregarlas y mostrarlas en anticipado.
- Instrucciones: Deberán formar equipos de hasta 5 integrantes en los que deberán elegir un tema de su interés relacion con la clase. Su elección de temas puede estar relacionado con los siguientes temas: cadenas de Markov y sus aplicaciones, simulación por Monte Carlo, sucesiones de números aleatorios, bootstrapping y aplicaciones en estadística, teoría de MCMC, cualquier aplicación interesante de MCMC no vista en clase.
Deberán elaborar un video de máximo 30min en el que expliquen el tema o teoría que les interesó.
Noten que no es necesario gastar dinero en materiales para hacer un video profesional pues existen un gran número de herramientas gratuitas. En la evaluación se tomará en cuenta no sólo el contenido teórico de su proyecto, que es el más importante, sino también la calidad de la presentación y su habilidad de comunicación de un tema técnico.
No se requiere entregar un proyecto escrito. No obstante, cualquier material adicional a la presentación que entreguen será tomado en cuenta positivamente para ayudar a la calificación.
Tomen en cuenta que la creatividad es un factor importante. - Fechas importantes
- Propuesta de tema y definición de equipos: 31/10/2016 via correo electrónico. Un solo correo por equipo mencionando los integrantes.
- Entrega de video: 10/12/2016
Los detalles se darán más adelante cuando se publiquen las fechas de examenes.