Anda di halaman 1dari 63

En esta sesin vamos a usar estos

paquetes: ggplot2 , VGAM , gridExtra , lattice , pscl , lmtest , MASS . Asegrate


de tenerlos instalados (ya sabes: install.packages(c("ggplot2", "VGAM",
"gridExtra", "lattice","pscl", "lmtest", "MASS"))

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.

Modelos truncados por ceros


Comencemos mostrando algunos ejemplos de este tipo de datos:

encuestas en las que se preguntamos a participantes el nmero de veces


que participan en una actividad. Por ejemplo, i) el nmero de veces por ao que un
visitante de un parque visita ese parque; ii) el nmero de veces que un paciente ha
estado hospitalizado; iii) el nmero de delitos por los que ha sido condenada una
persona que est en la carcel; iv) el nmero de veces hemos fotografiado a un
individuo con una cmara trampa;v) el nmero de veces que un conductor tuvo que
hacer el exmen prctico.
datos que por su propia naturaleza no pueden tomar el valor de 0. Por ejemplo, i) el
nmero de individuos que forman un grupo; ii) el tiempo mediano de germinacin
de un conjunto de semillas; iii) el nmero de das que un paciente pasa
hospitalizado; iv) el nmero de idiomas que habla una persona.

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){

datosPoissonAux <-rpois(1000, lambda=i) #Creo 1000 observaciones proveniente


s de una distribucin de Poisson con mu=i (en la funcin rpois, llaman lambda
a mu).
cortes <- seq(from=min(datosPoissonAux)-0.1, to=max(datosPoissonAux)+0.9, by
=1)
h <- hist(datosPoissonAux, plot = FALSE,breaks=cortes)
colores <- ifelse(h$breaks<0.9, "red", "grey80")
plot(h, col=colores, main=bquote(mu == .(i)))
}

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.

Y cmo se eliminan los ceros?


Esta seccin puede parecer complicada, pero en realidad es muy sencilla.
Vamos a ello. Recordemos que la funcin de distribucin de probabilidad de
Poisson es:

f(yi;i|yi0)=yi eiyi!f(yi;i|yi0)=yi eiyi!


Con esta funcin podemos estimar la probabilidad de que nuestra variable
respuesta tome un valor yiyi, sabiendo que sigue una distribucin de Poisson
con media ii.
Veamos un ejemplo: Cul es la probabilidad de observar un valor de 2 para
nuestra VR, si sabemos que se distribuye de acuerdo a una distribucin de
Poisson con media 2? y la de que VR sea 0?
media<- 2
observado<- c(2, 0)
nuestroPoisson<- function(mu, observed){
prob<- ((mu^observed)*(exp(-mu))) / factorial(observed)
return(prob)
}
nuestroPoisson(mu=media,observed=observado)

## [1] 0.2707 0.1353


##Por supuesto, existe una funcin en R que calcula estas probabilidades:
dpois(x=c(2,0), lambda=2)
## [1] 0.2707 0.1353

En los modelos sin ceros, excluimos la posibilidad de que la VR tome el valor 0


simplemente dividiendo las probabilidades del resto de valores posibles por [1 prob(0)]. As pues, sustituyendo en la ecuacin anterior, podemos calcular la
probabilidad de que VR sea 0:

f(0;i)=0 ei0!=eif(0;i)=0 ei0!=ei ;


recuerda: 0! = 1 ;-)
con esto, podemos recalcular las probabilidades del resto de valores:

f(yi;i|yi>0)=yi ei(1ei)yi!f(yi;i|yi>0)=yi ei(1e


i)yi!
Siguiendo con nuestro ejemplo anterior, podemos recalcular la probabilidad de
que VR=2, sabiendo que el 0 no vale:
media<- 2
observado<- 2

prob2<- dpois(x=2, lambda=2)


prob0<- dpois(x=0, lambda=2)

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.

Manos a la obra: modelos truncados por ceros


Vamos a usar una base de datos para analizar los factores que explican la duracin de la
estancia de los pacientes en un hospital. Comencemos cargando y explorando un poco
los datos:
hospital<-read.table(paste(raiz,"Datos/hospital.txt",sep=""),header=T)
str(hospital)
## 'data.frame':

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)
##

stay age hmo died

## 1

## 2

## 3

## 4

## 5

## 6

tail(hospital)
##

stay age hmo died

## 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))

#Vemos que N_days nunca vale 0

Vamos a tratar de predecir el nmero de das en funcin de las siguientes variables


explicativas:

age ,

el grupo de edad al que pertenece el paciente. Vara entre 1 y 9.


hmo , indica si el paciente tiene seguro mdico (1) o no (0).
died , indica que el paciente falleci en el hospital.

#vamos a decirle a R que los factores son factores :)


hospital$hmo<- factor(hospital$hmo)
hospital$died<- factor(hospital$died)

Lo primero, como siempre, es explorar los datos. Aprovechando la oportunidad, vamos


a probar un paquete muy til para hacer grficos, ggplot2 .
library(ggplot2)
library(gridExtra) #Habra que instalarlas si no estn, Ya sabes; install.pack
ages()
## Loading required package: grid
#En ggplot, las figuras se hacen de una manera un poco distinta a lo que hemos
visto hasta ahora, creando primero una "capa base", a la que despus se le van
aadiendo distintas capas. En este caso vamos a crear:
#1. Capa base, que indica los datos que vamos a usar, y los ejes
ggplot(hospital, aes(factor(age), stay)) +
#2. Capa con violinplots (muy tiles para ver como se distribuyen las observac
iones)
geom_violin() +
#3. capa con los puntos. Aadimos un poco de ruido para que no se superpongan
unos con otros.
geom_jitter(size=1.5,position = position_jitter(width = 0.2)) +
#4. capa con un ajuste LOESS que indica como vara stay en funcin de la edad.
stat_smooth(aes(x = age, y = stay), method="loess") +
#5. Hay muchos valores bajos y algunos muy altos. Como no hay ceros, podemos h
acer una escala logartmica en el eje y:
scale_y_log10()

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 riesgo de morir aumenta con la edad.

