Objetivo

Crear y evaluar un modelo de regresión lineal simple para predecir el peso de una persona con los datos women.

Descripción

Fundamento teórico

La regresión lineal simple apoya a la correlación estimando coeficientes para hacer predicciones.

\[ Y = a + bx \]

\[ Y = \beta_0 + \beta_1\cdot x_i + \epsilon \]

Desarrollo

Cargar librerías

library(ggplot2)
# library(plotly) # no se está usando
library(knitr)
library(PerformanceAnalytics) # Para coorelaciones gráficas
## Loading required package: xts
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
library(caret)  # Para particionar
## Warning: package 'caret' was built under R version 4.1.2
## Loading required package: lattice
library(Metrics) # Para determinar rmse 
## Warning: package 'Metrics' was built under R version 4.1.2
## 
## Attaching package: 'Metrics'
## The following objects are masked from 'package:caret':
## 
##     precision, recall

Cargar datos

datos <- as.data.frame(women)

Explorar datos

str(datos)
## 'data.frame':    15 obs. of  2 variables:
##  $ height: num  58 59 60 61 62 63 64 65 66 67 ...
##  $ weight: num  115 117 120 123 126 129 132 135 139 142 ...
summary(datos)
##      height         weight     
##  Min.   :58.0   Min.   :115.0  
##  1st Qu.:61.5   1st Qu.:124.5  
##  Median :65.0   Median :135.0  
##  Mean   :65.0   Mean   :136.7  
##  3rd Qu.:68.5   3rd Qu.:148.0  
##  Max.   :72.0   Max.   :164.0

Los datos

datos
##    height weight
## 1      58    115
## 2      59    117
## 3      60    120
## 4      61    123
## 5      62    126
## 6      63    129
## 7      64    132
## 8      65    135
## 9      66    139
## 10     67    142
## 11     68    146
## 12     69    150
## 13     70    154
## 14     71    159
## 15     72    164

Visualizar datos

Diagrama de dispersión

ggplot(data = datos) +
  geom_point(aes(x = height, y = weight), col='blue')

Las variables de interés

  • x la variable independiente o predictora sería el height.
  • y la variable dependiente o resultado, es decir y depende de x, weight.

Limpiar datos

En caso necesario…

Partir datos

Aleatoriamente se reparten las observaciones con el 70% para datos de entrenamiento y el 30% para datos de validación.

Sembrar una semilla con set.seed()

set.seed(2022)
n <- nrow(datos)  # cantidad de observaciones
entrena <- createDataPartition(y = datos$weight, p = 0.70, list = FALSE, times = 1)

# Datos entrenamiento
datos.entrenamiento <- datos[entrena, ]  # [renglones, columna]

# Datos validación
datos.validacion <- datos[-entrena, ]

Datos de entrenamiento

datos.entrenamiento
##    height weight
## 2      59    117
## 3      60    120
## 4      61    123
## 6      63    129
## 7      64    132
## 8      65    135
## 9      66    139
## 10     67    142
## 11     68    146
## 12     69    150
## 14     71    159
## 15     72    164

Datos de validación

datos.validacion
##    height weight
## 1      58    115
## 5      62    126
## 13     70    154

Construir el modelo

El modelo se construye con datos de entrenamiento

modelo.simple <- lm(data = datos.entrenamiento, formula = weight ~ height)
modelo.simple
## 
## Call:
## lm(formula = weight ~ height, data = datos.entrenamiento)
## 
## Coefficients:
## (Intercept)       height  
##     -93.238        3.535
a <- modelo.simple$coefficients[1] # abcisa
b <- modelo.simple$coefficients[2] # pendiente de la linea
a ; b 
## (Intercept) 
##   -93.23771
##   height 
## 3.534844

Mostrar la linea de tendencia

ggplot(data = datos.entrenamiento) +
  geom_point(aes(x = height, y = weight), col='blue') +
  geom_line(aes(x = height, y = modelo.simple$fitted.values), col='red')

\[ Y = -93.238 + 3.535 \cdot X_i \]

Evaluar el modelo antes de predicciones

summary(modelo.simple)
## 
## Call:
## lm(formula = weight ~ height, data = datos.entrenamiento)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -1.597 -1.079 -0.562  1.176  2.729 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -93.2377     7.0405  -13.24 1.15e-07 ***
## height        3.5348     0.1074   32.91 1.59e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.5 on 10 degrees of freedom
## Multiple R-squared:  0.9908, Adjusted R-squared:  0.9899 
## F-statistic:  1083 on 1 and 10 DF,  p-value: 1.585e-11

El valor de R Square de Multiple R-squared: 0.9908 significa que la variable height representa estadísticamente aproximadamente un 99% el valor de la variable weight.

El estadístico de R el cuadrado de la correlación (Pearson) de las dos variables

Hacer predicciones

Se usa la función predcit() para hacer predicciones con los datos de validación luego se compara con los datos reales.

predicciones <- predict(modelo.simple, newdata = datos.validacion)
predicciones
##        1        5       13 
## 111.7832 125.9226 154.2014

Construir un data frame para comparar

comparaciones <- data.frame(datos.validacion, predicciones)
comparaciones
##    height weight predicciones
## 1      58    115     111.7832
## 5      62    126     125.9226
## 13     70    154     154.2014

Evaluar predicciones

*rmse* Root Mean Stándar Error (Root-mean-square deviation), este valor normalmente se compara contra otro modelo y el que esté mas cerca de cero es mejor.

La raiz del Error Cuadrático Medio (rmse) es una métrica que dice qué tan lejos están los valores predichos de los valores observados o reales en un análisis de regresión, en promedio. Se calcula como:

\[ rmse = \sqrt{\frac{\sum(predicho_i - real_i)^{2}}{n}} \]

RMSE es una forma útil de ver qué tan bien un modelo de regresión puede ajustarse a un conjunto de datos.

Cuanto mayor sea el rmse, mayor será la diferencia entre los valores predichos y reales, lo que significa que peor se ajusta un modelo de regresión a los datos. Por el contrario, cuanto más pequeño sea el rmse, mejor podrá un modelo ajustar los datos.

rmse <- rmse(actual = comparaciones$weight, predicted = comparaciones$predicciones)
rmse
## [1] 1.861368

Predicciones con datos nuevos

estatura <- c(64, 68)
Y <- predict(object = modelo.simple, newdata = data.frame(height = estatura))
Y
##        1        2 
## 132.9923 147.1317

Interpretación

La representación visual mediante la dispersión de los datos de height y weight se observa que si hay una relación y asociación lineal entre ambas variables.

El modelo se construye con datos de entrenamiento siendo un 70% de los datos originales los que constituyen estos datos de entrenamiento.

Al construir el modelo de regresión lineal simple, se observa con las etiquetas ‘***’ que los valores de los coeficientes de intersección \(\beta_0\) y la pendiente \(\beta_1\) están en un nivel de confianza por encima del 99% además de que son estadísticamente significativos,

El valor de Multiple R-squared: 0.9908 que significa que la variable independiente height representa aproximadamente el 99% e valor de la variable dependiente weight dado que la fórmula en el modelo de regresión lineal simple fué establecida como: formula = weight ~ height que significa que el peso depende de la estatura.

Finalmente la métrica de rmse al hacer predicciones con los datos de validación se deberá comparar contra otro modelo similar para observar cual de los dos es menor de tal forma que el que más se acerque a cero tiene mejor ajuste en la predicción de los datos.

Bibliografía