# Estos son todos los paquetes que se usan en el tutorial.
# Solo necesitas instalarlos una vez por computadora.
# install.packages(c(
# "readxl", # importar archivos .xlsx
# "dplyr", # manipulación de datos (mutate, select, etc.)
# "psych", # estadísticos descriptivos
# "MVN", # detección de outliers multivariados
# "car", # diagnóstico de multicolinealidad (VIF)
# "lm.beta", # coeficientes estandarizados (beta)
# "lmtest", # prueba de independencia de errores (Durbin-Watson)
# "ggplot2", # gráficos de dispersión
# "patchwork",# combinar varios gráficos en un panel
# "writexl" # exportar tablas de resultados a Excel
# ))Tutorial: Regresión Lineal Múltiple en R
Estimación, verificación de supuestos y reporte de resultados
1 Introducción
Este tutorial muestra, paso a paso, cómo estimar un modelo de regresión lineal múltiple en R: desde la preparación de los datos, la construcción de variables, la detección de outliers, el ajuste del modelo, la verificación de sus supuestos estadísticos, y el reporte final de resultados en formato tabla (lista para Excel/Word).
Este tutorial usa una base de datos de ejemplo (UWES, ECE, EAA). Ustedes deben reemplazar los nombres de variables, rutas de archivo y especificaciones del modelo por los de su propia base de datos. A lo largo del documento encontrarán bloques marcados como:
# ✏️ EDITAR: ...Esos son los puntos exactos donde deben adaptar el código a su propio caso. Todo lo demás (la lógica del análisis) se mantiene igual.
1.1 Base de datos del tutorial (ejemplo)
Trabajaremos con datos de una muestra de 210 estudiantes universitarios peruanos, con tres instrumentos psicométricos:
| Instrumento | Variables | Descripción |
|---|---|---|
| UWES (Utrecht Work Engagement Scale — versión estudiantil) | UWES1–UWES17 | Compromiso académico |
| ECE (Escala de Cansancio Emocional) | ECE1–ECE10 | Cansancio emocional |
| EAA (Escala de Autoeficacia Académica) | EAA1–EAA9 | Autoeficacia académica |
1.1.1 Dimensiones del UWES
- Vigor: UWES2, UWES4, UWES7, UWES8, UWES9
- Dedicación: UWES1, UWES11, UWES5, UWES14
- Absorción: UWES3, UWES12, UWES13, UWES15, UWES16, UWES17
El modelo predictivo de ejemplo plantea que Vigor, Dedicación, Absorción y Cansancio emocional predicen Autoeficacia académica.
2 Instalación y configuración
2.1 Instalar los paquetes necesarios
2.2 Cargar los paquetes
library(readxl)
library(dplyr)
library(psych)
library(MVN)
library(car)
library(lm.beta)
library(lmtest)
library(ggplot2)
library(patchwork)
library(writexl)3 Preparación de los datos
3.1 Importar la base de datos
# ✏️ EDITAR: cambia "df_final.xlsx" por el nombre/ruta de tu archivo de datos.
datos <- read_excel("df_final.xlsx")
# Exploración inicial: siempre revisa esto primero para confirmar
# que tu base de datos se cargó correctamente.
dim(datos) # Número de filas (casos) y columnas (variables)[1] 206 50
names(datos) # Nombres de todas las variables disponibles [1] "ID" "Edad" "Sexo"
[4] "Departamento" "Rendimiento_acad" "Carrera"
[7] "Ciclo" "Promedio_nota" "Desaprobado"
[10] "Ocupación" "Modalidad_estudio" "Tipo_colegio"
[13] "Expectativa" "Abandonar_estudio" "UWES1"
[16] "UWES2" "UWES3" "UWES4"
[19] "UWES5" "UWES6" "UWES7"
[22] "UWES8" "UWES9" "UWES10"
[25] "UWES11" "UWES12" "UWES13"
[28] "UWES14" "UWES15" "UWES16"
[31] "UWES17" "ECE1" "ECE2"
[34] "ECE3" "ECE4" "ECE5"
[37] "ECE6" "ECE7" "ECE8"
[40] "ECE9" "ECE10" "EAA1"
[43] "EAA2" "EAA3" "EAA4"
[46] "EAA5" "EAA6" "EAA7"
[49] "EAA8" "EAA9"
3.2 Vista preliminar de los ítems
# ✏️ EDITAR: reemplaza estos vectores con los nombres de los ítems
# de TUS instrumentos (cópialos de `names(datos)` de arriba).
items_uwes <- paste0("UWES", 1:17)
items_ece <- paste0("ECE", 1:10)
items_eaa <- paste0("EAA", 1:9)
# Muestra las primeras 5 filas solo de los ítems de interés,
# para verificar visualmente que los datos se ven como se esperaba.
head(datos[, c(items_uwes, items_ece, items_eaa)], 5)# A tibble: 5 × 36
UWES1 UWES2 UWES3 UWES4 UWES5 UWES6 UWES7 UWES8 UWES9 UWES10 UWES11 UWES12
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 3 3 3 3 2 2 3 3 3 2 3 2
2 4 4 6 6 3 4 6 5 5 4 6 3
3 2 5 4 4 6 3 4 3 3 6 3 5
4 6 6 6 6 6 6 6 6 6 6 6 6
5 4 5 5 3 5 5 4 6 4 6 5 4
# ℹ 24 more variables: UWES13 <dbl>, UWES14 <dbl>, UWES15 <dbl>, UWES16 <dbl>,
# UWES17 <dbl>, ECE1 <dbl>, ECE2 <dbl>, ECE3 <dbl>, ECE4 <dbl>, ECE5 <dbl>,
# ECE6 <dbl>, ECE7 <dbl>, ECE8 <dbl>, ECE9 <dbl>, ECE10 <dbl>, EAA1 <dbl>,
# EAA2 <dbl>, EAA3 <dbl>, EAA4 <dbl>, EAA5 <dbl>, EAA6 <dbl>, EAA7 <dbl>,
# EAA8 <dbl>, EAA9 <dbl>
3.3 Verificar datos perdidos
# Cuenta cuántos valores NA (datos faltantes) tiene cada ítem.
# Si alguna columna tiene muchos NA, hay que decidir cómo tratarlos
# (eliminar casos, imputar, etc.) ANTES de continuar con el análisis.
colSums(is.na(datos[, c(items_uwes, items_ece, items_eaa)])) UWES1 UWES2 UWES3 UWES4 UWES5 UWES6 UWES7 UWES8 UWES9 UWES10 UWES11
0 0 0 0 0 0 0 0 0 0 0
UWES12 UWES13 UWES14 UWES15 UWES16 UWES17 ECE1 ECE2 ECE3 ECE4 ECE5
0 0 0 0 0 0 0 0 0 0 0
ECE6 ECE7 ECE8 ECE9 ECE10 EAA1 EAA2 EAA3 EAA4 EAA5 EAA6
0 0 0 0 0 0 0 0 0 0 0
EAA7 EAA8 EAA9
0 0 0
4 Construcción de las variables del modelo
En este tutorial trabajamos con sumatorias (puntajes compuestos): se suman los ítems de cada dimensión/instrumento para obtener una sola variable continua por constructo.
# ✏️ EDITAR: ajusta estos vectores a los ítems de cada dimensión
# de tu propio instrumento. El número de ítems puede variar.
items_vigor <- c("UWES2", "UWES4", "UWES7", "UWES8", "UWES9")
items_dedicacion <- c("UWES1", "UWES11", "UWES5", "UWES14")
items_absorcion <- c("UWES3", "UWES12", "UWES13", "UWES15", "UWES16", "UWES17")
# ✏️ EDITAR: renombra las variables resultantes (lado izquierdo del =)
# según los constructos de tu estudio.
datos <- datos %>%
mutate(
Vigor = rowSums(across(all_of(items_vigor))),
Dedicacion = rowSums(across(all_of(items_dedicacion))),
Absorcion = rowSums(across(all_of(items_absorcion))),
Cansancio = rowSums(across(all_of(items_ece))),
Autoeficacia = rowSums(across(all_of(items_eaa)))
)
# Vista rápida de las sumatorias ya calculadas
head(datos[, c("Vigor", "Dedicacion", "Absorcion", "Cansancio", "Autoeficacia")])# A tibble: 6 × 5
Vigor Dedicacion Absorcion Cansancio Autoeficacia
<dbl> <dbl> <dbl> <dbl> <dbl>
1 15 12 15 29 23
2 26 18 25 28 26
3 19 13 18 39 22
4 30 24 36 50 35
5 22 19 28 19 19
6 17 10 14 29 29
4.1 Descriptivos de las variables del modelo
# Estadísticos descriptivos (media, DE, asimetría, curtosis) de
# las variables que entrarán al modelo de regresión.
datos %>%
select(Vigor:Autoeficacia) %>%
describe() %>%
select(n, mean, sd, min, max, skew, kurtosis) n mean sd min max skew kurtosis
Vigor 206 18.10 5.41 5 30 0.15 -0.59
Dedicacion 206 13.81 3.97 5 24 0.27 -0.33
Absorcion 206 19.15 5.29 4 36 0.41 0.27
Cansancio 206 31.17 7.62 10 50 -0.15 0.15
Autoeficacia 206 24.18 5.38 9 36 0.31 -0.13
4.2 Identificar y eliminar outliers multivariados
Antes de ajustar el modelo, identificamos casos atípicos multivariados con la distancia de Mahalanobis, que detecta observaciones que se alejan demasiado del patrón conjunto de todas las variables (no solo de una variable a la vez).
# ✏️ EDITAR: reemplaza estos nombres por las variables de TU modelo
# (la variable dependiente y todos los predictores).
variables_modelo <- c("Autoeficacia", "Vigor", "Absorcion", "Dedicacion", "Cansancio")
resultado_outliers <- mvn(
data = datos[, variables_modelo],
multivariate_outlier_method = "quan",
show_new_data = TRUE
)
# Criterio conservador: chi-cuadrado con p < .001
# gl = número de variables incluidas en variables_modelo
valor_critico <- qchisq(0.999, df = length(variables_modelo))
outliers_severos <- resultado_outliers$multivariate_outliers[
resultado_outliers$multivariate_outliers$Mahalanobis.Distance > valor_critico, ]
# Casos detectados como outliers severos
outliers_severos Observation Mahalanobis.Distance
1 125 34.741
2 36 31.302
3 4 29.157
4 31 22.235
5 153 21.404
# Eliminamos esos casos del dataset antes de modelar
casos_eliminar <- as.integer(as.character(outliers_severos$Observation))
datos <- datos[-casos_eliminar, ]
# Reporte de cuántos casos quedaron para el análisis
cat("Casos eliminados:", length(casos_eliminar), "\n")Casos eliminados: 5
cat("Casos para análisis:", nrow(datos), "\n")Casos para análisis: 201
5 Regresión lineal múltiple
5.1 Especificar y ajustar el modelo
# ✏️ EDITAR: cambia la fórmula según tu variable dependiente (criterio)
# y tus variables predictoras. Formato: VD ~ predictor1 + predictor2 + ...
modelo_lm <- lm(Autoeficacia ~ Vigor + Absorcion + Dedicacion + Cansancio, data = datos)
summary(modelo_lm)
Call:
lm(formula = Autoeficacia ~ Vigor + Absorcion + Dedicacion +
Cansancio, data = datos)
Residuals:
Min 1Q Median 3Q Max
-11.2058 -2.4074 -0.0925 2.4390 10.5648
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 18.71105 1.91076 9.792 < 2e-16 ***
Vigor 0.14770 0.09632 1.534 0.12676
Absorcion 0.15104 0.08304 1.819 0.07048 .
Dedicacion 0.39952 0.13662 2.924 0.00386 **
Cansancio -0.18814 0.04284 -4.392 1.84e-05 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 3.885 on 196 degrees of freedom
Multiple R-squared: 0.4434, Adjusted R-squared: 0.432
F-statistic: 39.03 on 4 and 196 DF, p-value: < 2.2e-16
5.2 Coeficientes estandarizados (Beta)
Los coeficientes “crudos” (B) dependen de la escala de cada variable. Los coeficientes estandarizados (β) permiten comparar la fuerza relativa de los predictores entre sí, sin importar su escala original.
modelo_lm_std <- lm.beta(modelo_lm)
summary(modelo_lm_std)
Call:
lm(formula = Autoeficacia ~ Vigor + Absorcion + Dedicacion +
Cansancio, data = datos)
Residuals:
Min 1Q Median 3Q Max
-11.2058 -2.4074 -0.0925 2.4390 10.5648
Coefficients:
Estimate Standardized Std. Error t value Pr(>|t|)
(Intercept) 18.71105 NA 1.91076 9.792 < 2e-16 ***
Vigor 0.14770 0.15170 0.09632 1.534 0.12676
Absorcion 0.15104 0.14820 0.08304 1.819 0.07048 .
Dedicacion 0.39952 0.29753 0.13662 2.924 0.00386 **
Cansancio -0.18814 -0.26613 0.04284 -4.392 1.84e-05 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 3.885 on 196 degrees of freedom
Multiple R-squared: 0.4434, Adjusted R-squared: 0.432
F-statistic: 39.03 on 4 and 196 DF, p-value: < 2.2e-16
No existe un estándar tan consolidado como para r o R², pero suele usarse (con cautela) la misma heurística de Cohen (1988), ya que el β en una regresión simple equivale matemáticamente a una correlación de Pearson:
| |β| | Tamaño del efecto |
|---|---|
| ≈ 0.10 | Pequeño |
| ≈ 0.30 | Mediano |
| ≥ 0.50 | Grande |
Importante: en una regresión con varios predictores correlacionados entre sí, el β es un efecto parcial (lo que aporta esa variable una vez controladas las demás). Un β pequeño no significa necesariamente que la variable “no importa” — puede estar compartiendo varianza con otro predictor del modelo.
6 Verificación de supuestos
La validez de un modelo de regresión lineal depende de que se cumplan ciertos supuestos. Los organizamos en dos grupos, siguiendo la lógica de qué afecta cada uno:
6.1 1. Supuestos referidos a la estimación de los parámetros
Si estos supuestos no se cumplen, los coeficientes (B y β) en sí mismos pueden estar mal calculados o ser poco confiables.
6.1.1 1.1 Linealidad
Supuesto: la relación entre cada predictor y la variable dependiente es lineal (no curva). Comprobación: inspección visual de gráficos de dispersión entre la variable criterio y cada predictor, con una línea de tendencia.
# ✏️ EDITAR: cambia los nombres de variables (eje x e y) según tu modelo.
# Crea un gráfico de dispersión por cada predictor.
p1 <- ggplot(datos, aes(Vigor, Autoeficacia)) +
geom_point() + geom_smooth(method = "lm", color = "red") +
theme_minimal()
p2 <- ggplot(datos, aes(Absorcion, Autoeficacia)) +
geom_point() + geom_smooth(method = "lm", color = "red") +
theme_minimal()
p3 <- ggplot(datos, aes(Dedicacion, Autoeficacia)) +
geom_point() + geom_smooth(method = "lm", color = "red") +
theme_minimal()
p4 <- ggplot(datos, aes(Cansancio, Autoeficacia)) +
geom_point() + geom_smooth(method = "lm", color = "red") +
theme_minimal()
# Combina los 4 gráficos en un solo panel (2x2) con patchwork
p1 + p2 + p3 + p4Cómo interpretar: la línea roja de tendencia debe verse razonablemente recta (no en forma de U, curva pronunciada, etc.). Pequeñas desviaciones son normales.
6.1.2 1.2 Ausencia de multicolinealidad
Supuesto: los predictores no deben estar excesivamente correlacionados entre sí (si lo están, no se puede aislar el efecto único de cada uno). Comprobación: Factor de Inflación de la Varianza (VIF). Se cumple el supuesto con VIF < 10.
car::vif(modelo_lm) Vigor Absorcion Dedicacion Cansancio
3.445649 2.338148 3.645238 1.293113
6.1.3 1.3 Independencia de los errores
Supuesto: las observaciones son independientes entre sí y los residuos no están correlacionados. Comprobación: prueba de Durbin-Watson, obteniendo valores entre 1.5 y 2.5.
lmtest::dwtest(modelo_lm)
Durbin-Watson test
data: modelo_lm
DW = 2.1854, p-value = 0.9056
alternative hypothesis: true autocorrelation is greater than 0
6.2 2. Supuestos referidos a la significancia estadística
Si este supuesto no se cumple, los valores p y los intervalos de confianza pueden no ser del todo precisos (aunque, con muestras grandes, el efecto suele ser leve).
6.2.1 2.1 Normalidad de los errores
Supuesto: los errores (residuos) del modelo están distribuidos normalmente. Comprobación: prueba de Shapiro-Wilk, obteniendo p > .050. Se complementa con inspección visual del gráfico Q-Q.
shapiro.test(residuals(modelo_lm))
Shapiro-Wilk normality test
data: residuals(modelo_lm)
W = 0.99755, p-value = 0.9895
# Gráfico Q-Q: los puntos deben alinearse cerca de la diagonal
# si los residuos son aproximadamente normales.
plot(modelo_lm, which = 2)7 Reporte de resultados
7.1 Tabla de resultados (formato APA)
# Arma la tabla con B (crudo), error estándar, β (estandarizado), t y p,
# tal como se reporta habitualmente en una tesis.
tabla_lm <- data.frame(
Variable = names(coef(modelo_lm)),
B = round(coef(modelo_lm), 3),
EE_B = round(summary(modelo_lm)$coefficients[, "Std. Error"], 3),
`β` = round(c(NA, coef(modelo_lm_std)[-1]), 3),
t = round(summary(modelo_lm)$coefficients[, "t value"], 3),
p = round(summary(modelo_lm)$coefficients[, "Pr(>|t|)"], 3)
)
rownames(tabla_lm) <- NULL
knitr::kable(
tabla_lm,
caption = paste0(
"Resultados de la regresión lineal múltiple (R² = ",
round(summary(modelo_lm)$r.squared, 3),
", R² ajustado = ", round(summary(modelo_lm)$adj.r.squared, 3), ")"
)
)| Variable | B | EE_B | β | t | p |
|---|---|---|---|---|---|
| (Intercept) | 18.711 | 1.911 | NA | 9.792 | 0.000 |
| Vigor | 0.148 | 0.096 | 0.152 | 1.534 | 0.127 |
| Absorcion | 0.151 | 0.083 | 0.148 | 1.819 | 0.070 |
| Dedicacion | 0.400 | 0.137 | 0.298 | 2.924 | 0.004 |
| Cansancio | -0.188 | 0.043 | -0.266 | -4.392 | 0.000 |
# Exportar la tabla a Excel, dentro de una carpeta "Output"
# (se crea automáticamente si no existe).
dir.create("Output", showWarnings = FALSE)
writexl::write_xlsx(tabla_lm, "Output/tabla_resultados_regresion.xlsx")7.2 Tabla de verificación de supuestos
dw_test <- lmtest::dwtest(modelo_lm)
sw_test <- shapiro.test(residuals(modelo_lm))
vif_vals <- car::vif(modelo_lm)
# Tabla resumen: un vistazo rápido de qué supuestos se cumplen o no.
tabla_supuestos <- data.frame(
Supuesto = c("Linealidad",
"Multicolinealidad (VIF)",
"Independencia de errores (Durbin-Watson)",
"Normalidad de residuos (Shapiro-Wilk)"),
Estadistico = c(
"Inspección visual",
paste0("Máx. VIF = ", round(max(vif_vals), 2)),
paste0("DW = ", round(dw_test$statistic, 3)),
paste0("W = ", round(sw_test$statistic, 3))
),
p_valor = c(
NA,
NA,
round(dw_test$p.value, 3),
round(sw_test$p.value, 3)
),
Criterio = c("Relación recta en gráficos de dispersión",
"VIF < 10",
"DW entre 1.5 y 2.5",
"p > .05"),
Cumple = c(
"Verificar visualmente (ver sección anterior)",
ifelse(max(vif_vals) < 10, "✅ Sí", "⚠️ No"),
ifelse(dw_test$statistic > 1.5 & dw_test$statistic < 2.5, "✅ Sí", "⚠️ No"),
ifelse(sw_test$p.value > 0.05, "✅ Sí", "⚠️ No")
)
)
knitr::kable(tabla_supuestos, caption = "Verificación de supuestos del modelo de regresión")| Supuesto | Estadistico | p_valor | Criterio | Cumple |
|---|---|---|---|---|
| Linealidad | Inspección visual | NA | Relación recta en gráficos de dispersión | Verificar visualmente (ver sección anterior) |
| Multicolinealidad (VIF) | Máx. VIF = 3.65 | NA | VIF < 10 | ✅ Sí |
| Independencia de errores (Durbin-Watson) | DW = 2.185 | 0.906 | DW entre 1.5 y 2.5 | ✅ Sí |
| Normalidad de residuos (Shapiro-Wilk) | W = 0.998 | 0.990 | p > .05 | ✅ Sí |
# Exportar a Excel
dir.create("Output", showWarnings = FALSE)
writexl::write_xlsx(tabla_supuestos, "Output/tabla_supuestos.xlsx")Un “⚠️ No” no invalida automáticamente el modelo — hay que evaluar la magnitud del incumplimiento (por ejemplo, normalidad afectada solo por unos pocos outliers, con una muestra grande) antes de descartar el análisis. Discútanlo con su asesor de tesis si algún supuesto no se cumple claramente.
8 Interpretación
A continuación se muestra un ejemplo de cómo redactar la interpretación de los resultados de una regresión lineal múltiple, en formato APA, basado en los resultados de este mismo tutorial.
El texto en rojo indica las partes que deben cambiar según los resultados de su propio modelo (nombres de variables, número de casos, grados de libertad, coeficientes, valores p, etc.). El resto de la estructura y las frases de transición se mantienen igual — es la plantilla de redacción.
8.1 Ejemplo de redacción
Se realizó una regresión lineal múltiple para examinar cómo el compromiso académico (vigor, absorción, dedicación) y el cansancio emocional predicen la autoeficacia académica. El modelo de regresión, F(4, 196) = 39.03, p < .001, explicó un 44.3% de la varianza en la autoeficacia académica (R² = .443, R²ajustado = .432). Los resultados indicaron que la dedicación fue un predictor positivo significativo de la autoeficacia académica, B = 0.40, β = .30 (efecto mediano), p = .004. El cansancio emocional mostró un efecto negativo significativo, B = -0.19, β = -.27 (efecto mediano-pequeño), p < .001, indicando que a mayor cansancio emocional, menor autoeficacia académica. Por el contrario, el vigor (B = 0.15, β = .15, p = .127) y la absorción (B = 0.15, β = .15, p = .070) no resultaron predictores estadísticamente significativos una vez controladas las demás variables del modelo. Estos resultados pueden visualizarse en la Tabla 1. Los hallazgos subrayan la importancia de fomentar la dedicación y reducir el cansancio emocional para mejorar la autoeficacia académica en estudiantes universitarios.
Recuerden citar también, de forma breve, el resultado de la verificación de supuestos (sección anterior). Por ejemplo, cuando todos los supuestos se cumplen sin objeciones (como ocurre tras eliminar los casos atípicos multivariados en este tutorial):
“Se verificaron los supuestos del modelo: linealidad (inspección visual de los diagramas de dispersión), ausencia de multicolinealidad (VIF < 10), independencia de los errores (Durbin-Watson = 2.19, p = .914) y normalidad de los residuos (p = .990). Todos los supuestos se cumplieron satisfactoriamente.”
Si en cambio algún supuesto no se cumpliera (por ejemplo, si no se hubieran eliminado los outliers), la redacción debe matizarlo en vez de ignorarlo:
“…la normalidad de los residuos mostró una desviación leve y estadísticamente significativa (Shapiro-Wilk, p = .002), atribuible a un número reducido de casos atípicos; dado el tamaño muestral, este hallazgo no compromete sustancialmente la validez de las estimaciones.”
9 Referencias
- Field, A. (2013). Discovering statistics using IBM SPSS statistics (4th ed.). Sage.
- Tabachnick, B. G., & Fidell, L. S. (2019). Using multivariate statistics (7th ed.). Pearson.