Introducción

Los Modelos Lineales Generalizados (GLM) son una extensión de los modelos lineales clásicos que permiten modelar variables respuesta que no siguen una distribución normal.

Fueron introducidos por Nelder y Wedderburn (1972) y son ampliamente utilizados en estadística y ciencia de datos.

Componentes de un GLM

Un GLM está compuesto por tres elementos fundamentales:

1. Componente aleatoria

La variable respuesta ( Y ) sigue una distribución de la familia exponencial, como:

  • Normal
  • Binomial
  • Poisson
  • Gamma

2. Componente sistemática

Se define como:

[ = X]

donde:

  • ( X ) es la matriz de variables explicativas
  • ( ) es el vector de coeficientes

3. Función de enlace

Relaciona la media de la variable respuesta con el predictor lineal:

[ g() = ]

Algunos ejemplos de funciones de enlace:

  • Identidad: ( g() = )
  • Logit: ( g() = () )
  • Log: ( g() = () )

Interpretación de coeficientes

Supuestos

Los GLM permiten modelar una amplia variedad de datos y son fundamentales en análisis estadístico moderno.

Referencias

Ejemplo de regresión lineal múltiple en R

Usaremos el dataset mtcars (incluido en R)

data(mtcars)

Ver las primeras filas

head(mtcars)

Modelo: predecir consumo (mpg) usando peso (wt), caballos de fuerza (hp) y cilindros (cyl)

modelo <- lm(mpg ~ wt + hp + cyl, data = mtcars)

Resumen del modelo

summary(modelo)

Predicciones

predicciones <- predict(modelo)

Ver primeras predicciones

head(predicciones)

Gráfico de valores reales vs predichos

plot(mtcars$mpg, predicciones, main = “Valores reales vs predichos”, xlab = “mpg real”, ylab = “mpg predicho”, col = “blue”, pch = 19)

Línea de referencia

abline(0,1, col = “red”, lwd = 2)

# Ejemplo de regresión lineal múltiple en R

# Usaremos el dataset mtcars (incluido en R)

data(mtcars)

# Ver las primeras filas

head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
# Modelo: predecir consumo (mpg) usando peso (wt), caballos de fuerza (hp) y cilindros (cyl)

modelo <- lm(mpg ~ wt + hp + cyl, data = mtcars)

# Resumen del modelo

summary(modelo)
## 
## Call:
## lm(formula = mpg ~ wt + hp + cyl, data = mtcars)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.9290 -1.5598 -0.5311  1.1850  5.8986 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 38.75179    1.78686  21.687  < 2e-16 ***
## wt          -3.16697    0.74058  -4.276 0.000199 ***
## hp          -0.01804    0.01188  -1.519 0.140015    
## cyl         -0.94162    0.55092  -1.709 0.098480 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.512 on 28 degrees of freedom
## Multiple R-squared:  0.8431, Adjusted R-squared:  0.8263 
## F-statistic: 50.17 on 3 and 28 DF,  p-value: 2.184e-11
# Predicciones

predicciones <- predict(modelo)

# Ver primeras predicciones

head(predicciones)
##         Mazda RX4     Mazda RX4 Wag        Datsun 710    Hornet 4 Drive 
##          22.82043          22.01285          25.96040          20.93608 
## Hornet Sportabout           Valiant 
##          17.16780          20.25036
# Gráfico de valores reales vs predichos

plot(mtcars$mpg, predicciones,
main = "Valores reales vs predichos",
xlab = "mpg real",
ylab = "mpg predicho",
col = "blue", pch = 19)

# Línea de referencia

abline(0,1, col = "red", lwd = 2)

#id="supuestos_lm"
# Instalar paquetes si no los tienes
# install.packages("lmtest")
# install.packages("car")
# install.packages("nortest")

# Cargar librerías
library(lmtest)
## Cargando paquete requerido: zoo
## 
## Adjuntando el paquete: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(car)
## Cargando paquete requerido: carData
library(nortest)

# Datos
data(mtcars)

# Ajustar modelo
modelo <- lm(mpg ~ wt + hp + cyl, data = mtcars)

# 1. Normalidad de los residuos
residuos <- residuals(modelo)
shapiro.test(residuos)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuos
## W = 0.93455, p-value = 0.05252
# 2. Homocedasticidad (Breusch-Pagan)
bptest(modelo)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo
## BP = 2.9351, df = 3, p-value = 0.4017
# 3. Independencia de errores (Durbin-Watson)
dwtest(modelo)
## 
##  Durbin-Watson test
## 
## data:  modelo
## DW = 1.6441, p-value = 0.1002
## alternative hypothesis: true autocorrelation is greater than 0
# 4. Multicolinealidad (VIF)
vif(modelo)
##       wt       hp      cyl 
## 2.580486 3.258481 4.757456
# 5. Gráficos de diagnóstico
par(mfrow = c(2,2))
plot(modelo)

```{r} id=“logistic_model”} # Cargar datos data(mtcars)

Convertir la variable ‘am’ en factor (0 = automático, 1 = manual)

mtcars\(am <- as.factor(mtcars\)am)

Ajustar modelo de regresión logística

Queremos predecir el tipo de transmisión (am)

modelo_logit <- glm(am ~ wt + hp + mpg, data = mtcars, family = binomial(link = “logit”))

Resumen del modelo

summary(modelo_logit)

Probabilidades predichas

probabilidades <- predict(modelo_logit, type = “response”)

Ver primeras probabilidades

head(probabilidades)

Clasificación (umbral 0.5)

pred_clase <- ifelse(probabilidades > 0.5, 1, 0)

Matriz de confusión

table(Predicho = pred_clase, Real = mtcars$am)



``` r
# install.packages("faraway")
library(faraway)
## Warning: package 'faraway' was built under R version 4.5.3
## 
## Adjuntando el paquete: 'faraway'
## The following objects are masked from 'package:car':
## 
##     logit, vif
data(mtcars)
mtcars$am <- as.factor(mtcars$am)

modelo_logit <- glm(am ~ wt + hp + mpg,
                    data = mtcars,
                    family = binomial)

# Residuos de devianza
residuos_dev <- residuals(modelo_logit, type = "deviance")

# Envelope (sin xlab ni ylab para evitar conflicto)
halfnorm(residuos_dev,
         main = "Envelope de residuos (Half-Normal Plot)")

# Caminata aleatoria

z<-rnorm(1000,0,1)
plot(cumsum(z),type="l",ylim = c(-100,100))
#Caminata aleatoria
for (i in 1:100) {
  z<-rnorm(1000,0,1)
  lines(cumsum(z),type="l",col=i)
}

# Browniano Geométrica

z<-rnorm(1000,0,0.01)
t<-seq(0,1,length=1000)
plot(t,exp(t+cumsum(z)),type="l",ylim = c(-1,5))
#Caminata aleatoria
for (i in 1:100) {
  z<-rnorm(1000,0,0.01)
  t<-seq(0,1,length=1000)
  lines(t,exp(t+cumsum(z)),type="l",col=i)
}