Fumigación Calandria Granaria. Para estudiar la efectividad de la

Anuncio
Fumigación Calandria Granaria. Para estudiar la efectividad de la fumigación con óxido
etileno en el escarabajo del grano, Calandra Granaria, se expusieron grupos de n individuos a
diferentes dosis x (mg/l) y se recogió el número y de individuos afectados. (Collett)
x <- c(24.8, 24.6, 23.0, 21.0, 20.6, 18.2, 16.8, 15.8, 14.7, 10.8)
y <- c(23, 30, 29, 22, 23, 7, 12, 17, 10, 0) ### afectados
n <- c(30, 30, 31, 30, 26, 27, 31, 30, 31, 24) ### total
Ajusta un modelo logístico y valora su ajuste.
¿Hay sobredispersión? Estima la sobredispersión.
Ajusta un modelo quasi-binomial. ¿Un modelo logístico con pesos?
>
>
>
>
>
>
>
x <- c(24.8, 24.6, 23.0, 21.0, 20.6, 18.2, 16.8, 15.8, 14.7, 10.8)
y <- c(23, 30, 29, 22, 23, 7, 12, 17, 10, 0) ### afectados
n <- c(30, 30, 31, 30, 26, 27, 31, 30, 31, 24) ### total
n.y <- n - y
lx <- log(x)
p.full <- y/n
v.full <- n*p.full*(1-p.full)
> round( cbind(x, y, n, n.y, lx, p.full, v.full), 3 )
[1,]
[2,]
[3,]
[4,]
[5,]
[6,]
[7,]
[8,]
[9,]
[10,]
x
24.8
24.6
23.0
21.0
20.6
18.2
16.8
15.8
14.7
10.8
y
23
30
29
22
23
7
12
17
10
0
n n.y
lx p.full v.full
30
7 3.211 0.767 5.367
30
0 3.203 1.000 0.000
31
2 3.135 0.935 1.871
30
8 3.045 0.733 5.867
26
3 3.025 0.885 2.654
27 20 2.901 0.259 5.185
31 19 2.821 0.387 7.355
30 13 2.760 0.567 7.367
31 21 2.688 0.323 6.774
24 24 2.380 0.000 0.000
> respuesta <- cbind( y, n.y ) ### para ajuste con glm de R
>
>
>
>
###
###
mlx
lx0
modelo con lx=log(x) ###
centrado de lx para disminuir la correlación de coeficientes
<- mean(lx)
<- lx-mlx
###
> m0 <- glm( respuesta ~ lx0, family=binomial(link=logit) )
> summary( m0 )
Call:
glm(formula = respuesta ~ lx0, family = binomial(link = logit))
Deviance Residuals:
Min
1Q
Median
-3.3512 -1.3534
0.1293
3Q
1.6558
Max
2.5115
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept)
0.4087
0.1450
2.819 0.00481 **
lx0
6.2654
0.7781
8.052 8.15e-16 ***
--(Dispersion parameter for binomial family taken to be 1)
Null deviance: 138.001
Residual deviance: 36.444
AIC: 68.017
on 9
on 8
degrees of freedom
degrees of freedom
1
> bm0 <- coef( m0 ) ### coeficientes del modelo m0
> v.m0 <- vcov( m0 ) ### covarianzas de los betas de m0
> se.bm0 <- sqrt( diag(v.m0) ) ### errores estándar de betas
> cor.bm0 <- v.m0[1,2] / sqrt(v.m0[1,1]*v.m0[2,2])
> cbind(bm0, se.bm0, cor.bm0) ### cor.bm0 aprox. 0
bm0
se.bm0
cor.bm0
(Intercept) 0.4086719 0.1449515 0.03680878
lx0
6.2654360 0.7781260 0.03680878
>
>
>
>
>
#####################################################
pobs <- y/n
phat <- fitted( m0 )
yhat <- phat*n
res.dev <- residuals( m0 ) ### residuos de la deviance
> round( cbind(x, pobs, phat, y, yhat, res.dev)[order(x), ], 4 )
10
9
8
7
6
5
4
3
2
1
x
10.8
14.7
15.8
16.8
18.2
20.6
21.0
23.0
24.6
24.8
pobs
0.0000
0.3226
0.5667
0.3871
0.2593
0.8846
0.7333
0.9355
1.0000
0.7667
phat
0.0494
0.2638
0.3602
0.4527
0.5773
0.7480
0.7700
0.8555
0.9002
0.9047
y
0
10
17
12
7
23
22
29
30
23
yhat
1.1845
8.1766
10.8068
14.0329
15.5866
19.4468
23.0995
26.5197
27.0063
27.1403
res.dev
-1.5586
0.7274
2.2964
-0.7377
-3.3512
1.7411
-0.4688
1.3998
2.5115
-2.2178
>
>
>
>
>
### ajuste del modelo m0 ###
dev.m0 <- deviance( m0 )
gdl <- df.residual( m0 )
pval <- 1-pchisq( deviance(m0), df.residual(m0) )
round( cbind( dev.m0, gdl, pval ), 3 )
dev.m0 gdl pval
[1,] 36.444
8
0
¿Es válido el test de ajuste del modelo?
El modelo m0 proporciona muy mal ajuste. En 4 de los 10 grupos el ajuste es muy
deficiente.
¿Posibles causas?, ¿otro link?, ¿otras explicativas?, ¿sobredispersión?
> ### plot de proporciones y modelo logístico m0 ajustado ###
>
+
+
>
>
+
>
>
glogit <- function(x) {
exp( bm0[1]+bm0[2]*(x-mlx) ) / (1+exp( bm0[1]+bm0[2]*(x-mlx)) )
}
x11()
plot( lx, pobs, xlab="log(dosis)", ylab="prob( Y=1 )", col="blue",pch=16,
main="Modelo m0: fumigación del escarabajo del grano", cex.main=0.9)
points(lx, phat, pch=3)
curve(glogit, add=T, lwd=2, col="red")
2
0.6
0.4
0.0
0.2
prob( Y=1 )
0.8
1.0
Modelo m0: fumigación del escarabajo del grano
2.4
2.6
2.8
3.0
3.2
log(dosis)
> ####################################################
>
### Modelo binomial con sobredispersion ###
>
### estimación de la dispersion ###
> X2 <- sum( (y - yhat)^2 / (n*phat*(1-phat)) )
> dispersion.X2 <- X2 / df.residual(m0) ### estimador de dispersion
> ### estimador de la dispersion basado en la deviance residual
> dispersion.dev <- deviance(m0) / df.residual(m0)
> cbind( dispersion.X2, dispersion.dev )
[1,]
dispersion.X2 dispersion.dev
4.179256
4.555456
3
> ### corrección de la covarianza de beta ###
> v.m0.X2 <- dispersion.X2 * v.m0
> v.m0.dev <- dispersion.dev * v.m0
> se.bm0.X2 <- sqrt( diag(v.m0.X2) )
> se.bm0.dev <- sqrt( diag(v.m0.dev) )
> round( cbind( bm0, se.bm0, se.bm0.X2, se.bm0.dev ), 4)
bm0 se.bm0 se.bm0.X2 se.bm0.dev
(Intercept) 0.4087 0.1450
0.2963
0.3094
lx0
6.2654 0.7781
1.5907
1.6608
> #####################################################
> ### Ajuste de modelo binomial con sobredispersion ###
> m0s <- glm( respuesta ~ lx0, family=quasibinomial(link=logit) )
> summary( m0s )
Call:
glm(formula = respuesta ~ lx0, family = quasibinomial(link = logit))
Deviance Residuals:
Min
1Q
Median
-3.3512 -1.3534
0.1293
3Q
1.6558
Max
2.5115
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept)
0.4087
0.2963
1.379
0.2052
lx0
6.2654
1.5907
3.939
0.0043 **
--(Dispersion parameter for quasibinomial family taken to be 4.179256)
Null deviance: 138.001
Residual deviance: 36.444
AIC: NA
on 9
on 8
degrees of freedom
degrees of freedom
> deviance.escalada <- deviance(m0s)/dispersion.X2
> deviance.escalada
[1] 8.72013
Podemos observar que los cambios afectan a la varianza de los estimadores de los
parámetros.
El parámetro dispersión estimado por R es el correspondiente a X2.
No es posible calcular el AIC porque no se dispone de una verdadera verosimilitud.
La deviance no escalada es la deviance residual.
La deviance escalada es ahora desconocida porque depende de la dispersión.
La deviance escalada estimada sería la deviance residual / dispersion (8.72 =
36.444/4.18), valor, 8.72, que no sirve para nada (sería exactamente 8 si usáramos
dispersión.dev).
4
En el MLG m0 podríamos comparar los modelos NULO vs m0 mediante la diferencia
de deviances:
> drop1( m0, test="Chisq" )
Single term deletions
Model:
respuesta ~ lx0
Df Deviance
AIC
LRT
Pr(Chi)
<none>
36.444 68.017
lx0
1 138.001 167.574 101.56 < 2.2e-16 ***
--Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Pero, supuesta sobredispersión, sería más adecuado hacer un test F (similar al del
modelo lineal) considerando el cociente entre la diferencia de deviances dividida por
la diferencia de gdl y la dispersión estimada mediante la deviance del modelo más
“grande” (que es la deviance residual del modelo dividida por sus gdl)
> drop1( m0, test="F" )
Single term deletions
Model:
respuesta ~ lx0
Df Deviance
AIC F value
Pr(F)
<none>
36.444 68.017
lx0
1 138.001 167.574 22.294 0.001499 **
--Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Mensajes de aviso perdidos
In drop1.glm(m0, test = "F") : F test assumes 'quasibinomial' family
La comparación de m.nulo con m0 con sobredispersión puede hacerse también
calculando directamente el test F. El denominador de F es la estimación del
parámetro dispersión en el modelo m0, el “más grande” de los dos.
> m.nulo <- glm( respuesta ~ 1, family=binomial(link=logit) )
> deviance( m.nulo )
[1] 138.0006
> F <- ((deviance(m.nulo)-deviance(m0))/(9-8))/dispersion.dev
> F
[1] 22.29348
> 1-pf(F,9-8,8)
[1] 0.001499075
5
El ajuste del modelo m0s equivale al ajuste de un modelo binomial con un peso
asignado a la observación binomial de cada grupo inverso a la dispersión estimada
(dispersion.X2 en R):
> w <- rep( 1/dispersion.X2, length(x) )
> mw <- glm( respuesta ~ lx0, weights=w, family=binomial(link=logit) )
> summary( mw )
Call:
glm(formula = respuesta ~ lx0, family = binomial(link = logit),
weights = w)
Deviance Residuals:
Min
1Q
-1.63929 -0.66204
Median
0.06325
3Q
0.80993
Max
1.22852
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept)
0.4087
0.2963
1.379
0.168
lx0
6.2654
1.5907
3.939 8.2e-05 ***
--(Dispersion parameter for binomial family taken to be 1)
Null deviance: 33.0204
Residual deviance: 8.7201
AIC: 19.318
on 9
on 8
degrees of freedom
degrees of freedom
La deviance residual de mw coincide con la deviance escalada de m0s, y no es útil para
la valoración del ajuste de mw. Obsérvese que el modelo se ajusta para que la
deviance residual sea igual a los grados de libertad.
6
> #####################################################################
> ### Estimación de la LD50 ajustada la sobredispersion: modelo m0s ###
>
>
>
+
+
bm0 <- as.numeric( bm0 )
lx.LD50 <- -bm0[1] / bm0[2]
v.lx.LD50 <- ( v.m0.X2[1,1]
( bm0[1]^2 * v.m0.X2[2,2] /
( 2 * bm0[1] * v.m0.X2[1,2]
>
>
>
>
se.lx.LD50 <- sqrt( v.lx.LD50 )
alfa <- 0.05
IC.lx.LD50.inf <- lx.LD50 - qnorm(1-alfa/2)*se.lx.LD50
IC.lx.LD50.sup <- lx.LD50 + qnorm(1-alfa/2)*se.lx.LD50
+ mlx
/ (bm0[2]^2) ) +
(bm0[2]^4) ) / (bm0[2]^3) )
> ### la LD50 e IC del 95% en la escala de log(dosis) ###
> round( cbind(lx.LD50, IC.lx.LD50.inf, IC.lx.LD50.sup), 3 )
[1,]
>
>
>
>
lx.LD50 IC.lx.LD50.inf IC.lx.LD50.sup
2.852
2.755
2.949
### la LD50 e IC del 95% en la escala de la dosis ###
x.LD50 <- exp( lx.LD50 )
IC.x.LD50.inf <- exp( IC.lx.LD50.inf )
IC.x.LD50.sup <- exp( IC.lx.LD50.sup )
> round( cbind(x.LD50, IC.x.LD50.inf, IC.x.LD50.sup), 3 )
x.LD50 IC.x.LD50.inf IC.x.LD50.sup
[1,] 17.317
15.715
19.082
7
> ### métdodo de Williams para sobredispersion
> cbind(x,lx0,y,n)
x
lx0
[1,] 24.8 0.29393347
[2,] 24.6 0.28583626
[3,] 23.0 0.21858403
[4,] 21.0 0.12761225
[5,] 20.6 0.10838089
[6,] 18.2 -0.01548859
[7,] 16.8 -0.09553130
[8,] 15.8 -0.15690025
[9,] 14.7 -0.22906269
[10,] 10.8 -0.53736405
y
23
30
29
22
23
7
12
17
10
0
n
30
30
31
30
26
27
31
30
31
24
> m0 <- glm( respuesta ~ lx0, family=binomial )
> summary( m0 )
Call:
glm(formula = respuesta ~ lx0, family = binomial)
Deviance Residuals:
Min
1Q
Median
-3.3512 -1.3534
0.1293
3Q
1.6558
Max
2.5115
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept)
0.4087
0.1450
2.819 0.00481 **
lx0
6.2654
0.7781
8.052 8.15e-16 ***
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 138.001
Residual deviance: 36.444
AIC: 68.017
on 9
on 8
degrees of freedom
degrees of freedom
Number of Fisher Scoring iterations: 5
> library( dispmod )
> m0.disp <- glm.binomial.disp( m0 )
Binomial overdispersed logit model fitting...
Iter. 1 phi: 0.1137605
Iter. 2 phi: 0.1168621
Iter. 3 phi: 0.1168823
Iter. 4 phi: 0.1168824
Converged after 4 iterations.
Estimated dispersion parameter: 0.1168824
Call:
glm(formula = respuesta ~ lx0, family = binomial, weights = disp.weights)
Deviance Residuals:
Min
1Q
Median
-1.6505 -0.6698
0.0793
3Q
0.8231
Max
1.1895
8
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept)
0.3968
0.3018
1.315
0.189
lx0
6.3638
1.6211
3.926 8.65e-05 ***
--Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 33.6443
Residual deviance: 8.6886
AIC: 19.057
on 9
on 8
degrees of freedom
degrees of freedom
Number of Fisher Scoring iterations: 5
> ### m0.disp es como m0 con pesos de Williams:
> phiWill <- m0.disp$dispersion ### parámetro phi de Williams
> wWill <- 1/(1+(n-1)*phiWill)
> summary( glm( respuesta ~ lx0, family=binomial, weights = wWill ) )
Call:
glm(formula = respuesta ~ lx0, family = binomial, weights = wWill)
Deviance Residuals:
Min
1Q
Median
-1.6505 -0.6698
0.0793
3Q
0.8231
Max
1.1895
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept)
0.3968
0.3018
1.315
0.189
lx0
6.3638
1.6211
3.926 8.65e-05 ***
--Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 33.6443
Residual deviance: 8.6886
AIC: 19.057
on 9
on 8
degrees of freedom
degrees of freedom
Number of Fisher Scoring iterations: 5
> ##########################################
> ### Construcción del algoritmo de Williams
> phat <- fitted( m0 )
> yhat <- phat*n
> X2 <- sum( (y - yhat)^2 / (n*phat*(1-phat)) )
### pesos w=1
> h <- influence(m0)$hat
> G <- length( y ); p <- length( coef(m0) )
> phi0 <- (X2-(G-p)) / sum((n-1)*(1-h))
> phi0
[1] 0.1137605
>
>
>
>
phi <- NULL ### contendrá los valores iterados en el algoritmo
i <- 0
phi[1] <- phi0
toler <- 1
9
> while( (i<20) && ( toler>0.001 ) ){
+ i <- i+1
+ phi.aux <- phi[i]
+ waux <- 1/( 1+phi.aux*(n-1) )
+ maux <- glm( respuesta ~ lx0, family=binomial, weights=waux )
+ phat.aux <- fitted( maux )
+ yhat.aux <- phat.aux*n
+ X2.aux <- sum( waux*(y - yhat.aux)^2 / (n*phat.aux*(1-phat.aux)) )
+ haux <- influence(maux)$hat
+ phi[i+1] <- (X2.aux-sum(waux*(1-haux))) / sum(waux*(n-1)*(1-haux))
+ #toler <- abs(X2.aux-X2.viejo)
+ toler <- abs(X2.aux-(G-p))
+ X2.viejo <- X2.aux
+ }
> phi
[1] 0.1137605 0.1168621 0.1168823 0.1168824
> ### pesos de Williams
> w <- 1/( 1+phi[length(phi)]*(n-1) )
> ### Modelo con sobredispersion ajustada (Williams)
> m.disp <- glm( respuesta ~ lx0, family=binomial, weights=w )
> summary( m.disp )
Call:
glm(formula = respuesta ~ lx0, family = binomial, weights = w)
Deviance Residuals:
Min
1Q
Median
-1.6505 -0.6698
0.0793
3Q
0.8231
Max
1.1895
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept)
0.3968
0.3018
1.315
0.189
lx0
6.3638
1.6211
3.926 8.65e-05 ***
--Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 33.6443
Residual deviance: 8.6886
AIC: 19.057
on 9
on 8
degrees of freedom
degrees of freedom
Number of Fisher Scoring iterations: 5
10
Descargar