Tutorial: Regresión Lineal Múltiple en R

Estimación, verificación de supuestos y reporte de resultados

Autor/a

Cristopher Lino-Cruz

Fecha de publicación

22 de junio de 2026

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).

ImportanteImportante para los estudiantes

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

# 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
# ))

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
TipTamaño del efecto de los β estandarizados

No existe un estándar tan consolidado como para r o , 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 + p4

Tip

Có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), ")"
  )
)
Resultados de la regresión lineal múltiple (R² = 0.443, R² ajustado = 0.432)
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")
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")
NotaCómo leer esta tabla

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.

ImportanteCómo usar este ejemplo

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 ( = .443, 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.

NotaAntes de afirmar que un supuesto se cumple o no

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.