A edades bajas, la proporcin de gente que falleci es mayor entre los no


asegurados que entre los asegurados. Despus, la cosa parece igualarse.

Construccin del modelo


La distribucin de la variable respuesta

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

El valor medio de stayistayi se vincular al predictor lineal mediante la funcin de


vnculo logartmica (log(i)=ilog(i)=i).
Ajuste del modelo

Empezemos ajustando un glm Poisson truncado por ceros. Para usar este tipo de
modelos, vamos a cargar el paquete VGAM (que habr que instalar):

#install.packages("VGAM") #Si no est instalado


library(VGAM)
## Loading required package: splines
## Loading required package: stats4
m1<- vglm(stay ~ age + hmo + died + age:hmo + age:died + hmo:died
pospoisson(), data = hospital)
summary(m1)
##
## Call:
## vglm(formula = stay ~ age + hmo + died + age:hmo + age:died +
##

hmo:died, family = pospoisson(), data = hospital)

##
## Pearson residuals:
##
## log(lambda)

Min

1Q Median

-3 -1.7

3Q Max

-0.58 0.97

21

##
## Coefficients:
##
## (Intercept)

Estimate Std. Error z value


2.4285

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
##

## Number of linear predictors:

##
## 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,
##

family = pospoisson(), data = hospital)

##
## Pearson residuals:
##
## log(lambda)

Min

1Q Median

-3 -1.7

3Q Max

-0.57 0.96

21

##
## Coefficients:
##
## (Intercept)

Estimate Std. Error z value


2.425

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:
##

## Name of linear predictor: log(lambda)


##
## Dispersion Parameter for pospoisson family:

##
## Log-likelihood: -6908 on 1487 degrees of freedom
##
## Number of iterations: 4

Podemos comparar m1 y m2 haciendo un LRT, o por medio de AIC:


lrtest(m1,m2)
## Likelihood ratio test
##
## Model 1: stay ~ age + hmo + died + age:hmo + age:died + hmo:died
## Model 2: stay ~ age + hmo + died + age:hmo + hmo:died
##

#Df LogLik Df Chisq Pr(>Chisq)

## 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:
##

Estimate Std. Error z value

## (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
##

#Df LogLik Df Chisq Pr(>Chisq)

## 1 1487

-6908

## 2 1488

-6908

0.18

0.67

#ok. quitemos la interaccion age:hmo


m4<- vglm(stay ~ age + hmo + died
summary(m4)

, family = pospoisson(), data = hospital)

##
## 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:
##

Estimate Std. Error z value

## (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
##

#Df LogLik Df Chisq Pr(>Chisq)

## 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

, family = posnegbinomial(), data = hospi

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

-0.23 0.45 9.9

## log(size) -13.8 -0.29

0.46 0.76 1.1

##
## Coefficients:

##

Estimate Std. Error z value

## (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

Hummm este modelo tiene 2 interceptas. Que no cunda el pnico! (Intercept):1 es


la intercepta clsica, mientras que (Intercept):2 es el valor estimado para el
parmetro (sobredispersin) de la binomial negativa. Recuerda que en una binomial
negativa:
E(Y)=E(Y)=
var(Y)=+2var(Y)=+2
Es decir, que cuando difiere de 0 (como en el caso de nuestro modelo m4nb), la
varianza es mayor que la esperable de acuerdo a una distribucin de Poisson. De hecho,
si comparamos m4 con m4nb:
AIC(m4)
## [1] 13826
AIC(m4nb)
## [1] 9521

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

, family = posnegbinomial(), data = hospital)

##
## Model 1: stay ~ age + hmo + died
## Model 2: stay ~ hmo + died
##

#Df LogLik Df Chisq Pr(>Chisq)

## 1 2981

-4755

## 2 2982

-4756

1.43

0.23

#los dos modelos no difieren, luego nos quedamos con el ms sencillo.


summary(m5nb)
##
## Call:
## vglm(formula = stay ~ hmo + died, family = posnegbinomial(),
##

data = hospital)

##
## Pearson residuals:
##
## log(munb)

Min

1Q Median

3Q Max

-1.4 -0.71

-0.22 0.44 8.7

## log(size) -16.5 -0.30

0.45 0.76 1.0

##
## Coefficients:
##

Estimate Std. Error z value

## (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:
##

## Log-likelihood: -4756 on 2982 degrees of freedom


##
## Number of iterations: 4

Validacion del modelo

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)

p1<-ggplot(data = NULL, aes(x=F1, y=E1)) +


stat_smooth(aes(x = F1, y = E1), method="gam") +
geom_jitter(size=0.5,position = position_jitter(width = 0.05))

#Veamos tambien si hay patrones para nuestras variables explicativas:


p2<-ggplot(data = hospital, aes(factor(age), y=E1))+
ylab("Pearson residuals") +
stat_boxplot()+
geom_hline(h=0, colour=2)

p3<-ggplot(data = hospital, aes(factor(hmo), y=E1)) +


ylab("Pearson residuals") +
stat_boxplot()+
geom_hline(h=0, colour=2)

p4<-ggplot(data = hospital, aes(factor(died), y=E1)) +


ylab("Pearson residuals") +
stat_boxplot()+
geom_hline(h=0, colour=2)

grid.arrange(p1,p2,p3,p4,ncol=2) ##Esta funcin nos permite colocar las 4 figu


ras juntas

De acuerdo, no parece observarse ningn patrn claro.


Interpretacin del modelo

Ahora viene la mejor parte: interpretar nuestro modelo. Recordemos que las VEs que
han resistido nuestro escrutinio han sido:

con un valor de -0.146. Esto quiere decir que, independientemente de si muere


o vive (no hay interaccin), un paciente con seguro pasa menos das hospitalizado
que uno sin seguro.

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!

Prueba t mismo #1:


Calcula el nmero de das que predice nuestro modelo para las combinaciones de las
VEs que quedan.

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)
##

stay age hmo died

pred

## 1

0 10.629

## 2

9.265

## 3

7.516

## 4

0 10.629

## 5

8.596

## 6

8.596

