Regresión líneal múltiple

La regresión lineal se usa para predecir el valor de una variable de resultado [Y] sobre la base de una o más variables predictoras de entrada [X]. El objetivo es establecer una relación lineal a través de una fórmula matemática entre la (s) variable (s) del predictor y la variable de respuesta, de modo que podamos usar esta fórmula para estimar el valor de la respuesta Y , cuando solo los predictores ( X s ) Los valores son conocidos.

El objetivo de la regresión lineal es modelar una variable continua [Y] como una función matemática de una o más variables [X] , de modo que se pueda usar este modelo de regresión para predecir la [Y] cuando solo se conoce la [X]. Esta ecuación matemática se puede generalizar de la siguiente manera:

\[Y= \beta_ 0 + \beta_ 1 X1 + \beta_ 2 X2\varepsilon \]

donde, βo es la intersección y β1 es la pendiente. En conjunto, se denominan coeficientes de regresión. ϵ es el término de error, la parte de Y que el modelo de regresión no puede explicar.

1. Ejercicio básico de regresión lineal múltiple:

El objetivo es que el estudiante pueda replicar el código del algoritmo que se le entrega, analice la salida del modelo e identifique las variables más significativas y si el modelo es adecuado para predecir. Uva vez realizada la validación, si el modelo es adecuado para predecir, se pide realizar la predicción de 3 nuevos casos.

En este ejerccio se utilizará el set de datos trees, el cual está disponible en la librería dplyr y que contiene datos sobre la circunferencia (en pulgadas), la altura (en pies) y el volumen (en pies cúbicos) del tronco de árboles de la especia de cerezos. El objetivo de este ejercicio es construir un modelo de regresión lineal para predecir el volumen en función de las variables dadas.

1.1. Cargamos y exploramos la data

# Cargamos la librería 
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# Cargamos los datos
head(trees)
##   Girth Height Volume
## 1   8.3     70   10.3
## 2   8.6     65   10.3
## 3   8.8     63   10.2
## 4  10.5     72   16.4
## 5  10.7     81   18.8
## 6  10.8     83   19.7
# vemos la información general del dataset
str(trees)
## 'data.frame':    31 obs. of  3 variables:
##  $ Girth : num  8.3 8.6 8.8 10.5 10.7 10.8 11 11 11.1 11.2 ...
##  $ Height: num  70 65 63 72 81 83 66 75 80 75 ...
##  $ Volume: num  10.3 10.3 10.2 16.4 18.8 19.7 15.6 18.2 22.6 19.9 ...
# Vemos los estadísticos principales
summary(trees)
##      Girth           Height       Volume     
##  Min.   : 8.30   Min.   :63   Min.   :10.20  
##  1st Qu.:11.05   1st Qu.:72   1st Qu.:19.40  
##  Median :12.90   Median :76   Median :24.20  
##  Mean   :13.25   Mean   :76   Mean   :30.17  
##  3rd Qu.:15.25   3rd Qu.:80   3rd Qu.:37.30  
##  Max.   :20.60   Max.   :87   Max.   :77.00

1.2. Análisis gráfico

# Diagrama de dispersión y valores de correlación
library(psych)
pairs.panels(trees,gap=0)

#revisión con histogramas de la distribución de los datos
par(mfrow=c(1,3))
hist(trees$Girth, col="green", breaks=15)
hist(trees$Height, col="blue", breaks=15)
hist(trees$Volume, col="blue", breaks=15)

#revisión con histogramas de la distribución de los datos
par(mfrow=c(1,3))
boxplot(trees$Girth, col="green", main = "Circunferencia")
boxplot(trees$Height, col="blue", main = "Altura")
boxplot(trees$Volume, col="orange", main = "Volumen")

Del análisis gráfico anterior, se puede ver que las variables tienen una distribución normal, la varible volumen tiene datos atípicos.

1.3. Correlación

#matriz de correlación
round(cor(x = trees[c(1,2,3)], method = "pearson"),2)
##        Girth Height Volume
## Girth   1.00   0.52   0.97
## Height  0.52   1.00   0.60
## Volume  0.97   0.60   1.00

Análisis:

Con base en los resultados que hemos obtenido hasta el momento, se puede concluir que:

  • I. En los gráficos de dispersión se puede observar que la variable Girth (diámetro) está más linealmente asociada con la variable respuesta Volumen.
  • Hay una correlación alta entre la variable diámetro y volumen (0.97) y entre la variable volumen y altura la correlación es del 0.60

1.4. Construcción del modelo de regresión

# Modelo de regresión lineal
Mod_3 = lm (Volume ~ Girth+Height, data = trees)
print(Mod_3)
## 
## Call:
## lm(formula = Volume ~ Girth + Height, data = trees)
## 
## Coefficients:
## (Intercept)        Girth       Height  
##    -57.9877       4.7082       0.3393
# Veamos los estadísticos del modelo
summary(Mod_3)
## 
## Call:
## lm(formula = Volume ~ Girth + Height, data = trees)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.4065 -2.6493 -0.2876  2.2003  8.4847 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -57.9877     8.6382  -6.713 2.75e-07 ***
## Girth         4.7082     0.2643  17.816  < 2e-16 ***
## Height        0.3393     0.1302   2.607   0.0145 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.882 on 28 degrees of freedom
## Multiple R-squared:  0.948,  Adjusted R-squared:  0.9442 
## F-statistic:   255 on 2 and 28 DF,  p-value: < 2.2e-16

**Análisis:

  • Podemos ver que las dos variables son estadísticamente significativas
  • Una vez construido el modelo de regresión lineal múltiple, también hemos establecido la relación entre el predictor [X] y la respuesta [Y] en forma de una fórmula matemática para el volumen en función de la altura y del diámetro. En la salida anterior, se puede observar que la parte de ‘Coeficientes’ tiene componentes: Intercept : -57.9877, altura: 0.3393 y diámetro 4.7082:

\[Volume  =  β_o  + (β_1 ∗  Heigth) + ( β_2 ∗  Girth)\]

1.5. Predicir un nuevo caso

De acuerdo con los resultados obtenidos del modelo, se pide que realice la predicción para los siguientes casos:

  • Caso 1: altura 73.4 pies y diámetro 20 pulgadas
  • Caso 2: altura 65.9 pies y diámetro 18.1 pulgadas
  • Caso 3: altura 53.7 pies y diámetro 15.4 pulgadas
# Definamos las variables
bo = -57.9877
b1 = 0.3393
b2 = 4.7082
#caso 1
altura = 73.4
diametro = 20

nuevo_tree_caso_1 =paste("El volumen el árbol del caso 1 es de:",round( bo + (b1*altura) + (b2*diametro),2))
nuevo_tree_caso_1
## [1] "El volumen el árbol del caso 1 es de: 61.08"
#caso 2
altura = 65.9
diametro = 18.1

nuevo_tree_caso_2 = paste("El volumen el árbol del caso 2 es de:",round( bo + (b1*altura) + (b2*diametro),2))
nuevo_tree_caso_2
## [1] "El volumen el árbol del caso 2 es de: 49.59"
#caso 2
altura = 53.7
diametro = 15.4

nuevo_tree_caso_3 = paste("El volumen el árbol del caso 3 es de:",round( bo + (b1*altura) + (b2*diametro),2))
nuevo_tree_caso_3
## [1] "El volumen el árbol del caso 3 es de: 32.74"