class: center, middle, inverse, title-slide # APIs con R ### Pachá ### LatinR - Sep 26th, 2019 --- # DigitalOcean * Digitalocean.com * Voy a mostrar ejemplos usando una máquina virtual escalable * Es útil si necesito el output de un modelo que no puedo correr en mi notebook * Si no tienes cuenta puedes acceder con [m.do.co/c/6119f0430dad](https://m.do.co/c/6119f0430dad) y tendrás 100 USD de crédito * Usa la imagen que subí y que ya trae RStudio Server [marketplace.digitalocean.com/apps/rstudio](https://marketplace.digitalocean.com/apps/rstudio) --- # Plumber * Genera una API REST * Similar a escribir paquetes de R * Usa los conceptos de get, post y put --- # ¿Por qué usar Plumber? ## Hardware * En la administración pública muchas veces el hardware no nos sirve para ajustar modelos * Un notebook, por caro que sea, a veces tampoco es suficiente --- # ¿Por qué usar Plumber? ## Técnica * Las redes neuronales se pueden ejecutar por partes * Las regresiones necesitan capacidad computacional para la matriz de diseño que *no* se lee por partes * A veces ayuda usar matrices dispersas en lugar de matrices densas * No es un problema de R, Python, Stata, etc, tiene que ver con como el computador almacena números --- # ¿Por qué usar Plumber? ## Interpretabilidad * Las herramientas de regresión entregan una salida *interpretable* * Para el diseño de políticas públicas no podemos confiar en cajas negras * La única salvedad serían los modelos de series de tiempo * Cualquier otro modelo que combina variables debe ser explicable --- # ¿Por qué usar Plumber? ## Evaluación * Las políticas públicas tienen *impacto* * Ese impacto se puede medir usando econometría * Mirada económica/ética: * ¿Existe un programa mejor que pueda implementar? * ¿Puedo mejorar a un grupo sin empeorar a los demás? --- # Modelo lineal, parte 1 Modelo lineal usando datos de `datos`: ```r pacman::p_load_gh("cienciadedatos/datos") modelo <- lm(precio ~ quilate, data = diamantes) coef(modelo) ``` ``` ## (Intercept) quilate ## -2256.361 7756.426 ``` --- # Modelo lineal, parte 2 Usando plumber ```r #* modelo #* @param x variable independiente #* @param y variable dependiente #* @get /modelo function(x, y) { form <- as.formula(paste(y, x, sep = "~")) summary(lm(form, data = diamantes)) } ``` --- # Modelo lineal, parte 3 Para ejecutar: ```r r <- plumb("plumber.R") r$run(port=8000) ``` --- # Modelo lineal, parte 4 La prueba debe dar error, `plumber` por default devuelve un `data.frame` convertido a JSON. Cambios necesarios: ```r #* modelo #* @param x variable independiente #* @param y variable dependiente #* @get /modelo function(x, y) { form <- as.formula(paste(y, x, sep = "~")) broom::tidy(lm(form, data = diamantes)) } ``` --- # Modelo lineal, parte 5 Más opciones: ```r #* modelo2 #* @param x variable independiente #* @param y variable dependiente #* @param m modelo #* @get /modelo2 function(x, y, m) { form <- switch(m, "lin" = as.formula(paste(y, x, sep = "~")), "log" = as.formula(sprintf("I(log(%s)) ~ I(log(%s))", y ,x)) ) broom::tidy(lm(form, data = diamantes)) } ``` --- # Advertencias * Plumber jamás debería usarse sin https cuando hay datos sensibles en uso * Sin una configuración https debería reservarse a la intranet * Por ejemplo, si no hago un control mínimo como `x <- substr(x, 1, 5)` un usuario podría pasar `SELECT * FROM public.clientes` u otro comando para obtener más datos de lo que quiero que vea --- # Extensiones * Se puede levantar el servicio con docker, pm2 o systemd * Se puede integrar con Shiny --- # Contacto **Twitter y Github: `pachamaltese`** **Email: `pacha arroba dcc punto uchile punto cl`** --- <center> <h3> This work is licensed as **Creative Commons Attribution-NonCommercial 4.0 International** To view a copy of this license visit https://creativecommons.org/licenses/by-nc/4.0/ </h3> <center>