Modelos inflados por ceros


En ecologa no es muy habitual encontrar conteos en los que no pueda aparecer el valor 0.
Sin embargo, s que es mucho ms usual encontrar datos de conteos en los que hay un
numero de ceros mayor que el que cabra esperar de acuerdo a una distribucin de
Poisson o una binomial negativa.
Esto puede causar problemas en nuestros modelos ya que, de no tener en cuenta el
exceso de ceros:

Las estimas de los coeficientes pueden ser poco fiables.


Puede haber sobredispersin.

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

-0.896 -0.558 -0.402 -0.956 0.437 ...

##

$ zg

: num

3.05 1.746 0.28 -0.602 0.528 ...

##

$ 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.

Modelos inflados y alterados


Ahora vamos a hablar de ZIP y ZAP (y de ZINB y ZANB). !No confundir
con estos!
Hay bsicamente dos estrategias para lidiar con el problema de los ceros:
1. Asumir que todos los ceros son iguales (sin distinguir entre falsos y autnticos). Este
tipo de modelos constan de dos partes: en una primera parte se consideran todos los
datos como ceros o no-ceros y se modela la probabilidad de que una observacin sea
cero (en funcin de las variables explicativas seleccionadas) usando un modelo
binomial. Posteriormente, las observaciones que no son cero se modelizan usando
modelos truncados por ceros, como los que acabamos de ver. Afortunadamente hay
funciones de R que realizan simultneamente ambos procesos. Estos modelos se
llaman Modelos en dos partes o modelos ZAP o ZANB; ZA es por Zero Altered, P
indica el uso de la distribucin de Poisson y NB el de la binomial negativa.
2. Asumir que los ceros proceden de dos procesos distintos: el proceso binomial y el
proceso de Poisson. Igual que en los ZAP, se hace un glm binomial para modelizar la
probabilidad de medir un 0 (los falsos ceros; por ejemplo cuando el observador no ha

visto a ningn individuo de la especie en cuestin a pesar de que est presente).


Posteriormente se modeliza la probabilidad de obtener el resto de valores, incluyendo
ceros (los ceros autnticos; por ejemplo cuando el hbitat no es adecuado para la
especie en cuestin). Estos modelos se llaman Modelos mezclados(mixture models) o
modelos ZIP (Zero Inflated) o ZINB.
Ambos tipos de modelos nos permiten abordar el exceso de ceros. La eleccin de uno u
otro modelo debera basarse en conocimiento a priori de las fuentes de ceros en nuestro
problema. En principio, si consideramos que por algn motivo hay una gran cantidad de
falsos ceros en nuestros datos, deberamos decantarnos por modelos ZI(P/NB), que nos
van a permitir descubrir los motivos que llevan a medir falsos ceros (y tal vez tomar
medidas para evitarlos en futuros trabajos). Si por el contrario pensamos que la mayora
de los ceros son autnticos aunque haya muchos (e.g. cuando una especie es muy
selectiva en cuanto a las condiciones ambientales en las que aparece, pero somos
capaces de detectarla sin muchos problemas), podemos optar por los ZA(P/NB).

Ok, empecemos por los ZA(P/NB).


Como acabamos de ver, los ZAP (o hurdle models) son conceptualmente muy sencillos:
primero realizamos una regresin binomial para estimar la probabilidad de que una
observacin sea cero; despus, usamos un modelo truncado por ceros para analizar los
datos que no son cero.
Vamos a seguir con el ejemplo de los pescadores. Supongamos que los gestores del
parque quieren vigilar especialmente a los grupos de gente que pescan muchos ms
peces de la cuenta. En cuanto a la gente que no pesca nada, les da igual si es porque
sean psimos pescadores o porque en realidad no hayan ido a pescar; el objetivo es
conocer las caractersticas de los grupos que pescan mucho. En resumen, queremos
conocer los factores que determinan el nmero de peces pescados por los grupos,
teniendo en cuenta que hay muchos grupos que no pescan ningn pez.
Como siempre, lo primero es echarle un ojo a las variables:
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

-0.896 -0.558 -0.402 -0.956 0.437 ...

##

$ zg

: num

3.05 1.746 0.28 -0.602 0.528 ...

##

$ count

: int

0 0 0 0 1 0 0 0 0 1 ...

head(fish)

##

nofish livebait camper persons child

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)
##

nofish livebait camper persons child

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)

histogram(~count | adultos, data = fish,

type = "count")

#... parece que nadie pesca solo


histogram(~count | child, data = fish,

type = "count")

#... parece que si se va con nios no se va a pescar, o no se pesca casi nada


histogram(~count | camper, data = fish,

type = "count")

#... parece que quienes llevan caravana pescan ms que quienes no

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

## -3.9008 -0.6511 -0.4518

3Q

Max

0.0511 17.5950

##
## Count model coefficients (truncated poisson with log link):
##
## (Intercept)

Estimate Std. Error z value Pr(>|z|)


-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

## Zero hurdle model coefficients (binomial with logit link):


##
## (Intercept)

Estimate Std. Error z value Pr(>|z|)


-1.7718

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

## --## Signif. codes:

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:

Recuerda! aunque una variable no sea significativa por s sola, no


debemos eliminarla del modelo si forma parte de una interaccin
significativa.
#quitamos adultos:child de poisson:
f1A<- formula(count ~ adultos + child + camper +

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)

Zap1A<- hurdle(f1A, dist = "poisson",link = "logit", data = fish)

Zap1B<- hurdle(f1B, dist = "poisson",link = "logit", data = fish)

#Comparamos los modelos simplificados con el original:

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

lrtest(Zap1, Zap1A) ##Esta funcin lrtest es la de lmtest, no la del paquete V


GAM, que aqui no sirve
## Likelihood ratio test
##
## Model 1: count ~ adultos + child + camper + adultos:child + adultos:camper
+
##

camper:child | adultos + child + camper + adultos:child +

##

adultos:camper + camper:child

## Model 2: count ~ adultos + child + camper + adultos:camper + camper:child |


##

adultos + child + camper + adultos:child + adultos:camper +

##
##

