diff --git a/vignettes/compoisson.Rmd b/vignettes/compoisson.Rmd index 7b211de328999b434347e0eccd30293eb76ff288..00abc63c4e5a6b42c84dded9b1ffa4ad0e31640a 100755 --- a/vignettes/compoisson.Rmd +++ b/vignettes/compoisson.Rmd @@ -589,14 +589,244 @@ update(xy, type = c("p", "g")) + ``` -# Ocorrência de mosca-branca em variedades de soja # +# Ocorrência de ninfas de mosca-branca em variedades de soja # + +```{r} + +data(ninfas) +str(ninfas) +## help(ninfas) + +``` + +Experimento conduzido em casa de vegetação sob o delineamento de blocos +casualizados. No experimento foram avaliadas plantas de diferentes +cultivares de soja contabilizando o número de ninfas de mosca-branca nos +folíolos dos terços superior, médio e inferior das plantas. As +avaliações ocorreram em 6 datas dentre os 38 dias do estudo. + +Nesta análise serão consideradas somente as cultivares com prefixo +\code{BRS}, sendo o número total de ninfas de mosca-branca nos folíolos +a variável de interesse. + +```{r} + +## Somente as cultivares que contém BRS na identificação +ninfas <- droplevels(subset(ninfas, grepl("BRS", x = cult))) + +## Categorizando a variável dias em aval +ninfas$aval <- factor(ninfas$dias) + +str(ninfas) + +``` + +Assim as variáveis consideradas são definidas como: + ## Análise Exploratória ## +```{r} + +## Experimento balanceado +xtabs(~aval + cult, data = ninfas) + +(xy <- xyplot(ntot ~ aval | cult, + data = ninfas, + type = c("p", "g", "smooth"), + jitter.x = TRUE)) + +## Avaliando preliminarmente suposição de equidispersão +(mv <- aggregate(ntot ~ data + cult, data = ninfas, + FUN = function(x) c(mean = mean(x), var = var(x)))) + +xlim <- ylim <- extendrange(c(mv$ntot), f = 0.05) +xyplot(ntot[, "var"] ~ ntot[, "mean"], + data = mv, + xlim = xlim, + ylim = ylim, + ylab = "Variância Amostral", + xlab = "Média Amostral", + panel = function(x, y) { + panel.xyplot(x, y, type = c("p", "r"), grid = TRUE) + panel.abline(a = 0, b = 1, lty = 2) + }) + +``` + ## Ajuste dos modelos ## +```{r, cache = TRUE} + +## Preditores considerados +f1 <- ntot ~ bloco + cult + aval +f2 <- ntot ~ bloco + cult * aval + +## Ajustando os modelos Poisson +m1P <- glm(f1, data = ninfas, family = poisson) +m2P <- glm(f2, data = ninfas, family = poisson) + +## Ajustando os modelos COM-Poisson +m1C <- cmp(f1, data = ninfas, sumto = 600) +m2C <- cmp(f2, data = ninfas, sumto = 600) + +``` + ## Comparação dos ajustes ## +```{r} + +## Verossimilhancas dos modelos ajustados +cbind("Poisson" = sapply(list(m1P, m2P), logLik), + "COM-Poisson" = sapply(list(m1C, m2C), logLik)) + +## Teste de razão de verossimilhanças +anova(m1P, m2P, test = "Chisq") +anova(m1C, m2C) + +``` + +```{r} + +## Estimativas dos parâmetros +summary(m1P) +summary(m1C) + +``` + ## Avaliando modelo proposto ## +```{r} + +## Um dos problemas computacionais do modelo COM-Poisson é a obtenção da +## constante de normalização Z. Assim uma visualização pós ajuste para +## verificar se o ajuste proporcionou uma densidade válida se faz +## necessária +convergencez(m1C, incremento = 100, maxit = 10) + +``` + +```{r} + +## Dado que o modelo COM-Poisson leva as mesmas estimativas pontuais que +## o modelo Poisson a análise de diagnóstico padrão pode ser utilizada +par(mfrow = c(2, 2)) +plot(m1P) + +``` + +```{r, cache = TRUE} + +##------------------------------------------- +## Testando a nulidade do parâmetro phi + +## Usando o ajuste Poisson +trv <- 2 * (logLik(m1C) - logLik(m1P)) +attributes(trv) <- NULL +round(c(trv, pchisq(trv, 1, lower = FALSE)), digits = 5) + +## Reajustando o COM-Poisson para phi = 0 (ou equivalente nu = 1) +m1Cfixed <- cmp(f1, data = ninfas, fixed = list("phi" = 0)) +anova(m1C, m1Cfixed) + +## Via perfil de log-verossimilhança +perf <- profile(m1C, which = 1) +confint(perf) +plot(perf) + +``` + +```{r} + +##------------------------------------------- +## Verificando a matriz ve variâncias e covariâncias +Vcov <- vcov(m1C) +Corr <- cov2cor(Vcov) + +library(corrplot) +corrplot.mixed(Corr, lower = "number", upper = "ellipse", + diag = "l", tl.pos = "lt", tl.col = "black", + tl.cex = 0.8, col = brewer.pal(9, "Greys")[-(1:3)]) + +``` + ## Predição ## + +```{r} + +## Predição pontual/intervalar +pred <- with(ninfas, + expand.grid( + bloco = factor(levels(bloco)[1], + levels = levels(bloco)), + cult = levels(cult), + aval = levels(aval) + )) +qn <- qnorm(0.975) * c(fit = 0, lwr = -1, upr = 1) + +f1; f1[[2]] <- NULL; f1 +X <- model.matrix(f1, data = pred) + +## Como não temos interesse na interpretação dos efeitos de blocos +## tomaremos a média desses efeitos para predição + +bl <- attr(X, "assign") == 1 +X[, bl] <- X[, bl] * 0 + 1/(sum(bl) + 1) +head(X) + +library(multcomp) + +##------------------------------------------- +## Considerando a Poisson +aux <- exp(confint(glht(m1P, linfct = X), + calpha = univariate_calpha())$confint) +colnames(aux) <- c("fit", "lwr", "upr") +aux <- data.frame(modelo = "Poisson", aux) +predP <- cbind(pred, aux) + +##------------------------------------------- +## Considerando a COM-Poisson + +## Obtendo os parâmetros da distribuição (lambdas e phi) +betas <- coef(m1C)[-1] +phi <- coef(m1C)[1] +loglambdas <- X %*% betas + +## Obtendo os erros padrão das estimativas +## Obs.: Deve-se usar a matriz de variâncias e covariâncias +## condicional, pois os parâmetros de locação (betas) e dispersão +## (phi) não são ortogonais. +Vc <- Vcov[-1, -1] - Vcov[-1, 1] %*% solve(Vcov[1, 1]) %*% Vcov[1, -1] +U <- chol(Vc) +se <- sqrt(apply(X %*% t(U), MARGIN = 1, FUN = function(x) { + sum(x^2) +})) + +aux <- c(loglambdas) + outer(se, qn, FUN = "*") +aux <- apply(aux, MARGIN = 2, + FUN = function(col) { + sapply(col, FUN = function(p) { + y <- 0:400; py <- dcmp(y, p, phi, sumto = 600) + sum(y*py) + }) + }) +aux <- data.frame(modelo = "COM-Poisson", aux) +predC <- cbind(pred, aux) + +##------------------------------------------- +## Visualizando os valores preditos intervalares pelos dois modelos +da <- rbind(predP, predC) +da <- da[order(da$cult, da$aval, da$modelo), ] + +source(paste0("https://gitlab.c3sl.ufpr.br/leg/legTools/raw/", + "issue%2315/R/panel.segplot.by.R")) + +update(xy, type = c("p", "g"), alpha = 0.5) + + as.layer(segplot( + aval ~ lwr + upr | cult, centers = fit, + data = da, + horizontal = FALSE, draw = FALSE, lwd = 2, grid = TRUE, + panel = panel.segplot.by, groups = modelo, f = 0.1, + pch = 1:nlevels(pred$modelo)+2, as.table = TRUE)) + +```