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