camper:child
#Df LogLik Df Chisq Pr(>Chisq)

## 1

14

-723

## 2

13

-726 -1

6.83

0.009 **

## --## Signif. codes:

0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

lrtest(Zap1, Zap1B)

## Likelihood ratio test


##
## Model 1: count ~ adultos + child + camper + adultos:child + adultos:camper
+
##

camper:child | adultos + child + camper + adultos:child +

##

adultos:camper + camper:child

## Model 2: count ~ adultos + child + camper + adultos:child + adultos:camper


+
##

camper:child | adultos + child + camper + adultos:camper +

##

camper:child

##

#Df LogLik Df Chisq Pr(>Chisq)

## 1

14

-723

## 2

13

-723 -1

0.15

0.69

AIC(Zap1, Zap1A, Zap1B)


##

df

AIC

## Zap1

14 1473

## Zap1A 13 1478
## Zap1B 13 1471

El modelo sin adultos:child en la parte binomial ( Zap1B ) es mejor (no difiere


de Zap1 de acuerdo al LRT y tiene un AIC menor. En cambio, quitar adultos:child de la
parte Poisson empeora nuestro modelo bastante (como ya caba esperar de acuerdo al pvalor de summary ). Por lo tanto, eliminamos adultos:child de la parte binomial y
seguimos refinando el modelo:
summary(Zap1B)
##
## Call:
## hurdle(formula = f1B, data = fish, dist = "poisson", link = "logit")
##
## Pearson residuals:
##

Min

1Q

Median

## -3.7437 -0.6593 -0.4503

3Q

Max

0.0325 16.9913

##
## Count model coefficients (truncated poisson with log link):

##

Estimate Std. Error z value Pr(>|z|)

## (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

## Zero hurdle model coefficients (binomial with logit link):


##

Estimate Std. Error z value Pr(>|z|)

## (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

## --## Signif. codes:

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:

f1C<- formula(count ~ adultos + child + camper +

adultos:child + adultos:camp

er + camper:child |
adultos + child + camper +

camper:child)

Zap1C<- hurdle(f1C, dist = "poisson",link = "logit", data = fish)

lrtest(Zap1B, Zap1C)
## Likelihood ratio test
##

## Model 1: count ~ adultos + child + camper + adultos:child + adultos:camper


+
##

camper:child | adultos + child + camper + adultos:camper +

##

camper:child

## Model 2: count ~ adultos + child + camper + adultos:child + adultos:camper


+
##
##

camper:child | adultos + child + camper + camper:child


#Df LogLik Df Chisq Pr(>Chisq)

## 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

## -3.3486 -0.6905 -0.4427

3Q

Max

0.0864 15.4957

##
## Count model coefficients (truncated poisson with log link):
##
## (Intercept)

Estimate Std. Error z value Pr(>|z|)


-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

## adultos:camper

0.81541

8.0e-05 ***

## child:camper

-0.8718

0.2348

-3.71

0.00021 ***

## Zero hurdle model coefficients (binomial with logit link):


##

Estimate Std. Error z value Pr(>|z|)

## (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

## --## Signif. codes:

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
+
##

camper:child | adultos + child + camper + camper:child

## Model 2: count ~ adultos + child + camper + adultos:child + adultos:camper


+
##
##

camper:child | adultos + child + camper


#Df LogLik Df Chisq Pr(>Chisq)

## 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

## -3.4206 -0.7351 -0.4477

3Q

Max

0.0481 15.7656

##
## Count model coefficients (truncated poisson with log link):
##

Estimate Std. Error z value Pr(>|z|)

## (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

## Zero hurdle model coefficients (binomial with logit link):


##
## (Intercept)

Estimate Std. Error z value Pr(>|z|)


-2.309

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")

p1<-ggplot(data = NULL, aes(x=F1, y=E1)) +


stat_smooth(aes(x = F1, y = E1), method="gam") +
ylab("Pearson residuals") +
xlab("Fitted values") +
geom_jitter(size=1,position = position_jitter(width = 0.05))

#Veamos tambien si hay patrones para nuestras variables explicativas:


p2<-ggplot(data = fish, aes(factor(adultos), y=E1))+
ylab("Pearson residuals") +
stat_boxplot()+
geom_hline(h=0, colour=2)

p3<-ggplot(data = fish, aes(factor(child), y=E1)) +


ylab("Pearson residuals") +
stat_boxplot()+
geom_hline(h=0, colour=2)

p4<-ggplot(data = fish, aes(factor(camper), y=E1)) +


ylab("Pearson residuals") +
stat_boxplot()+
geom_hline(h=0, colour=2)

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.

Atencin! El haber ajustado primero el modelo ZAP se debe a motivos


puramente pedaggicos. Cuando analices tus propios datos es
conveniente seleccionar el tipo de modelo antes de pasar a las etapas de
seleccin de variables y validacin. La existencia de algunos valores
de count muy elevados es un indicador de que puede haber
sobredispersin en los datos.
ZANB
La mejor forma de ver si elegimos el modelo ZAP o el ZANB es ajustar ambos modelos
(saturados) y compararlos:
f1<-formula(count ~ adultos + child + camper + adultos:child + adultos:camper
+ camper:child |
adultos + child + camper + adultos:child + adultos:camper + camper
:child)
#Modelo poisson:
Zap1<- hurdle(f1, dist = "poisson",link = "logit", data = fish)
#Modelo binomial negativa:
Zanb1<- hurdle(f1, dist = "negbin",link = "logit", data = fish)

lrtest(Zap1, Zanb1) #Recuerda que un modelo poisson y un NB pueden compararse


por medio de LRT!
## Likelihood ratio test
##
## Model 1: count ~ adultos + child + camper + adultos:child + adultos:camper
+
##

camper:child | adultos + child + camper + adultos:child +

##

adultos:camper + camper:child

## Model 2: count ~ adultos + child + camper + adultos:child + adultos:camper


+

##

camper:child | adultos + child + camper + adultos:child +

##

adultos:camper + camper:child

##

#Df LogLik Df Chisq Pr(>Chisq)

## 1

14

-723

## 2

15

-390

665

<2e-16 ***

## --## Signif. codes:

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.

Prueba t mismo #2:

Partiendo de Zanb1 , selecciona las variables explicativas, eliminando la menos


significativa en cada paso.
Valida t modelo. Hay algn patrn en los residuos?
Interpreta tu modelo. que variables influyen en que se cojan o no peces? y en el
nmero de peces pescados?

Llega el turno de los ZIP(NB).


Como ya dijimos antes, la principal diferencia entre los ZAP y los ZIP es que en estos
ltimos estamos interesados en distinguir los distintos orgenes de los ceros observados,
es decir, consideramos que hay ceros autnticos y ceros falsos. Vamos a utilizar una
nueva base de datos para ver estos modelos (datos de Hemmingsen et al. 2005):
ParasiteCod<-read.table(paste(raiz,"Datos/ParasiteCod.txt", sep=""), header=T)
str(ParasiteCod)
## 'data.frame':

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

148 144 146 138 40 68 52 3848 2576 1972 ...

##

$ 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

La columna Intensity recoge el nmero de individuos de un determinado parsito


encontrados en ejemplares de bacalao capturados en distintos aos y areas de la costa de
Noruega. Adems tenemos informacin acerca de ciertas caractersticas de cada bacalao.
Vamos a tratar de analizar el nmero de parsitos en funcin del ao ( Year ), la zona de
estudio ( Area ) y la longitud del bacalao ( Length )
Antes de nada, vamos a decirle a R que tanto Area como Year son factores, y no
variables cuantitativas.
ParasiteCod$fArea <- factor(ParasiteCod$Area)
ParasiteCod$fYear <- factor(ParasiteCod$Year)

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, ]

