Documente Academic
Documente Profesional
Documente Cultură
Introduccin
En esta sesin vamos a tratar con dos casos especiales que pueden aparecer cuando
trabajamos con conteos. Aunque ambos casos son fundamentalmente diferentes, tienen
un mismo elemento en comn: el 0. Comenzaremos hablando de los modelos que no
permiten que la variable respuesta sea 0 (Zero truncated models), y que por lo tanto
nunca predicen un valor de 0 para ella. Posteriormente pasaremos a los modelos
inflados por ceros (Zero inflated models), en los que, por algn motivo, hay ms
observaciones con un valor 0 de las que cabra esperar de acuerdo a una distribucin de
Poisson o binomial negativa.
Como ya hemos visto anteriormente, para datos que toman valores enteros y no
negativos, se utilizan la distribucin de Poisson y la Binomial negativa. En la regresin
de Poisson asumimos que la VR se distribuye segn una funcin de Poisson con un
parmetro mu (que es tanto la media como lavarianza). El problema es que la
distribucin de Poisson no excluye los ceros, es decir, predice valores de 0 para la VR,
especialmente cuando los valores de son bajos:
par (mfrow=c(2,3))
muCasos <-c(2,3,4,5,8,15)
for (i in muCasos){
Por lo tanto, si es pequeo, pero nuestra variable respuesta no puede tomar el valor
0, es bastante probable que un modelo con distribucin de Poisson (o Binomial
Negativa) no funcione adecuadamente, porque predecir muchos ceros. En cambio,
cuando es grande (como en el ltimo panel de la figura anterior), usar un modelo que
no elimine la posibilidad de predecir ceros no supone un gran problema. Los modelos
truncados por ceros simplemente reparten la probabilidad de que la VR sea 0 de
acuerdo a una distribucin de Poisson (las barras de color rojo en la figura), entre todos
los dems valores posibles. Veamos como se hace esto.
prob2sin0<- prob2/(1-prob0)
prob2sin0
## [1] 0.313
#Es decir, al excluir el 0, el resto de valores son ms probables.
As, los modelos Poisson truncados por ceros son iguales a los glm con errores
de Poisson que hemos visto hasta ahora, con la diferencia de que utilizan
distribuciones de probabilidad en las que se eliminan los ceros y se reajustan
las probabilidades del resto de valores. Como ya dijimos antes, siguiendo el
ejemplo de los histogramas, se reparte la barra roja entre todas las dems por
eso, cuando es grande, la porcin a repartir es muy pequea y no vale la
pena sustituir un modelo de Poisson por uno truncado por ceros; de hecho,
como es muy raro que se predigan valores negativos, tampoco sale tan a
cuenta hacer una regresin de Poisson en lugar de una normal.
En caso de que, en lugar de una distribucin de Poisson, estuviramos usando
una Binomial Negativa, el procedimiento seria similar.
1493 obs. of
4 variables:
##
$ stay: int
4 9 3 9 1 4 10 3 5 6 ...
##
$ age : int
4 4 7 6 7 5 8 7 4 4 ...
##
$ hmo : int
0 1 1 0 0 0 0 0 0 0 ...
##
$ died: int
0 0 1 0 1 1 1 1 0 0 ...
head(hospital)
##
## 1
## 2
## 3
## 4
## 5
## 6
tail(hospital)
##
## 1488
52
## 1489
14
## 1490
## 1491
59
## 1492
63
## 1493
32
La variable respuesta que nos interesa es stay , que es el nmero de das que los
pacientes permanecen hospitalizados. Una vez que un paciente es ingresado, se
contabiliza el primer da, por lo que esta variable nunca vale 0; empieza a contar en 1:
plot(table(hospital$stay))
age ,
El ajuste de la lnea LOESS parece indicar que la longitud de la estancia no vara mucho
entre grupos de edad. Pero podria haber una interaccin entre la edad y hmo. Vamos a
verlo:
ggplot(hospital, aes(age, fill=died)) +
geom_histogram(binwidth=.5, position="fill") +
facet_grid(hmo ~ ., margins=TRUE)
Parece que:
El nmero de das que la gente pasa hospitalizada es un conteo (solo puede tomar
valores enteros y positivos), que adems no puede tomar el valor 0. Puesto que no
queremos predecir valores negativos, optaremos por una distribucin de Poisson.
Usaremos una correccin para ajustar las probabilidades teniendo en cuenta que el 0 no
puede ser predicho. En caso de que haya sobredispersin, recurriremos a una
distribucin binomial negativa.
Si stayistayi es el numero de das que pasa hospitalizada una persona ii, entonces, para
un modelo Poisson:
stayiZTP(i)=P(i) / eistayiZTP(i)=P(i) / ei
E(stay)=iE(stay)=i
var(stay)=ivar(stay)=i
El predictor lineal
Aqu entran en juego nuestras variables explicativas. Vamos a tener en cuenta la edad
de los pacientes, si tienen o no seguro mdico y si fallecieron durante su estancia en el
hospital. Vamos a aadir interacciones entre las variables, ya que es plausible que
tengan un efecto sobre la VR.
i=+1agei+2hmoi+3died+4ageihmoi+5ageidiedi+6hmoidiedii=+1
agei+2hmoi+3died+4ageihmoi+5ageidiedi+6hmoidiedi
La funcin de vnculo
Empezemos ajustando un glm Poisson truncado por ceros. Para usar este tipo de
modelos, vamos a cargar el paquete VGAM (que habr que instalar):
##
## Pearson residuals:
##
## log(lambda)
Min
1Q Median
-3 -1.7
3Q Max
-0.58 0.97
21
##
## Coefficients:
##
## (Intercept)
0.0334
72.80
## age
-0.0132
0.0063
-2.10
## hmo1
-0.0542
0.0805
-0.67
## died1
-0.2119
0.0629
-3.37
## age:hmo1
-0.0147
0.0151
-0.97
## age:died1
0.0021
0.0110
0.19
-0.0221
0.0527
-0.42
## hmo1:died1
##
##
## Name of linear predictor: log(lambda)
##
## Dispersion Parameter for pospoisson family:
, family =
##
## Log-likelihood: -6908 on 1486 degrees of freedom
##
## Number of iterations: 4
En este caso, summary no devuelve p-valores. En cualquier caso, para una primera
aproximacin, y asumiendo que las estimas se distribuyen de acuerdo a una normal,
un z value que valga 2 o ms nos puede servir para ver si una variable es o no
significativa.
Vamos a probar a eliminar la interaccin age:died
m2<- vglm(stay ~ age + hmo + died + age:hmo + hmo:died
, family = pospoisson(
), data = hospital)
summary(m2)
##
## Call:
## vglm(formula = stay ~ age + hmo + died + age:hmo + hmo:died,
##
##
## Pearson residuals:
##
## log(lambda)
Min
1Q Median
-3 -1.7
3Q Max
-0.57 0.96
21
##
## Coefficients:
##
## (Intercept)
0.0291
83.43
## age
-0.013
0.0054
-2.34
## hmo1
-0.054
0.0805
-0.67
## died1
-0.201
0.0198
-10.12
## age:hmo1
-0.015
0.0151
-0.97
## hmo1:died1
-0.022
0.0527
-0.43
##
## Number of linear predictors:
##
##
## Log-likelihood: -6908 on 1487 degrees of freedom
##
## Number of iterations: 4
## 1 1486
-6908
## 2 1487
-6908
0.04
0.85
#y si usasemos AIC?:
AIC(m1)
## [1] 13830
AIC(m2)
## [1] 13828
#Parece que m2 es mejor. Quitemos ahora hmo:died:
m3<- vglm(stay ~ age + hmo + died + age:hmo , family = pospoisson(), data = ho
spital)
summary(m3)
##
## Call:
## vglm(formula = stay ~ age + hmo + died + age:hmo, family = pospoisson(),
##
data = hospital)
##
## Pearson residuals:
##
Min
## log(lambda)
1Q Median
-3 -1.7
3Q Max
-0.57 0.99
21
##
## Coefficients:
##
## (Intercept)
2.426
0.0291
83.5
## age
-0.012
0.0054
-2.3
## hmo1
-0.056
0.0803
-0.7
## died1
-0.204
0.0184
-11.1
## age:hmo1
-0.015
0.0150
-1.0
##
## Number of linear predictors:
##
## Name of linear predictor: log(lambda)
##
## Dispersion Parameter for pospoisson family:
##
## Log-likelihood: -6908 on 1488 degrees of freedom
##
## Number of iterations: 4
lrtest(m2,m3)
## Likelihood ratio test
##
## Model 1: stay ~ age + hmo + died + age:hmo + hmo:died
## Model 2: stay ~ age + hmo + died + age:hmo
##
## 1 1487
-6908
## 2 1488
-6908
0.18
0.67
##
## Call:
## vglm(formula = stay ~ age + hmo + died, family = pospoisson(),
##
data = hospital)
##
## Pearson residuals:
##
Min
## log(lambda)
1Q Median
-3 -1.7
3Q Max
-0.59 0.98
21
##
## Coefficients:
##
## (Intercept)
2.436
0.027
89.1
## age
-0.014
0.005
-2.9
## hmo1
-0.136
0.024
-5.7
## died1
-0.204
0.018
-11.1
##
## Number of linear predictors:
##
## Name of linear predictor: log(lambda)
##
## Dispersion Parameter for pospoisson family:
##
## Log-likelihood: -6909 on 1489 degrees of freedom
##
## Number of iterations: 4
lrtest(m3,m4)
## Likelihood ratio test
##
## Model 1: stay ~ age + hmo + died + age:hmo
## Model 2: stay ~ age + hmo + died
##
## 1 1488
-6908
## 2 1489
-6909
1.07
0.3
Todos los trminos ahora parecen significativos (z values mayores que 2), asi que
podria parecer que nos podemos quedar con este modelo. Pero (y esto en realidad es
mejor mirarlo ANTES de empezar a ajustar el modelo), todo parece indicar que hay
sobredispersin (la varianza es superior a la media). Veamos:
n <- nrow(hospital)
p <- length(coef(m4))
sum(residuals(m4, type = "pearson")^2, na.rm = TRUE)/(n - p)
## [1] 6.695
En efecto, es bastante mayor que uno. Vamos a ajustar un modelo con una
distribucin binomial negativa truncada por ceros (toma ya!):
m4nb<- vglm(stay ~ age + hmo + died
tal)
n <- nrow(hospital)
p <- length(coef(m4nb))
sum(residuals(m4nb, type = "pearson")[,1]^2, na.rm = TRUE)/(n - p)
## [1] 1.141
#Parece que asi se arregla el problema de la sobredispersin.
summary(m4nb)
##
## Call:
## vglm(formula = stay ~ age + hmo + died, family = posnegbinomial(),
##
data = hospital)
##
## Pearson residuals:
##
## log(munb)
Min
1Q Median
3Q Max
-1.4 -0.71
##
## Coefficients:
##
## (Intercept):1
2.408
0.072
33.5
## (Intercept):2
0.569
0.055
10.3
## age
-0.016
0.013
-1.2
## hmo1
-0.147
0.059
-2.5
## died1
-0.218
0.046
-4.7
##
## Number of linear predictors:
##
## Names of linear predictors: log(munb), log(size)
##
## Dispersion Parameter for posnegbinomial family:
##
## Log-likelihood: -4755 on 2981 degrees of freedom
##
## Number of iterations: 4
vemos que el AIC del modelo con binomial negativa es considerablemente menor,
luego nos quedamos con l. Sin embargo, tambin parece que age ha dejado de ser
significativo, as que seguimos con nuestra seleccin:
m5nb<- vglm(stay ~ hmo + died
lrtest(m4nb, m5nb)
## Likelihood ratio test
##
## Model 1: stay ~ age + hmo + died
## Model 2: stay ~ hmo + died
##
## 1 2981
-4755
## 2 2982
-4756
1.43
0.23
data = hospital)
##
## Pearson residuals:
##
## log(munb)
Min
1Q Median
3Q Max
-1.4 -0.71
##
## Coefficients:
##
## (Intercept):1
2.33
0.028
82.9
## (Intercept):2
0.57
0.055
10.3
## hmo1
-0.15
0.059
-2.5
## died1
-0.23
0.046
-4.9
##
## Number of linear predictors:
##
## Names of linear predictors: log(munb), log(size)
##
## Dispersion Parameter for posnegbinomial family:
##
Finalmente, parece que hemos llegado a dar con nuestro modelo ptimo. Vamos a
validarlo. Como siempre, dibujamos los residuos (de Pearson) contra los valores
esperados, y contra las variables explicativas y cruzamos los dedos para no encontrar
ningn patrn:
E1 <- resid(m5nb, type = "pearson")[,1]
F1<- fitted(m5nb)
Ahora viene la mejor parte: interpretar nuestro modelo. Recordemos que las VEs que
han resistido nuestro escrutinio han sido:
died :
hmo :
con un valor de -0.226. Esto quiere decir que los pacientes que mueren pasan
menos das hospitalizados que los pacientes que no mueren. Un resultado un poco
macabro, pero lgico al fin y al cabo.
Cuantos das pasa un paciente sin seguro que no muere? Vamos a calcularlos a mano.
El caso de hmo =0 y died =0 viene representado por la intercepta del modelo
`round(coef(m5nb)[1],3). Esto quiere decir que un modelo sin truncar por ceros
predecira $e^{2.329}=10.27das. Pero como ya vimos, para calcular los resultados
en este tipo de modelos, tenemos que dividir la prediccin que nos da el modelo entre
[1-Pr(0)], asumiendo que esta ltima probabilidad se distribuye de acuerdo a una
binomial negativa con los parmetros que nos da el modelo. Esta probabilidad es:
dnbinom(x=0, size=exp(0.5671208), mu=exp(2.329134))
## [1] 0.03384
bastante baja, por lo que (en este caso) el resultado obtenido por el modelo truncado
por ceros no va a diferir mucho del que nos dara una binomial negativa de las
normalitas:
# El nmero de das de hospitalizacin que nuestro modelo predice para un paci
ente sin seguro y que no muere es...
exp(2.329134)/ (1- dnbinom(x=0, size=exp(0.5671208), mu=exp(2.329134)))
# ... redoble de tambores :)
10.63 das!
Un poco lento, aunque no viene mal calcular estas cosas para comprender lo que se est
haciendo. Por supuesto, como siempre, la funcin predict nos puede hacer la vida ms
fcil:
hospital$pred<-predict(m5nb,type="response")
head(hospital)
##
pred
## 1
0 10.629
## 2
9.265
## 3
7.516
## 4
0 10.629
## 5
8.596
## 6
8.596
Hay varios motivos que pueden llevar a que en un conteo aparezcan ceros. Por ejemplo,
en el contexto de la abundancia de pjaros en un rea forestal:
1. Hay errores estructurales. Es decir, que una especie no est presente en un parche
porque el hbitat no es el adecuado.
2. Hay errores de diseo, debidos a un pobre diseo experimental o muestral. Por
ejemplo, si buscamos a una especie en una poca en la los individuos se encuentran
en otro sitio (e.g. golondrinas en invierno), es muy probable que nuestros conteos
contengan una gran proporcion de ceros. Otro error de este tipo es muestrear durante
demasiado poco tiempo, o a una escala espacial inadecuada.
3. Hay errores de observador. Esto ocurre cuando dos especies son similares y el
observador no sabe distinguirlas, o cuando son dificiles de detectar.
4. Por ltimo el error de los propios pjaros. Es decir, que el hbitat es el adecuado, pero
el pjaro no est presente.
De entre estas posible fuentes de ceros, los de diseo, los debidos al observador y los de
los pjaros (nmeros 2, 3 y 4 de la lista anterior) se consideran falsos ceros, mientras que
los estructurales se consideran ceros autnticos. La presencia de falsos ceros puede
llevar a que haya una sobreabundancia de ceros en nuestros datos. En esta seccin
vamos a ver tcnicas (modelos inflados por ceros y modelos alterados por ceros) que
permiten tener en cuenta este problema.
Vamos a explorar una base de datos para ilustrar esto. En ella aparecen el numero de
peces count que ha pescado una serie de grupos de pescadores en un parque, as como
una serie de caractersticas de los grupos:
fish<-read.table(paste(raiz,"Datos/pesca.txt", sep=""), header=T)
str(fish)
## 'data.frame':
250 obs. of
8 variables:
##
$ nofish
: int
1 0 0 0 0 0 0 0 1 0 ...
##
$ livebait: int
0 1 1 1 1 1 1 1 0 1 ...
##
$ camper
: int
0 1 0 1 0 1 0 0 1 1 ...
##
$ persons : int
1 1 1 2 1 4 3 4 3 1 ...
##
$ child
: int
0 0 0 1 0 2 1 3 2 0 ...
##
$ xb
: num
##
$ zg
: num
##
$ count
: int
0 0 0 0 1 0 0 0 0 1 ...
plot(table(fish$count))
Se observa que, efectivamente, una gran parte de los grupos no pescan nada. En realidad,
si los datos siguieran una distribucin de Poisson, el nmero de ceros que cabra esperar
es mucho menor que el observado en estos datos.
250 obs. of
8 variables:
##
$ nofish
: int
1 0 0 0 0 0 0 0 1 0 ...
##
$ livebait: int
0 1 1 1 1 1 1 1 0 1 ...
##
$ camper
: int
0 1 0 1 0 1 0 0 1 1 ...
##
$ persons : int
1 1 1 2 1 4 3 4 3 1 ...
##
$ child
: int
0 0 0 1 0 2 1 3 2 0 ...
##
$ xb
: num
##
$ zg
: num
##
$ count
: int
0 0 0 0 1 0 0 0 0 1 ...
head(fish)
##
xb
zg count
## 1
0 -0.8963
3.0504
## 2
0 -0.5583
1.7461
## 3
0 -0.4017
0.2799
## 4
1 -0.9563 -0.6015
## 5
0.4369
0.5277
## 6
1.3945 -0.7075
tail(fish)
##
xb
zg count
## 245
0 -0.2911
1.3155
## 246
0 -0.7552
2.3242
## 247
1.7949 -5.6259
## 248
1 -0.3926
## 249
## 250
0.6773
1.3746 -2.5956
0.8288 -1.4571
Hay 250 observaciones de grupos que acudieron al parque. De cada grupo se sabe el
nmero de peces que pescaron ( count ), el nmero de nios que forman parte del grupo
( child ), el nmero de miembros del grupo ( persons ) y si llevaban o no una caravana
( camper ).
Nos encontramos con un posible problema: persons es el nmero total de
personas, incluyendo nios, de cada grupo. Un grupo con muchos nios tendr
forzosamente muchas personas, mientras que un grupo con pocas personas no puede
tener mucho nios, por lo que es posible que persons y child estn correlacionados:
cor(fish$persons,fish$child, method="spearman")
## [1] 0.5412
Podemos solucionar esto simplemente creando una nueva variable que indique el nmero
de adultos:
fish$adultos<- fish$persons - fish$child #los adultos son el total de personas
menos los nios
cor(fish$adultos,fish$child, method="spearman") #Bien! Se ha reducido bastante
la correlacin
## [1] -0.1957
Ahora veamos como vara el nmero de peces pescados en funcin de nuestras VEs:
library(lattice)
type = "count")
type = "count")
type = "count")
Ok. Pues vamos a hacer nuestro modelo. Como estamos analizando dos procesos,
usaremos dos conjuntos de variables explicativas (unas para la parte binomial y otras para
la truncada por ceros). Lo primero que vamos a hacer es crear la frmula con las variables
explicativas que vamos a incluir en nuestro modelo. Como es un modelo que incluye la
mezcla de dos procesos (poisson y binomial), tenemos que indicar:
1. Nuestra variable respuesta (`count ~).
2. Las variables explicativas para el proceso de poisson.
3. Las variables explicativas para el proceso binomial.
Esto se hace asi:
f1<-formula(count ~ adultos + child + camper + adultos:child + adultos:camper
+ camper:child |
adultos + child + camper + adultos:child + adultos:camper + camper
:child)
El smbolo | separa las variables explicativas del proceso binomial (a la derecha) de las
del proceso de poisson (a la izquierda). Podramos escribir todo dentro de la funcin de R
que ajusta este tipo de modelos ( hurdle ), pero es ms cmodo (y menos lioso) escribir la
frmula aparte. Carguemos el paquete correspondiente ( pscl ) y ajustemos el modelo:
library(pscl)
## Loading required package: MASS
## Classes and Methods for R developed in the
##
## Political Science Computational Laboratory
##
## Department of Political Science
##
## Stanford University
##
## Simon Jackman
##
## hurdle and zeroinfl functions by Achim Zeileis
Zap1 <- hurdle(f1, dist = "poisson",link = "logit", data = fish)
summary(Zap1)
##
## Call:
## hurdle(formula = f1, data = fish, dist = "poisson", link = "logit")
##
## Pearson residuals:
##
Min
1Q
Median
3Q
Max
0.0511 17.5950
##
## Count model coefficients (truncated poisson with log link):
##
## (Intercept)
0.3110
-0.23
## adultos
0.5484
0.0936
5.86
4.6e-09 ***
## child
1.2504
0.3489
3.58
0.00034 ***
## camper
-0.4174
0.3555
-1.17
0.24028
## adultos:child
-0.3214
0.1173
-2.74
0.00614 **
0.4121
0.1045
3.94
8.0e-05 ***
-0.8718
0.2348
-3.71
0.00021 ***
## adultos:camper
## child:camper
0.81541
0.6439
-2.75
0.0059 **
0.9384
0.3087
3.04
0.0024 **
## child
-1.2066
0.8072
-1.49
0.1350
## camper
-0.0735
0.7922
-0.09
0.9261
## adultos:child
-0.1379
0.3503
-0.39
0.6938
## adultos
## adultos:camper
0.4432
0.4013
1.10
0.2694
## child:camper
0.6179
0.5447
1.13
0.2567
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Number of iterations in BFGS optimization: 16
## Log-likelihood: -723 on 14 Df
En effecto, summary tiene dos partes: una primera parte para el modelo truncado por
ceros ( truncated poisson with log link ) y una segunda parte para el modelo binomial
( binomial with logit link ).
Una vez hecho esto, vamos a proceder a seleccionar las VEs que nos vamos a quedar.
Este proceso puede ser un poco largo, al estar compuesto el modelo de dos partes
diferentes. Para hacerlo, vamos a ir eliminando de cada una de las partes la interaccin
con un p-valor ms alto. En este caso esa variable es adultos:child , tanto en la parte
binomial como en la poisson:
adultos:camper + camper:chil
d |
adultos + child + camper + adultos:child + adultos:camper + camper
:child)
#quitamos adultos:child de binomial:
f1B<- f1<-formula(count ~ adultos + child + camper + adultos:child + adultos:c
amper + camper:child |
adultos + child + camper +
adultos:camper + camper:child)
library(lmtest)
## Loading required package: zoo
##
## Attaching package: 'zoo'
##
## The following objects are masked from 'package:base':
##
##
as.Date, as.Date.numeric
##
##
## Attaching package: 'lmtest'
##
## The following object is masked from 'package:VGAM':
##
##
lrtest
##
adultos:camper + camper:child
##
##
camper:child
#Df LogLik Df Chisq Pr(>Chisq)
## 1
14
-723
## 2
13
-726 -1
6.83
0.009 **
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
lrtest(Zap1, Zap1B)
##
adultos:camper + camper:child
##
camper:child
##
## 1
14
-723
## 2
13
-723 -1
0.15
0.69
df
AIC
## Zap1
14 1473
## Zap1A 13 1478
## Zap1B 13 1471
Min
1Q
Median
3Q
Max
0.0325 16.9913
##
## Count model coefficients (truncated poisson with log link):
##
## (Intercept)
-0.0726
0.3110
-0.23
## adultos
0.5484
0.0936
5.86
4.6e-09 ***
## child
1.2504
0.3489
3.58
0.00034 ***
## camper
-0.4174
0.3555
-1.17
0.24028
## adultos:child
-0.3214
0.1173
-2.74
0.00614 **
0.4121
0.1045
3.94
8.0e-05 ***
-0.8718
0.2348
-3.71
0.00021 ***
## adultos:camper
## child:camper
0.81541
## (Intercept)
-1.6988
0.6127
-2.77
0.00556 **
0.8963
0.2862
3.13
0.00174 **
## child
-1.4781
0.4390
-3.37
0.00076 ***
## camper
-0.0475
0.7864
-0.06
0.95182
## adultos:camper
0.4150
0.3909
1.06
0.28839
## child:camper
0.6909
0.5207
1.33
0.18458
## adultos
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Number of iterations in BFGS optimization: 16
## Log-likelihood: -723 on 13 Df
#Vamos a quitar adultos:camper de la parte binomial:
adultos:child + adultos:camp
er + camper:child |
adultos + child + camper +
camper:child)
lrtest(Zap1B, Zap1C)
## Likelihood ratio test
##
##
camper:child
## 1
13
-723
## 2
12
-723 -1
1.12
0.29
AIC(Zap1B, Zap1C)
##
df
AIC
## Zap1B 13 1471
## Zap1C 12 1471
#Todo parece indicar que es seguro eliminar esa interaccin.
summary(Zap1C)
##
## Call:
## hurdle(formula = f1C, data = fish, dist = "poisson", link = "logit")
##
## Pearson residuals:
##
Min
1Q
Median
3Q
Max
0.0864 15.4957
##
## Count model coefficients (truncated poisson with log link):
##
## (Intercept)
0.3110
-0.23
## adultos
0.5484
0.0936
5.86
4.6e-09 ***
## child
1.2504
0.3489
3.58
0.00034 ***
## camper
-0.4174
0.3555
-1.17
0.24028
## adultos:child
-0.3214
0.1173
-2.74
0.00614 **
0.4121
0.1045
3.94
## adultos:camper
0.81541
8.0e-05 ***
## child:camper
-0.8718
0.2348
-3.71
0.00021 ***
## (Intercept)
-2.143
0.470
-4.56
5.1e-06 ***
1.135
0.194
5.86
4.7e-09 ***
-1.546
0.457
-3.38
0.00072 ***
## camper
0.681
0.396
1.72
0.08590 .
## child:camper
0.757
0.533
1.42
0.15539
## adultos
## child
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Number of iterations in BFGS optimization: 16
## Log-likelihood: -723 on 12 Df
#Seguimos quitando la interaccin que queda (camper:child):
f1D<- formula(count ~ adultos + child + camper +
adultos:child + adultos:camp
er + camper:child |
adultos + child + camper )
Zap1D<- hurdle(f1D, dist = "poisson",link = "logit", data = fish)
lrtest(Zap1C, Zap1D)
## Likelihood ratio test
##
## Model 1: count ~ adultos + child + camper + adultos:child + adultos:camper
+
##
## 1
12
-723
## 2
11
-724 -1
AIC(Zap1C, Zap1D)
2.18
0.14
##
df
AIC
## Zap1C 12 1471
## Zap1D 11 1471
De acuerdo al LRT, el modelo sin camper:child en la parte binomial no difiere del que s
la incluye; El AIC de ambos es muy similar. Vamos a quedarnos con el modelo que no
incluye esa interaccin:
summary(Zap1D)
##
## Call:
## hurdle(formula = f1D, data = fish, dist = "poisson", link = "logit")
##
## Pearson residuals:
##
Min
1Q
Median
3Q
Max
0.0481 15.7656
##
## Count model coefficients (truncated poisson with log link):
##
## (Intercept)
-0.0726
0.3110
-0.23
## adultos
0.5484
0.0936
5.86
4.6e-09 ***
## child
1.2504
0.3489
3.58
0.00034 ***
## camper
-0.4174
0.3555
-1.17
0.24028
## adultos:child
-0.3214
0.1173
-2.74
0.00614 **
0.4121
0.1045
3.94
8.0e-05 ***
-0.8718
0.2348
-3.71
0.00021 ***
## adultos:camper
## child:camper
0.81541
0.461
-5.01
5.6e-07 ***
1.110
0.191
5.81
6.2e-09 ***
-1.028
0.234
-4.40
1.1e-05 ***
1.018
0.325
3.14
0.0017 **
## adultos
## child
## camper
## --## Signif. codes:
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Number of iterations in BFGS optimization: 16
## Log-likelihood: -724 on 11 Df
Llegados a este punto, todas las variables que quedan en el modelo son significativas, por
lo que podemos dar por concluida la seleccion de variables.
Para finalizar, solo quedara validar el modelo. De nuevo, miramos los residuos (de
Pearson) y los comparamos con los valores ajustados y con cada una de las variables
explicativas (y cruzamos los dedos esperando no encontrar ningn patrn)
E1<- residuals(Zap1D, type="pearson")
F1<- predict(Zap1D, type="response")
grid.arrange(p1,p2,p3,p4,ncol=2)
Bueno no se ven patrones muy claros. Sin embargo no hemos comprobado si hay
sobredispersin en la parte poisson de nuestro modelo. Como se hace? Ajustando un
modelo con una distribucin binomial negativa (ZANB), que permite que la varianza
aumente ms rpido que la media y comparndolo con nuestro modelo ZAP.
##
adultos:camper + camper:child
##
##
adultos:camper + camper:child
##
## 1
14
-723
## 2
15
-390
665
<2e-16 ***
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
AIC(Zap1, Zanb1)
##
df
## Zap1
14 1473.3
## Zanb1 15
AIC
810.7
En efecto, todo indica que Zanb1 es mucho mejor. De nuevo, vamos a seleccionar las
variables explicativas.
1254 obs. of
: int
11 variables:
##
$ Sample
1 2 3 4 5 6 7 8 9 10 ...
##
$ Intensity : int
0 0 0 0 0 0 0 0 0 0 ...
##
$ Prevalence: int
0 0 0 0 0 0 0 0 0 0 ...
##
$ Year
: int
1999 1999 1999 1999 1999 1999 1999 1999 1999 1999 ...
##
$ Depth
: int
220 220 220 220 220 220 220 194 194 194 ...
##
$ Weight
: int
##
$ Length
: int
26 26 27 26 17 20 19 77 67 60 ...
##
$ Sex
: int
0 0 0 0 0 0 0 0 0 0 ...
##
$ Stage
: int
0 0 0 0 0 0 0 0 0 0 ...
##
$ Age
: int
0 0 0 0 0 0 0 0 0 0 ...
##
$ Area
: int
2 2 2 2 2 2 2 3 3 3 ...
head(ParasiteCod)
##
Sample Intensity Prevalence Year Depth Weight Length Sex Stage Age Area
## 1
0 1999
220
148
26
## 2
0 1999
220
144
26
## 3
0 1999
220
146
27
## 4
0 1999
220
138
26
## 5
0 1999
220
40
17
## 6
0 1999
220
68
20
tail(ParasiteCod)
##
Sample Intensity Prevalence Year Depth Weight Length Sex Stage Age
## 1249
1249
89
1 2001
260
1414
56
## 1250
1250
90
1 2001
228
224
31
## 1251
1251
104
1 2001
140
690
43
## 1252
1252
125
1 2001
140
754
44
## 1253
1253
128
1 2001
140
1270
55
## 1254
1254
257
1 2001
228
370
35
##
Area
## 1249
## 1250
## 1251
## 1252
## 1253
## 1254
Despus, para facilitar las cosas ms adelante, vamos a eliminar las filas en las que no
disponemos de datos para alguna de las variables que utilizamos:
I1 <- is.na(ParasiteCod$Intensity) |
is.na(ParasiteCod$fArea) |
is.na(ParasiteCod$fYear) |
is.na(ParasiteCod$Length)
ParasiteCod2 <- ParasiteCod[!I1, ]
Gran parte de los bacalaos no tienen ningn parsito (Como caba esperar de una base de
datos para explicar los modelos inflados por ceros), mientras que bastantes tienen unos
pocos y unos pocos bacalaos tienen muchsimos parsitos. Pero de dnde vienen los
ceros?
1. Algunos bacalaos no han estado expuestos al parsito, bien porque en su regin no
est presente el vector que propaga los parsitos (una especie de cangrejo), o bien
porque han llegado recientemente desde una zona libre de parsitos. Estos se
consideran falsos ceros.
2. Algunos ceros pueden deberse a errores cometidos por el observador, que no
encuentra parsitos en un bacalao que s los tiene (algo que parece ser fcil que
ocurra cuando el bacalao no est muy infectado). Estos tambin son falsos ceros.
3. El resto de ceros vienen de peces que han estado expuestos al vector, pero que por
algn motivo (habitat, inmunidad, condiciones ambientales) no han sido infectados.
Estos son ceros autnticos.
En este caso, nos interesa distinguir unos ceros de otros para 1) intentar tomar medidas
para reducir el nmero de falsos ceros (por ejemplo, formar a la persona que muestrea los
parsitos o evitar las reas en las que no est el vector) y 2) conocer las caractersticas de
los bacalaos que, habiendo estado expuestos, no sufren infecciones.
lrtest(Zip1,Zinb1)
## Likelihood ratio test
##
## Model 1: Intensity ~ fArea * fYear + Length | fArea * fYear + Length
## Model 2: Intensity ~ fArea * fYear + Length | fArea * fYear + Length
##
## 1
26
-6818
## 2
27
-2450
8734
<2e-16 ***
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
df
## Zip1
26 13687
## Zinb1 27
AIC
4955
Min
1Q Median
3Q
Max
## (Intercept)
3.73390
0.34440
10.84
## fArea2
0.19777
0.32913
0.60
## fArea3
-0.64673
0.27779
-2.33
## fArea4
0.70750
0.25226
2.80
0.005 **
## fYear2000
0.06389
0.29564
0.22
0.829
## fYear2001
-0.93915
0.60606
-1.55
0.121
## Length
-0.03641
0.00511
-7.13
1e-12 ***
## fArea2:fYear2000 -0.65399
0.53542
-1.22
0.222
## fArea3:fYear2000
1.02496
0.42960
2.39
0.017 *
## fArea4:fYear2000
0.53453
0.41497
1.29
0.198
## fArea2:fYear2001
0.96727
0.71817
1.35
0.178
## fArea3:fYear2001
1.00270
0.67750
1.48
0.139
## fArea4:fYear2001
0.85516
0.65440
1.31
0.191
-0.96662
0.09634
-10.03
## Log(theta)
<2e-16 ***
0.548
0.020 *
<2e-16 ***
##
## Zero-inflation model coefficients (binomial with logit link):
##
## (Intercept)
0.1909
0.7813
0.24
0.80697
## fArea2
2.0137
0.5729
3.51
0.00044 ***
## fArea3
1.9053
0.5499
3.46
0.00053 ***
## fArea4
-0.7362
0.8622
-0.85
0.39321
## fYear2000
-1.0717
2.0002
-0.54
0.59209
## fYear2001
3.2932
0.7104
4.64
-0.0388
0.0120
-3.23
## fArea2:fYear2000
0.4654
2.0789
0.22
0.82286
## fArea3:fYear2000
-0.7945
2.1576
-0.37
0.71269
## fArea4:fYear2000
-13.5700
1509.5741
-0.01
0.99283
## fArea2:fYear2001
-3.2074
0.8360
-3.84
0.00012 ***
## fArea3:fYear2001
-3.5041
0.8300
-4.22
2.4e-05 ***
## fArea4:fYear2001
-2.9105
1.1046
-2.63
0.00841 **
## Length
3.6e-06 ***
0.00125 **
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Theta = 0.38
## Number of iterations in BFGS optimization: 53
## Log-likelihood: -2.45e+03 on 27 Df
Puesto que Length es significativa en ambas partes del modelo, el paso evidente es
probar a eliminar la interaccin Area:Year :
#Elimino Area:Year de la parte del conteo
f1A<-formula(Intensity ~ fArea+fYear + Length | fArea*fYear + Length)
#Elimino Area:Year de la parte binomial
f1B<-formula(Intensity ~ fArea*fYear + Length | fArea+fYear + Length)
lrtest(Zinb1, Zinb1A)
## Likelihood ratio test
##
## Model 1: Intensity ~ fArea * fYear + Length | fArea * fYear + Length
## Model 2: Intensity ~ fArea + fYear + Length | fArea * fYear + Length
##
## 1
27
-2450
## 2
21
-2458 -6
14.2
0.027 *
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
lrtest(Zinb1, Zinb1B)
## Likelihood ratio test
##
## Model 1: Intensity ~ fArea * fYear + Length | fArea * fYear + Length
## Model 2: Intensity ~ fArea * fYear + Length | fArea + fYear + Length
##
## 1
27
-2450
## 2
21
-2460 -6
18.9
0.0044 **
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
df
AIC
## Zinb1
27 4955
## Zinb1A 21 4957
## Zinb1B 21 4962
Parece que no podemos (debemos) eliminar ningn trmino (aunque los test son
aproximados y una p=0.027 podria no convencernos del todo). El hecho de tener variables
explicativas categricas aade cierta dificultad a la hora de incluir nuestros resultados en
una posible publicacin o informe (e.g. hay 6 p-valores asociados a la
interaccin Area:Year en la parte binomial). Para solventar esto, podemos comparar el
modelo seleccionado ( Zinb1 ) con un modelo en el que eliminemos el trmino en cuestin.
Por ejemplo:
## 1
27
-2450
## 2
21
-2460 -6
18.9
0.0044 **
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
En una posible publicacin podemos mostrar el valor del estadstico Chi cuadrado, los gdl
y el p-valor (22=18.85.29; df=6; p=0.004), repitiendo este proceso para todas las
variables explicativas.
Inciso: Es necesario usar el modelo inflado por ceros?
Nada de lo que hemos visto hasta ahora nos indica que nuestro modelo inflado por ceros
sea mejor que una binomial negativa normal y corriente. El problema aqu es que es dificil
comparar modelos que no estn anidados. Sin embargo, el test de Vuong, disponible en la
funcin pscl::vuong , nos permite hacer estas comparaciones. Probemos a calcular el
modelo binomial negativa (usando la funcin glm.nb de MASS ):
library(MASS)
vuong(Zinb1, nb1A)
## Vuong Non-Nested Hypothesis Test-Statistic: -61.27
## (test-statistic is asymptotically distributed N(0,1) under the
##
## in this case:
## model2 > model1, with p-value <2e-16
Perfecto; el test nos indica que el modelo inflado por ceros es mucho mejor que su
equivalente sin inflar.
ltimos pasos: validacin e interpretacin
Ya solo nos queda validar el modelo. Como siempre, calculamos los residuos de Pearson
y los representamos contra todo:
E1<- residuals(Zinb1, type="pearson")
F1<- predict(Zinb1, type="response")
grid.arrange(p1,p2,p3,p4,ncol=2)
No se observan patrones ni outliers evidentes. Parece que podemos quedarnos con este
modelo.
Vamos a echarle un ojo a algunos de los coeficientes del modelo para interpretar su
significado:
summary(Zinb1)
##
## Call:
## zeroinfl(formula = f1, data = ParasiteCod2, dist = "negbin", link = "logit"
)
##
## Pearson residuals:
##
Min
1Q Median
3Q
Max
## (Intercept)
3.73390
0.34440
10.84
## fArea2
0.19777
0.32913
0.60
## fArea3
-0.64673
0.27779
-2.33
## fArea4
0.70750
0.25226
2.80
0.005 **
## fYear2000
0.06389
0.29564
0.22
0.829
## fYear2001
-0.93915
0.60606
-1.55
0.121
## Length
-0.03641
0.00511
-7.13
1e-12 ***
## fArea2:fYear2000 -0.65399
0.53542
-1.22
0.222
## fArea3:fYear2000
1.02496
0.42960
2.39
0.017 *
## fArea4:fYear2000
0.53453
0.41497
1.29
0.198
## fArea2:fYear2001
0.96727
0.71817
1.35
0.178
## fArea3:fYear2001
1.00270
0.67750
1.48
0.139
## fArea4:fYear2001
0.85516
0.65440
1.31
0.191
-0.96662
0.09634
-10.03
## Log(theta)
##
<2e-16 ***
0.548
0.020 *
<2e-16 ***
## (Intercept)
0.1909
0.7813
0.24
0.80697
## fArea2
2.0137
0.5729
3.51
0.00044 ***
## fArea3
1.9053
0.5499
3.46
0.00053 ***
## fArea4
-0.7362
0.8622
-0.85
0.39321
## fYear2000
-1.0717
2.0002
-0.54
0.59209
## fYear2001
3.2932
0.7104
4.64
-0.0388
0.0120
-3.23
## fArea2:fYear2000
0.4654
2.0789
0.22
0.82286
## fArea3:fYear2000
-0.7945
2.1576
-0.37
0.71269
## fArea4:fYear2000
-13.5700
1509.5741
-0.01
0.99283
## fArea2:fYear2001
-3.2074
0.8360
-3.84
0.00012 ***
## fArea3:fYear2001
-3.5041
0.8300
-4.22
2.4e-05 ***
## fArea4:fYear2001
-2.9105
1.1046
-2.63
0.00841 **
## Length
3.6e-06 ***
0.00125 **
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Theta = 0.38
## Number of iterations in BFGS optimization: 53
## Log-likelihood: -2.45e+03 on 27 Df
un coeficiente negativo indica que cuando esa variable toma un valor alto (o no nulo en el
caso de los factores) las probabilidades de observar falsos ceros disminuyen. Por ejemplo:
Una cosa interesante es que podemos representar los valores predichos para cada una de
las dos partes del modelo. Por ejemplo, para los falsos ceros:
newdata1$pred0<-predict(Zinb1, newdata1,type="zero")
newdata1$predCount<-predict(Zinb1, newdata1,type="count")
predZI=predCount(1pred0)predZI=predCount(1pred0)
lo comprobamos?
newdata1$predZI== newdata1$predCount* (1- newdata1$pred0)
##
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[14] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[27] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[40] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[53] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[66] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[79] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[92] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[105] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[118] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[131] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[144] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[157] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[170] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[183] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[196] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[209] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[222] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[235] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[248] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[261] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[274] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[287] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[300] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[313] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[326] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[339] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[352] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[365] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[378] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[391] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[404] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[417] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[430] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[443] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[456] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[469] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[482] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[495] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[508] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[521] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[534] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[547] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[560] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[573] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[586] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[599] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[612] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[625] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[638] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[651] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[664] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[677] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[690] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[703] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[716] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[729] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[742] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[755] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[768] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[781] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[794] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[807] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[820] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[833] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[846] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[859] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[872] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[885] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[898] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[911] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[924] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[937] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[950] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[963] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[976] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
##
[989] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [1002] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
Referencias.
El texto y cdigo est basado principalmente en:
Zuur, A.F., Ieno, E. I., Walker, N.J., Saveliev, A. A., Smith, G. 2009. Mixed Effects
Models and Extensions in Ecology with R. Springer.
http://www.ats.ucla.edu/stat/r/dae/zinbreg.htm
http://www.ats.ucla.edu/stat/r/dae/zipoisson.htm
adultos:camper + camper:child)
lrtest(Zanb1,ZanbA1)
## Likelihood ratio test
##
## Model 1: count ~ adultos + child + camper + adultos:child + adultos:camper
+
##
##
adultos:camper + camper:child
##
##
camper:child
#Df LogLik Df Chisq Pr(>Chisq)
## 1
15
-390
## 2
14
-390 -1
0.21
0.65
lrtest(Zanb1,ZanbB1)
## Likelihood ratio test
##
## Model 1: count ~ adultos + child + camper + adultos:child + adultos:camper
+
##
##
adultos:camper + camper:child
##
camper:child
##
## 1
15
-390
## 2
14
-390 -1
0.15
0.69
AIC(Zanb1,ZanbA1,ZanbB1)
##
df
AIC
## Zanb1
15 810.7
## ZanbA1 14 808.9
## ZanbB1 14 808.8
#Me quedo con ZanbB1
summary(ZanbB1)
##
## Call:
## hurdle(formula = fB1, data = fish, dist = "negbin", link = "logit")
##
## Pearson residuals:
##
Min
1Q
Median
3Q
Max
9.10048
##
## Count model coefficients (truncated negbin with log link):
##
## (Intercept)
0.867
-1.74
## adultos
0.850
0.291
2.92
0.0035 **
## child
1.309
0.952
1.38
0.1688
## camper
0.358
0.933
0.38
0.7012
-0.169
0.366
-0.46
0.6446
0.214
0.335
0.64
0.5227
## child:camper
-1.445
0.702
-2.06
0.0397 *
## Log(theta)
-0.808
0.430
-1.88
0.0599 .
## adultos:child
## adultos:camper
0.0810 .
0.6127
-2.77
0.00556 **
0.8963
0.2862
3.13
0.00174 **
## child
-1.4781
0.4390
-3.37
0.00076 ***
## camper
-0.0475
0.7864
-0.06
0.95182
## adultos:camper
0.4150
0.3909
1.06
0.28839
## child:camper
0.6909
0.5207
1.33
0.18458
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Theta: count = 0.446
## Number of iterations in BFGS optimization: 17
## Log-likelihood: -390 on 14 Df
fA2<-formula(count ~ adultos + child + camper +
adultos:camper + camper:child
|
adultos + child + camper +
adultos:camper + camper:child)
camper:child)
lrtest(ZanbB1,ZanbA2)
## Likelihood ratio test
##
## Model 1: count ~ adultos + child + camper + adultos:child + adultos:camper
+
##
##
camper:child
## 1
14
-390
## 2
13
-391 -1
0.21
0.65
lrtest(ZanbB1,ZanbB2)
## Likelihood ratio test
##
## Model 1: count ~ adultos + child + camper + adultos:child + adultos:camper
+
##
##
camper:child
## 1
14
-390
## 2
13
-391 -1
1.12
0.29
AIC(ZanbB1,ZanbA2,ZanbB2)
##
df
AIC
## ZanbB1 14 808.8
## ZanbA2 13 807.0
## ZanbB2 13 807.9
#Me quedo con ZanbA2
summary(ZanbA2)
##
## Call:
## hurdle(formula = fA2, data = fish, dist = "negbin", link = "logit")
##
## Pearson residuals:
##
Min
1Q
Median
3Q
Max
9.0018
##
## Count model coefficients (truncated negbin with log link):
##
## (Intercept)
## adultos
0.872
-1.73
0.844
0.292
2.89
0.0844 .
0.0038 **
## child
0.979
0.625
1.57
0.1174
## camper
0.425
0.927
0.46
0.6465
## adultos:camper
0.187
0.330
0.57
0.5715
## child:camper
-1.474
0.706
-2.09
0.0367 *
## Log(theta)
-0.823
0.432
-1.90
0.0569 .
## (Intercept)
-1.6988
0.6127
-2.77
0.00556 **
0.8963
0.2862
3.13
0.00174 **
## child
-1.4781
0.4390
-3.37
0.00076 ***
## camper
-0.0475
0.7864
-0.06
0.95182
## adultos:camper
0.4150
0.3909
1.06
0.28839
## child:camper
0.6909
0.5207
1.33
0.18458
## adultos
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Theta: count = 0.439
## Number of iterations in BFGS optimization: 17
## Log-likelihood: -391 on 13 Df
fA3<-formula(count ~ adultos + child + camper +
adultos + child + camper +
camper:child |
adultos:camper + camper:child)
adultos:camper + camper:child
|
adultos + child + camper +
camper:child)
lrtest(ZanbA2,ZanbA3)
## Likelihood ratio test
##
## 1
13
-391
## 2
12
-391 -1
0.31
0.58
lrtest(ZanbA2,ZanbB3)
## Likelihood ratio test
##
## Model 1: count ~ adultos + child + camper + adultos:camper + camper:child |
##
## 1
13
-391
## 2
12
-391 -1
1.12
0.29
AIC(ZanbA2,ZanbA3,ZanbB3)
##
df
AIC
## ZanbA2 13 807.0
## ZanbA3 12 805.3
## ZanbB3 12 806.1
#Me quedo con ZanbA3
summary(ZanbA3)
##
## Call:
## hurdle(formula = fA3, data = fish, dist = "negbin", link = "logit")
##
## Pearson residuals:
##
Min
1Q
Median
3Q
Max
8.8784
##
## Count model coefficients (truncated negbin with log link):
##
## (Intercept)
-1.888
0.562
-3.36
0.00079 ***
## adultos
0.990
0.146
6.76
1.4e-11 ***
## child
1.072
0.609
1.76
0.07818 .
## camper
0.903
0.368
2.45
0.01425 *
## child:camper
-1.585
0.683
-2.32
0.02032 *
## Log(theta)
-0.848
0.436
-1.94
0.05202 .
## (Intercept)
-1.6988
0.6127
-2.77
0.00556 **
0.8963
0.2862
3.13
0.00174 **
## child
-1.4781
0.4390
-3.37
0.00076 ***
## camper
-0.0475
0.7864
-0.06
0.95182
## adultos:camper
0.4150
0.3909
1.06
0.28839
## child:camper
0.6909
0.5207
1.33
0.18458
## adultos
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Theta: count = 0.428
## Number of iterations in BFGS optimization: 14
## Log-likelihood: -391 on 12 Df
fA4<-formula(count ~ adultos + child + camper
adultos + child + camper +
adultos:camper + camper:child)
camper:child |
camper:child)
lrtest(ZanbA3,ZanbA4)
## Likelihood ratio test
##
## Model 1: count ~ adultos + child + camper + camper:child | adultos + child
+
##
adultos:camper + camper:child
#Df LogLik Df Chisq Pr(>Chisq)
## 1
12
-391
## 2
11
-394 -1
5.68
0.017 *
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
lrtest(ZanbA3,ZanbB4)
## Likelihood ratio test
##
## Model 1: count ~ adultos + child + camper + camper:child | adultos + child
+
##
camper + camper:child
#Df LogLik Df Chisq Pr(>Chisq)
## 1
12
-391
## 2
11
-391 -1
1.12
AIC(ZanbA3,ZanbA4,ZanbB4)
##
df
AIC
## ZanbA3 12 805.3
## ZanbA4 11 809.0
## ZanbB4 11 804.5
#Me quedo con ZanbB4
0.29
summary(ZanbB4)
##
## Call:
## hurdle(formula = fB4, data = fish, dist = "negbin", link = "logit")
##
## Pearson residuals:
##
Min
1Q
Median
3Q
Max
9.0014
##
## Count model coefficients (truncated negbin with log link):
##
## (Intercept)
-1.888
0.562
-3.36
0.00079 ***
## adultos
0.990
0.146
6.76
1.4e-11 ***
## child
1.072
0.609
1.76
0.07818 .
## camper
0.903
0.368
2.45
0.01425 *
## child:camper
-1.585
0.683
-2.32
0.02032 *
## Log(theta)
-0.848
0.436
-1.94
0.05202 .
## (Intercept)
-2.143
0.470
-4.56
5.1e-06 ***
1.135
0.194
5.86
4.7e-09 ***
-1.546
0.457
-3.38
0.00072 ***
## camper
0.681
0.396
1.72
0.08590 .
## child:camper
0.757
0.533
1.42
0.15539
## adultos
## child
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Theta: count = 0.428
## Number of iterations in BFGS optimization: 14
## Log-likelihood: -391 on 11 Df
fA5<-formula(count ~ adultos + child + camper
camper:child)
camper:child |
lrtest(ZanbB4,ZanbA5)
## Likelihood ratio test
##
## Model 1: count ~ adultos + child + camper + camper:child | adultos + child
+
##
camper + camper:child
camper:child
#Df LogLik Df Chisq Pr(>Chisq)
## 1
11
-391
## 2
10
-394 -1
5.68
0.017 *
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
lrtest(ZanbB4,ZanbB5)
## Likelihood ratio test
##
## Model 1: count ~ adultos + child + camper + camper:child | adultos + child
+
##
camper + camper:child
camper
#Df LogLik Df Chisq Pr(>Chisq)
## 1
11
-391
## 2
10
-392 -1
2.18
0.14
df
AIC
## ZanbB4 11 804.5
## ZanbA5 10 808.1
## ZanbB5 10 804.6
#Me quedo con ZanbB5
summary(ZanbB5) #Todo es significativo. Ya hemos acabado la seleccin
##
## Call:
## hurdle(formula = fB5, data = fish, dist = "negbin", link = "logit")
##
## Pearson residuals:
##
Min
1Q
Median
3Q
Max
8.0265
##
## Count model coefficients (truncated negbin with log link):
##
## (Intercept)
-1.888
0.562
-3.36
0.00079 ***
## adultos
0.990
0.146
6.76
1.4e-11 ***
## child
1.072
0.609
1.76
0.07818 .
## camper
0.903
0.368
2.45
0.01425 *
## child:camper
-1.585
0.683
-2.32
0.02032 *
## Log(theta)
-0.848
0.436
-1.94
0.05202 .
0.461
-5.01
5.6e-07 ***
1.110
0.191
5.81
6.2e-09 ***
-1.028
0.234
-4.40
1.1e-05 ***
1.018
0.325
3.14
0.0017 **
## Signif. codes:
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Theta: count = 0.428
## Number of iterations in BFGS optimization: 14
## Log-likelihood: -392 on 10 Df
############################################
######### VALIDACION
############################################
E1<- residuals(ZanbB5, type="pearson")
F1<- predict(ZanbB5, type="response")
geom_hline(h=0, colour=2)
grid.arrange(p1,p2,p3,p4,ncol=2)
############################################
######### INTERPRETACIN
############################################
summary(ZanbB5)
##
## Call:
## hurdle(formula = fB5, data = fish, dist = "negbin", link = "logit")
##
## Pearson residuals:
##
Min
1Q
Median
3Q
Max
8.0265
##
## Count model coefficients (truncated negbin with log link):
##
## (Intercept)
-1.888
0.562
-3.36
0.00079 ***
## adultos
0.990
0.146
6.76
1.4e-11 ***
## child
1.072
0.609
1.76
0.07818 .
## camper
0.903
0.368
2.45
0.01425 *
## child:camper
-1.585
0.683
-2.32
0.02032 *
## Log(theta)
-0.848
0.436
-1.94
0.05202 .
0.461
-5.01
5.6e-07 ***
1.110
0.191
5.81
6.2e-09 ***
-1.028
0.234
-4.40
1.1e-05 ***
1.018
0.325
3.14
0.0017 **
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Theta: count = 0.428
## Number of iterations in BFGS optimization: 14
## Log-likelihood: -392 on 10 Df
##### proceso binomial (Distingue entre grupos que pescan algo y lo que no pes
can nada):
# Los grupos con ms nios tienen menos probabilidades de pescar algo (coefici
ente de child negativo)
# Cuantos ms adultos haya, ms probabilidades hay de pescar algo.
# Los grupos que van en caravana tienen ms probabilidades de pescar algo.
##### proceso conteo (predice el nmero de peces pescados por los grupos que p
escan algo):
# Cuantos ms adultos, ms se pesca.
# Los grupos que van en caravana pescan ms que los que no.
# Cuantos ms nios, ms se pesca (ojo, p>0.05, no podemos estar muy seguros d
e esto). En cambio,
# si se va en caravana, cuantos ms nios se lleven, menos se pesca.
facet_wrap(~camper) +
labs(x = "Adultos", y = "Nmero de peces predichos")
##Cuidado con esta figura, que es engaosa!! En realidad no hay grupos con 4
adultos y 3 nios. El mximo de personas en un grupo es ms bajo:
max(fish$adultos+fish$child)
## [1] 4
##Luego esta prediccin es una extrapolacin para la que no tenemos datos sufi
cientes. Limitemos las predicciones a las combinaciones que sabemos que existe
n:
Paquetes empleados:
Este documento html est confeccionado con R-Markdown desde RStudio 0.98.978. El
cdigo est hecho con R version 3.1.1 (2014-07-10) as como con los
paquetes ggplot2 1.0.0, VGAM 0.9.4, gridExtra 0.9.1, lattice 0.20.29, pscl 1.4.6, l
mtest 0.9.33 y MASS 7.3.33