diff --git a/vignettes/v06_gamma_count.Rmd b/vignettes/v06_gamma_count.Rmd index 043674176f006f42280d21ca12289316bffd3a72..2bbe0f2576b65b568946655b5b23e2cf2f8190af 100644 --- a/vignettes/v06_gamma_count.Rmd +++ b/vignettes/v06_gamma_count.Rmd @@ -5,7 +5,7 @@ author: > Eduardo E. Ribeiro Jr & Cesar A. Taconeli vignette: > - %\VignetteIndexEntry{"Análise de Contagens com Modelo Poisson Generalizado"} + %\VignetteIndexEntry{"Análise de Contagens com Modelo Gamma Count"} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- @@ -108,7 +108,6 @@ $$ ```{r, message=FALSE, error=FALSE, warning=FALSE} # Definições da sessão. -# devtools::load_all("../") library(lattice) library(latticeExtra) library(grid) @@ -218,8 +217,10 @@ rp.do(panel = panel, action = react) ## Verossimilhança e Estimação ## ```{r} +#----------------------------------------------------------------------- # Função de log-Verossimilhança da Poisson Generalizada na # parametrização de modelo de regressão. + MRDCr::llgcnt #----------------------------------------------------------------------- @@ -342,8 +343,6 @@ dev.off() # Tamanho das covariâncias com \alpha. each(sum, mean, max)(abs(V[1, -1])) - -opts_chunk$set(eval = FALSE) ``` ```{r} @@ -390,14 +389,27 @@ aux <- confint(glht(m0, linfct = X), calpha = univariate_calpha())$confint colnames(aux)[1] <- "fit" pred$pois <- cbind(pred$pois, exp(aux)) -str(pred$pois) # Preditos pela Quasi-Poisson. aux <- confint(glht(m0, linfct = X), calpha = univariate_calpha())$confint colnames(aux)[1] <- "fit" -pred$pois <- cbind(pred$pois, exp(aux)) -str(pred$pois) +pred$quasi <- cbind(pred$quasi, exp(aux)) + +# TODO documentar no pacote. +fitted.gcnt <- function(lambda, alpha, offset = NULL, ymax = 40) { + if (is.null(offset)) { + offset <- 1 + } + pars <- cbind(lambda, alpha, offset) + y <- 1:ymax + apply(pars, MARGIN = 1, + FUN = function(p) { + sum(pgamma(p[3], + shape = p[2] * y, + rate = p[2] * p[1])) + }) +} # Matrix de covariância completa e sem o alpha (marginal). V <- vcov(m3) @@ -409,16 +421,12 @@ pred$gcnt$eta <- c(X %*% coef(m3)[-1]) pred$gcnt <- cbind(pred$gcnt, apply(outer(aux, qn, FUN = "*"), MARGIN = 2, FUN = function(x) { - exp(pred$gcnt$eta + x) + fitted.gcnt( + lambda = exp(pred$gcnt$eta + x), + alpha = exp(coef(m3)["alpha"]), + ymax = 300) })) - -# TODO fitted.gcnt -fitted.gcnt <- function(lambda, alpha, offset, nmax) { - y <- 0:nmax - sum(pgamma(offset, - shape = exp(alpha) * y, - rate = exp(alpha) * exp(lambda))) -} +pred$gcnt$eta <- NULL pred <- ldply(pred, .id = "modelo") pred <- arrange(pred, umid, K, modelo) @@ -426,7 +434,7 @@ pred <- arrange(pred, umid, K, modelo) key <- list(type = "o", divide = 1, lines = list(pch = 1:nlevels(pred$modelo), lty = 1, col = 1), - text = list(c("Poisson", "Poisson Generelizada"))) + text = list(c("Poisson", "Quasi-Poisson", "Gamma Count"))) xyplot(fit ~ K | umid, data = pred, layout = c(NA, 1), as.table = TRUE, @@ -453,10 +461,26 @@ xyplot(ngra ~ K | umid, data = soja, layout = c(NA, 1), xlab = expression("Dose de potássio aplicada"~(mg ~ dm^{3})), strip = strip.custom(strip.names = TRUE, var.name = "Umidade")) +# NOTE: Essa contagem é alta e uma análise preliminar não retornou +# Hessiana para o modelo Gamma-Count ajustado com a mle2. A suspeita que +# é seja pela ordem de magnitude dos dados. Sendo assim, vamos +# considerar um offset artifical de 10 apenas para correr as análises. +# +# Warning message: +# In mle2(llgcnt, start = start, data = L, fixed = list(alpha = 0), : +# couldn't invert Hessian +# +# Warning message: +# In mle2(llgcnt, start = start, data = L, vecpar = TRUE) : +# couldn't invert Hessian + +soja$off <- 10 + #----------------------------------------------------------------------- # Modelo Poisson. -m0 <- glm(ngra ~ bloc + umid * K, data = soja, family = poisson) +m0 <- glm(ngra ~ offset(log(off)) + bloc + umid * K, + data = soja, family = poisson) m1 <- update(m0, family = quasipoisson) # Diagnóstico. @@ -472,7 +496,7 @@ summary(m1) # Modelo Poisson Generalizado. L <- with(soja, - list(y = ngra, offset = 1, X = model.matrix(m0))) + list(y = ngra, offset = off, X = model.matrix(m0))) # Usa as estimativas do Poisson como valores iniciais. start <- c(alpha = 0, coef(m0)) @@ -492,9 +516,10 @@ m3 <- mle2(llgcnt, start = start, data = L, vecpar = TRUE) anova(m3, m2) # Estimaitvas dos parâmetros. -cbind("PoissonGLM" = c(NA, coef(m0)), - "PoissonML" = coef(m2), - "Gcnteraliz" = coef(m3)) +c0 <- cbind("PoissonGLM" = c(NA, coef(m0)), + "PoissonML" = coef(m2), + "GCount" = coef(m3)) +splom(c0[-(1:2), ]) + layer(panel.abline(a = 0, b = 1, lty = 2)) # Perfil para o parâmetro de dispersão. plot(profile(m3, which = "alpha")) @@ -505,7 +530,9 @@ corrplot.mixed(V, lower = "number", upper = "ellipse", diag = "l", tl.pos = "lt", tl.col = "black", tl.cex = 0.8, col = brewer.pal(9, "Greys")[-(1:3)]) dev.off() +``` +```{r} # Tamanho das covariâncias com \alpha. each(sum, mean, max)(abs(V[1, -1])) @@ -528,11 +555,15 @@ linearHypothesis(model = m0, #----------------------------------------------------------------------- # Predição com bandas de confiança. -X <- LSmatrix(m0, effect = c("umid", "K")) +# Por causa do offset, não tem como usar a LSmatrix. +pred <- unique(subset(soja, select = c("umid", "K"))) +X <- model.matrix(formula(m0)[-2], + data = cbind(off = 1, bloc = soja$bloc[1], pred)) +i <- grep(x = colnames(X), pattern = "^bloc") +X[, i] <- X[, i] * 0 + 1/(length(i) + 1) -pred <- attr(X, "grid") pred <- transform(pred, - K = as.integer(K), + K = as.numeric(as.character(K)), umid = factor(umid)) pred <- list(pois = pred, quasi = pred, gcnt = pred) @@ -551,7 +582,7 @@ aux <- confint(glht(m1, linfct = X), colnames(aux)[1] <- "fit" pred$quasi <- cbind(pred$quasi, exp(aux)) -# Preditos pela Poisson Generalizada. +# Matrix de covariância completa e sem o alpha (marginal). V <- vcov(m3) V <- V[-1, -1] U <- chol(V) @@ -561,8 +592,12 @@ pred$gcnt$eta <- c(X %*% coef(m3)[-1]) pred$gcnt <- cbind(pred$gcnt, apply(outer(aux, qn, FUN = "*"), MARGIN = 2, FUN = function(x) { - exp(pred$gcnt$eta + x) + fitted.gcnt( + lambda = exp(pred$gcnt$eta + x), + alpha = exp(coef(m3)["alpha"]), + ymax = 300) })) +pred$gcnt$eta <- NULL # Junta o resultado dos 3 modelos. pred <- ldply(pred, .id = "modelo") @@ -573,7 +608,7 @@ key <- list(type = "o", divide = 1, lines = list(pch = 1:nlevels(pred$modelo), lty = 1, col = 1), text = list(c("Poisson", "Quasi-Poisson", - "Poisson Generelizada"))) + "Gamma-Count"))) xyplot(fit ~ K | umid, data = pred, layout = c(NA, 1), as.table = TRUE, @@ -585,6 +620,8 @@ xyplot(fit ~ K | umid, data = pred, prepanel = prepanel.cbH, desloc = 8 * scale(as.integer(pred$modelo), scale = FALSE), panel = panel.cbH) + +opts_chunk$set(eval = FALSE) ``` ## Número de Grãos por Vagem ## @@ -627,17 +664,7 @@ anova(m1, test = "F") L <- with(soja, list(y = ngra, offset = nvag, X = model.matrix(m0))) -# De acordo com a estimativa de phi da Quasi-Poisson, esse dado é -# subdisperso. Já que na verossimilhaça (1 + alpha * y) > -1 quando -# alpha < 0, então o menor valor possível para gamma para ter uma -# log-verossimilhança avaliável é --1/max(soja$ngra) - -# Mesmo com esse lower bound, o valor chute para alpha foi definido por -# tentativa erro. O valor -0.003 dá Error e o valor -0.002 na hora de -# perfilhar encontra um mínimo melhor. Então, por tentativa erro -# chegou-se no -0.0026. -start <- c(alpha = -0.0026, coef(m0)) +start <- c(alpha = 0, coef(m0)) parnames(llgcnt) <- names(start) # Com alpha fixo em 0 corresponde à Poisson. @@ -653,9 +680,10 @@ m3 <- mle2(llgcnt, start = start, data = L, vecpar = TRUE) # Teste para nulinidade do parâmetro de dispersão (H_0: alpha == 0). anova(m3, m2) -cbind("PoissonGLM" = c(NA, coef(m0)), - "PoissonML" = coef(m2), - "Gcnteraliz" = coef(m3)) +c0 <- cbind("PoissonGLM" = c(NA, coef(m0)), + "PoissonML" = coef(m2), + "GCount" = coef(m3)) +splom(c0[-(1:2), ]) + layer(panel.abline(a = 0, b = 1, lty = 2)) # Perfil para o parâmetro de dispersão. plot(profile(m3, which = "alpha")) @@ -665,7 +693,9 @@ corrplot.mixed(V, lower = "number", upper = "ellipse", diag = "l", tl.pos = "lt", tl.col = "black", tl.cex = 0.8, col = brewer.pal(9, "Greys")[-(1:3)]) dev.off() +``` +```{r} # Tamanho das covariâncias com \alpha. each(sum, mean, max)(abs(V[1, -1])) @@ -715,7 +745,7 @@ aux <- confint(glht(m1, linfct = X), colnames(aux)[1] <- "fit" pred$quasi <- cbind(pred$quasi, exp(aux)) -# Preditos pela Poisson Generalizada. +# Matrix de covariância completa e sem o alpha (marginal). V <- vcov(m3) V <- V[-1, -1] U <- chol(V) @@ -725,8 +755,12 @@ pred$gcnt$eta <- c(X %*% coef(m3)[-1]) pred$gcnt <- cbind(pred$gcnt, apply(outer(aux, qn, FUN = "*"), MARGIN = 2, FUN = function(x) { - exp(pred$gcnt$eta + x) + fitted.gcnt( + lambda = exp(pred$gcnt$eta + x), + alpha = exp(coef(m3)["alpha"]), + ymax = 300) })) +pred$gcnt$eta <- NULL # Junta o resultado dos 3 modelos. pred <- ldply(pred, .id = "modelo") @@ -737,7 +771,7 @@ key <- list(type = "o", divide = 1, lines = list(pch = 1:nlevels(pred$modelo), lty = 1, col = 1), text = list(c("Poisson", "Quasi-Poisson", - "Poisson Generelizada"))) + "Gamma-Count"))) xyplot(fit ~ K | umid, data = pred, layout = c(NA, 1), as.table = TRUE, @@ -755,12 +789,12 @@ xyplot(fit ~ K | umid, data = pred, Experimento conduzido em casa de vegetação para avaliar o efeito da desfolha, em diferentes fases de desenvolvimento do algodão, sobre a -produção da cultura. As parcelas foram vasos com duas plantas -que tiveram a área das folhas removidas com uma tesoura, simulando o ataque de -insetos desfolhadores, nos níveis de 0, 25, 50, 75 e 100% de remoção de -área foliar. Em cada fase de desenvolvimento (de 5), 5 parcelas sofreram -desfolha nos níveis mencionados. O número de capulhos ao final do -experimento foi contado. +produção da cultura. As parcelas foram vasos com duas plantas que +tiveram a área das folhas removidas com uma tesoura, simulando o ataque +de insetos desfolhadores, nos níveis de 0, 25, 50, 75 e 100% de remoção +de área foliar. Em cada fase de desenvolvimento (de 5), 5 parcelas +sofreram desfolha nos níveis mencionados. O número de capulhos ao final +do experimento foi contado. ```{r} #-----------------------------------------------------------------------