Observemos ahora la distribucin del nmero de parsitos en nuestros bacalaos:


plot(table(ParasiteCod2$Intensity))

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.

Entonces, cual es la probabilidad de observar un 0?


Supongamos que Pr(Yi)Pr(Yi) es la probabilidad de que un
bacalao ii tenga YiYi parsitos. La probabilidad de que YiYi sea 0 es en realidad la suma
de los falsos ceros, ms la probabilidad de que, una vez eliminadas las observaciones que
no son falsos ceros, se produzca un cero autntico:
Pr(Yi=0) = Pr(falsos ceros) + (1Pr(falsos ceros)) x Pr(ceros autnticos)Pr(Yi=0) = Pr
(falsos ceros) + (1Pr(falsos ceros)) x Pr(ceros autnticos)
Esto es, dividimos los datos en dos grupos: el primero contiene slo ceros (los falsos
ceros), y el segundo contiene tanto ceros como otros nmeros (mayores que cero). Sin
embargo, estos grupos son imaginarios; no sabemos qu ceros pertenecen a cada uno de
los grupos (aunque s sabemos que las que no son cero pertenecen al segundo grupo).
Es fcil ver que el primer grupo se puede estudiar usando una distribucin binomial,
donde es la probabilidad de observar un falso cero. Es decir:

Pr(Yi=0) = i+(1i) x Pr(ceros autnticos)Pr(Yi=0) = i+(1i) x Pr(ceros autnticos),


mientras que para el segundo grupo se puede usar una distribucin para conteos que
permita la obtencin de ceros: Poisson (o binomial negativa en caso de sobredispersin).
En el caso de Poisson, como ya hemos visto, la probabilidad de observar un cero es:

Pr(0;i)=0 ei0! = eiPr(0;i)=0 ei0! = ei ;


Con lo que finalmente obtenemos que la probabilidad de observar un 0 (del tipo que sea)
es:

Pr(Yi=0) = i+(1i) x eiPr(Yi=0) = i+(1i) x ei


Adems, siguiendo un procedimient anlogo se llega facilmente a estimar la probabilidad
de observar un valor mayor que cero (la probabilidad de que un pez tenga parsitos y que
adems haya quedado registrado correctamente):

Pr(Yi>0) = (1i) x yieiyi!Pr(Yi>0) = (1i) x yieiyi!


Y una vez aqui, qu? Con estas dos frmulas podemos contruir la funcin de probabilidad
en la que se basan los modelos ZIP.

Sabras calcular la probabilidad de observar 0 parsitos


si i=0.3i=0.3 y i=5i=5? y 4 parsitos?
En realidad es fcil ver que lo nico que tendremos que modelizar son los valores
de ii (binomial) y de ii (Poisson) en funcin de las covariables que elijamos:

i=ebin1+ebini=ebin1+ebin, donde binbin es la funcin vnculo de la parte


binomial del modelo (bin+1binx1bin+...+nbinxnbinbin+1binx1bin+...+nbinxnbin)

i=epoii=epoi , donde poipoi es la funcin vnculo de la parte poisson del modelo


(poi+1poix1poi+...+npoixnpoipoi+1poix1poi+...+npoixnpoi)
Afortunadamente, hay funciones de que utilizan procedimientos de mxima verosimilitud
para los coeficientes binbin y poipoi, as como sus errores estndar.

Manos a la obra. Bacalaos usando ZIP y ZINB.


En este caso, nos interesa predecir tanto el nmero de parsitos en los bacalaos que han
podido ser infectados como la probabilidad de que un bacalao no tenga parsitos por no
haber estado expuesto. La distincin fundamental con respecto a los modelos ZA es que
queremos distinguir entre los falsos ceros y los ceros autnticos.
Para ajustar estos modelos vamos a usar de nuevo el paquete pscl ; en este caso, la
funcin zeroinfl . Construimos un modelo saturado que incluye el ao, el rea, la
interaccin ao:area y la longitud del bacalao.

Prueba t mismo #3:


Representa grficamente la distribucin del nmero de parsitos en funcin de las
variables explicativas seleccionadas ( fYear , fArea y Length ) cmo interpretas estas
figuras?

Construimos un modelo ZIP saturado, y en paralelo, un modelo ZINB, y elegimos el que


mejor se ajusta a nuestros datos:
f1<-formula(Intensity ~ fArea * fYear + Length | fArea*fYear + Length)

