Número de parejas, hijos, semillas, plántulas, granos de polen, etc. Número de individuos observados en un lapso de tiempo. Número de individuos observados en un área determinada.
La variable respuesta se distribuye como Poisson \[Y_{i} \sim P(\mu_{i})\] Su valor esperado es \(\mu_{i}\), su varianza es igual a su valor esperado. \[E(Y_{i}) = \mu_{i}\] \[var(Y_{i} = \mu_{i})\] El enlace canónico es logaritmo \[\eta =log(\mu_{i})\] Por lo que el valor esperado es igual al exponencial de la parte sistemática. \[\mu_{i} = e^{\eta}\] Colocando las variables predictoras en la parte sistemática… \[\mu_{i} = e^{\beta_{0} + \beta_{1}X_{1i} + ... + \beta_{k}X_{ki}}\]
dat <- read.table("RoadKills.txt", header = TRUE)
fit <- lm(TOT.N ~ D.PARK, data=dat)
summary(fit)
##
## Call:
## lm(formula = TOT.N ~ D.PARK, data = dat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -41.470 -9.316 -1.511 6.269 53.441
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 57.3049 4.5479 12.600 < 2e-16 ***
## D.PARK -2.4763 0.3113 -7.955 1.95e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 16.29 on 50 degrees of freedom
## Multiple R-squared: 0.5586, Adjusted R-squared: 0.5498
## F-statistic: 63.28 on 1 and 50 DF, p-value: 1.952e-10
dat <- read.table("RoadKills.txt", header = TRUE)
fit <- glm(TOT.N ~ D.PARK, data = dat, family = poisson)
summary(fit)
##
## Call:
## glm(formula = TOT.N ~ D.PARK, family = poisson, data = dat)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -8.1100 -1.6950 -0.4708 1.4206 7.3337
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.316485 0.043220 99.87 <2e-16 ***
## D.PARK -0.105851 0.004387 -24.13 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 1071.4 on 51 degrees of freedom
## Residual deviance: 390.9 on 50 degrees of freedom
## AIC: 634.29
##
## Number of Fisher Scoring iterations: 4
Esto indicaría un mal ajuste del modelo, si bien es un test vago.
pchisq(390.9, 50, lower.tail=F)
## [1] 2.321894e-54
dat <- read.table("RoadKills.txt", header = TRUE)
fit <- glm(TOT.N ~ D.PARK, data = dat, family = poisson)
anova(fit, test = "Chisq")
## Analysis of Deviance Table
##
## Model: poisson, link: log
##
## Response: TOT.N
##
## Terms added sequentially (first to last)
##
##
## Df Deviance Resid. Df Resid. Dev Pr(>Chi)
## NULL 51 1071.4
## D.PARK 1 680.55 50 390.9 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
dat <- read.table("RoadKills.txt", header = TRUE)
fit0 <- glm(TOT.N ~ 1, data = dat, family = poisson)
fit1 <- glm(TOT.N ~ D.PARK, data = dat, family = poisson)
anova(fit0, fit1, test = "Chisq")
## Analysis of Deviance Table
##
## Model 1: TOT.N ~ 1
## Model 2: TOT.N ~ D.PARK
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 51 1071.4
## 2 50 390.9 1 680.55 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
La diferencia de devianzas se distribuye como \(\chi^2\) con sus grados de libertad igual a la diferencia de grados de libertad entre los modelos.
dat <- read.table("RoadKills.txt", header = TRUE)
fit <- glm(TOT.N ~ D.PARK, data = dat, family = poisson)
fit$coefficients
## (Intercept) D.PARK
## 4.3164850 -0.1058506
exp(fit$coefficients)
## (Intercept) D.PARK
## 74.924803 0.899559
1/exp(fit$coefficients)
## (Intercept) D.PARK
## 0.01334672 1.11165580
El número de muertos disminuye un 11.17% por cada kilómetro de distancia.
Ver el patrón de serpenteo. Violación de supuestos?
Uno de los supuestos de un MLG es que la variable dependiente se ajusta a una de las funciones de la familia exponencial. Cada una de estas familias está caracterizada por una relación media-varianza específica.
Distribución | Posición | Dispersión |
---|---|---|
Poisson | \(E(Y) = \mu\) | \(var(Y) = \mu\) |
Binomial | \(E(Y) = N\pi\) | \(var(Y) = N\pi(1-\pi)\) |
Sin embargo, a veces la variabilidad observada es mayor en una proporción \(\phi\) respecto a lo esperado. Si \(\phi > 1\) entonces existe sobredispersión
Distribución | Posición | Dispersión |
---|---|---|
Poisson | \(E(Y) = \mu\) | \(var(Y) = \phi\mu\) |
Binomial | \(E(Y) = N\pi\) | \(var(Y) = \phi N\pi(1-\pi)\) |
La sobredispersión provoca que los errores estándar de los parámetros sean la raíz cuadrada de \(\phi\) veces más chicos que lo que deberían (y aumenta por tanto el error de tipo I)
1- Datos binarios (Binomiales no agregados: 0 y 1).
2- Cuando el modelo en consideración es el saturado (como los modelos loglineales para tablas de contingencia).
Si nuestro modelo presenta un buen ajuste y aún así permanece mucha devianza residual no explicada debemos estimar \(\phi\) para probar si existe sobredispersión.
No hay acuerdo en cuál es la magnitud de sobredispersión tolerable. Podemos usar una aproximación práctica (examinar si los valores P cambian significativamente), o usar el límite arbitrario de \(\phi\) > 2.
##
## Call:
## glm(formula = TOT.N ~ D.PARK, family = poisson, data = dat)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -8.1100 -1.6950 -0.4708 1.4206 7.3337
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.316485 0.043220 99.87 <2e-16 ***
## D.PARK -0.105851 0.004387 -24.13 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 1071.4 on 51 degrees of freedom
## Residual deviance: 390.9 on 50 degrees of freedom
## AIC: 634.29
##
## Number of Fisher Scoring iterations: 4
## Warning in anova.glm(fit, test = "F"): using F test with a 'poisson' family
## is inappropriate
## Analysis of Deviance Table
##
## Model: poisson, link: log
##
## Response: TOT.N
##
## Terms added sequentially (first to last)
##
##
## Df Deviance Resid. Df Resid. Dev F Pr(>F)
## NULL 51 1071.4
## D.PARK 1 680.55 50 390.9 680.55 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
No existen la “familia quasipoisson” o “quasibinomial”, sino que especificamos una relación media-varianza y ajustamos el modelo mediante cuasiverosimilitud.
Distribución | Posición | Dispersión |
---|---|---|
Poisson | \(E(Y) = \mu\) | \(var(Y) = \mu\) |
Binomial Negativa | \(E(Y) = N\pi\) | \(var(Y) = \mu + \theta\mu^2\) |
El parámetro \(\theta\) regula la sobredispersión.
library(MASS)
dat <- read.table("RoadKills.txt", header = TRUE)
nbfit <- glm.nb(TOT.N ~ D.PARK, data=dat)
summary(nbfit)
##
## Call:
## glm.nb(formula = TOT.N ~ D.PARK, data = dat, init.theta = 3.681040094,
## link = log)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.4160 -0.8289 -0.2116 0.4800 2.1346
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.41072 0.15476 28.50 <2e-16 ***
## D.PARK -0.11612 0.01137 -10.21 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for Negative Binomial(3.681) family taken to be 1)
##
## Null deviance: 155.445 on 51 degrees of freedom
## Residual deviance: 54.742 on 50 degrees of freedom
## AIC: 393.09
##
## Number of Fisher Scoring iterations: 1
##
##
## Theta: 3.681
## Std. Err.: 0.891
##
## 2 x log-likelihood: -387.093
library(MASS)
dat <- read.table("RoadKills.txt", header = TRUE)
nbfit <- glm.nb(TOT.N ~ D.PARK, data=dat)
anova(nbfit, test = "Chisq")
## Warning in anova.negbin(nbfit, test = "Chisq"): tests made without re-
## estimating 'theta'
## Analysis of Deviance Table
##
## Model: Negative Binomial(3.681), link: log
##
## Response: TOT.N
##
## Terms added sequentially (first to last)
##
##
## Df Deviance Resid. Df Resid. Dev Pr(>Chi)
## NULL 51 155.445
## D.PARK 1 100.7 50 54.742 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
library(MASS)
dat <- read.table("RoadKills.txt", header = TRUE)
nbfit <- glm.nb(TOT.N ~ D.PARK, data = dat)
pofit <- glm(TOT.N ~ D.PARK, data = dat, family = poisson)
L.NB = logLik(nbfit); L.NB
## 'log Lik.' -193.5465 (df=3)
L.Po = logLik(pofit); L.Po
## 'log Lik.' -315.1434 (df=2)
d <- 2 * (L.NB - L.Po)
attributes(d) <- NULL # para borrar resultados innecesarios
d
## [1] 243.1939
pchisq(d, df = 1, lower.tail = FALSE)/2
## [1] 3.956301e-55