Este documento presenta una guía sobre la ejecución de la regresión lineal múltiple con el software R. El análisis de datos multifactorial sirve para expresar la relación entre una variable de interés (la respuesta) y un conjunto de variables predictoras relacionadas.
Considere ahora un ejemplo hecho con el software R que detalla paso a paso las instrucciones para realizar la regresión lineal múltiple:
La base de datos está alojada en Github, para leerla se usa el código siguiente:
datos <- read.csv("https://raw.githubusercontent.com/fhernanb/Python-para-estadistica/master/03%20Regression/Regresi%C3%B3n%20lineal%20simple/softdrink.csv", header = T)
En este paso, se ven las variables, las primeras observaciones y la estructura de la base de datos, entre otras cosas.
names(datos) # Ver nombre de las variables
## [1] "Obs" "y" "x1" "x2"
head(datos) # Primeras observaciones
str(datos) # Estructura de la base
## 'data.frame': 25 obs. of 4 variables:
## $ Obs: int 1 2 3 4 5 6 7 8 9 10 ...
## $ y : num 16.7 11.5 12 14.9 13.8 ...
## $ x1 : int 7 3 3 4 6 7 2 7 30 5 ...
## $ x2 : int 560 220 340 80 150 330 110 210 1460 605 ...
Note que el software R leyó la columna Obs
de la base de datos como una variable, para eliminarla, se hace lo siguiente:
datos1 <- datos[,-1] # Elimina la primera columna
names(datos1)
## [1] "y" "x1" "x2"
Por consiguiente, se calcula el coeficiente de correlación de Pearson entre las variables regresoras.
cor(datos1$x1, datos1$x2)
## [1] 0.824215
Para calcular dicha correlación, se emplea el siguiente código:
round(cor(datos1), 3) # Matriz de correlación redondeada a 3 decimales
## y x1 x2
## y 1.000 0.965 0.892
## x1 0.965 1.000 0.824
## x2 0.892 0.824 1.000
Esta matriz es una herramienta de exploración de datos que permite comparar varios subconjuntos de la base de datos para buscar patrones y relaciones. Se obtiene así:
# Opción básica
plot(datos1)
# Opción mejorada
pairs(datos1, labels=c("y","x1","x2"), main='Matriz de dispersión', cex.main=0.8, cex = 1.5, pch = 20, bg="light blue", cex.labels = 1, font.labels=1)
Esta matriz también sirve para explorar los datos al comparar varios subconjuntos de la base de datos, pero adiciona la correlación entre cada uno de los subconjuntos. Para obtenerla con R, en este caso se creo una función y luego se usó la función pairs()
, obsérvelo a continuación:
panel.cor <- function(x1, y, digits=2, prefix="", cex.cor){
par(usr = c(0, 1, 0, 1))
r <- abs(cor(x1, y))
txt <- format(c(r, 0.123456789), digits=digits)[1]
txt <- paste(prefix, txt, sep="")
if(missing(cex.cor))
cex <- 0.8/strwidth(txt)
text(0.5, 0.5, txt, cex = cex)
}
pairs(datos1, lower.panel=panel.smooth, upper.panel=panel.cor,
main="Matriz de dispersión con correlaciones")
Ahora, se ajusta el modelo de regresión lineal para los datos en cuestión usando la función lm()
.
mod <- lm(y ~ x1 + x2, data = datos1)
Para obtener un resumen del modelo ajustado se usa:
# Resumen del modelo ajustado
summary(mod)
##
## Call:
## lm(formula = y ~ x1 + x2, data = datos1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.7880 -0.6629 0.4364 1.1566 7.4197
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.341231 1.096730 2.135 0.044170 *
## x1 1.615907 0.170735 9.464 3.25e-09 ***
## x2 0.014385 0.003613 3.981 0.000631 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.259 on 22 degrees of freedom
## Multiple R-squared: 0.9596, Adjusted R-squared: 0.9559
## F-statistic: 261.2 on 2 and 22 DF, p-value: 4.687e-16
Residuals:
son las diferencias entre las respuestas observadas en cada combinación de valores de las variables regresoras y la correspondiente predicción de la respuesta calculada.
Estimate:
corresponde a las estimaciones de los coeficientes del modelo. Los coeficientes de las variables regresoras siempre tienen interpretación; en este caso, el coeficiente de x1 expresa el efecto sobre la variable respuesta al controlar o ajustar la regresora x2; es decir, se asocia un aumento de una unidad en la variable regresora x1 con un aumento de 1.615907 en el ajuste de la variable respuesta al controlar la varaible regresora x2. En cambio, el intercepto no siempre puede ser interpretado, dependerá exclusivamente de la naturaleza del problema.
Std Error:
representa el error estándar de cada coeficiente del modelo.
t value:
es el valor que toma el estadístico de prueba.
Pr(>|t|):
corresponde al valor-p para las pruebas de hipótesis de que los coeficientes son ceros. Si esta valor-p es menor que el nivel de significancia, que por defecto es del 5%, entonces se rechaza la hipótesis nula y por lo tanto, existe significancia en la regresión. A menudo, la prueba de hipótesis de que el intecerpto es cero es poco útil, ya que éste depende de la naturaleza del problema. En cambio, las pruebas de hipótesis de que los coeficientes de las variables regresoras son cero, son muy importantes; debido a que, si se prueba que el coeficiente es cero, entonces la variable regresora no tendría ningún aporte al modelo.
Signif codes:
representa el nivel de significancia de las variables regresoras para la predicción del modelo de regresión. Entre más estrellas se le asigne a la regresora, más contribuye con el modelo.
Residual standard error:
es la estimación de la desviación estandar. Este valor da una idea de cuán lejos están los valores del modelo ajustado a los valores observados de la variable respuesta.
Multiple R-squared:
este valor expresa la proporción de la variación explicada por el modelo; es decir, por las variables explicativas. En este caso, aproximadamente el 96% de la variación en la variable respuesta puede ser explicada por el modelo; es decir, por las variables regresoras (x1 y x2).
F-statistic:
equivale al estadístico F. Éste permite constrastar la hipótesis nula de que el valor poblacional R es cero, lo cual, equivale a contrastar la hipótesis de que los coeficientes de las variables regresoras son cero.
p-value:
índica la importancia del modelo mediante una prueba de hipótesis donde la hipótesis nula es que todos los coeficientes del modelo son cero. En este ejemplo, prueba específicamente que los coeficientes de las regresoras (x1 y x2) son cero.
Similarmente, las estimaciones de los parámetros del modelo se obtienen al usar el siguiente cógido:
# Coeficientes
coef(mod) # Opción 1
## (Intercept) x1 x2
## 2.34123115 1.61590721 0.01438483
mod$coef # Opción 2
## (Intercept) x1 x2
## 2.34123115 1.61590721 0.01438483
# Varianza estimada
sigma(mod)^2 # Opción 1
## [1] 10.62417
summary(mod)$sigma^2 # Opción 2
## [1] 10.62417
# Desviación estándar
sigma(mod) # Opción 1
## [1] 3.259473
summary(mod)$sigma # Opción 2
## [1] 3.259473
Se usará el comando confint()
para hallar dichos intervalos, así:
confint(mod, conf.level=0.95) # I.C al 95%
## 2.5 % 97.5 %
## (Intercept) 0.066751987 4.61571030
## x1 1.261824662 1.96998976
## x2 0.006891745 0.02187791
Con una confianza del 95% se puede decir que el verdadero valor del coeficiente de la regresora x1 está entre 1.26 y 1.97. Observe que la estimación de dicho coeficiente fue 1.62.
Con una confianza del 95% se puede decir que el verdadero valor del coeficiente de la regresora x2 está entre 0.007 y 0.022. Observe que la estimación de dicho coeficiente fue 0.014.
Para realizar este gráfico es necesario instalar y cargar la libreria plot3D
y plot3Drgl
, las cuales sirven simultanéamente para dibujar un diagrama de dispersión en tres dimensiones y brindar interacción al gráfico; es decir, rotación o movimiento.
# install.packages("plot3D")
# install.packages("plot3Drgl")
library(plot3D)
library(plot3Drgl)
Luego, se obtiene el diagrama de dispersión en 3D.
grid.lines <- 40
x1.pred <- seq(min(datos1$x1), max(datos1$x1), length.out = grid.lines)
x2.pred <- seq(min(datos1$x2), max(datos1$x2), length.out = grid.lines)
x1x2 <- expand.grid(x1 = x1.pred, x2 = x2.pred)
y.pred <- matrix(predict(mod, newdata = x1x2), nrow = grid.lines, ncol = grid.lines)
fitpoints <- predict(mod)
scatter3D(x=datos1$x1, y=datos1$x2, z=datos1$y, theta=30, phi=8, pch=20)
grid.lines <- 40
x1.pred <- seq(min(datos1$x1), max(datos1$x1), length.out = grid.lines)
x2.pred <- seq(min(datos1$x2), max(datos1$x2), length.out = grid.lines)
x1x2 <- expand.grid(x1 = x1.pred, x2 = x2.pred)
y.pred <- matrix(predict(mod, newdata = x1x2), nrow = grid.lines, ncol = grid.lines)
fitpoints <- predict(mod)
scatter3D(x=datos1$x1, y=datos1$x2, z=datos1$y, theta=30, phi=8, pch=20, bty = "g",
colkey = TRUE, surf = list(x=x1.pred, y=x2.pred, z=y.pred, fit = fitpoints))
Nota: si desea ver la interacción de los gráfico anteriores, use el comando plotrgl()
al final del código de cada gráfico de dispersión.
Documento fue creado durante el curso Análisis de Regresión de la Universidad Nacional de Colombia sede Medellín. La base de datos utilizada son del ejemplo 3.1 del libro de Montgomery, Peck and Vining (2003). Además, dicha base se encuentra alojada en la cuenta de Github del profesor Freddy Hernández Barajas, https://github.com/fhernanb. Adicionalmente, se le agradece al compañero Felipe Bedoya por brindar aportes con algunos gráficos.
Hernández, F., (2019). Regresión lineal múltiple en Python. Recuperado de: https://github.com/fhernanb
Correa, J., y González, N. (2002). Gráficos Estadísticos con R, Medellín, Colombia.