Zip1 <- zeroinfl(f1, dist = "poisson",link = "logit", data = ParasiteCod2)


Zinb1 <- zeroinfl(f1, dist = "negbin",link = "logit", data = ParasiteCod2)

lrtest(Zip1,Zinb1)
## Likelihood ratio test
##
## Model 1: Intensity ~ fArea * fYear + Length | fArea * fYear + Length
## Model 2: Intensity ~ fArea * fYear + Length | fArea * fYear + Length
##

#Df LogLik Df Chisq Pr(>Chisq)

## 1

26

-6818

## 2

27

-2450

8734

<2e-16 ***

## --## Signif. codes:


AIC(Zip1,Zinb1)

0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

##

df

## Zip1

26 13687

## Zinb1 27

AIC

4955

El modelo ZINB es claramente superior al ZIP. A partir de ahora trabajaremos sobre l.


Vamos a seleccionar las variables explicativas de forma similar a lo que hicimos en los
modelos ZA:
summary(Zinb1)
##
## Call:
## zeroinfl(formula = f1, data = ParasiteCod2, dist = "negbin", link = "logit"
)
##
## Pearson residuals:
##

Min

1Q Median

3Q

Max

## -0.614 -0.443 -0.358 -0.125 11.453


##
## Count model coefficients (negbin with log link):
##

Estimate Std. Error z value Pr(>|z|)

## (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):
##

Estimate Std. Error z value Pr(>|z|)

## (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 **

## --## Signif. codes:

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)

Zinb1A <- zeroinfl(f1A, dist = "negbin",link = "logit", data = ParasiteCod2)


Zinb1B <- zeroinfl(f1B, dist = "negbin",link = "logit", data = ParasiteCod2)

lrtest(Zinb1, Zinb1A)
## Likelihood ratio test
##
## Model 1: Intensity ~ fArea * fYear + Length | fArea * fYear + Length
## Model 2: Intensity ~ fArea + fYear + Length | fArea * fYear + Length
##

#Df LogLik Df Chisq Pr(>Chisq)

## 1

27

-2450

## 2

21

-2458 -6

14.2

0.027 *

## --## Signif. codes:

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
##

#Df LogLik Df Chisq Pr(>Chisq)

## 1

27

-2450

## 2

21

-2460 -6

18.9

0.0044 **

## --## Signif. codes:

0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

AIC(Zinb1, Zinb1A, Zinb1B)


##

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:

#Elimino Area:Year de la parte binomial


f2B<-formula(Intensity ~ fArea*fYear + Length | fArea+fYear + Length)
Zinb2B <- zeroinfl(f2B, dist = "negbin",link = "logit", data = ParasiteCod2)
lrtest(Zinb1, Zinb2B)
## Likelihood ratio test
##
## Model 1: Intensity ~ fArea * fYear + Length | fArea * fYear + Length
## Model 2: Intensity ~ fArea * fYear + Length | fArea + fYear + Length
##

#Df LogLik Df Chisq Pr(>Chisq)

## 1

27

-2450

## 2

21

-2460 -6

18.9

0.0044 **

## --## Signif. codes:

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)

nb1A<-glm.nb(Intensity ~ fArea+fYear + Length, data = ParasiteCod2)

vuong(Zinb1, nb1A)
## Vuong Non-Nested Hypothesis Test-Statistic: -61.27
## (test-statistic is asymptotically distributed N(0,1) under the
##

null that the models are indistinguishible)

## 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")

p1<-ggplot(data = NULL, aes(x=F1, y=E1)) +


stat_smooth(aes(x = F1, y = E1), method="gam") +
ylab("Pearson residuals") +
xlab("Fitted values") +
geom_jitter(size=1,position = position_jitter(width = 0.05))

#Veamos tambien si hay patrones para nuestras variables explicativas:


p2<-ggplot(data = ParasiteCod2, aes(fYear, y=E1))+
ylab("Pearson residuals") +
stat_boxplot()+
geom_hline(h=0, colour=2)

p3<-ggplot(data = ParasiteCod2, aes(fArea, y=E1)) +


ylab("Pearson residuals") +
stat_boxplot()+
geom_hline(h=0, colour=2)

p4<-ggplot(data = ParasiteCod2, aes(Length, y=E1)) +


stat_smooth(aes(x = Length, y = E1), method="gam") +
ylab("Pearson residuals") +
xlab("Length") +
geom_jitter(size=1,position = position_jitter(width = 0.05))

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

## -0.614 -0.443 -0.358 -0.125 11.453


##
## Count model coefficients (negbin with log link):
##

Estimate Std. Error z value Pr(>|z|)

## (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):


##

Estimate Std. Error z value Pr(>|z|)

## (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 **

## --## Signif. codes:

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

Respecto a la parte del conteo del modelo:

A igualdad de todo lo dems, el log(count) del nmero de parsitos del Area4 es


0.71 unidades mayor que la del Area1, lo que equivale a decir que esperamos que un
bacalao del Area4 tenga 2.03 parsitos ms que uno del Area1.

-En el ao 2000 la abundancia de parsitos fue mayor (a igualdad de todo lo dems).


-El nmero de parsitos desciende con el tamao del bacalao (coeficiente de Length =0.036) a un ritmo de 0.96 parsitos por centmetro
Respecto a la parte binomial:
Atencin a esto, que puede haber sorpresas!. Recuerda que la parte binomial del modelo
nos indica la probabilidad de que una observacin sea un falso 0; esto quiere decir que

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:

El coeficiente para Year2001 es 3.29. Es decir, a igualdad de otros factores, en el ao


2001 es ms probable observar falsos ceros que en el ao 1999 (que es el nivel que
sirve de base).

El coeficiente para Length es de -0.039: la probabilidad de un falso 0 es menor cuanto


ms grande sea el bacalao.

Cuidado con esto, porque en los modelos ZA(P/NB), la parte binomial


