# Load dataset — institutoschicago.sav must be in the data/ project folder
school_data <- haven::read_sav("data/institutoschicago.sav")
# Remove records with missing values on any of the model variables
school_data <- school_data %>%
tidyr::drop_na(SELECTIVO, ASISTENCIA, RENTABAJA, EXTRANJERO, TAMCLASE)
# Apply descriptive labels for cleaner output in tables and summaries
school_data <- expss::apply_labels(
school_data,
SELECTIVO = "Percentage of passing students",
ASISTENCIA = "Attendance rate",
RENTABAJA = "Low income families rate",
EXTRANJERO = "Foreign students rate",
TAMCLASE = "Average class size"
)Parte 6
Introducción al análisis de regresión
El análisis de regresión múltiple es una técnica de dependencia fundamental en la modelización de datos. Se utiliza cuando el objetivo es explicar el comportamiento de una variable métrica (la variable dependiente) a partir de la influencia de varias variables independientes (que pueden ser métricas o, mediante transformaciones, no métricas como las dicotómicas).
Aunque es ampliamente aplicable a series temporales, en investigación de mercados se trabaja habitualmente con datos transversales para modelizar comportamientos y percepciones en un momento dado.
Objetivos y fines del modelo
El uso de la regresión en investigación de mercados persigue dos grandes fines:
- Fines explicativos: entender la estructura y relaciones subyacentes. Por ejemplo, ¿qué relación existe entre el gasto mensual de un cliente y su edad, nivel de ingresos y frecuencia de visita a la tienda?
- Fines predictivos: estimar un valor futuro o desconocido. Por ejemplo, estimar las ventas totales de un empleado en función de su experiencia previa, territorio asignado y horas de formación.
Determinación de las variables
La selección de las variables es una de las tareas más críticas, ya que condiciona por completo la validez del resultado.
- La variable dependiente (\(Y\)): define el enfoque del problema. Su elección determina qué es exactamente lo que se intenta entender o predecir.
- Las variables independientes (\(X_k\)): deben seleccionarse basándose en la teoría o la lógica de negocio. Un exceso de variables independientes puede generar un problema de multicolinealidad, ocultando la contribución real e individual de cada variable al modelo.
Modelo de estimación
La estimación se realizará por mínimos cuadrados ordinarios (MCO u OLS por sus siglas en inglés, Ordinary Least Squares). El objetivo de este método es encontrar la línea (o hiperplano, en el caso múltiple) que minimice la suma de los cuadrados de las diferencias entre los valores reales observados y los valores predichos por el modelo.
La ecuación general de la regresión lineal múltiple se expresa formalmente como:
\[Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \dots + \beta_k X_k + \epsilon\]
Donde:
- \(Y\) es la variable dependiente.
- \(\beta_0\) es la constante o intersección.
- \(\beta_1 \dots \beta_k\) son los coeficientes de regresión parcial asociados a cada variable independiente.
- \(X_1 \dots X_k\) son las variables explicativas.
- \(\epsilon\) es el término de error o residuo (lo que el modelo no logra explicar).
Planteamiento del problema a resolver
Para ilustrar de forma práctica todo el proceso, se utilizan datos reales procedentes de 82 institutos de la ciudad de Chicago (IL).
A modo de configuración inicial, se carga el conjunto de datos que se empleará en toda la sesión:
El contexto es relevante para interpretar correctamente los resultados: Chicago es una ciudad con una alta proporción de población afroamericana y de migrantes latinos.
Objetivo del caso: establecer qué explica que los alumnos procedentes de distintos institutos tengan un nivel de desempeño diferente, medido mediante un examen común (la selectividad).
Definición de las variables:
- Variable dependiente:
SELECTIVO: porcentaje de aprobados en selectividad.
- Variables explicativas o independientes:
ASISTENCIA: porcentaje de estudiantes que acuden regularmente al instituto.TAMCLASE: número medio de alumnos en la clase donde recibieron formación.EXTRANJERO: porcentaje de alumnos procedentes de familias extranjeras con bajo dominio del idioma.RENTABAJA: porcentaje de alumnos procedentes de hogares de renta baja.
El proceso del análisis de regresión
Para que los resultados de una regresión sean fiables, no basta con ejecutar un comando. Debe seguirse un protocolo riguroso que garantice que los datos cumplen con los requisitos estadísticos.
Requisitos previos y tamaño de la muestra
Antes de comenzar, debe asegurarse que el diseño de investigación es sólido. Un error común es intentar explicar un fenómeno con demasiadas variables para muy pocos casos.
- Proporción casos/variables: como regla general, se necesita un mínimo de 15 a 20 observaciones por cada variable independiente incluida en el modelo.
- En el caso práctico: se dispone de 82 institutos (casos, 80 con todos los datos) y 4 variables independientes (
ASISTENCIA,RENTABAJA,EXTRANJERO,TAMCLASE). La ratio es de aproximadamente 20:1, lo cual es ideal para obtener resultados generalizables.
Relaciones lineales
Antes de pasar a los diagnósticos complejos, es vital visualizar si la relación asumida como lineal realmente lo parece en los datos.
# Scatter plot: Attendance vs Academic Success
# The linear fit (geom_smooth) offers a first visual check of linearity
ggplot2::ggplot(school_data, ggplot2::aes(x = ASISTENCIA, y = SELECTIVO)) +
ggplot2::geom_point(color = "#2c3e50", alpha = 0.6) +
ggplot2::geom_smooth(method = "lm", color = "#e74c3c", se = TRUE) +
ggplot2::theme_minimal() +
ggplot2::labs(
title = "Relación entre asistencia y éxito académico",
subtitle = "La línea roja representa la estimación del modelo lineal",
x = "Porcentaje de asistencia",
y = "Porcentaje aprobados selectividad"
)Descriptivos y correlaciones
Antes de interpretar la capacidad explicativa conjunta del modelo, es una práctica fundamental analizar el comportamiento individual de las variables y sus relaciones bivariadas (uno a uno).
En primer lugar, se revisan los estadísticos descriptivos básicos (media, desviación típica y tamaño muestral \(N\)) para asegurar que los datos tienen sentido, trabajando ya únicamente con los casos válidos (sin perdidos).
# Subset with only the variables used in the regression
vars_regression <- school_data %>%
dplyr::select(SELECTIVO, ASISTENCIA, RENTABAJA, EXTRANJERO, TAMCLASE)
# Descriptive statistics (psych::describe replicates SPSS's Descriptives output)
descriptives_table <- psych::describe(vars_regression) %>% round(2)
print(descriptives_table) vars n mean sd median trimmed mad min max range skew
SELECTIVO 1 80 30.41 22.29 23.45 27.26 16.61 0.0 100.0 100.0 1.24
ASISTENCIA 2 80 86.60 4.68 86.05 86.61 4.60 73.7 95.8 22.1 -0.10
RENTABAJA 3 80 80.81 15.31 85.65 83.45 7.86 23.1 98.6 75.5 -1.69
EXTRANJERO 4 80 4.06 6.35 0.35 2.68 0.52 0.0 22.3 22.3 1.52
TAMCLASE 5 80 17.91 4.41 17.90 18.15 4.60 4.8 27.2 22.4 -0.52
kurtosis se
SELECTIVO 1.07 2.49
ASISTENCIA -0.23 0.52
RENTABAJA 2.61 1.71
EXTRANJERO 1.11 0.71
TAMCLASE 0.12 0.49
En segundo lugar, se analiza la matriz de correlaciones de Pearson. Esta tabla actúa como una “radiografía previa” al modelo múltiple y permite evaluar dos aspectos cruciales:
- Correlaciones con la variable dependiente: se busca que las variables independientes tengan una correlación estadísticamente significativa (\(p < 0.05\)) con
SELECTIVO. Sin correlación bivariada, difícilmente aportarán al modelo múltiple. - Correlaciones entre las variables independientes: proporciona una primera pista sobre posibles problemas de multicolinealidad. Si dos variables explicativas están fuertemente correlacionadas entre sí (por encima de 0.80), es probable que ambas estén midiendo aspectos muy similares y compitan por explicar la misma parte de la varianza.
# Pearson correlation matrix with p-values and sample sizes
# Hmisc::rcorr requires a matrix object as input
cor_matrix <- Hmisc::rcorr(as.matrix(vars_regression))
cat("--- Pearson correlation coefficients ---\n")
print(round(cor_matrix$r, 3))
cat("\n--- Significance (p-value) ---\n")
print(round(cor_matrix$P, 4))--- Pearson correlation coefficients ---
SELECTIVO ASISTENCIA RENTABAJA EXTRANJERO TAMCLASE
SELECTIVO 1.000 0.721 -0.714 -0.123 0.511
ASISTENCIA 0.721 1.000 -0.518 -0.010 0.593
RENTABAJA -0.714 -0.518 1.000 0.103 -0.440
EXTRANJERO -0.123 -0.010 0.103 1.000 0.036
TAMCLASE 0.511 0.593 -0.440 0.036 1.000
--- Significance (p-value) ---
SELECTIVO ASISTENCIA RENTABAJA EXTRANJERO TAMCLASE
SELECTIVO NA 0.0000 0.0000 0.2772 0.000
ASISTENCIA 0.0000 NA 0.0000 0.9304 0.000
RENTABAJA 0.0000 0.0000 NA 0.3642 0.000
EXTRANJERO 0.2772 0.9304 0.3642 NA 0.748
TAMCLASE 0.0000 0.0000 0.0000 0.7480 NA
Estimación del modelo: primera ejecución
Selección de las variables y método
En esta sesión se utiliza el método Enter (Introducir). Esto significa que se fuerza a todas las variables seleccionadas a entrar en el modelo simultáneamente. Es el método más robusto cuando existe una base teórica sólida que justifica la inclusión de dichas variables.
En R, el motor de la regresión lineal es la función stats::lm() (linear model). A diferencia de otros programas, la ejecución no arroja decenas de tablas de golpe, sino que guarda toda la información en un objeto que posteriormente se explora con summary().
# Estimate the multiple regression model using OLS
# Syntax: dependent_variable ~ X1 + X2 + ... + Xk
model_chicago <- stats::lm(
SELECTIVO ~
ASISTENCIA +
RENTABAJA +
EXTRANJERO +
TAMCLASE,
data = school_data
)
# First look at the full model output
cat("Model results (first run):\n")
summary(model_chicago)Model results (first run):
Call:
stats::lm(formula = SELECTIVO ~ ASISTENCIA + RENTABAJA + EXTRANJERO +
TAMCLASE, data = school_data)
Residuals:
LABEL: Percentage of passing students
VALUES:
-34.845, -6.649, -1.301, 6.234, 52.897
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -110.5677 37.5578 -2.944 0.00431 **
ASISTENCIA 2.2045 0.4106 5.370 8.51e-07 ***
RENTABAJA -0.6517 0.1136 -5.739 1.90e-07 ***
EXTRANJERO -0.2593 0.2300 -1.127 0.26316
TAMCLASE 0.2119 0.4162 0.509 0.61222
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 12.86 on 75 degrees of freedom
Multiple R-squared: 0.6839, Adjusted R-squared: 0.6671
F-statistic: 40.57 on 4 and 75 DF, p-value: < 2.2e-16
Identificación de outliers y casos influyentes
Un modelo de regresión es muy sensible a casos extremos o al incumplimiento de ciertas reglas matemáticas. Antes de dar por válidos los coeficientes, se deben realizar dos tipos de comprobaciones:
- Detección de casos influyentes con los residuos: ¿existe algún instituto tan “especial” que esté arrastrando la línea de regresión hacia él, falseando el resultado general?
- Validación de supuestos sobre el error: ¿se comportan los residuos de forma aleatoria, normal y constante?
Para detectar estos casos perturbadores, se utilizan dos métricas complementarias:
- Distancia de Mahalanobis: mide la distancia de un caso respecto al centro de la nube de puntos de todas las variables independientes. Ayuda a identificar casos con combinaciones de variables explicativas muy inusuales (outliers multivariantes).
- Distancia de Cook: es, quizás, la medida más importante para el analista. No solo indica si un caso es “raro”, sino si tiene influencia en el modelo. Si se eliminara un caso con una distancia de Cook alta, los coeficientes cambiarían significativamente.
¿Cómo proceder si se encuentra un outlier? No debe eliminarse por sistema. Primero se comprueba si es un error de grabación de datos. Si el dato es correcto, el investigador debe decidir si ese caso pertenece realmente a la población que se desea estudiar o si es una excepción que requiere un análisis separado. En el caso de Chicago, si un instituto tiene una configuración de alumnos extremadamente inusual, su eliminación podría hacer que el modelo sea mucho más robusto para explicar el comportamiento del resto de centros.
Estos indicadores — especialmente la distancia de Cook — se calculan con el modelo ya estimado:
# Extract the independent variable matrix once (used for Mahalanobis calculation)
indep_matrix <- as.matrix(
school_data[, c("ASISTENCIA", "RENTABAJA", "EXTRANJERO", "TAMCLASE")]
)
# Append influence diagnostics to the dataframe
school_data <- school_data %>%
dplyr::mutate(
mahalanobis = stats::mahalanobis(
x = indep_matrix,
center = colMeans(indep_matrix),
cov = stats::cov(indep_matrix)
),
cook_d = stats::cooks.distance(model_chicago)
)
# Visualize Cook's Distance
# Common threshold: 4/n (here 4/82 ≈ 0.049); cases above the red line warrant inspection
cutoff <- 4 / nrow(school_data)
ggplot2::ggplot(
school_data,
ggplot2::aes(x = seq_len(nrow(school_data)), y = cook_d)
) +
ggplot2::geom_bar(stat = "identity", fill = "#34495e") +
ggplot2::geom_hline(yintercept = cutoff, color = "#e74c3c", linetype = "dashed") +
ggplot2::theme_minimal() +
ggplot2::labs(
title = "Diagnóstico de influencia (Distancia de Cook)",
subtitle = "Los casos por encima de la línea roja podrían estar distorsionando el modelo",
x = "ID del instituto",
y = "Distancia de Cook"
)Indicadores de ajuste
Con el modelo estimado, la atención se centra en los indicadores que miden la “bondad del ajuste”:
# Full model summary — focus here on R², Adjusted R², F-statistic and Residual SE
cat("Model results (goodness of fit):\n")
summary(model_chicago)
# Multiple R: correlation between observed and predicted values
# Not shown directly in summary() — computed as sqrt(R²)
multiple_r <- sqrt(summary(model_chicago)$r.squared)
cat("Multiple correlation (R):", round(multiple_r, 4), "\n")Model results (goodness of fit):
Call:
stats::lm(formula = SELECTIVO ~ ASISTENCIA + RENTABAJA + EXTRANJERO +
TAMCLASE, data = school_data)
Residuals:
LABEL: Percentage of passing students
VALUES:
-34.845, -6.649, -1.301, 6.234, 52.897
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -110.5677 37.5578 -2.944 0.00431 **
ASISTENCIA 2.2045 0.4106 5.370 8.51e-07 ***
RENTABAJA -0.6517 0.1136 -5.739 1.90e-07 ***
EXTRANJERO -0.2593 0.2300 -1.127 0.26316
TAMCLASE 0.2119 0.4162 0.509 0.61222
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 12.86 on 75 degrees of freedom
Multiple R-squared: 0.6839, Adjusted R-squared: 0.6671
F-statistic: 40.57 on 4 and 75 DF, p-value: < 2.2e-16
Multiple correlation (R): 0.827
- Coeficiente de correlación múltiple (\(R\)): mide el grado de asociación lineal entre el valor real observado de la variable dependiente (
SELECTIVO) y los valores predichos por el modelo. Su valor oscila entre 0 y 1. En R no aparece etiquetado como \(R\) en elsummary(); se obtiene como la raíz cuadrada del \(R^2\), tal y como se ha calculado manualmente. - Coeficiente de determinación (\(R^2\)): indica la proporción de la varianza de la variable dependiente que es explicada por el conjunto de las independientes.
- Coeficiente de determinación ajustado (Adjusted \(R^2\)): medida más conservadora y realista. Penaliza la inclusión de variables que no aportan valor real al modelo. Es el valor que debe reportarse habitualmente en investigación de mercados.
- Estadístico F (ANOVA): si el p-valor asociado es menor a 0.05, puede afirmarse que el modelo es significativo en su conjunto; es decir, que al menos una de las variables explica el éxito en selectividad mejor que el simple azar.
- Error típico de la estimación (Residual standard error): indica, en las mismas unidades que la variable dependiente (porcentaje de aprobados), cuánto se equivoca de media el modelo al realizar una predicción. Cuanto menor sea este valor, más precisas serán las estimaciones.
Además, la tabla de coeficientes no estandarizados proporciona los valores exactos para construir la ecuación de predicción:
\[SELECTIVO = \beta_0 + (\beta_1 \cdot ASISTENCIA) + (\beta_2 \cdot RENTABAJA) + (\beta_3 \cdot EXTRANJERO) + (\beta_4 \cdot TAMCLASE)\]
donde las \(\beta_k\) son las estimaciones de los parámetros.
Diagnóstico del modelo
Tras auditar la calidad del modelo, se entra en la fase de interpretación de resultados. Deben responderse tres preguntas: ¿es el modelo útil en su conjunto?, ¿qué variables son significativas?, ¿cuál es la que más influye?
Una vez validado que el modelo funciona de forma global, se desciende al detalle de los coeficientes (\(\beta\)). Se distinguen dos tipos de información:
# Model summary displayed again here as the starting point for coefficient interpretation
cat("Model results (coefficient interpretation):\n")
summary(model_chicago)
# Multiple R (repeated for interpretive completeness)
multiple_r <- sqrt(summary(model_chicago)$r.squared)
cat("Multiple correlation (R):", round(multiple_r, 4), "\n")Model results (coefficient interpretation):
Call:
stats::lm(formula = SELECTIVO ~ ASISTENCIA + RENTABAJA + EXTRANJERO +
TAMCLASE, data = school_data)
Residuals:
LABEL: Percentage of passing students
VALUES:
-34.845, -6.649, -1.301, 6.234, 52.897
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -110.5677 37.5578 -2.944 0.00431 **
ASISTENCIA 2.2045 0.4106 5.370 8.51e-07 ***
RENTABAJA -0.6517 0.1136 -5.739 1.90e-07 ***
EXTRANJERO -0.2593 0.2300 -1.127 0.26316
TAMCLASE 0.2119 0.4162 0.509 0.61222
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 12.86 on 75 degrees of freedom
Multiple R-squared: 0.6839, Adjusted R-squared: 0.6671
F-statistic: 40.57 on 4 and 75 DF, p-value: < 2.2e-16
Multiple correlation (R): 0.827
- Coeficientes no estandarizados (B / Estimate): representan el cambio en la variable dependiente por cada unidad que aumenta la independiente, manteniendo el resto constantes. Se usan para la ecuación de predicción.
- Coeficientes estandarizados (Beta): son fundamentales para el objetivo explicativo. Al estar en la misma escala (desviaciones típicas), permiten comparar qué variable tiene mayor peso relativo en el modelo. No se ofrecen directamente en el
summary()base y deben calcularse explícitamente.
Significación global del modelo (Prueba F)
La primera parada es la tabla ANOVA. La prueba F contrasta la hipótesis nula de que todos los coeficientes de las variables independientes son cero.
En la salida se muestra el resultado:
F-statistic: 40.57 on 4 and 75 DF, p-value: < 2.2e-16
Si p-valor < 0.05: se rechaza la hipótesis nula. El modelo es significativamente mejor que usar simplemente la media para predecir. Existe, al menos, una relación lineal real.
Significación de los parámetros individuales (Prueba t)
No todas las variables que se introducen en el modelo tienen por qué ser relevantes. La prueba t de Student evalúa la contribución individual de cada variable manteniendo las demás constantes.
- Hipótesis: la variable \(X_i\) no ayuda a explicar \(Y\).
- Decisión: si el p-valor asociado a la t es menor de 0.05, se concluye que esa variable es un predictor significativo para el éxito en selectividad.
- Cada variable tiene su propio contraste. Si el p-valor (Pr(>|t|)) es inferior a 0.05, esa variable contribuye significativamente al modelo.
Interpretación de los coeficientes: B vs. \(\beta\)
Para entender el “peso” de las variables, R ofrece dos tipos de coeficientes:
- Coeficientes no estandarizados (B / Estimate): expresados en las unidades originales (ej: por cada 1% que sube la asistencia, los aprobados suben un B%). Son útiles para la ecuación de predicción.
- Coeficientes estandarizados (Beta): expresados en desviaciones típicas. Al estar todos en la misma escala, permiten comparar la importancia relativa. La variable con el \(\beta\) absoluto más alto es la que tiene mayor impacto en el modelo.
# Standardized coefficients (Beta) via lm.beta::lm.beta()
# summary() here shows both B (Estimate) and the standardized Beta side by side
model_beta <- lm.beta::lm.beta(model_chicago)
summary(model_beta)
Call:
stats::lm(formula = SELECTIVO ~ ASISTENCIA + RENTABAJA + EXTRANJERO +
TAMCLASE, data = school_data)
Residuals:
LABEL: Percentage of passing students
VALUES:
-34.845, -6.649, -1.301, 6.234, 52.897
Coefficients:
Estimate Standardized Std. Error t value Pr(>|t|)
(Intercept) -110.56772 NA 37.55778 -2.944 0.00431 **
ASISTENCIA 2.20450 0.46328 0.41055 5.370 8.51e-07 ***
RENTABAJA -0.65173 -0.44757 0.11356 -5.739 1.90e-07 ***
EXTRANJERO -0.25926 -0.07389 0.22996 -1.127 0.26316
TAMCLASE 0.21188 0.04195 0.41624 0.509 0.61222
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 12.86 on 75 degrees of freedom
Multiple R-squared: 0.6839, Adjusted R-squared: 0.6671
F-statistic: 40.57 on 4 and 75 DF, p-value: < 2.2e-16
Implicaciones de los coeficientes no significativos
Eliminación hacia atrás (Backward Elimination)
Debe seguirse este protocolo estricto:
- Observar los p-valores de las variables no significativas.
- Identificar la que tiene el p-valor más alto (la “peor” predictora).
- Eliminar SOLAMENTE esa variable.
- Volver a ejecutar el modelo (reespecificar).
Las variables independientes suelen estar correlacionadas entre sí. En ocasiones, una variable parece “no significativa” únicamente porque otra variable le está “robando” la explicación (multicolinealidad leve).
Efecto Lázaro: al eliminar la variable con el peor p-valor, es posible que otra variable que antes no era significativa se vuelva significativa (\(p<0.05\)) al tener más varianza disponible para explicarse.
El indicador clave, el Adjusted \(R^2\)
¿Cómo asegurar que se ha acertado al eliminarla? Se observa el Adjusted \(R^2\). El \(R^2\) normal siempre bajará ligeramente al quitar variables (es un principio matemático). Sin embargo, si el Adjusted \(R^2\) sube o se mantiene igual, significa que la decisión fue correcta: se ha eliminado ruido reteniendo la mejor información.
Excepción: variables de control teórico
Existe un escenario donde no debe eliminarse una variable aunque carezca de significación: cuando la teoría o el diseño del experimento exigen su inclusión. Ejemplo: si se mide el efecto de una campaña de marketing en ventas y se incluye el “Precio” como variable de control. Si el precio no resulta significativo en esa muestra concreta, no debe eliminarse; de lo contrario, el modelo podría acusarse de sesgo por omisión. Se retiene para afirmar: “controlando por el efecto del precio, la campaña tuvo un efecto positivo”.
Correlaciones parciales y semiparciales
En investigación de mercados no basta con saber si una variable es significativa; se busca cuantificar su aportación única. Dado que las variables suelen estar relacionadas entre sí, el \(R^2\) no es simplemente la suma de las correlaciones individuales. Para desgranar esta información se utilizan:
- Correlación parcial: mide la relación entre una variable independiente y la dependiente, eliminando el efecto que las otras variables independientes tienen sobre ambas.
- Correlación semiparcial (o Part): mide la relación eliminando el efecto de las otras independientes solo sobre la variable explicativa actual. Es la medida más pura de aportación, ya que su cuadrado indica exactamente cuánto aumentaría el \(R^2\) si se añadiera esa variable en último lugar al modelo.
# Semi-partial (Part) correlations — unique contribution of each predictor
part_corr <- ppcor::spcor(vars_regression)
# Partial correlations — controlling for all other predictors on both variables
partial_corr <- ppcor::pcor(vars_regression)
# Summary table: zero-order, partial and part correlations with unique R² contribution
contribution_table <- data.frame(
Variable = names(vars_regression)[-1],
Cor_Order_0 = cor_matrix$r[1, -1],
Partial = partial_corr$estimate[1, -1],
Part = part_corr$estimate[1, -1]
) %>%
dplyr::mutate(Contribution_R2 = Part^2) # Unique % of R² explained by each predictor
print(contribution_table[, -1]) Cor_Order_0 Partial Part Contribution_R2
ASISTENCIA 0.7208610 0.52695673 0.34858381 0.121510671
RENTABAJA -0.7137334 -0.55240542 -0.37257096 0.138809118
EXTRANJERO -0.1229632 -0.12909458 -0.07319028 0.005356817
TAMCLASE 0.5108685 0.05867719 0.03304565 0.001092015
Al interpretar esta tabla, el analista puede concluir con rigor:
- La variable dominante: aquella con la correlación semiparcial (
Part) más alta es la que aporta más información exclusiva. - Redundancia: si la correlación de orden cero es muy alta pero la parcial es muy baja, la variable es redundante (su información ya la están aportando otras).
- Utilidad estratégica: el valor
Contribution_R2revela qué porcentaje del éxito en selectividad se explica únicamente por esa variable y por ninguna otra.
Validación de los supuestos básicos del modelo
Una vez analizada la capacidad explicativa, debe certificarse que el modelo cumple con los “cuatro pilares” de la regresión lineal. Si estos supuestos fallan, las pruebas de significancia (\(F\) y \(t\)) pierden su validez y las conclusiones podrían ser erróneas.
La validación se realiza interrogando los residuos (el error cometido) en busca de patrones que no deberían existir:
- Muestra: relación entre el número de indicadores y casos.
- Residuos extremos: outliers en los residuos.
- Independencia: los errores no deben estar relacionados entre sí (Durbin-Watson).
- Linealidad: la relación entre las variables debe ser rectilínea.
- Homocedasticidad: la varianza del error debe ser constante (sin “embudos”).
- Normalidad: los errores deben seguir una distribución normal con media cero.
Para estas comprobaciones, con el modelo ya calculado, se calcula una serie de variables diagnósticas:
- PRE (Valor predicho): se obtiene con
stats::predict(). - RES (Residuo bruto): se obtiene con
stats::residuals(). - ZPR (Valor predicho estandarizado): se calcula tipificando los valores predichos con
scale(). - ZRE (Residuo estandarizado):
stats::rstandard()calcula el residuo estandarizado corregido por el apalancamiento o leverage. - SRE (Residuo estudentizado): se obtiene con
stats::rstudent()(equivale al residuo eliminado estudentizado).
# Calculate and append diagnostic variables using Base R functions
# as.vector() on scale() avoids matrix formatting issues inside the dataframe
school_data <- school_data %>%
dplyr::mutate(
pred_val = stats::predict(model_chicago),
resid_val = stats::residuals(model_chicago),
z_pred = as.vector(scale(stats::predict(model_chicago))),
z_resid = stats::rstandard(model_chicago),
stud_resid = stats::rstudent(model_chicago)
)
# Inspect the first rows to verify the new diagnostic columns
school_data %>%
dplyr::select(INSTITUTO, SELECTIVO, pred_val, resid_val, z_pred, z_resid, stud_resid) %>%
utils::head()# A tibble: 6 × 7
INSTITUTO SELECTIVO pred_val resid_val z_pred z_resid stud_resid
<chr> <labelled> <dbl> <labelle> <dbl> <labelle> <labelled>
1 FLOWER VOC HIGH 70.6 17.7 52.89734 -0.689 4.169925 4.725946
2 JONES COLL PREP HIGH 85.2 56.7 28.49938 1.43 2.283293 2.351211
3 YNG WOMN LDRSHP CHRT 28.8 59.8 -31.02755 1.60 -2.477262 -2.567996
4 NORTHSIDE COLL PREP 100.0 87.8 12.19111 3.11 1.064933 1.065899
5 PERSPECTIVES CHRTR H 23.7 49.2 -25.53578 1.02 -2.057522 -2.104002
6 NORTH LAWNDALE CHRTR 8.2 43.0 -34.84521 0.686 -2.765504 -2.898777
Con estas variables calculadas, pueden construirse las visualizaciones para analizar la presencia de atípicos, la linealidad, la homocedasticidad y la normalidad.
Muestra
Este indicador ejerce una gran influencia sobre la significatividad de la relación:
- Con muestras más pequeñas se corre el riesgo de sobreajuste (overfitting, resultados no generalizables fuera de esa muestra).
- Con muestras muy grandes, habrá que asegurarse de que, además de resultados estadísticamente significativos, las relaciones obtenidas tienen cierta intensidad, pues existe la tendencia a que pequeños coeficientes resulten significativos estadísticamente de forma artificial.
Las reglas empíricas habituales son:
- 10 a 15 casos por indicador (una regla sencilla que puede simplificar en exceso la complejidad del problema).
- Según Green (1991), para \(k\) parámetros (variables independientes):
- Cuando el foco se pone en el ajuste global del modelo: \(50 + (8 \times k)\).
- Cuando el foco se pone en la significatividad de los parámetros: \(104 + k\).
- Cuando el foco se centra en ambos análisis: el mayor de los anteriores.
Residuos extremos
Un outlier no es un caso que deba eliminarse inmediatamente, sino un caso que debe analizarse de manera particular:
- Puede ser un error en la entrada de datos: se modifica si es posible o se elimina si no hay opción.
- Puede ser un valor correcto pero explicable: se analizan las variables que lo explican.
- Puede ser un valor correcto pero inexplicable: se recomienda modelizar con y sin el valor para analizar su efecto.
Los outliers en una regresión se analizan sobre los residuos estandarizados o estudentizados. Una de las formas más potentes de detectar casos problemáticos es observar cuántas desviaciones típicas se aleja su residuo de la media (cero). En una distribución normal, es extremadamente raro encontrar casos más allá de 3 desviaciones típicas. Se aplican las siguientes reglas:
- 95% deben estar entre -1.96 y +1.96.
- 95.45% deben estar entre -2 y 2.
- 99% deben estar entre -2.58 y +2.58.
- 99.78% deben estar entre -3 y 3.
Si esos porcentajes observados son inferiores, existe evidencia de que el nivel de error del modelo no es aceptable (ajusta pobremente). Si un caso supera \(\pm 2.58\), debe ser analizado.
- Caso atípico: aquel cuyo residuo estandarizado está fuera del intervalo \([-3, +3]\).
- Caso a revisar: aquellos ubicados entre 2 y 3 desviaciones típicas, especialmente si la muestra es pequeña.
# Frequency table of absolute standardised residuals
# Head and tail give a view of both low-residual (well-fitted) and high-residual cases
utils::head(expss::fre(abs(school_data$z_resid)))
utils::tail(expss::fre(abs(school_data$z_resid)))| Percentage of passing students | Count | Valid percent | Percent | Responses, % | Cumulative responses, % |
|---|---|---|---|---|---|
| 0.00783596844282617 | 1 | 1.2 | 1.2 | 1.2 | 1.2 |
| 0.0191362365958814 | 1 | 1.2 | 1.2 | 1.2 | 2.5 |
| 0.0299952853719144 | 1 | 1.2 | 1.2 | 1.2 | 3.8 |
| 0.0400238883072977 | 1 | 1.2 | 1.2 | 1.2 | 5.0 |
| 0.0466790187951101 | 1 | 1.2 | 1.2 | 1.2 | 6.2 |
| 0.0474318937348801 | 1 | 1.2 | 1.2 | 1.2 | 7.5 |
| Percentage of passing students | Count | Valid percent | Percent | Responses, % | Cumulative responses, % |
|---|---|---|---|---|---|
| 2.28329347648761 | 1 | 1.2 | 1.2 | 1.2 | 96.2 |
| 2.47726205922403 | 1 | 1.2 | 1.2 | 1.2 | 97.5 |
| 2.7655035970376 | 1 | 1.2 | 1.2 | 1.2 | 98.8 |
| 4.16992537304343 | 1 | 1.2 | 1.2 | 1.2 | 100.0 |
| #Total | 80 | 100 | 100 | 100 | |
| <NA> | 0 | 0.0 |
Independencia: Durbin-Watson
Este estadístico garantiza que el error de un caso (ej. un instituto) no está condicionado por el error del anterior. En el caso de Chicago, dado que los datos no tienen un orden temporal lógico, es altamente probable que la independencia se cumpla, pero es obligatorio reportarlo.
- Valor ideal: 2.0.
- Rango aceptable: entre 1.5 y 2.5.
# Durbin-Watson test for serial autocorrelation in the residuals
dw_result <- lmtest::dwtest(model_chicago)
print(dw_result)
Durbin-Watson test
data: model_chicago
DW = 1.6611, p-value = 0.05996
alternative hypothesis: true autocorrelation is greater than 0
Linealidad
Se posiciona z_pred (predichos estandarizados) en el eje X y z_resid (residuos estandarizados) en el eje Y.
Resultado visual esperado:
- Correcto: una nube de puntos sin forma, como un enjambre de abejas.
- Incorrecto: una forma de “U” o de “U invertida” (parábola), que indica que la relación original era curva y se ha forzado una línea recta, violando el supuesto de linealidad.
Al evaluar la linealidad, se observa la tendencia central de la nube de puntos de izquierda a derecha:
- Lo ideal: si se traza una línea que pase por el centro de la nube, debería ser una línea plana horizontal que coincida con el cero.
- El problema: si esa línea central dibuja una “U” o una onda, el modelo está fallando de forma sistemática (subestimando en los extremos y sobreestimando en el medio, o viceversa).
# Residual diagnostic plot: ZPRED vs ZRESID
# For linearity: assess the SHAPE of the central trend (should be flat at zero)
ggplot2::ggplot(school_data, ggplot2::aes(x = z_pred, y = z_resid)) +
ggplot2::geom_point(color = "#2c3e50", alpha = 0.7, size = 2) +
ggplot2::geom_hline(yintercept = 0, color = "#e74c3c", linewidth = 1) +
ggplot2::geom_hline(yintercept = c(-2, 2), color = "#7f8c8d", linetype = "dashed") +
ggplot2::geom_hline(yintercept = c(-3, 3), color = "#c0392b", linetype = "dotted",
linewidth = 1) +
ggplot2::theme_minimal() +
ggplot2::labs(
title = "Gráfico de diagnóstico de residuos",
subtitle = "Validación visual de linealidad",
x = "Valores predichos estandarizados (Z_PRED)",
y = "Residuos estandarizados (Z_RESID)"
)Homocedasticidad
Se utiliza el mismo gráfico ZPRED vs ZRESID, pero ahora el foco cambia: en lugar de observar la tendencia central, se observa la amplitud vertical de la nube de puntos a medida que se avanza de izquierda a derecha.
- Lo ideal: la nube de puntos debe parecer un “tubo” o un rectángulo de ancho constante. El error es igual de ancho para predicciones bajas que para predicciones altas.
- El problema: si la nube comienza muy estrecha y se va abriendo como un embudo o un megáfono, se está ante un escenario de heterocedasticidad. Significa que, para valores bajos, el modelo es muy preciso, pero a medida que los valores crecen, el modelo se vuelve cada vez más impreciso.
# Same ZPRED vs ZRESID plot reused with a different interpretive lens:
# For homoscedasticity: assess the WIDTH (vertical spread) of the cloud,
# not its central trend — it should remain constant across all predicted values
ggplot2::ggplot(school_data, ggplot2::aes(x = z_pred, y = z_resid)) +
ggplot2::geom_point(color = "#2c3e50", alpha = 0.7, size = 2) +
ggplot2::geom_hline(yintercept = 0, color = "#e74c3c", linewidth = 1) +
ggplot2::geom_hline(yintercept = c(-2, 2), color = "#7f8c8d", linetype = "dashed") +
ggplot2::geom_hline(yintercept = c(-3, 3), color = "#c0392b", linetype = "dotted",
linewidth = 1) +
ggplot2::theme_minimal() +
ggplot2::labs(
title = "Gráfico de diagnóstico de residuos",
subtitle = "Validación visual de homocedasticidad",
x = "Valores predichos estandarizados (ZPRED)",
y = "Residuos estandarizados (ZRESID)"
)Normalidad: gráfico Q-Q de los residuos
Para evaluar si los errores siguen una distribución normal, se enfrentan los cuantiles teóricos de una distribución normal perfecta con los cuantiles reales de los residuos estudentizados:
# Normal Q-Q plot for residual normality
# Points should lie close to the diagonal; systematic deviations signal non-normality
ggplot2::ggplot(school_data, ggplot2::aes(sample = stud_resid)) +
ggplot2::stat_qq(color = "#34495e", alpha = 0.7) +
ggplot2::stat_qq_line(color = "#e74c3c", linewidth = 1) +
ggplot2::theme_minimal() +
ggplot2::labs(
title = "Gráfico de probabilidad normal (Q-Q)",
subtitle = "Los puntos deberían alinearse sobre la diagonal roja",
x = "Cuantiles teóricos",
y = "Cuantiles de los residuos estudentizados"
)Evaluar la normalidad combinando la inspección visual (histograma con curva normal) con las pruebas analíticas (Shapiro-Wilk y Lilliefors) representa la forma más rigurosa de validar este supuesto:
# Visual validation: histogram of standardised residuals with normal curve overlay
# after_stat(density) scales the y-axis to density so the curve fits properly
ggplot2::ggplot(school_data, ggplot2::aes(x = z_resid)) +
ggplot2::geom_histogram(
ggplot2::aes(y = ggplot2::after_stat(density)),
fill = "steelblue",
color = "white",
alpha = 0.8
) +
ggplot2::stat_function(
fun = dnorm,
args = list(
mean = mean(school_data$z_resid, na.rm = TRUE),
sd = sd(school_data$z_resid, na.rm = TRUE)
),
color = "black",
linewidth = 1.5
) +
ggplot2::theme_minimal() +
ggplot2::labs(
title = "Distribución de los residuos estandarizados",
subtitle = "Histograma de frecuencias vs. curva normal teórica",
x = "Residuos estandarizados (ZRESID)",
y = "Densidad"
)# Analytical normality tests on the standardised residuals
# Shapiro-Wilk: most powerful for n < 100; Lilliefors: more conservative
stats::shapiro.test(school_data$z_resid)
nortest::lillie.test(school_data$z_resid)
Shapiro-Wilk normality test
data: school_data$z_resid
W = 0.93954, p-value = 0.0009098
Lilliefors (Kolmogorov-Smirnov) normality test
data: school_data$z_resid
D = 0.079702, p-value = 0.2389
¿Por qué existe aparente contradicción en los resultados? Se trata de una diferencia de potencia estadística entre ambas pruebas, en interacción con el tamaño de la muestra (\(n=80\)):
- Shapiro-Wilk (\(p < 0.05\)): indica que se RECHAZA la normalidad. Esta prueba es extremadamente sensible y potente, especialmente para muestras menores de 100 casos. Es capaz de detectar desviaciones muy sutiles de la campana ideal.
- Lilliefors (\(p > 0.05\)): indica que NO se puede RECHAZAR la normalidad. Incluso con la corrección de Lilliefors, esta prueba es mucho más conservadora y suele pasar por alto desviaciones moderadas.
Al observar el gráfico, el estadístico de Shapiro-Wilk es matemáticamente preciso. La distribución de los residuos no dibuja una campana perfecta:
- Se aprecia un pico central muy agudo (apuntamiento o curtosis alta).
- Se observa una ligera asimetría (la cola derecha posee mayor densidad aparente que la izquierda).
Shapiro-Wilk detecta estas “imperfecciones” geométricas, mientras que Lilliefors evalúa que la forma general es lo suficientemente próxima a una normal como para no rechazar la hipótesis.
La decisión práctica
En un entorno de investigación de mercados profesional, el comentario que debe trasladarse al informe es el siguiente:
Aunque la prueba de Shapiro-Wilk (más sensible) detecta desviaciones significativas de la normalidad perfecta (\(p = 0.0009\)), la prueba de Lilliefors (\(p = 0.2389\)) y la inspección visual del histograma sugieren que estas desviaciones son moderadas. Dado que el tamaño de la muestra es suficientemente amplio (\(n=80\)) y que la estimación por Mínimos Cuadrados Ordinarios es un método robusto frente a violaciones leves del supuesto de normalidad, se decide dar por válido el modelo y continuar con la interpretación. No obstante, esta ligera asimetría advierte que el modelo podría ser susceptible de mejora si se identifican y tratan casos atípicos o si se transforma alguna variable.
En la práctica empírica, estas asimetrías suelen estar causadas por aquellos 2 o 3 institutos que presentan un comportamiento anómalo (los outliers detectados en pasos anteriores con la distancia de Cook o con residuos superiores a 3 desviaciones).