Marzo 2021
Conocimientos de R (saben abrirlo, cargar paquetes y datos, saben hacer operaciones y gráficos).
Quieren conocer explorar datos y conocer la sintaxis para hacer modelos lineales en R.
Conocimientos de R (saben abrirlo, cargar paquetes y datos, saben hacer operaciones y gráficos).
Quieren conocer explorar datos y conocer la sintaxis para hacer modelos lineales en R.
Notas
Ya vieron teoría, hoy es solo para que practiquen en R.
Recuerden que los modelos dependen de sus preguntas y experimentos o muestreos.
Ejemplos de regresiones lineales simples
Sthda por Alboukadel Kassambara
Ejercicios de estadística con R
Matias Andina
Tutoriales diversos
STAT 545
Ejercicios practicos
ourcodingclub
Outliers
Rocio Joo
Imágenes adicionales
Unsplash
Portada por Kristine Wook
Siempre inspecciona tus datos!
Todos esto gráficos tienen medias, desviaciones estandar y una correlacion entre puntos similar.
Alberto Cairo creo este paquete (datasauRus) para ilustrarlo.
Si quieren replicar algunas graficas:
#install.packages('datasauRus')library(datasauRus)
ggplot(datasaurus_dozen, aes(x=x, y=y, colour=dataset))+ geom_point()+ theme_void()+ theme(legend.position = "none")+ facet_wrap(~dataset, ncol=3)
Exploremos los datos de pinguinos.
library(ggplot2)library(datos)
## Warning: package 'datos' was built under R version 4.2.3
Pingus<-datos::pinguinos
Recordemos como se realizan los gráficos de puntos.
ggplot(Pingus) + aes(x = largo_aleta_mm, y = masa_corporal_g)+ geom_point()
Sabemos que hay tres especies, separemos las especies por colores.
ggplot(Pingus, aes(x=largo_aleta_mm, y=masa_corporal_g, color=especie))+ geom_point()
Si agregamos una nueva capa con la linea de tendencia, especificamos un ajuste lineal ("lm") podemos ver como se relacionan estos datos.
No obstante! tenemos datos de tres especies diferentes!
ggplot(Pingus, aes(x=largo_aleta_mm, y=masa_corporal_g)) + geom_point(aes(color =especie))+ geom_smooth(method="lm")
Cambiando algunos argumentos nos permite explorar y obtener diferentes resultados gráficos usando los mismos datos.
Por ejemplo, si cambiamos la ubicacion del color, le decimos que me haga lineas por especies.
ggplot(Pingus, aes(x=largo_aleta_mm, y=masa_corporal_g, color = especie)) + geom_point() + geom_smooth(method = "lm")
facet_wrap es un argumento que nos permite ver variables categoricas separadas por panel.
ggplot(Pingus, aes(x=largo_pico_mm, y=alto_pico_mm)) + geom_point()+ facet_wrap(~especie)
Noten que al usar facet_wrap los paneles se acomodan de cierta manera que no es fácil de cambiar, para cambiar como están acomodados podemos usar cowplot o patchwork.
Deben instalarlo antes.
#install.packages("cowplot")library(cowplot)
Guardar plots con nombres e incluirlos en una sola figura.
cowplot::plot_grid(p1,p2,p3,p4, labels = "AUTO") #<< Agrega letras
Cargar libreria.
#install.packages(plotly)library(plotly)
Crear ggplot.
Pingus_puntos<-ggplot(Pingus, aes(x=largo_aleta_mm, y=masa_corporal_g, color = especie)) + geom_point()
La funcion ggplotly te permite inspeccionar tu grafico de manera interactiva.
ggplotly(Pingus_puntos)
Vamos a ver un ejemplo en los ejercicios.
Cargar datos desde el paquete, usar read_csv, o import dataset.
library(datos)library(tidyverse)Pingus<-datos::pinguinos
Crear un gráfico.
ggplot(Pingus, aes(x=largo_aleta_mm, y=masa_corporal_g, color = especie)) + geom_point() + geom_smooth(method = "lm")
Cambiemos el orden de los argumentos.
ggplot(Pingus, aes(x=largo_aleta_mm, y=masa_corporal_g)) + geom_point(aes(color =especie))+ geom_smooth(method="lm")
Ver variables categoricas separadas por panel.
ggplot(Pingus, aes(largo_pico_mm, alto_pico_mm)) + geom_point()+ facet_wrap(~especie)
Exploremos los datos usando solo los datos de Pinguinos de Adelia.
Adelia<-Pingus%>% filter(especie=='Adelia')
ggplot(Adelia, aes(x=largo_aleta_mm, y=masa_corporal_g)) + geom_point())+ geom_smooth(method="lm")
Cargar libreria.
#install.packages(plotly)library(plotly)
Crear ggplot.
Pingus_puntos<-ggplot(Pingus, aes(x=largo_aleta_mm, y=masa_corporal_g, color = especie)) + geom_point()
La funcion ggplotly te permite inspeccionar tu grafico de manera interactiva.
ggplotly(Pingus_puntos)
Recordatorio:
Cuando busquen ejemplos en Internet, en algún momento van a toparse con:
set.seed(123)ejemplo <- rnorm(n = 10000, mean = 0, sd = 1)
Que es set.seed?
set.seed genera secuencias de numeros "random" pero al poner una "semilla" nos aseguramos de que nos genere la misma secuencia en todas las computadoras.
Que es rnorm?
rnorm sirve para generar muestras aleatorias a partir de una población teórica con distribución normal, dandole media y desviación estándar.
Cuando busquen ejemplos en Internet, en algún momento van a toparse con:
set.seed(123)ejemplo <- rnorm(n = 10000, mean = 0, sd = 1)
Que es set.seed?
set.seed genera secuencias de numeros "random" pero al poner una "semilla" nos aseguramos de que nos genere la misma secuencia en todas las computadoras.
Que es rnorm?
rnorm sirve para generar muestras aleatorias a partir de una población teórica con distribución normal, dandole media y desviación estándar.
Cuando hagan preguntas en internet, es muy útil usarlo!
Para esto, tomamos una muestra de 100 voluntarios y los asignamos de manera aleatoria a 5 dosis de chocolate (20, 40, 60, 80, y 100 gramos). Los individuos consumen la dosis asignada, el chocolate aumenta su felicidad (según la fórmula felicidad=dosis∗2.5+10), que medimos y graficamos.
Generar participantes
id <- 1:100
Generar dosis
dosis <- sort(rep(seq(20,100,20), 20))
Generar respuesta "ideal"
respuesta <- dosis * 2.5 + 10
Construir data.frame
datos <- data.frame(id=id,dosis=dosis,respuesta=respuesta)
Asi se veria nuestro modelo ideal
p <- ggplot(datos, aes(x=dosis, y=respuesta))+ geom_point()+ xlab("Dosis Chocolate (gr)")+ ylab("Felicidad")p
Semilla para muestras aleatorias.
set.seed(444)
Agregar ruido con distribución normal (media 0, sd = 5)
datos$respuesta <- datos$respuesta + rnorm(n = 100, mean = 0, sd = 5)
p <- ggplot(datos, aes(x=dosis, y=respuesta))+ geom_point(alpha = 0.1)+ xlab("Dosis Chocolate (gr)")+ ylab("Felicidad")p
nuevo concepto: alpha en el grafico crea puntos con 'transparencia'.
Para construir modelos en R, es importante el simbolo virgulilla
~
En nuestro caso, queremos estudiar la relación entre la felicidad (respuesta) y la dosis de chocolate (dosis). Entonces el modelo se construiría de la siguiente manera.
modelo_chocolate <- lm(data=datos, respuesta ~ dosis)
Ver resultados del modelo.
summary(modelo_chocolate)
## ## Call:## lm(formula = respuesta ~ dosis, data = datos)## ## Residuals:## Min 1Q Median 3Q Max ## -9.204 -3.696 -1.330 3.091 11.497 ## ## Coefficients:## Estimate Std. Error t value Pr(>|t|) ## (Intercept) 8.59279 1.15698 7.427 4.15e-11 ***## dosis 2.51659 0.01744 144.283 < 2e-16 ***## ---## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1## ## Residual standard error: 4.933 on 98 degrees of freedom## Multiple R-squared: 0.9953, Adjusted R-squared: 0.9953 ## F-statistic: 2.082e+04 on 1 and 98 DF, p-value: < 2.2e-16
El paquete broom (de la paqueteria tidyverse), nos permite extraer información estadística de los modelos.
Aquí está la tabla con los estimadores:
broom::tidy(modelo_chocolate)
## # A tibble: 2 × 5## term estimate std.error statistic p.value## <chr> <dbl> <dbl> <dbl> <dbl>## 1 (Intercept) 8.59 1.16 7.43 4.15e- 11## 2 dosis 2.52 0.0174 144. 5.93e-116
A partir de la columna de estimadores (estimate), vemos que el consumo de chocolate incrementa la felicidad (esperamos mayor un incremento en ~2.52 unidades de felicidad por cada gramo de chocolate).
Nuestro modelo puede escribirse como:
felicidad=2.52∗dosis de chocolate+8.59
felicidad=2.52∗dosis de chocolate+8.59
También podemos acceder a porciones del modelo por separado.
Coeficientes.
modelo_chocolate$coefficients
## (Intercept) dosis ## 8.592791 2.516593
Intervalos.
round(confint(modelo_chocolate), 3)
## 2.5 % 97.5 %## (Intercept) 6.297 10.889## dosis 2.482 2.551
Valores predichos.
head(modelo_chocolate$fitted.values,5)
## 1 2 3 4 5 ## 58.92464 58.92464 58.92464 58.92464 58.92464
Residuales.
head(modelo_chocolate$residuals,5)
## 1 2 3 4 5 ## -3.7340820 -0.3253313 -7.2040228 1.8230764 6.2374206
Podemos explorar el ajuste y analizar el cumplimiento de supuestos en R utilizando la función plot que maneja bien objetos lm.
par(mfrow = c(2, 2))plot(modelo_chocolate)
nuevo concepto par(mfrow), es que nos muestre los graficos en dos columnas y dos filas. par por grafical parameters, mf de Multiple Figures/Frames y row de ordenado por fila.
Cargar e instalar paquetes.
#install.packages("performance")#install.packages('see')library(performance)
Algunas funciones del paquete:
check_model(modelo_chocolate)
Cambiemos nuestros datos para un peor ajuste.
datos$nueva_dosis <- datos$dosis + rnorm(100,10,10)
Creemos un nuevo modelo.
nuevo_modelo <- lm(data = datos, respuesta~nueva_dosis)
Agreguemos los valores predichos y los residuales a nuestro data frame.
datos$nuevo_pred <- nuevo_modelo$fitted.valuesdatos$residuos <- nuevo_modelo$residuals
Estos son nuestros nuevos datos, y la linea de regression.
Plot_nueva_dosis<- ggplot(datos, aes(nueva_dosis, respuesta))+ geom_point()+ geom_point(aes(nueva_dosis, nuevo_pred), color="gray50", pch=1) + theme(plot.background = element_rect(colour = NA))+ xlab("Dosis Chocolate (gr)")+ ylab("Felicidad")Plot_nueva_dosis
Agregar los residuales.
Plot_nueva_dosis + geom_segment(aes(xend = nueva_dosis, yend = nuevo_pred), alpha=0.5)
Una herramienta para visualizar mejor los puntos con residuos grandes es graficarlos utilizando una escala de color y tamaño.
ggplot(datos, aes(nueva_dosis, respuesta))+ geom_point(aes(color = residuos, size=abs(residuos)))+ geom_point(aes(nueva_dosis, nuevo_pred), color="gray50", pch=1) + geom_segment(aes(xend = nueva_dosis, yend = nuevo_pred), alpha=0.5)+ xlab("Dosis Chocolate (gr)")+ ylab("Felicidad")+ scale_color_gradientn(colours = c("red", "black", "red"))+ guides(color = FALSE, size = FALSE)
Los objetivos de realizar un análisis de regresión pueden resumirse en:
Generar nuestros datos.
id <- 1:100 dosis <- sort(rep(seq(20,100,20), 20))respuesta <- dosis * 2.5 + 10datos <- data.frame(id=id, dosis=dosis, respuesta=respuesta)set.seed(444)datos$respuesta <- datos$respuesta + rnorm(n = 100, mean = 0, sd = 5)
Crear figura.
p <- ggplot(datos, aes(x=dosis, y=respuesta))+ geom_point(alpha = 0.1)+ geom_smooth(method="lm")+ xlab("Dosis Chocolate (gr)")+ ylab("Felicidad")p
Sintaxis de modelos lineares.
modelo_chocolate <- lm(data=datos, respuesta ~ dosis)
Obtener estimadores.
summary(modelo_chocolate)broom::tidy(modelo_chocolate)
Ver coeficientes.
modelo_chocolate$coefficients
Checar supuestos.
#install.packages("performance")#install.packages('see')library(performance)
check_model(modelo_chocolate)
Ver los residuales. Cambiemos nuestros datos para un peor ajuste.
datos$nueva_dosis <- datos$dosis + rnorm(100,10,10)
nuevo_modelo <- lm(data = datos, respuesta~nueva_dosis)
datos$nuevo_pred <- nuevo_modelo$fitted.valuesdatos$residuos <- nuevo_modelo$residuals
ggplot(datos, aes(nueva_dosis, respuesta))+ geom_point(aes(color = residuos, size=abs(residuos)))+ geom_point(aes(nueva_dosis, nuevo_pred), color="gray50", pch=1) + geom_segment(aes(xend = nueva_dosis, yend = nuevo_pred), alpha=0.5)+ xlab("Dosis Chocolate (gr)")+ ylab("Felicidad")+ scale_color_gradientn(colours = c("red", "black", "red"))+ guides(color = FALSE, size = FALSE)
Keyboard shortcuts
↑, ←, Pg Up, k | Go to previous slide |
↓, →, Pg Dn, Space, j | Go to next slide |
Home | Go to first slide |
End | Go to last slide |
Number + Return | Go to specific slide |
b / m / f | Toggle blackout / mirrored / fullscreen mode |
c | Clone slideshow |
p | Toggle presenter mode |
t | Restart the presentation timer |
?, h | Toggle this help |
Esc | Back to slideshow |