La regresión logística es un modelo estadístico que se utiliza para predecir la probabilidad de un resultado binario (1/0, Sí/No, Verdadero/Falso) basado en una o más variables predictoras. Es especialmente útil en el campo de la investigación médica y social.
Los “log-odds” o logaritmo de las probabilidades (odds) son un concepto clave en la regresión logística y en otros modelos estadísticos que tratan con probabilidades. Para entender los log-odds, primero es necesario comprender qué son las probabilidades (odds).
Las probabilidades son una manera de expresar la probabilidad de que ocurra un evento en relación con la probabilidad de que no ocurra. Matemáticamente, se calculan como:
\[ \text{Odds} = \frac{P(evento)}{1 - P(evento)} \]
Donde \(P(evento)\) es la probabilidad de que ocurra el evento.
Por ejemplo, si la probabilidad de que llueva mañana es 0.75 (75%), los odds serían:
\[ \text{Odds de lluvia} = \frac{0.75}{1 - 0.75} = \frac{0.75}{0.25} = 3 \]
Esto significa que es 3 veces más probable que llueva que no llueva.
Los log-odds son simplemente el logaritmo natural de las probabilidades. Entonces, si tenemos las probabilidades (odds) como se definió anteriormente, los log-odds serían:
\[ \text{Log-Odds} = \log(\text{Odds}) = \log\left(\frac{P(evento)}{1 - P(evento)}\right) \]
El uso del logaritmo en este contexto tiene varias ventajas, especialmente en la modelización estadística:
Rango de valores: Mientras que las probabilidades solo pueden tener valores positivos, los log-odds pueden variar desde \(-\infty\) hasta \(+\infty\). Esto es útil para modelar en un contexto lineal.
Simetría: Los log-odds proporcionan una escala más simétrica para describir probabilidades. Por ejemplo, los log-odds de 0 corresponden a probabilidades de 0.5 (50%); valores positivos indican probabilidades mayores a 0.5 y negativos menores a 0.5.
Transformación lineal: En la regresión logística, la relación entre las variables predictoras y los log-odds de la variable dependiente es lineal, lo que facilita el modelado y la interpretación.
El método de estimación más común en la regresión logística es el de máxima verosimilitud. Este método busca estimar los parámetros del modelo (coeficientes) de tal manera que maximicen la probabilidad (verosimilitud) de observar los datos dados. En términos simples, busca ajustar el modelo de tal manera que las predicciones hechas por el modelo coincidan lo más posible con los datos reales.
La función de verosimilitud en la regresión logística se utiliza para estimar los coeficientes del modelo (\(\beta\)) que hacen que los datos observados sean los más probables. La derivación comienza con la función logística, que modela la probabilidad de que la variable dependiente \(Y\) sea igual a 1, dada una combinación lineal de variables independientes \(X\).
La función logística se define como:
\[ P(Y=1|X) = \frac{1}{1 + e^{-(\beta_0 + \beta_1X_1 + \beta_2X_2 + ... + \beta_kX_k)}} \]
Ahora, la verosimilitud \(L\) es el producto de las probabilidades individuales para todas las observaciones. Para una observación individual, la probabilidad de observar \(Y_i\) (que puede ser 0 o 1) es:
\[ P(Y_i|X_i) = [P(Y=1|X_i)]^{Y_i} \times [1 - P(Y=1|X_i)]^{1-Y_i} \]
Para todas las observaciones (digamos, \(n\) observaciones), la función de verosimilitud \(L\) es el producto de todas estas probabilidades individuales:
\[ L(\beta) = \prod_{i=1}^{n} [P(Y=1|X_i)]^{Y_i} \times [1 - P(Y=1|X_i)]^{1-Y_i} \]
Esta función de producto puede ser difícil de manejar, especialmente al tomar derivadas para la optimización. Por lo tanto, generalmente se trabaja con el logaritmo de la verosimilitud, conocido como log-verosimilitud (\(\ell(\beta)\)), ya que el logaritmo convierte los productos en sumas, que son más fáciles de diferenciar:
\[ \ell(\beta) = \sum_{i=1}^{n} [Y_i \log(P(Y=1|X_i)) + (1-Y_i) \log(1 - P(Y=1|X_i))] \]
Para encontrar los valores de \(\beta\) que maximizan esta log-verosimilitud, se utiliza el método de máxima verosimilitud, que implica tomar la derivada de \(\ell(\beta)\) con respecto a cada \(\beta_j\) y resolviendo para cuando estas derivadas sean cero. Esto generalmente se hace mediante métodos numéricos, como el método de Newton-Raphson, ya que las ecuaciones resultantes no suelen tener soluciones analíticas.
A diferencia de la regresión lineal, la logística no requiere que las variables independientes sean de naturaleza continua ni que estén normalmente distribuidas. Sin embargo, tiene sus propios supuestos: 1. Linealidad de las variables independientes y los log-odds: Aunque la relación entre las variables independientes y la dependiente es no lineal, la relación entre cualquier variable independiente y el logaritmo de las odds (log-odds) sí debe ser lineal. 2. No multicolinealidad: Las variables independientes no deben estar altamente correlacionadas entre sí. 3. Independencia de errores: Las observaciones deben ser independientes entre sí.
La regresión logística se basa en la función logística, cuya fórmula es:
\[ P(Y=1) = \frac{1}{1 + e^{-(\beta_0 + \beta_1X_1 + \beta_2X_2 + ... + \beta_kX_k)}} \]
Donde: - \(P(Y=1)\) es la probabilidad de que el evento de interés (Y=1) ocurra.
- \(e\) es la base del logaritmo natural.
- \(\beta_0, \beta_1, ..., \beta_k\) son los coeficientes del modelo.
- \(X_1, X_2, ..., X_k\) son las variables independientes.
La derivación de esta fórmula se basa en la utilización de la función logística para transformar el modelo lineal en uno que predice log-odds, que luego se transforma en una probabilidad.
En la regresión logística, los coeficientes se interpretan en términos de odds ratios. Un odds ratio mayor que 1 indica que el evento es más probable con el incremento de la variable independiente, mientras que un odds ratio menor que 1 indica lo contrario.
La regresión logística es una herramienta poderosa y flexible que se adapta bien a una variedad de contextos donde la variable dependiente es de naturaleza binaria. Su capacidad para manejar relaciones no lineales y variables de varios tipos (continuas, categóricas) la hace especialmente valiosa en muchos campos de investigación.
#install.packages("PASWR")
library(PASWR)
library(papaja)
library(htmltools)
library(summarytools)
library(tidyverse)
library(ggplot2)
data("titanic3")
tabla<- ctable(titanic3$pclass, as.factor(titanic3$survived))
apa_table(tabla$proportions, caption= "Tabla cruzada, supervivientes y clase de viajero")
| 0 | 1 | Total | |
|---|---|---|---|
| 1st | 0.38 | 0.62 | 1.00 |
| 2nd | 0.57 | 0.43 | 1.00 |
| 3rd | 0.74 | 0.26 | 1.00 |
| Total | 0.62 | 0.38 | 1.00 |
perc<-titanic3 %>% group_by(pclass) %>%
count(survived) %>%
mutate(ratio=scales::percent(n/sum(n)))
ggplot(titanic3, aes(x=factor(pclass), fill=factor(survived)))+
geom_bar(position = "fill")+
geom_text(data=perc, aes(y=n, label=ratio),
position = position_fill(vjust = 0.5))+
labs(y="Porcentaje", x="Clase del pasajero")+
scale_x_discrete(labels=c("1st"="Primera",
"2nd"="Segunda", "3rd"="Tercera"))+
scale_fill_manual(values=c("0"="green", "1"="lightblue"),
labels=c("0"="No", "1"="Sí"), name="¿Sobrevivió?")+ theme_apa()
tablanum<-titanic3 %>% group_by(survived) %>% filter(!is.na(age)) %>% summarize(Media=mean(age), DE=sd(age), n=n())
apa_table(tablanum, caption = "Edad promedio y des. est. por superviviencia")
| survived | Media | DE | n |
|---|---|---|---|
| 0 | 30.55 | 13.92 | 619 |
| 1 | 28.92 | 15.06 | 427 |
ggplot(titanic3, aes(x=as.factor(survived),
y=age, fill=as.factor(survived)))+
geom_boxplot()+labs(y="Edad",
x="Supervivencia de los pasajeros")+
scale_x_discrete(labels=c("0"="No", "1"="Sí"))+
scale_fill_manual(values=c("0"="darkred",
"1"="darkblue"),
labels=c("0"="No", "1"="Sí"),
name="¿Sobrevivió?")+theme_apa()
tablasexn<-titanic3 %>% group_by(survived, sex)%>%
filter(!is.na(age)) %>%
summarize(Media=mean(age), DE=sd(age))
apa_table(tablasexn, caption="Edad promedio y des. est. por sexo y superviviencia")
| survived | sex | Media | DE |
|---|---|---|---|
| 0 | female | 25.26 | 13.48 |
| 0 | male | 31.52 | 13.80 |
| 1 | female | 29.82 | 14.77 |
| 1 | male | 26.98 | 15.55 |
ggplot(titanic3, aes(x=as.factor(survived), y=age, fill=as.factor(sex)))+
geom_boxplot()+labs(y="Edad", x="Supervivencia de los pasajeros")+ scale_x_discrete(labels=c("0"="No", "1"="Sí"))+
scale_fill_manual(values=c("female"="darkred", "male"="darkblue"),
labels=c("female"="Femenino", "male"="Masculino"), name="Sexo")+theme_apa()
library(caret)
titanic<-titanic3 %>% filter(age>=0| !is.na(age))
index<-createDataPartition(y=titanic$survived, p=0.75, list=F)
train<-titanic3[index,]
test<-titanic3[-index,]
dim(train)
## [1] 785 14
dim(test)
## [1] 524 14
library(stargazer)
model1<-glm(survived~ pclass, data=titanic3, family=binomial)
stargazer(model1, title="Regresión logística univariada",
align = T, type="html",
covariate.labels = c("1ra clase", "2da clase", "(Intercepto)"),
dep.var.labels=c("¿Sobrevivió?"), out="reg1.html")
| Dependent variable: | |
| ¿Sobrevivió? | |
| 1ra clase | -0.770*** |
| (0.167) | |
| 2da clase | -1.557*** |
| (0.143) | |
| (Intercepto) | 0.486*** |
| (0.115) | |
| Observations | 1,309 |
| Log Likelihood | -806.629 |
| Akaike Inf. Crit. | 1,619.259 |
| Note: | p<0.1; p<0.05; p<0.01 |
Existen dos formas para expresar la regresión logística, la primera:
\[ log \left(\frac{p}{1-p} \right)=\beta_0+\beta_1X \]
O por:
\[ p=\frac{e^{\beta_0+\beta_1X}}{1+e^{\beta_0+\beta_1X}} \]
El cual la primera es la fórmula basada en el logaritmo del chance (log-odds) y la segunda basada en probabilidades.
En un predictor continuo, cuando \(X=0\), podemos expresar el log-odds así:
\[ log(odd|X=0)=0 \]
Entonces, si queremos evaluar, por ejemplo, cuando el predictor (en este caso la edad) aumenta en un año, sería:
Cuando \(X=x\):
\[ log(odds|X=x)=\beta_0+\beta_1*x \]
Dado que \(X=x+1\) podemos decir que:
\[ log(odds|X=x+1)= \beta_0+\beta_1*(x+1)=\beta_0+\beta_1*x+\beta_1 \]
Esto genera una intuición para comprender cómo se interpretan los predictores continuos en los modelos de regresión logística. Otra forma de expresarlo sería la diferencia entre los log-odds, es decir, de cuando \(X=0\) y \(X=1\):
\[ log(odds|X=x+1)-log(odds|X=x)=log \left(\frac{odds|X=x+1}{odds|X=x}\right)= log(OR)=\beta_1 \]
Debido a que los log-odds son algo difíciles de interpretar (en términos prácticos), podemos elevarlo a la \(e\) para expresarlo en razón de chances:
\[ OR=e^{\beta_1} \]
edadadj<-glm(survived~age, data=train, family = binomial)
coef(edadadj)
## (Intercept) age
## 0.25756928 -0.01420254
Esto significa que el modelo ajustado tiene esta forma:
\[ log\left( \frac{p_i}{1-p_1} \right)=0.091-0.013*edad_i \]
Para expresarlo en OR usamos el comando
exp(coef(modelo)):
exp(coef(edadadj))
## (Intercept) age
## 1.2937814 0.9858978
Nota: En caso de calcular los intervalos de confianza debes de usar el comando:
exp(confint(edadadj)).
La interpretación de \(\beta_1\) sería que por cada año que aumenta la edad del pasajero, la probabilidad de sobrevivir es 0.99 veces menor.
Si tuviésemos que hacer predicciones nos valemos del paquete
effects() y del comando allEffects:
#install.packages("effects")
library(effects)
efectos<-allEffects(edadadj)
df_e<-as.data.frame(efectos)
apa_table(df_e, caption="Predicciones, variable Edad")
| age | fit | se | lower | upper |
|---|---|---|---|---|
| age | ||||
| 0.20 | 0.56 | 0.05 | 0.47 | 0.65 |
| 20.00 | 0.49 | 0.02 | 0.45 | 0.54 |
| 40.00 | 0.42 | 0.02 | 0.38 | 0.47 |
| 60.00 | 0.36 | 0.04 | 0.28 | 0.44 |
| 80.00 | 0.29 | 0.06 | 0.19 | 0.42 |
#install.packages("visreg")
library(visreg)
visreg(edadadj, scale = "response", gg=T)+
labs(y="P(Superviencia|X)", x="Edad")+theme_apa()
mod1<-glm(survived~sex, data=train, family=binomial)
mod2<-glm(survived~sex+age, data=train, family=binomial)
mod3<-glm(survived~sex*age, data=train, family=binomial)
library(stargazer)
stargazer(mod1, mod2, mod3, title="Regresiones logísticas univariadas, multivariadas y con interacciones",
align = T, type="html",
covariate.labels = c("Sexo", "Edad","Sexo*Edad", "(Intercepto)"),
dep.var.labels=c("¿Sobrevivió?"), out="reg2.html")
| Dependent variable: | |||
| ¿Sobrevivió? | |||
| (1) | (2) | (3) | |
| Sexo | -2.570*** | -2.762*** | -1.178** |
| (0.178) | (0.203) | (0.464) | |
| Edad | -0.009 | 0.025** | |
| (0.007) | (0.012) | ||
| Sexo*Edad | -0.055*** | ||
| (0.015) | |||
| (Intercepto) | 1.313*** | 1.796*** | 0.823** |
| (0.141) | (0.265) | (0.358) | |
| Observations | 785 | 650 | 650 |
| Log Likelihood | -411.410 | -327.663 | -320.821 |
| Akaike Inf. Crit. | 826.820 | 661.326 | 649.643 |
| Note: | p<0.1; p<0.05; p<0.01 | ||
plot(allEffects(mod3),axes=list(y=list(lab="P(Supervivencia|X)")))
labs(y="P(Superviencia|X)", x="Edad")+theme_apa()
## NULL
Función ANOVA
anova(mod3, test="Chisq")
## Analysis of Deviance Table
##
## Model: binomial, link: logit
##
## Response: survived
##
## Terms added sequentially (first to last)
##
##
## Df Deviance Resid. Df Resid. Dev Pr(>Chi)
## NULL 649 895.91
## sex 1 238.685 648 657.22 < 2.2e-16 ***
## age 1 1.898 647 655.33 0.1683338
## sex:age 1 13.684 646 641.64 0.0002163 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
AIC(mod1, mod2, mod3)
## Warning in AIC.default(mod1, mod2, mod3): No todos los modelos se han ajustado
## usando el mismo número de observaciones
## df AIC
## mod1 2 826.8197
## mod2 3 661.3262
## mod3 4 649.6427
Selección de predictories excluyendolos de manera secuencial (no recomendado).
ajust<-glm(survived~ .^2, data=train[,c("survived", "pclass", "sex", "age")],
family=binomial)
(ajust<-step(ajust, trace=0))
##
## Call: glm(formula = survived ~ (pclass + sex + age)^2, family = binomial,
## data = train[, c("survived", "pclass", "sex", "age")])
##
## Coefficients:
## (Intercept) pclass2nd pclass3rd sexmale
## 2.71961 0.62630 -2.28707 -1.97590
## age pclass2nd:sexmale pclass3rd:sexmale pclass2nd:age
## 0.01365 -0.73549 1.56476 -0.05260
## pclass3rd:age sexmale:age
## -0.02847 -0.04869
##
## Degrees of Freedom: 649 Total (i.e. Null); 640 Residual
## (135 observations deleted due to missingness)
## Null Deviance: 895.9
## Residual Deviance: 553.9 AIC: 573.9
summary(ajust)
##
## Call:
## glm(formula = survived ~ (pclass + sex + age)^2, family = binomial,
## data = train[, c("survived", "pclass", "sex", "age")])
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.71961 0.91144 2.984 0.00285 **
## pclass2nd 0.62630 1.01285 0.618 0.53634
## pclass3rd -2.28707 0.88026 -2.598 0.00937 **
## sexmale -1.97590 0.89761 -2.201 0.02772 *
## age 0.01365 0.02231 0.612 0.54054
## pclass2nd:sexmale -0.73549 0.75535 -0.974 0.33020
## pclass3rd:sexmale 1.56476 0.68592 2.281 0.02253 *
## pclass2nd:age -0.05260 0.02423 -2.171 0.02994 *
## pclass3rd:age -0.02847 0.02152 -1.323 0.18595
## sexmale:age -0.04869 0.02046 -2.380 0.01733 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 895.91 on 649 degrees of freedom
## Residual deviance: 553.90 on 640 degrees of freedom
## (135 observations deleted due to missingness)
## AIC: 573.9
##
## Number of Fisher Scoring iterations: 5
#Instalarlo desde cran bajando el zip ya que no está disponible
# para R 4.3.1 o mayor.
library(dominanceanalysis)
res<-dominanceAnalysis(ajust)
plot(res, which.graph="conditional",
fit.function="r2.m")
plot(res, which.graph="general",
fit.function="r2.m")
fitf<-train(survived~pclass+sex+age+ pclass:sex, data=train,
method="glm", na.action=na.omit)
(imp<-varImp(fitf, scale=F))
## glm variable importance
##
## Overall
## sexmale 11.493
## pclass3rd 8.584
## age 5.006
## `pclass3rd:sexmale` 3.682
## pclass2nd 2.003
## `pclass2nd:sexmale` 1.687
plot(imp)
#install.packages("ResourceSelection")
library(ResourceSelection)
dat<-na.omit(mod2$data[,c("survived","sex","age")])
hoslem.test(x=dat$survived,
y=fitted(mod2))
##
## Hosmer and Lemeshow goodness of fit (GOF) test
##
## data: dat$survived, fitted(mod2)
## X-squared = 15.318, df = 8, p-value = 0.05326
library(emmeans)
mod5<-glm(survived~sex*pclass, data=train, family=binomial)
pm<-emmeans(mod5, ~sex*pclass)
contrast(pm, "revpairwise", by="sex", adjust = "bonferroni")
## sex = female:
## contrast estimate SE df z.ratio p.value
## 2nd - 1st -1.176 0.619 Inf -1.898 0.1729
## 3rd - 1st -3.220 0.545 Inf -5.911 <.0001
## 3rd - 2nd -2.045 0.403 Inf -5.077 <.0001
##
## sex = male:
## contrast estimate SE df z.ratio p.value
## 2nd - 1st -0.977 0.303 Inf -3.225 0.0038
## 3rd - 1st -0.832 0.250 Inf -3.324 0.0027
## 3rd - 2nd 0.145 0.300 Inf 0.481 1.0000
##
## Results are given on the log odds ratio (not the response) scale.
## P value adjustment: bonferroni method for 3 tests
emmip(mod5, sex~pclass, CIs = T, plotit = T)
Residuos con distribución binomial.
ausencia de puntos influyentes
el logit de \(p\) es lineal.
plot(mod5, 1:4)
head(influence.measures(mod5)$infmat,n=3)
## dfb.1_ dfb.sxml dfb.pcl2 dfb.pcl3 dfb.sx:2 dfb.sx:3
## 1 2.646402e-02 -0.02496023 -2.174952e-02 -2.472176e-02 0.01953701 0.02246246
## 2 -6.497865e-15 0.04308912 9.231199e-15 5.879267e-15 -0.03372695 -0.03877719
## 3 -2.544715e-01 0.24001144 2.091381e-01 2.377184e-01 -0.18786308 -0.21599353
## dffit cov.r cook.d hat
## 1 0.02646402 1.0162062 0.0000561122 0.008928571
## 2 0.12967176 0.9970629 0.0023811971 0.007194245
## 3 -0.25447154 0.9622285 0.0409057455 0.008928571
head(influence.measures(mod5)$is.inf,n=3)
## dfb.1_ dfb.sxml dfb.pcl2 dfb.pcl3 dfb.sx:2 dfb.sx:3 dffit cov.r cook.d hat
## 1 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 2 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 3 FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
#install.packages("mgcv")
library(mgcv)
mgam<-gam(survived~age+sex+pclass+s(age,by=sex), data=train,
family=binomial, method="REML")
par(mfrow=c(1,2))
plot(mgam)
#install.packages("DHARMa")
library(DHARMa)
## This is DHARMa 0.4.6. For overview type '?DHARMa'. For recent changes, type news(package = 'DHARMa')
simr<-simulateResiduals(ajust, refit = T)
testDispersion(simr, plot = T)
##
## DHARMa nonparametric dispersion test via mean deviance residual fitted
## vs. simulated-refitted
##
## data: simr
## dispersion = 1.1623, p-value = 0.016
## alternative hypothesis: two.sided
library(car)
##
## Adjuntando el paquete: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
## The following object is masked from 'package:purrr':
##
## some
vif(mod5)
## there are higher-order terms (interactions) in this model
## consider setting type = 'predictor'; see ?vif
## GVIF Df GVIF^(1/(2*Df))
## sex 7.566725 1 2.750768
## pclass 20.165634 2 2.119107
## sex:pclass 27.587325 2 2.291804
Nota: para abundar en los diagnósticos ir a este link
pdata<-predict(mod3, newdata=test, type="response")
confusionMatrix(data=as.factor(as.numeric(pdata>0.5)),
reference = as.factor(test$survived))
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 215 48
## 1 50 83
##
## Accuracy : 0.7525
## 95% CI : (0.707, 0.7943)
## No Information Rate : 0.6692
## P-Value [Acc > NIR] : 0.0001918
##
## Kappa : 0.4432
##
## Mcnemar's Test P-Value : 0.9195384
##
## Sensitivity : 0.8113
## Specificity : 0.6336
## Pos Pred Value : 0.8175
## Neg Pred Value : 0.6241
## Prevalence : 0.6692
## Detection Rate : 0.5429
## Detection Prevalence : 0.6641
## Balanced Accuracy : 0.7225
##
## 'Positive' Class : 0
##
ggplot(train, aes(x=age, y=survived, fill=sex))+
geom_point(position=position_jitter(height=0.05),
aes(y=survived, color=sex))+
stat_smooth(method = "glm", method.args = list(family="binomial"),
se=T)+theme_apa()
library(texreg)
htmlreg(mod3, single.row = T)
| Model 1 | |
|---|---|
| (Intercept) | 0.82 (0.36)* |
| sexmale | -1.18 (0.46)* |
| age | 0.03 (0.01)* |
| sexmale:age | -0.05 (0.02)*** |
| AIC | 649.64 |
| BIC | 667.55 |
| Log Likelihood | -320.82 |
| Deviance | 641.64 |
| Num. obs. | 650 |
| ***p < 0.001; **p < 0.01; *p < 0.05 | |
La regresión de Poisson es un tipo de análisis estadístico utilizado para modelar datos de conteo, donde las respuestas son cantidades no negativas e enteras, como el número de veces que ocurre un evento. Es especialmente útil cuando los datos de conteo son pequeños y no están distribuidos normalmente. Aquí están algunos aspectos clave de la regresión de Poisson:
Modelo basado en la distribución de Poisson: La regresión de Poisson utiliza la distribución de Poisson para modelar la variable de respuesta. Esta distribución es adecuada para modelar el número de veces que ocurre un evento en un intervalo fijo de tiempo o espacio.
Variable dependiente: La variable dependiente en la regresión de Poisson es un conteo (por ejemplo, el número de accidentes de tráfico en una semana).
Variables independientes: Puede incluir variables independientes (predictores) tanto continuas como categóricas. Estas variables se utilizan para predecir la variable dependiente.
Función de enlace logarítmico: Utiliza una función de enlace logarítmico para relacionar la media de la distribución de Poisson con las variables independientes. Esto significa que la relación entre la variable dependiente y cada variable independiente es logarítmica.
Estimación de parámetros: Los parámetros del modelo se estiman generalmente a través del método de máxima verosimilitud.
Uso en diferentes campos: Se aplica en diversos campos como la epidemiología, la ingeniería y las ciencias sociales, para modelar y predecir fenómenos que son esencialmente conteos.
Supuestos y limitaciones: Un supuesto clave de la regresión de Poisson es que la media y la varianza de la distribución son iguales (equidispersión). Cuando los datos no cumplen con este supuesto (sobredispersión), se pueden utilizar modelos alternativos como la regresión binomial negativa.
Interpretación de resultados: La interpretación de los coeficientes en un modelo de regresión de Poisson es en términos de cambios logarítmicos y efectos multiplicativos, lo que puede ser menos intuitivo que en modelos lineales.
Esta técnica es valiosa para analizar y predecir fenómenos donde los datos de conteo son la principal fuente de información.
La elección entre la regresión lineal y la regresión de Poisson depende en gran medida de la naturaleza de la variable dependiente y la distribución de los datos. Hay varios contextos en los que la regresión lineal puede no ser adecuada, y en esos casos, la regresión de Poisson podría ser una mejor opción. Aquí te explico por qué:
Datos de Conteo: Cuando la variable dependiente es un conteo (por ejemplo, el número de veces que ocurre un evento), la regresión lineal no es ideal. Los conteos son valores enteros no negativos, y la regresión lineal puede predecir valores negativos, lo que no tiene sentido en este contexto.
Heterocedasticidad: La regresión lineal asume homocedasticidad (varianza constante de los errores a lo largo de las predicciones). Sin embargo, en los datos de conteo, la varianza a menudo aumenta con el aumento en el valor medio (varianza dependiente del medio), lo que lleva a la heterocedasticidad.
Distribución de los Residuos: La regresión lineal asume que los residuos (errores) están normalmente distribuidos. En datos de conteo, especialmente con bajos conteos, esta suposición raramente se cumple.
Modelado de Datos de Conteo: La regresión de Poisson está diseñada específicamente para modelar variables de respuesta que son conteos. Asume que estos conteos siguen una distribución de Poisson, que es apropiada para modelar eventos discretos.
Manejo de Heterocedasticidad: En la regresión de Poisson, la varianza se asume proporcional a la media, lo que a menudo es una suposición más realista para datos de conteo. Esto ayuda a manejar la heterocedasticidad inherente en estos datos.
Distribución de Poisson: Esta regresión se basa en la distribución de Poisson, que es una distribución de probabilidad discreta y es más adecuada para modelar conteos que la distribución normal utilizada en la regresión lineal.
Relaciones no Lineales: La función de enlace logarítmica en la regresión de Poisson permite modelar relaciones no lineales entre las variables independientes y el logaritmo de la tasa esperada del evento.
Equidispersión: La regresión de Poisson asume que la media y la varianza de la distribución son iguales (equidispersión). Si los datos muestran sobredispersión (la varianza es mayor que la media), puede ser necesario utilizar modelos alternativos como la regresión binomial negativa o aplicar errores estándares robustos y estimar los parámetros por medio del estimador de log-pseudo verosemilitud (Wooldridge, 1999).
Independencia de Eventos: La regresión de Poisson asume que los eventos son independientes entre sí, lo cual puede no ser cierto en todos los contextos.
En resumen, mientras que la regresión lineal es adecuada para datos continuos y normalmente distribuidos, la regresión de Poisson es más apropiada para datos de conteo, especialmente cuando estos datos no cumplen con los supuestos de la regresión lineal. La elección del modelo debe basarse en la naturaleza de los datos y las suposiciones subyacentes de cada técnica estadística.
library(asbio)
## Cargando paquete requerido: tcltk
##
## Adjuntando el paquete: 'asbio'
## The following object is masked from 'package:lubridate':
##
## pm
data(crabs)
summary(crabs)
## color spine width satell weight
## 1:12 1: 37 Min. :21.0 Min. : 0.000 Min. :1.200
## 2:95 2: 15 1st Qu.:24.9 1st Qu.: 0.000 1st Qu.:2.000
## 3:44 3:121 Median :26.1 Median : 2.000 Median :2.350
## 4:22 Mean :26.3 Mean : 2.919 Mean :2.437
## 3rd Qu.:27.7 3rd Qu.: 5.000 3rd Qu.:2.850
## Max. :33.5 Max. :15.000 Max. :5.200
library(ggplot2)
ggplot(crabs, aes(x=width, y=satell))+
geom_point(color="red")+labs(y="Número de cangrejos macho satélites",
x= "Anchura")+theme_apa()+
geom_smooth(method = "lm", se=T)
## `geom_smooth()` using formula = 'y ~ x'
library(texreg)
p1<-glm(satell ~width, data=crabs, family=poisson)
htmlreg(p1, single.row = F)
| Model 1 | |
|---|---|
| (Intercept) | -3.30*** |
| (0.54) | |
| width | 0.16*** |
| (0.02) | |
| AIC | 927.18 |
| BIC | 933.48 |
| Log Likelihood | -461.59 |
| Deviance | 567.88 |
| Num. obs. | 173 |
| ***p < 0.001; **p < 0.01; *p < 0.05 | |
exp(coef(p1))
## (Intercept) width
## 0.03670812 1.17826744
library(effects)
plot(allEffects(p1))
p2<-glm(satell ~color+spine+width+weight,
family = poisson, data=crabs)
p2f<-drop1(p2, ~., test = "Chisq")
print(p2f)
## Single term deletions
##
## Model:
## satell ~ color + spine + width + weight
## Df Deviance AIC LRT Pr(>Chi)
## <none> 549.59 920.88
## color 3 558.83 924.12 9.2405 0.026258 *
## spine 2 551.38 918.68 1.7947 0.407644
## width 1 549.70 919.00 0.1169 0.732441
## weight 1 558.63 927.93 9.0439 0.002636 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
p2ff<-glm(satell ~weight+color, family = poisson,
data=crabs)
expb <- exp(coef(p2ff))
se <- summary(p2ff)$coefficients[, "Std. Error"]
expse <- expb * se
resum<-summary(p2ff)
pv<-resum$coefficients[,"Pr(>|z|)"]
tab<-data.frame(Estimate= expb,
Std_Error=expse,
p.value= pv)
colnames(tab)<-c("Estimate", "Str. Error", "p-value")
apa_table(tab, caption = "Tabla regresión de Poisson (multivariada)", )
| Estimate | Str. Error | p-value | |
|---|---|---|---|
| (Intercept) | 0.95 | 0.22 | 0.83 |
| weight | 1.73 | 0.12 | 0.00 |
| color2 | 0.81 | 0.13 | 0.18 |
| color3 | 0.64 | 0.11 | 0.01 |
| color4 | 0.64 | 0.13 | 0.03 |
library(dominanceanalysis)
res<-dominanceAnalysis(p2ff)
plot(res,which.graph= "conditional",
fit.function="r2.m")
plot(res, which.graph="general",
fit.function="r2.m")
library(performance)
r2(p2ff)
## # R2 for Generalized Linear Regression
## Nagelkerke's R2: 0.384
#install.packages("ggResidpanel")
library(ggResidpanel)
resid_panel(p2ff)
library(DHARMa)
simulateResiduals(p2ff, plot=T)
## Object of Class DHARMa with simulated residuals based on 250 simulations with refit = FALSE . See ?DHARMa::simulateResiduals for help.
##
## Scaled residual values: 0.9692204 0.1262143 1 0.01960219 0.7382982 0.05306938 0.0102588 0.04577162 0.08714838 0.06708433 0.1026964 0.03375695 0.996 0.059697 1 0.9207625 0.3718092 0.04667784 0.0349914 0.784124 ...
predi<-data.frame(width=c(27,30, 33.3,37, 40, 47))
pv<-predict(p1, predi, type="response")
pv
## 1 2 3 4 5 6
## 3.078554 5.035916 8.653330 15.877627 25.972707 81.888770
Los modelos lineales generales de Poisson para tasas de incidencia son una extensión de los modelos de Poisson tradicionales. Son particularmente útiles cuando se desea modelar tasas de incidencia, es decir, el número de eventos en relación con alguna medida de exposición o tamaño de población. El parámetro de compensación, que suele denotarse como \(A_i\) (o simplemente “offset” en términos de modelado), juega un papel crucial en estos modelos. A continuación, describo los aspectos clave de estos modelos:
Modelo de Poisson Tradicional: En su forma básica, un modelo de Poisson modela el número de veces que ocurre un evento, asumiendo que estos eventos siguen una distribución de Poisson y son independientes entre sí.
Variable Dependiente: La variable dependiente en un modelo de Poisson es un conteo (por ejemplo, número de casos de una enfermedad).
Propósito del Offset: El offset \(A_i\) se utiliza para ajustar la tasa de incidencia por un factor de exposición o tamaño de población. Por ejemplo, si estás modelando la incidencia de una enfermedad, el offset podría ser la población en riesgo.
Modelo con Offset: El modelo tiene la forma \(\log(\lambda_i) = \beta_0 + \beta_1X_{1i} + \cdots + \beta_kX_{ki} + \log(A_i)\), donde \(\lambda_i\) es la tasa esperada de incidencia para la i-ésima observación, \(\beta_0, \beta_1, ..., \beta_k\) son los coeficientes del modelo, \(X_{1i}, ..., X_{ki}\) son las variables independientes, y \(A_i\) es el offset.
Interpretación: En este modelo, el offset se incluye como un logaritmo, lo que implica que se modela la tasa de incidencia (número de eventos por unidad de exposición) en lugar del conteo total de eventos.
Estimación: Los parámetros del modelo se estiman comúnmente mediante máxima verosimilitud.
Interpretación de Coeficientes: Los coeficientes se interpretan en términos de un efecto logarítmico sobre la tasa de incidencia. Por ejemplo, un coeficiente de 0.2 indica que, manteniendo todo lo demás constante, un incremento de una unidad en la variable independiente correspondiente aumenta la tasa de incidencia en un factor de \(e^{0.2}\).
En resumen, los modelos lineales generales de Poisson para tasas de incidencia ofrecen una herramienta poderosa para analizar datos de conteo ajustados por una medida de exposición, lo que permite una interpretación más precisa y relevante en contextos donde el “tamaño” de la población o el nivel de exposición varía entre las observaciones.
#install.packages("ISwR")
library(ISwR)
data("eba1977")
summary(eba1977)
## city age pop cases
## Fredericia:6 40-54:4 Min. : 509.0 Min. : 2.000
## Horsens :6 55-59:4 1st Qu.: 628.0 1st Qu.: 7.000
## Kolding :6 60-64:4 Median : 791.0 Median :10.000
## Vejle :6 65-69:4 Mean :1100.3 Mean : 9.333
## 70-74:4 3rd Qu.: 954.8 3rd Qu.:11.000
## 75+ :4 Max. :3142.0 Max. :15.000
El parámetro \(A_i\) sería así:
\[ Tasa= \frac{cases}{pop} \]
En donde cases= casos y pop= población total.
eba1977$logpop<-log(eba1977$pop)
pr1<-glm(cases~city+age+offset(logpop), family = poisson, data=eba1977)
htmlreg(pr1,single.row = T)
| Model 1 | |
|---|---|
| (Intercept) | -5.63 (0.20)*** |
| cityHorsens | -0.33 (0.18) |
| cityKolding | -0.37 (0.19)* |
| cityVejle | -0.27 (0.19) |
| age55-59 | 1.10 (0.25)*** |
| age60-64 | 1.52 (0.23)*** |
| age65-69 | 1.77 (0.23)*** |
| age70-74 | 1.86 (0.24)*** |
| age75+ | 1.42 (0.25)*** |
| AIC | 137.84 |
| BIC | 148.44 |
| Log Likelihood | -59.92 |
| Deviance | 23.45 |
| Num. obs. | 24 |
| ***p < 0.001; **p < 0.01; *p < 0.05 | |
Interpretar los coeficientes se hace de la misma manera que otras veces:
exp(coef(pr1))
## (Intercept) cityHorsens cityKolding cityVejle age55-59 age60-64
## 0.003581174 0.718880610 0.689667168 0.761612264 3.007213795 4.565884929
## age65-69 age70-74 age75+
## 5.857402508 6.403619032 4.135686847
test.data <- data.frame(city = "Kolding",
age = "40-54",
pop = 1000,
logpop = log(1000))
predicted.value <- predict(pr1, test.data,
type = "response")
predicted.value
## 1
## 2.469818
Hay toda una discusión sobre el uso de modelos de conteo. Pero todo al final, al igual que en otras entregas, depende de los supuestos. El modelo de Poisson es un modelo estadístico que se utiliza comúnmente para describir la distribución de eventos raros o poco frecuentes en un intervalo fijo de tiempo o espacio. En el contexto de la regresión de Poisson, se asume que la varianza de la variable dependiente es igual a su media, una propiedad conocida como equidispersión. Sin embargo, en la práctica, a menudo se encuentra que los datos reales no cumplen con esta suposición, lo que lleva al fenómeno conocido como sobredispersión.
En un modelo de Poisson, si \(Y\) es una variable aleatoria que representa el número de eventos, y \(\lambda\) es la tasa promedio de ocurrencia de estos eventos, entonces:
La sobredispersión ocurre cuando la varianza observada en los datos es mayor que la media, es decir, \(\text{Var}(Y) > E[Y]\). Esto puede deberse a varias razones, como heterogeneidad no observada en la población, eventos correlacionados o la presencia de datos atípicos.
Estimaciones Sesgadas: En presencia de sobredispersión, las estimaciones de los parámetros del modelo de Poisson pueden estar sesgadas.
Errores Estándar Subestimados: Los errores estándar de las estimaciones pueden subestimarse, llevando a inferencias estadísticas incorrectas, como intervalos de confianza demasiado estrechos o pruebas de hipótesis que rechazan incorrectamente la hipótesis nula.
Una forma común de abordar la sobredispersión es a través del Modelo Binomial Negativo, que introduce un parámetro adicional para modelar la variabilidad extra. En este modelo:
Para un modelo de regresión, donde \(\lambda\) depende de variables explicativas \(X\), en el modelo de Poisson, se tiene:
En el caso del modelo Binomial Negativo, se agrega un componente para modelar la sobredispersión:
Donde \(r\) representa el grado de sobredispersión en el modelo. Este enfoque permite una mayor flexibilidad en el modelado de datos con varianza mayor que la media, proporcionando estimaciones más realistas y confiables en presencia de sobredispersión.
Cuando se trata la sobredispersión en modelos de Poisson, una de las técnicas utilizadas es la estimación por log-pseudo verosimilitud. Esta técnica puede ofrecer estimaciones robustas de los parámetros del modelo incluso cuando hay sobredispersión. Sin embargo, es importante notar que la log-pseudo verosimilitud no “resuelve” el problema de la sobredispersión en sí, sino que proporciona una forma de manejarlo durante la estimación de los parámetros.
En el contexto de la regresión de Poisson, la función de verosimilitud para una muestra de \(n\) observaciones independientes \(y_i\) con medias \(\lambda_i\) es:
\[ L(\beta) = \prod_{i=1}^{n} \frac{e^{-\lambda_i} \lambda_i^{y_i}}{y_i!} \]
Donde \(\lambda_i = \exp(X_i \beta)\) y \(X_i\) es el vector de variables independientes para la observación \(i\).
La función de log-verosimilitud es el logaritmo natural de la función de verosimilitud:
\[ \log L(\beta) = \sum_{i=1}^{n} \left( -\lambda_i + y_i \log(\lambda_i) - \log(y_i!) \right) \]
Cuando hay sobredispersión, la varianza es mayor que la media. Para abordar esto, se puede modificar la función de log-verosimilitud para incluir un parámetro adicional que capture la sobredispersión. Sin embargo, en lugar de modificar directamente la función de verosimilitud, se utiliza una técnica conocida como log-pseudo verosimilitud, donde se ajustan los errores estándar de los estimadores para reflejar la sobredispersión.
La función de log-pseudo verosimilitud en sí misma no cambia; lo que cambia es cómo se calculan los errores estándar de las estimaciones de los parámetros. En lugar de usar la matriz de información de Fisher estándar (basada en la suposición de equidispersión), se utiliza una matriz de información empírica o “sandwich” que es más robusta a la presencia de sobredispersión.
Estimar los parámetros \(\beta\) usando la log-verosimilitud estándar.
Calcular la matriz de varianzas y covarianzas robusta, también conocida como el estimador “sandwich”, que tiene en cuenta la sobredispersión. Esta matriz se calcula como:
\[ \text{Var}(\hat{\beta}) = (X^T W X)^{-1} X^T W D W X (X^T W X)^{-1} \]
Donde:
Esta aproximación mejora la robustez de las estimaciones en presencia de sobredispersión, pero no altera el hecho fundamental de que si hay sobredispersión significativa, un modelo alternativo como el binomial negativo puede ser más apropiado. La log-pseudo verosimilitud proporciona una forma de manejar la sobredispersión sin cambiar el modelo subyacente, pero no elimina la necesidad de considerar modelos que puedan capturar mejor la estructura de los datos. Aunque en contextos de datos de panel (o datos multinivel), log-pseudo verosimilitud resulta más potente y estima de manera más robusta los parámetros en contextos en donde la heterogeneidad no observable de los individuos en la muestra requiere modelarse. En estos contextos tranformaciones como la de efectos fijos (o within transformation) comúnmente usada en econometría es más factible en Poisson ya que no es posible eliminar el efecto de dicha heterogeneidad en modelos binomiales negativos usando efectos fijos, cayendo en un problema de parámetros incidentales. Pero en muchos contextos (estudios de sección cruzada) la regresión binomial negativa puede ser útil
Los modelos lineales mixtos son una extensión de los modelos lineales clásicos que permiten el análisis de datos con estructuras de correlación complejas y la inclusión de efectos aleatorios además de los efectos fijos. Son particularmente útiles para analizar datos longitudinales, datos jerárquicos o agrupados, y para manejar la variabilidad tanto dentro como entre los grupos en un conjunto de datos.
Efectos Fijos: Estos son similares a los coeficientes en un modelo de regresión lineal convencional. Representan las relaciones promedio entre las variables independientes y la variable dependiente en la población.
Efectos Aleatorios: Estos son componentes del modelo que varían aleatoriamente para diferentes niveles de una o más variables agrupadoras (por ejemplo, sujetos en un estudio longitudinal, escuelas en un análisis de datos educativos, etc.). Permiten que el modelo capture la variabilidad en los datos que no se explica por los efectos fijos.
Variable Dependiente: Es la variable de resultado que se modela como una combinación lineal de los efectos fijos y aleatorios más un término de error.
Un modelo lineal mixto se puede expresar en forma matemática como:
\[ Y = X\beta + Z\gamma + \epsilon \]
Donde: - \(Y\) es el vector de la variable dependiente. - \(X\) es la matriz de diseño para los efectos fijos. - \(\beta\) es el vector de efectos fijos. - \(Z\) es la matriz de diseño para los efectos aleatorios. - \(\gamma\) es el vector de efectos aleatorios. - \(\epsilon\) es el vector de errores, generalmente asumido como normalmente distribuido con media cero y varianza constante.
Los modelos lineales mixtos se utilizan en una amplia gama de disciplinas, incluyendo:
Existen varios paquetes de software estadístico que pueden realizar
análisis utilizando modelos lineales mixtos, incluyendo R (con paquetes
como lme4 y nlme), SAS (procedimiento MIXED),
SPSS y otros. Estos paquetes facilitan el ajuste y la interpretación de
estos modelos en diversas situaciones de investigación.
Los efectos fijos en modelos lineales mixtos comparten similitudes con los efectos fijos en modelos de datos de panel en econometría, aunque existen diferencias en el contexto y la forma en que se aplican y se interpretan.
En los modelos lineales mixtos, los efectos fijos son coeficientes que representan las relaciones promedio entre las variables independientes y la variable dependiente. Estos efectos se consideran constantes a través de todas las observaciones o grupos en el análisis. La incorporación de efectos aleatorios en estos modelos permite capturar variaciones en los datos que no son explicadas por los efectos fijos, tales como diferencias entre sujetos o grupos que no están directamente relacionadas con las variables independientes estudiadas.
En los modelos de datos de panel, especialmente en econometría, los efectos fijos también se utilizan para controlar la heterogeneidad no observada que puede ser constante a lo largo del tiempo pero que varía entre las unidades transversales (como individuos, empresas o países). En este contexto, un modelo de efectos fijos asume que esta heterogeneidad no observada puede ser capturada permitiendo que el intercepto varíe entre las unidades transversales.
En resumen, mientras que los efectos fijos en ambos contextos tienen la función de capturar efectos constantes en diferentes niveles de análisis, la naturaleza y aplicación de estos efectos difieren entre los modelos lineales mixtos y los modelos de datos de panel en econometría.