Problema 1: si una persona está interesada en estimar (o predecir) el tiempo que le tomaría llegar a la universidad desde un lugar ubicado a una distancia de 7.83 km, ¿Qué modelo le recomendaría a esta persona?
Problema 2: la misma persona del problema 1 ahora nos menciona que se movilizará hasta la universidad en motocicleta, ¿cambia en algo su modelo? ¿Cuántos modelos son posibles?
Análisis multivariado
¿Cómo podemos analizar todas las variables (de frutas y vegetales) juntas? ¿Es posible?
Problema 1: si una persona está interesada en estimar (o predecir) el tiempo que le tomaría llegar a la universidad desde un lugar ubicado a una distancia de 7.83 km, ¿Qué modelo le recomendaría a esta persona?
# Datos para modeloencuesta_mod<-encuesta%>%filter(tiempo_casa_u<750)# Ajuste del modelomodelo1<-lm(tiempo_casa_u~distancia_casa_u, data =encuesta)modelo2<-lm(tiempo_casa_u~distancia_casa_u, data =encuesta_mod)
Problema 2: la misma persona del problema 1 ahora nos menciona que se movilizará hasta la universidad en motocicleta, ¿cambia en algo su modelo? ¿Cuántos modelos son posibles?
total_variogramas<-bind_rows(variograma_nulo, variograma_dist, variograma_esp)total_variogramas%>%ggplot(aes(x =dist, y =gamma, color =Modelo))+geom_point()
Regresión Kriging
Ajuste de variogramas:
psill: meseta parcial. Estabilización de la semivarianza.
range: separación o distancia entre pares de puntos en la cual ya no hay dependencia espacial.
nugget: semivarianza esperada a la separación o distancia de 0m
Los valores de psill, range y nugget sirven como valores iniciales para el ajuste del modelo.
Code
# Biblioteca necesaria para ajustar variogramaslibrary(gstat)# Ajuste de varioramaajuste_var<-fit.variogram(object =variograma_esp, model =vgm( model ="Sph", psill =1, range =700, nugget =1))# Grid de datos a predecirdata("meuse.grid")# Conversión a sffmeusegrid_sf<-meuse.grid%>%st_as_sf(coords =c(1, 2), crs ="+init=epsg:28992")prediccion_spat<-krige(log(zinc)~1, zinc_sf, meusegrid_sf, model =ajuste_var)
---title: "Ajuste de modelos con R"author: "Edimer David Jaramillo"format: html: toc: true toc-title: "Tabla de contenido" smooth-scroll: true code-fold: true df-print: paged toc-location: left number-depth: 4 theme: light: flatly dark: darkly code-copy: true highlight-style: github code-tools: source: true code-link: true ---```{r setup, include=FALSE}knitr::opts_chunk$set(echo =TRUE, warning =FALSE, message =FALSE)```# Bibliotecas R```{r}library(tidyverse) # Manipulación de datos y gráficoslibrary(janitor) # Edición automática de nombreslibrary(yardstick) # Métricas para evaluar modeloslibrary(ggeffects) # Gráficos de efectos estimados en modelo lineallibrary(FactoMineR) # Métodos multivariados library(factoextra) # Gráficos para métodos multivariados```# Preguntas pendientes## Distancia vs tiempo- **Problema 1:** si una persona está interesada en estimar (o predecir) el tiempo que le tomaría llegar a la universidad desde un lugar ubicado a una distancia de 7.83 km, ¿Qué modelo le recomendaría a esta persona?- **Problema 2:** la misma persona del *problema 1* ahora nos menciona que se movilizará hasta la universidad en *motocicleta*, ¿cambia en algo su modelo? ¿Cuántos modelos son posibles?## Análisis multivariado- ¿Cómo podemos analizar todas las variables (de frutas y vegetales) juntas? ¿Es posible?# Datos## Encuesta```{r}encuesta <-read_csv("EncuestaDepurada.csv")encuesta %>%head()```## Frutas y vegetales```{r}frutas <-read_csv("fruits.csv", na ="-") %>%clean_names() %>%mutate(grupo ="Frutas") %>%select(-c(energy_kcal_k_j))vegetales <-read_csv("vegetables.csv", na ="-") %>%clean_names() %>%mutate(grupo ="Vegetales") %>%select(-c(energy_kcal_k_j))frutas_vegetales <-bind_rows(frutas, vegetales) %>%filter(!is.na(sugars_g)) %>%filter(!is.na(vitamin_a_iu)) %>%filter(!is.na(vitamin_b5_mg)) %>%filter(!is.na(vitamin_e_mg))frutas_vegetales %>%head()```# Modelo lineal## Modelo 1- **Problema 1:** si una persona está interesada en estimar (o predecir) el tiempo que le tomaría llegar a la universidad desde un lugar ubicado a una distancia de 7.83 km, ¿Qué modelo le recomendaría a esta persona?$$y = mx + b$$$$y = \beta_1x + \beta_0$$$$\hat{y} = \hat{\beta_1}x + \hat{\beta_0} + \hat{\epsilon} \\ $$### Gráfico de dispersión```{r}encuesta %>%filter(tiempo_casa_u <750) %>%ggplot(aes(x = distancia_casa_u, y = tiempo_casa_u)) +geom_point(size =2) ```### Ajuste ```{r}# Datos para modeloencuesta_mod <- encuesta %>%filter(tiempo_casa_u <750)# Ajuste del modelomodelo1 <-lm(tiempo_casa_u ~ distancia_casa_u,data = encuesta)modelo2 <-lm(tiempo_casa_u ~ distancia_casa_u,data = encuesta_mod)```- ¿El resultado de los modelos es diferente?```{r}modelo1 %>%summary()``````{r}modelo2 %>%summary()```### ¿Mejor modelo?- ¿Valores predichos vs valores reales? Raíz del cuadrado medio del error (RMSE):$$RMSE = \sqrt{\frac{\sum_{i = 1}^{n}(y_i-\hat{y_i})^2}{n}}$$```{r}reales_mod1 <- encuesta$tiempo_casa_ureales_mod2 <- encuesta_mod$tiempo_casa_upredichos_mod1 <-predict(modelo1, newdata = encuesta)predichos_mod2 <-predict(modelo2, newdata = encuesta_mod)rmse_mod1 <-rmse_vec(truth = reales_mod1, estimate = predichos_mod1)rmse_mod2 <-rmse_vec(truth = reales_mod2, estimate = predichos_mod2)```- RMSE del modelo 1:```{r}rmse_mod1```- RMSE del modelo 2:```{r}rmse_mod2```### Predicciones$$\hat{y} = \hat{\beta_1}x + \hat{\beta_0} + \hat{\epsilon} \\ $$$$\hat{y} = 1.1306x + 17.5930 \\ $$```{r}datos_nuevos <-data.frame(distancia_casa_u =c(7.83))predict(modelo2, newdata = datos_nuevos)```- Manualmente:```{r}(1.1306*7.83) +17.5930```## Modelo 2- **Problema 2:** la misma persona del *problema 1* ahora nos menciona que se movilizará hasta la universidad en *motocicleta*, ¿cambia en algo su modelo? ¿Cuántos modelos son posibles?$$\hat{y} = \hat{\beta_0} + \hat{\beta_1}x_1 + \hat{\beta_2}x_2 + ... +\hat{\beta_k}x_k + \hat{\epsilon} \\ $$### Gráfico de dispersión```{r}encuesta %>%filter(tiempo_casa_u <750) %>%ggplot(aes(x = distancia_casa_u, y = tiempo_casa_u, color = medio_transporte)) +geom_point(size =2) ```### Ajuste ```{r}# Ajuste del modelomodelo3 <-lm(tiempo_casa_u ~ distancia_casa_u + medio_transporte,data = encuesta_mod)```- ¿El resultado de los modelos es diferente?```{r}modelo3 %>%summary()```### ¿Mejor modelo?- ¿Valores predichos vs valores reales? Raíz del cuadrado medio del error (RMSE):$$RMSE = \sqrt{\frac{\sum_{i = 1}^{n}(y_i-\hat{y_i})^2}{n}}$$```{r}reales_mod3 <- encuesta_mod$tiempo_casa_upredichos_mod3 <-predict(modelo3, newdata = encuesta_mod)rmse_mod3 <-rmse_vec(truth = reales_mod3, estimate = predichos_mod3)```- RMSE de los modelos 1, 2 y 3:```{r}rmse_mod1rmse_mod2rmse_mod3```### Predicciones$$\hat{y} = \hat{\beta_0} + \hat{\beta_1}x_1 + \hat{\beta_2}x_2 + ... +\hat{\beta_k}x_k + \hat{\epsilon} \\ $$```{r}coefficients(modelo3)``````{r}datos_nuevos2 <-data.frame(distancia_casa_u =7.83, medio_transporte ="Motocicleta")predict(modelo3, newdata = datos_nuevos2)```- Manualmente:```{r}14.771884+ ((1.023430*7.83) + (-3.623867*1) + (11.771737*0)) ```## Estimación con modelo final- Efecto marginal de la variable *distancia*:```{r}graficos_modelo <-modelo3 %>%ggpredict() %>%plot()graficos_modelo$distancia_casa_u```- Efecto marginal de la variable *medio de transporte*:```{r}graficos_modelo$medio_transporte```# Análisis de componentes principales (PCA)## Idea intuitiva<center><imgsrc="https://miro.medium.com/max/1400/1*37a_i1t1tDxDYT3ZI6Yn8w.gif"/></center>## Ajuste y resumen```{r}acp <-PCA(X = frutas_vegetales %>%select(-name),quali.sup =21,graph =FALSE)summary(acp)```## Gráfico de variables (1 y 2)- Todas:```{r}fviz_pca_var(X = acp, axes =c(1, 2))```- 10 variables de mayor contribución:```{r}fviz_pca_var(X = acp, axes =c(1, 2), select.var =list(contrib =10))```## Gráfico de individuos```{r}fviz_pca_ind(X = acp, axes =c(1, 2))```## Biplot```{r}fviz_pca_biplot(X = acp, axes =c(1, 2), select.var =list(contrib =10),col.ind = frutas_vegetales$grupo)```## Explor (App)```{r, eval=FALSE}library(explor)explor(acp)```# Análisis de clúster## K-Means idea intuitiva<center><imgsrc="https://upload.wikimedia.org/wikipedia/commons/e/ea/K-means_convergence.gif"/></center>## K = 2```{r}set.seed(1)kmeans_k2 <-kmeans(x = frutas_vegetales %>%select(where(is.numeric)),centers =2)kmeans_k2```## ¿Cuál es el mejor K?```{r}set.seed(1)fviz_nbclust(x = frutas_vegetales %>%select(where(is.numeric)),method ="wss",FUNcluster = kmeans,k.max =10)```## K = 3```{r}set.seed(1)kmeans_k3 <-kmeans(x = frutas_vegetales %>%select(where(is.numeric)),centers =3)kmeans_k3```## Grupos```{r}df_cluster_k3 <- frutas_vegetales %>%mutate(cluster =as.factor(kmeans_k3$cluster))df_cluster_k3 %>%head()```- ¿Cómo quedaron asignadas las frutas y vegetales con el análisis de clúster?```{r}df_cluster_k3 %>%count(grupo, cluster)```# PCA + K-Means```{r}fviz_pca_biplot(X = acp, axes =c(1, 2), select.var =list(contrib =10),col.ind = df_cluster_k3$cluster)```# Interpolación espacial## Datos de ejemplo```{r}# Bibliotecaslibrary(sp)library(sf)library(raster)library(leaflet)library(gstat)# Datos para ejemplodata("meuse")data_zinc <- meuse# Formato sfzinc_sf <- data_zinc %>%st_as_sf(coords =c(1, 2), crs ="+init=epsg:28992")# Coordenadas# x: longitud# y: latitudcoordinates(data_zinc) <-~ x + y```## Gráfico con ggplot2```{r}zinc_sf %>%ggplot() +geom_sf(aes(color = zinc)) +theme_bw() +scale_color_viridis_c()```## Gráfico con leaflet```{r}leaflet(as_Spatial(st_transform(zinc_sf, crs =4326))) %>%addTiles() %>%addCircles()```## Variogramas### Modelo nulo```{r}variograma_nulo <-variogram(object =log(zinc) ~1, data = data_zinc) %>%mutate(Modelo ="Nulo")variograma_nulo %>%ggplot(aes(x = dist, y = gamma)) +geom_point()```### Modelo distancias```{r}variograma_dist <-variogram(log(zinc) ~ dist, data = data_zinc) %>%mutate(Modelo ="Distancia")variograma_dist %>%ggplot(aes(x = dist, y = gamma)) +geom_point()```### Modelo espacial```{r}variograma_esp <-variogram(log(zinc) ~ x + y, data = data_zinc) %>%mutate(Modelo ="Espacial")variograma_esp %>%ggplot(aes(x = dist, y = gamma)) +geom_point()```## Comparando variogramas```{r}total_variogramas <-bind_rows(variograma_nulo, variograma_dist, variograma_esp)total_variogramas %>%ggplot(aes(x = dist, y = gamma, color = Modelo)) +geom_point()```## Regresión Kriging- Ajuste de variogramas: - psill: meseta parcial. Estabilización de la semivarianza. - range: separación o distancia entre pares de puntos en la cual ya no hay dependencia espacial. - nugget: semivarianza esperada a la separación o distancia de 0m - Los valores de psill, range y nugget sirven como valores iniciales para el ajuste del modelo.```{r}# Biblioteca necesaria para ajustar variogramaslibrary(gstat)# Ajuste de varioramaajuste_var <-fit.variogram(object = variograma_esp,model =vgm(model ="Sph",psill =1,range =700,nugget =1 ))# Grid de datos a predecirdata("meuse.grid")# Conversión a sfmeusegrid_sf <- meuse.grid %>%st_as_sf(coords =c(1, 2), crs ="+init=epsg:28992")prediccion_spat <-krige(log(zinc) ~1, zinc_sf, meusegrid_sf, model = ajuste_var)prediccion_spat %>%ggplot() +geom_sf(aes(color =exp(var1.pred))) +scale_color_viridis_c(name ="Zinc (predicho)")```# Anexo- Mapa universidad:```{r}library(leaflet)leaflet() %>%addTiles() %>%setView(lng=-75.20082, lat=7.99156, zoom =16) %>%addProviderTiles(provider = providers$Esri.WorldImagery, group ="Satellite") %>%addLayersControl(baseGroups =c("Street View", "Satellite")) %>%addMarkers(lng=-75.20082, lat=7.99156, popup ="Belmont Park")```