nos da la probabilidad de que una observacin no sea 0, es decir, los
coeficientes (adems de diferir algo) tendrn distinto signo.
Por lo general, una buena representacin grfica suele ayuda mucho a entender nuestros
modelos:
newdata1 <- expand.grid(factor(1:4), factor(1999:2001), 17:101) ##Con esto cre
amos todas las combinaciones posibles de nuestros tres predictores
colnames(newdata1) <- c("fArea", "fYear", "Length")
newdata1$predZI <- predict(Zinb1, newdata1) ##Calculamos lo que predice nuestr
o modelo para cada combinacion de los predictores

ggplot(newdata1, aes(x = Length, y = predZI, colour = fYear)) +


geom_point() +
geom_line() +
facet_wrap(~fArea) +
labs(x = "Length", y = "Nmero de parsitos predichos")

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")

ggplot(newdata1, aes(x = Length, y = pred0, colour = fYear)) +


geom_point() +
geom_line() +
facet_wrap(~fArea) +
labs(x = "Length", y = "Probabilidad de falsos ceros")

Y para los conteos:

newdata1$predCount<-predict(Zinb1, newdata1,type="count")

ggplot(newdata1, aes(x = Length, y = predCount, colour = fYear)) +


geom_point() +
geom_line() +
facet_wrap(~fArea) +
labs(x = "Length", y = "Nmero de parsitos predichos (sin falsos ceros)")

Observa que si le decimos a predict que type="count" , el nmero de parsitos predichos


es mayor que el predicho por el modelo cuando tiene en cuenta los falsos ceros. Como ya
hemos visto antes, lo que hacemos al hacer un modelo ZI es modelizar dos procesos
distintos y combinarlos. En realidad, si lo expresamos en trminos de las tres predicciones
que acabamos de crear:

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

## [1015] TRUE TRUE TRUE TRUE TRUE TRUE

Es decir, el valor obtenido aplicando el proceso de conteo es modulado (reducido) por el


proceso binomial (los falsos ceros). Esto tiene sentido: si para cierta combinacin de
nuestros predictores el proceso de conteo predice un gran nmero de parsitos, pero a su
vez el proceso binomial predice una alta probabilidad de observar falsos ceros, nuestro
modelo va a predecir un nmero de parsitos ms bien bajo. Fjate por ejemplo en:

la diferencia para la combinacin Year2001:Area1, para la que la probabilidad de


predecir un falso cero es muy alta.
el bajo nmero de parsitos predichos para Area2, que se debe en gran medida a la
alta probabilidad de registrar falsos ceros.
la pequea diferencia entre el resultado global y el del proceso de conteo para Area4,
en la que la probabilidad de medir falsos ceros es relativamente baja.

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

SOLUCIN al Prueba t mismo #2:


############################################
######### SELECCION DE VARIABLES
############################################

fA1<-formula(count ~ adultos + child + camper + adultos:camper + camper:child


|
adultos + child + camper + adultos:child + adultos:camper + camper
:child)

fB1<-formula(count ~ adultos + child + camper + adultos:child+ adultos:camper


+ camper:child |
adultos + child + camper +

adultos:camper + camper:child)

ZanbA1<- hurdle(fA1, dist = "negbin",link = "logit", data = fish)


ZanbB1<- hurdle(fB1, dist = "negbin",link = "logit", data = fish)

lrtest(Zanb1,ZanbA1)
## Likelihood ratio test
##
## Model 1: count ~ adultos + child + camper + adultos:child + adultos:camper
+
##

camper:child | adultos + child + camper + adultos:child +

##

adultos:camper + camper:child

## Model 2: count ~ adultos + child + camper + adultos:camper + camper:child |


##

adultos + child + camper + adultos:child + adultos:camper +

##
##

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
+
##

camper:child | adultos + child + camper + adultos:child +

##

adultos:camper + camper:child

## Model 2: count ~ adultos + child + camper + adultos:child + adultos:camper


+
##

camper:child | adultos + child + camper + adultos:camper +

##

camper:child

##

#Df LogLik Df Chisq Pr(>Chisq)

## 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

## -0.76166 -0.50910 -0.29333 -0.00914

9.10048

##
## Count model coefficients (truncated negbin with log link):
##
## (Intercept)

Estimate Std. Error z value Pr(>|z|)


-1.512

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 .

## Zero hurdle model coefficients (binomial with logit link):


##
## (Intercept)
## adultos

Estimate Std. Error z value Pr(>|z|)


-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

## --## Signif. codes:

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)

fB2<-formula(count ~ adultos + child + camper + adultos:child+ adultos:camper


+ camper:child |
adultos + child + camper +

camper:child)

ZanbA2<- hurdle(fA2, dist = "negbin",link = "logit", data = fish)


ZanbB2<- hurdle(fB2, dist = "negbin",link = "logit", data = fish)

lrtest(ZanbB1,ZanbA2)
## Likelihood ratio test
##
## Model 1: count ~ adultos + child + camper + adultos:child + adultos:camper
+
##

camper:child | adultos + child + camper + adultos:camper +

##

camper:child

## Model 2: count ~ adultos + child + camper + adultos:camper + camper:child |


##
##

adultos + child + camper + adultos:camper + camper:child


#Df LogLik Df Chisq Pr(>Chisq)

## 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 | adultos + child + camper + adultos:camper +

##

camper:child

## Model 2: count ~ adultos + child + camper + adultos:child + adultos:camper


+
##
##

camper:child | adultos + child + camper + camper:child


#Df LogLik Df Chisq Pr(>Chisq)

## 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

## -0.7605 -0.5081 -0.3043 -0.0458

9.0018

##
## Count model coefficients (truncated negbin with log link):
##
## (Intercept)
## adultos

Estimate Std. Error z value Pr(>|z|)


-1.504

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 .

## Zero hurdle model coefficients (binomial with logit link):


##

Estimate Std. Error z value Pr(>|z|)

## (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

## --## Signif. codes:

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)

fB3<-formula(count ~ adultos + child + camper +

adultos:camper + camper:child

|
adultos + child + camper +

camper:child)

ZanbA3<- hurdle(fA3, dist = "negbin",link = "logit", data = fish)


ZanbB3<- hurdle(fB3, dist = "negbin",link = "logit", data = fish)

