Práctica de regresión lineal simple
Sección teórica
Responda a las siguientes preguntas:
¿Qué relación hay entre el tamaño de muestra de los datos y la precisión de los estimadores del modelo de regresión lineal simple?
- El tamaño de muestra es uno de los aspectos importantes a considerar en la aplicación del algorítmo de regresión lineal simple. De manera general, un mayor tamaño de muestra producirá coeficientes más precisos y con menor variablilidad; por otro lado, un tamaño de muestra menor puede incrementar la variabilidad en los estimadores y reducir el poder estadístico del modelo.
La razón está en que un tamaño de muestra mayor representa mejor a la población, reduciendo el error estándar de los estimadores del modelo y haciendo que éstos converjan a los parámetros poblacionales verdaderos.
- El tamaño de muestra es uno de los aspectos importantes a considerar en la aplicación del algorítmo de regresión lineal simple. De manera general, un mayor tamaño de muestra producirá coeficientes más precisos y con menor variablilidad; por otro lado, un tamaño de muestra menor puede incrementar la variabilidad en los estimadores y reducir el poder estadístico del modelo.
¿Cómo afecta la presencia de valores atípicos en los resultados del modelo de regresión lineal simple?
- El modelo de regresión lineal simple busca estimar los parámetros de la línea recta cuya suma de los cuadrados de los errores sea mínima calculando la distancia entre los valores reales y los valores ajustados por la línea recta.
Cuando una observación se desvía significativamente del resto puede influir en los coeficientes pues el algoritmo buscará minimizar la distancia existente hacia las observaciones atípicas sesgando el valor de los estimadores en la dirección de los valores atípicos, de forma no técnica se puede decir que un outlier atrae la recta de regresión hacia el resultando en un modelo menos preciso y menos confiable.
La presencia de valores atípicos también puede mermar la significancia estadística del modelo pues se vuelve más dificil la detección de una relación significativa entre la variable dependiente y la variable independiente.
- El modelo de regresión lineal simple busca estimar los parámetros de la línea recta cuya suma de los cuadrados de los errores sea mínima calculando la distancia entre los valores reales y los valores ajustados por la línea recta.
Suponga que le muestran un modelo de regresión lineal simple con un ajuste perfecto, es decir, donde \(R^2 = 1\), ¿qué podría decir de ese modelo?
Aunque en la teoría podría parecer que un valor de \(R^2=1\) es alcanzable, encontrar este valor refleja un problema con los datos usados.
Recordemos que en el modelo de regresión lineal se cumple:
\[r^2=R^2\]
Donde \(r\) es el coeficiente de correlación de Pearson, por lo tanto un valor de \(R^2=1\) significaría que \(r=\pm1\).
La única manera de obtener esos valores es que la variable independiente y la variable dependiente sean la misma salvo alguna transformación lineal.Miremos el siguiente ejemplo, usando a la misma variable como dependiente e independiente:
y <- sample(-1000:1000, 100) x <- y (data_frame(x, y) %>% ggplot(., aes(x, y))+ geom_point()+ theme_minimal()) %>% ggplotly()Calculemos correlación:
cor(x, y)[1] 1Ajustemos el modelo:
m <- lm(y~x) summary(m) %>% sjPlot::tab_model()Dependent variable Predictors Estimates CI p (Intercept) -0.00 -0.00 – 0.00 0.063 x 1.00 1.00 – 1.00 <0.001 Observations 100 R2 / R2 adjusted 1.000 / 1.000 Ahora usemos las mismas variables pero transformando una de ellas:
x <- 4*y+10 (data_frame(x, y) %>% ggplot(., aes(x, y))+ geom_point()+ theme_minimal()) %>% ggplotly()cor(x, y)[1] 1m <- lm(y~x) summary(m) %>% sjPlot::tab_model()Dependent variable Predictors Estimates CI p (Intercept) -2.50 -2.50 – -2.50 <0.001 x 0.25 0.25 – 0.25 <0.001 Observations 100 R2 / R2 adjusted 1.000 / 1.000 Como vemos, un modelo de regresión lineal con un valor \(R^2=1\) se trataría de un modelo redundante donde para modelar la variable de interés Y, necesitaríamos conocer los valores de ella misma. Por lo tanto, aunque contraintuitivo, se trataría de un modelo inválido.
Sección práctica
La CFE está interesada en entender la relación entre la temperatura promedio diaria y el consumo eléctrico de una ciudad con el objetivo de crear un modelo que permita predecir el consumo eléctrico usando el pronóstico del tiempo.
Se le encarga al equipo de estadística de la compañía realizar el proyecto.
Para llevarlo acabo se le proporciona un conjunto de datos que contiene las siguientes variables:
Temperatura: indica la temperatura promedio bimestral en °F
Consumo: indica el consumo eléctrico promedio por habitante
library(pins)
board <- board_folder("linear_models")
cfe_data <- board %>%
pin_read("cfe_data")Ajuste y valide un modelo de regresión lineal simple para los datos.
Desarrollo
Empezaremos con la revisión de datos:
skimr::skim(cfe_data)| Name | cfe_data |
| Number of rows | 15 |
| Number of columns | 3 |
| _______________________ | |
| Column type frequency: | |
| character | 2 |
| numeric | 1 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| fecha | 0 | 1 | 11 | 11 | 0 | 15 | 0 |
| temperatura | 0 | 1 | 5 | 6 | 0 | 15 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| consumo | 0 | 1 | 895.27 | 565.61 | 210 | 408.5 | 607 | 1396.5 | 1886 | ▇▁▂▃▂ |
Nuestro conjunto de datos consta de tres variables: fecha, temperatura y consumo. Estas dos últimas serán la que usaremos para el modelo de regresión lineal.
El primer problema que notamos es que la variable de temperatura se muestra como de tipo character.
head(cfe_data) %>%
knitr::kable()| fecha | consumo | temperatura |
|---|---|---|
| dic22-feb23 | 297 | 64,76 |
| oct22-dic22 | 210 | 61,345 |
| ago22-oct22 | 1190 | 74,795 |
| jun22-ago22 | 1886 | 85,495 |
| abr22-jun22 | 1523 | 83,68 |
| feb22-abr22 | 429 | 72,815 |
Hay dos opciones:
- Las comas debería ser puntos decimales
- Las comas indican separación de millares
Sabemos que los datos de temperatura están dados en °F por lo que es imposible que las comas indiquen separación de millares, así que en realidad las comas deberían ser puntos decimales.
Corregimos la variable:
cfe_data <- cfe_data %>%
mutate(temperatura = as.numeric(gsub(",", ".", temperatura)))skimr::skim(cfe_data)| Name | cfe_data |
| Number of rows | 15 |
| Number of columns | 3 |
| _______________________ | |
| Column type frequency: | |
| character | 1 |
| numeric | 2 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| fecha | 0 | 1 | 11 | 11 | 0 | 15 | 0 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| consumo | 0 | 1 | 895.27 | 565.61 | 210.00 | 408.50 | 607.00 | 1396.50 | 1886.0 | ▇▁▂▃▂ |
| temperatura | 0 | 1 | 71.64 | 9.31 | 56.71 | 64.43 | 72.82 | 79.02 | 85.5 | ▆▆▃▆▇ |
Creamos gráficos descriptivos de los datos para entenderlos mejor:
(
ggplot(cfe_data, aes(consumo))+
geom_density(fill = "#0AAC00")+
theme_minimal()
) %>%
ggplotly()El consumo eléctrico presenta una distribución bimodal, lo que puede indicar dos momentos temporales de consumo incremental.
(
ggplot(cfe_data, aes(temperatura))+
geom_density(fill = "#F73719")+
theme_minimal()
) %>%
ggplotly()La distribución de temperatura también el bimodal, es muy probable que las incrementos que observamos estén relacionados con los que veíamos previamente en el consumo.
Aprovechando que tenemos una variable temporal podemos hacer un gráfico de lineal que muestre temperatura y consumo en el tiempo:
g1 <- cfe_data %>%
mutate(orden = rev(1:n())) %>%
ggplot(., aes(x = orden))+
geom_line(aes(y = temperatura, group = 1, colour = "#F73719"))+
theme_minimal()
g2 <- cfe_data %>%
mutate(orden = rev(1:n())) %>%
ggplot(., aes(x = orden))+
geom_line(aes(y = consumo, group = 1, colour = "#0AAC00"))+
theme_minimal()
gridExtra::grid.arrange(g1, g2)Vemos que justamente los incrementos de temperatura y consumo coinciden, de hecho el comportamiento general de temperatura y consumo parece estrechamente relacionado.
Esto puede indicar que en la ciudad donde los datos fueron capturados se hace uso de sistemas de aire acondicionado, especificamente para el clima caluroso. y por esa razón los incrementos de temperatura se relacionan con el incremento de consumo eléctrico.
cor(cfe_data$consumo, cfe_data$temperatura)[1] 0.8792633
Si vemos el coeficiente de correlación confirmamos una relación existente.
(
ggplot(cfe_data, aes(temperatura, consumo))+
geom_point()+
labs(title = "Grafico de dispersión entre las variables de temperatura y consumo eléctrico")+
theme_minimal()
) %>%
ggplotly()En el gráfico de dipsersión también podemos confirmar visualmente la relación ya mencionada.
Notemos que hay una región de consumo donde tenemos valores no observamos, esta falta de datos podría mermar la calidad del modelo de regresión lineal.
Ahora crearemos el modelo de regresión lineal simple:
modelo_consumo <- lm(consumo ~ temperatura, data = cfe_data)
summary(modelo_consumo) %>%
sjPlot::tab_model()| consumo | |||
|---|---|---|---|
| Predictors | Estimates | CI | p |
| (Intercept) | -2930.97 | -4182.73 – -1679.21 | <0.001 |
| temperatura | 53.41 | 36.07 – 70.75 | <0.001 |
| Observations | 15 | ||
| R2 / R2 adjusted | 0.773 / 0.756 | ||
Del resumen del modelo podemos concluir que la temperatura es una variable estadísticamente significativa para explicar el consumo eléctrico pues el p.value asociado a la prueba de hipótesis \(\beta_1=0\) es muy pequeño.
El modelo obtenido tiene una \(R^2=0.77\) la cuál indica que usando únicamente la temperatura podemos explicar de buna manera el comportamiento del consumo eléctrico.
Veamos las gráficas de diagnóstico:
library(ggfortify)
autoplot(modelo_consumo, 1)+
theme_minimal()Este gráfico nos ayuda a visualizar si los residuales siguen patrones no lineales que indiquen la presencia de este mismo tipo de relación entre las variables independiente y dependiente.
El patrón mostrado podría indicar que la relación entre temperatura y consumo no es lineal, pero también podría deberse a la región no observada de consumo para la cual no tenemos residuales y que podrían estár ocasionando una falta de indentificación correcta de la relación subyacente a los datos.
autoplot(modelo_consumo, 2)+
theme_minimal()Del gráfico cuantil-cuantil podemos observar un comportamiento muy cercano a la distribución normal salvo por las colas, lo cual es esperado.
autoplot(modelo_consumo, 3)+
theme_minimal()El gráfico de diagnóstico para homocedasticidad también puede llegar a ser confuso dada la posible falta de datos, podemos usar una prueba estadística para tener una mejor idea de la conclusión que debemos hacer.
lmtest::bptest(modelo_consumo)
studentized Breusch-Pagan test
data: modelo_consumo
BP = 0.049619, df = 1, p-value = 0.8237
La prueba indica que no se rechaza homocedasticidad.
autoplot(modelo_consumo, 4)+
theme_minimal()La distancia de cook se considera alta si es mayor que 0.5 y extrema si es mayor que 1, de acuerdo con otros autores también sería alta si es mayor que \(\frac{4}{n} = \frac{4}{15}=0.26\)
En nuestro gráfico no observamos casos que puedan considerarse influyentes.
Podemos concluir en general que tenemos un buen modelo para explicar el consumo eléctrico usando la temperatura de la ciudad.
Regresemos al resúmen del modelo:
summary(modelo_consumo) %>%
sjPlot::tab_model()| consumo | |||
|---|---|---|---|
| Predictors | Estimates | CI | p |
| (Intercept) | -2930.97 | -4182.73 – -1679.21 | <0.001 |
| temperatura | 53.41 | 36.07 – 70.75 | <0.001 |
| Observations | 15 | ||
| R2 / R2 adjusted | 0.773 / 0.756 | ||
El estimador para la temperatura es de 53.41 unidades, esto indica que si la temperatura incrementa un grado Farenheit en la ciudad se espera que en promedio el consumo eléctrico incremente en 53.4 unidades.
El intercepto indicaría el consumo eléctrico para una temperatura de 0°F, la cual equivale a -17°C, en el histórico que tenemos no se ha observado este valor por lo que no podemos interpretar el intercepto por si mismo.
Consolidación de resultados.
Se puede confirmar la existencia de una relación entre la temperatura promedio de la ciudad y el consumo eléctrico.
La ecuación que relaciona a estas variables y que puede usarse para predecir el consumo futuro con el pronostico del tiempo es la siguiente: \[Consumo = 53.41 * Temperatura°F-2930.97\]
La relación encontrada indica que el consumo eléctrico será mayor cuando la temperatura sea mayor, en particular, por cada incremento en la temperatura de 1°F (o equivalentemente 0.5°C) se producirá un incremento promedio de 53.4 KWH de consumo eléctrico
El modelo actual puede aplicar para ciudades en donde el consumo incremente únicamente en condiciones de temperaturas altas. No aplica para ciudades donde el consumo también incremente en temperaturas bajas.
El modelo creado es robusto pero se recomienda capturar más información mejorar la generalización hacia el comportamiento real.
Este modelo tiene dos aplicaciones:
La CFE puede usarlo para predecir momentos específicos de alto volumen de consumo para garantizar que puede satisfacer esa demanda
El modelo puede democratizarse para los usuarios a través de una calculadora de consumo eléctrico que los ayude a preveer ese gasto fijo