Práctica de regresión lineal simple

Sección teórica

Responda a las siguientes preguntas:

  1. ¿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.
  2. ¿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.
  3. 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] 1

      Ajustemos 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] 1
      m <- 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)
Data summary
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:

  1. Las comas debería ser puntos decimales
  2. 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)
Data summary
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