lrtest(ZanbA2,ZanbA3)
## Likelihood ratio test
##

## Model 1: count ~ adultos + child + camper + adultos:camper + camper:child |


##

adultos + child + camper + adultos:camper + camper:child

## Model 2: count ~ adultos + child + camper + camper:child | adultos + child


+
##
##

camper + adultos:camper + camper:child


#Df LogLik Df Chisq Pr(>Chisq)

## 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 |
##

adultos + child + camper + adultos:camper + camper:child

## Model 2: count ~ adultos + child + camper + adultos:camper + camper:child |


##
##

adultos + child + camper + camper:child


#Df LogLik Df Chisq Pr(>Chisq)

## 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

## -0.7577 -0.5229 -0.3030 -0.0455

8.8784

##
## Count model coefficients (truncated negbin with log link):
##

Estimate Std. Error z value Pr(>|z|)

## (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 .

## Zero hurdle model coefficients (binomial with logit link):


##

Estimate Std. Error z value Pr(>|z|)

## (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

## --## 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: -391 on 12 Df
fA4<-formula(count ~ adultos + child + camper
adultos + child + camper +

adultos:camper + camper:child)

fB4<-formula(count ~ adultos + child + camper +


adultos + child + camper +

camper:child |

camper:child)

ZanbA4<- hurdle(fA4, dist = "negbin",link = "logit", data = fish)


ZanbB4<- hurdle(fB4, dist = "negbin",link = "logit", data = fish)

lrtest(ZanbA3,ZanbA4)
## Likelihood ratio test
##
## Model 1: count ~ adultos + child + camper + camper:child | adultos + child
+
##

camper + adultos:camper + camper:child

## Model 2: count ~ adultos + child + camper | adultos + child + camper +


##
##

adultos:camper + camper:child
#Df LogLik Df Chisq Pr(>Chisq)

## 1

12

-391

## 2

11

-394 -1

5.68

0.017 *

## --## Signif. codes:

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 + adultos:camper + camper:child

## Model 2: 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

## -0.7519 -0.4814 -0.3186 -0.0228

9.0014

##
## Count model coefficients (truncated negbin with log link):
##

Estimate Std. Error z value Pr(>|z|)

## (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 .

## Zero hurdle model coefficients (binomial with logit link):


##

Estimate Std. Error z value Pr(>|z|)

## (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

## --## 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: -391 on 11 Df
fA5<-formula(count ~ adultos + child + camper

adultos + child + camper +

camper:child)

fB5<-formula(count ~ adultos + child + camper +

camper:child |

adultos + child + camper )


ZanbA5<- hurdle(fA5, dist = "negbin",link = "logit", data = fish)
ZanbB5<- hurdle(fB5, dist = "negbin",link = "logit", data = fish)

lrtest(ZanbB4,ZanbA5)
## Likelihood ratio test
##
## Model 1: count ~ adultos + child + camper + camper:child | adultos + child
+
##

camper + camper:child

## Model 2: count ~ adultos + child + camper | adultos + child + camper +


##
##

camper:child
#Df LogLik Df Chisq Pr(>Chisq)

## 1

11

-391

## 2

10

-394 -1

5.68

0.017 *

## --## Signif. codes:

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

## Model 2: count ~ adultos + child + camper + camper:child | adultos + child


+
##
##

camper
#Df LogLik Df Chisq Pr(>Chisq)

## 1

11

-391

## 2

10

-392 -1

2.18

0.14

AIC(ZanbB4,ZanbA5,ZanbB5) #Cuidadito aqui... LRT y AIC difieren... sigo con LR


T, a ver que tal:
##

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

## -0.7483 -0.5001 -0.2918 -0.0694

8.0265

##
## Count model coefficients (truncated negbin with log link):
##

Estimate Std. Error z value Pr(>|z|)

## (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 .

## Zero hurdle model coefficients (binomial with logit link):


##
## (Intercept)
## adultos
## child
## camper
## ---

Estimate Std. Error z value Pr(>|z|)


-2.309

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")

p1<-ggplot(data = NULL, aes(x=F1, y=E1)) +


stat_smooth(aes(x = F1, y = E1), method="gam") +
ylab("Pearson residuals") +
xlab("Fitted values") +
geom_jitter(size=1,position = position_jitter(width = 0.05))

#Veamos tambien si hay patrones para nuestras variables explicativas:


p2<-ggplot(data = fish, aes(factor(adultos), y=E1))+
ylab("Pearson residuals") +
stat_boxplot()+
geom_hline(h=0, colour=2)

p3<-ggplot(data = fish, aes(factor(child), y=E1)) +


ylab("Pearson residuals") +
stat_boxplot()+
geom_hline(h=0, colour=2)

p4<-ggplot(data = fish, aes(factor(camper), y=E1)) +


ylab("Pearson residuals") +
stat_boxplot()+

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

## -0.7483 -0.5001 -0.2918 -0.0694

8.0265

##
## Count model coefficients (truncated negbin with log link):
##

Estimate Std. Error z value Pr(>|z|)

## (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 .

## Zero hurdle model coefficients (binomial with logit link):


##
## (Intercept)
## adultos
## child
## camper

Estimate Std. Error z value Pr(>|z|)


-2.309

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
##### 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.

### Representacin grfica:

newdata1 <- expand.grid(unique(fish$adultos), unique(fish$child), unique(fish$


camper)) ##Con esto creamos todas las combinaciones posibles de nuestros tres
predictores
colnames(newdata1) <- c("adultos", "child", "camper")
newdata1$predZANB <- predict(ZanbB5, newdata1) ##Calculamos lo que predice nue
stro modelo para cada combinacion de los predictores

ggplot(newdata1, aes(x = adultos, y = predZANB, colour = factor(child))) +


geom_point() +
geom_line() +

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:

fish$predZANB <- predict(ZanbB5)

ggplot(fish, aes(x = adultos, y = predZANB, colour = factor(child))) +


geom_point() +
geom_line() +
facet_wrap(~camper) +
labs(x = "Adultos", y = "Nmero de peces predichos")

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

Anda mungkin juga menyukai