Una de las razones por las que R sigue siendo el lenguaje de referencia en estadística es que los modelos clásicos están integrados en el propio lenguaje, sin necesidad de instalar nada. lm() para regresión lineal y glm() para modelos lineales generalizados son dos funciones que llevan décadas en base R y que producen resultados que cualquier estadístico puede interpretar directamente.
Regresión lineal con lm()
La función lm() ajusta un modelo de regresión lineal por mínimos cuadrados. La sintaxis usa la notación de fórmula de R, donde ~ separa la variable respuesta de los predictores:
# Datos de ejemplo
set.seed(42)
n <- 100
df <- data.frame(
x1 = rnorm(n, mean = 50, sd = 10),
x2 = rnorm(n, mean = 20, sd = 5),
grupo = sample(c("A", "B", "C"), n, replace = TRUE)
)
df$y <- 2.5 * df$x1 - 1.2 * df$x2 + 10 + rnorm(n, sd = 8)
# Modelo lineal simple
mod1 <- lm(y ~ x1, data = df)
# Modelo con varios predictores
mod2 <- lm(y ~ x1 + x2, data = df)
# Con variable categórica (crea dummies automáticamente)
mod3 <- lm(y ~ x1 + x2 + grupo, data = df)
# Con interacción
mod4 <- lm(y ~ x1 * x2, data = df) # equivale a x1 + x2 + x1:x2
# Para incluir todos los predictores: y ~ .
summary() devuelve el resumen completo del modelo: coeficientes estimados, errores estándar, estadístico t, p-valores, R² y R² ajustado, estadístico F:
summary(mod2) # Call: # lm(formula = y ~ x1 + x2, data = df) # # Coefficients: # Estimate Std. Error t value Pr(>|t|) # (Intercept) 9.823 5.634 1.743 0.0842 # x1 2.487 0.089 27.942 <2e-16 *** # x2 -1.198 0.174 -6.885 5e-10 *** # # Residual standard error: 8.12 on 97 degrees of freedom # Multiple R-squared: 0.893, Adjusted R-squared: 0.891 # F-statistic: 405.3 on 2 and 97 DF, p-value: < 2.2e-16
Diagnóstico y predicción
# Gráficos de diagnóstico (4 en una sola llamada) par(mfrow = c(2, 2)) plot(mod2) par(mfrow = c(1, 1)) # Predicciones nuevos_datos <- data.frame(x1 = c(45, 55, 60), x2 = c(18, 22, 25)) predict(mod2, newdata = nuevos_datos) predict(mod2, newdata = nuevos_datos, interval = "confidence") # IC 95% predict(mod2, newdata = nuevos_datos, interval = "prediction") # IP 95% # Coeficientes, residuos, valores ajustados coef(mod2) residuals(mod2) fitted(mod2) # Comparar modelos con ANOVA anova(mod1, mod2, mod3) # AIC y BIC para selección de modelos AIC(mod1, mod2, mod3) BIC(mod1, mod2, mod3)
Modelos lineales generalizados con glm()
glm() extiende la regresión lineal a situaciones donde la variable respuesta no es continua normal. El argumento family define la distribución y la función de enlace:
# Regresión logística (variable binaria)
# family = binomial() usa enlace logit por defecto
df$aprobado <- as.integer(df$y > median(df$y))
mod_logit <- glm(aprobado ~ x1 + x2 + grupo,
family = binomial(),
data = df)
summary(mod_logit)
# Odds ratios (exponencial de los coeficientes)
exp(coef(mod_logit))
exp(confint(mod_logit)) # IC de los OR
# Predicción de probabilidades
prob_pred <- predict(mod_logit, type = "response") # probabilidades
clase_pred <- ifelse(prob_pred > 0.5, 1, 0)
# Tabla de confusión manual
table(real = df$aprobado, predicho = clase_pred)
Otras familias de glm()
# Regresión de Poisson (conteos)
mod_poisson <- glm(conteos ~ x1 + x2,
family = poisson(),
data = df_conteos)
# Regresión binomial negativa (conteos con sobredispersión)
library(MASS)
mod_nb <- glm.nb(conteos ~ x1 + x2, data = df_conteos)
# Regresión gamma (valores positivos continuos asimétricos)
mod_gamma <- glm(gasto ~ x1 + x2,
family = Gamma(link = "log"),
data = df_gastos)
Modelos mixtos y extensiones
Cuando los datos tienen estructura jerárquica (medidas repetidas en los mismos sujetos, datos agrupados por centro o región) los modelos lineales estándar no son suficientes. El paquete lme4 añade efectos aleatorios:
library(lme4)
# Modelo mixto: efecto fijo de x1, efecto aleatorio de sujeto
mod_mixto <- lmer(y ~ x1 + x2 + (1 | sujeto), data = df_longitudinal)
# Modelo mixto logístico
mod_mixto_logit <- glmer(aprobado ~ x1 + (1 | centro),
family = binomial(),
data = df)
Interpretación y buenas prácticas
Un error frecuente es interpretar p-valores sin comprobar los supuestos del modelo. En regresión lineal, los residuos deben ser aproximadamente normales, la varianza debe ser constante (homocedasticidad) y no debe haber autocorrelación. Los cuatro gráficos de plot(modelo) permiten detectar violaciones graves.
Para reportar resultados, el paquete broom convierte la salida de lm() y glm() en data frames ordenados, lo que facilita la presentación en tablas y la integración con ggplot2:
library(broom) tidy(mod2) # coeficientes como data.frame glance(mod2) # métricas de ajuste global augment(mod2) # datos originales + residuos + valores ajustados
Si quieres profundizar en la aplicación de estos modelos a conjuntos de datos grandes, el artículo sobre machine learning en R con tidymodels extiende estos conceptos al marco de validación cruzada y ajuste de hiperparámetros. Para entender mejor la base estadística en SQL, también puedes ver funciones de ventana SQL.
Imagen: Pexels / Markus Winkler
