diff --git a/11-fatorial-duplo-2-adicionais.Rmd b/11-fatorial-duplo-2-adicionais.Rmd index a2bd06be4faff1e83bc0ffd520a22cf93d92be0b..d74164770b2f64beced823a623b3638c9d11078b 100644 --- a/11-fatorial-duplo-2-adicionais.Rmd +++ b/11-fatorial-duplo-2-adicionais.Rmd @@ -307,6 +307,49 @@ da %>% group_by(!!x) %>% ## Análise de dados de *fusarium* em Zimmermann +Os dados que usaremos para aplicar a análise acima prototipada estão em +@zimmermann2014. Trata-se de um experimento fatorial $3 \times 3 + 2$, +ou seja, um fatorial duplo com mais dois pontos adicionais. O +experimento foi realizado no delineamento inteiramente casualizado. + +A variável resposta é o número de sementes infectadas com *fusarium* de +um total de 40 sementes expostas (`nsi`). Portanto, a resposta pode ser +analisada considerando distribuição binomial se forem razoáveis as +suposições para tal. Digo razoáveis porque nem todo experimento que +produza uma resposta assim -- um número inteiro no numerador tendo outro +número inteiro no denominador -- terá distribuição binomial. Existem +suposições, como independência entre os ensaios de Bernoulli e +probabilidade de sucesso homogênea em cada ponto +experimental. Geralmente as sementes apresentam tamanho variável, estão +em condições fisiológicas diferentes e são colocadas para germinar todas +juntas em um ambiente compartilhado (gerbox, faixa de canteiro, bandeja +de germinação). A probabilidade de sucesso pode mudar com o +estado/tamanho/idade da semente dentro de um mesma unidade experimental, +o que faz com que a variância observada na resposta seja maior que +àquela esperada pela distribuição binomial. Além do mais, estarem +germinando em um ambiente compartilhado pode não garantir independência +das germinações individuais das sementes, ou seja, uma semente infectada +pode produzir inóculo que aumenta a chance de infecção das demais +sementes da mesma repetição. + +É bastante comum de ver em livros de Estatística Experimental o uso da +transformação arco seno da raíz quadrada para dados de proporção como +estes. Essa transformação é uma transformação estabilizadora da +variância para dados de distribuição binomial[^1]. Lembre-se que uma +variável aleatória com distribuição binomial de parâmetros $n$ e $p$ tem +variância $p(1 - p)$. A transformação $f(x) = \arcsin(\sqrt(x))$ é +empregada para levar os dados para uma escala com maior homogeneidade de +variâncias e assim realizar análise assumindo-se distribuição +gaussiana. Hoje, tem-se os modelos lineares generalizados (GLM) +disponíveis para a análise de dados de proporção como este, o que +dimunui a justificativa para uso de transformações estabilizadoras da +variância. De qualquer forma, com propósito didático, eu farei a análise +com a variável transformada e depois usando GLM. + +Os dados que vamos usar estão no objeto `ZimmermannTb9.22` do pacote +`labestData`. Consulte a documentação para detalhes. A variável `y` é a +versão transformada da proporção amostral de sementes infectadas. + ```{r} library(labestData) @@ -323,41 +366,395 @@ str(tb) # Contagem dos pontos experimentais. xtabs(~fung + aplic, data = tb) +# Proporção amostral de sementes infectadas em cada ponto experimental. +with(tb, tapply(nsi/40, list(fung, aplic), FUN = mean)) + # Análise exploratória. ggplot(data = tb, mapping = aes(x = aplic, y = y)) + facet_grid(facets = . ~ fung, scale = "free", space = "free") + - geom_jitter(alpha = 0.5, width = 0.1) + geom_jitter(alpha = 0.5, width = 0.1, height = 0) ``` -<!---------------------------------------------------------------------- --> +Neste experimento o fator fungicida (`fung`) corresponde ao produto +usado para controle de *fusarium* com 3 níveis qualitativos: Benlate, +Captam e Derosal. O fator aplicação (`aplic`) indica a forma de +aplicação de fungicida quando ao uso associado de polímero, também com 3 +níveis: fungicida puro, fungicida antes do polímero e fungicida +misturado ao polímero. Os pontos adicionais são a testemunha sem +controle de *fusarium* e a aplicação isolada de polímero. + +Para a análise do fatorial com tratamento adicional temos que escolher o +conjunto de hipóteses mais adequado. Em @zimmermann2014, é feita a +análise considerando as hipóteses da cláusula 3 que, neste caso, será: +i) testemunha vs polímero, ii) (testemunha + polímero) vs pontos +fatoriais e iii) entre pontos fatoriais. A hipótese (i) deseja saber se +a aplicação de polímero altera a ocorrência de *fusarium*. A (iii) +deseja avaliar a existência de efeito do fungicída, da forma de +aplicação, ou da interação entre eles. A (ii) é, no caso de (i) e (iii) +não serem rejeitadas, se o controle conseguido com qualquer aplicação +dos fungicidas difere das testemunhas. É necessário enfatizar que a +interpretação das hipóteses é sequêncial. + +Cada ponto experimental foi teve 5 repetições. A proporção média de +sementes infectadas apresenta valor 0 para um ponto experimental +(`derosal:misturado`). Essa característica é relevante para a análise +com GLM binomial, portanto, discutirei adiante. + +O diagrama de dispersão sugere existência de difença entre os +tratamentos para o controle de *fusarium*. Outro aspecto igualmente +saliente é que existem muitos zeros observados. No ponto experimental +`fung = derosal & aplic = misturado` foi observado zero em todas as +unidades experimentais. Dois alertas decorrem disso: estimativa amostral +de proporção de infecção é $\hat{p} = 0$, ou seja, foram do espaço +paramétrico de $p \in (0, 1)$ da distribuição binomial e variância +amostral igual 0. De qualquer forma, essa primeira análise assume +distribuição para a variável transformada. + +As hipóteses que serão testadas já foram estabelecidas. Agora precisa-se +criar o conjunto de contrastes que as represente. Isso é feito no bloco +a seguir, seguido do ajuste do modelo. A 5º coluna da matriz de +contrastes é para a hipótese (i) e a 4º coluna é para a hipótese +(ii). Os coeficientes tem que somar sempre zero porque são contrastes. O +conjunto de contrastes é ortogonal, ou seja, o produto interno das +colunas é 0. +```{r} +# Contrates para o fator fungicida. +ctr <- C(tb$fung, contr = contr.helmert) +attr(ctr, "contrasts")[, 3] <- c(-2, -2, -2, 3, 3) +attr(ctr, "contrasts")[, 4] <- c( 0, 0, 0, -1, 1) +contrasts(tb$fung) <- attr(ctr, "contrasts") -```{r, eval = FALSE} -tb <- expand.grid(NR = c("Baixo", "Convencional"), - Fitato = c("Alto", "Médio"), - Fitase = c(0, 750, 1500)) -tb <- tb[with(tb, !(NR == "Convencional" & Fitase > 0)), ] -ftable(xtabs(~NR + Fitato + Fitase, data = tb)) +# Contrates para o fator aplicação. +ctr <- C(tb$aplic, contr = contr.helmert) +attr(ctr, "contrasts")[, 3] <- c(-2, -2, -2, 3, 3) +attr(ctr, "contrasts")[, 4] <- c( 0, 0, 0, -1, 1) +contrasts(tb$aplic) <- attr(ctr, "contrasts") -# Importação dados dados. -tb <- read_tsv("./data-raw/fat2x3+2adic.txt", - comment = "#", - col_types = cols()) -attr(tb, "spec") <- NULL -str(tb) +# Mostra que o produto interno é 0. +crossprod(contrasts(tb$fung)) -# Criando o fator NR. -tb$nr <- "Baixo" -tb$nr[with(tb, tratamento %in% c(1, 5))] <- "Convencional" +# Criação da matriz de delineamento. +X_full <- model.matrix(~fung * aplic, data = tb) +attr(X_full, "contrasts") -# Contagem das ocorrências dos pontos experimentais. -ftable(xtabs(~nr + fitato + fitase, data = tb)) +# Ajuste do modelo. +m0 <- aov(y ~ 0 + X_full, data = tb) +cbind(coef(m0)) -# Análise exploratória. -ggplot(data = tb, - mapping = aes(x = fitase, y = cdaeb, color = nr)) + - facet_wrap(facets = ~fitato) + +# Diagnóstico não seja discutido aqui para não sair do foco. +# par(mfrow = c(2, 2)) +# plot(m0) +# layout(1) + +# Para decompor as SQ. +ef <- list("ii) T+P vs Fat" = 4, + "i) T vs P" = 5, + "Fung" = 2:3, + "Aplic" = 6:7, + "Fung:Aplic" = 8:11) +summary(m0, split = list(X_full = ef)) +``` + +O quadro de anova acima está igual ao disponível em @zimmermann2014 +página 188, exceto por arredondamentos e ordem das linhas. + +Pela inspeção do quadro de análise de variância, rejeita-se a hipótese +nula de não interação entre fungicida e aplicação ao nível de 5%. Dessa +forma, não interpreta-se os efeitos principais. Pelo quadro, não se +rejeita a hipótese (i), ou seja, em termos práticos, não houve evidência +de que polímero isolado tem efeito sobre *fusarium*. A hipótese (ii) não +faz sentido ser intepretada haja visto a existência de interação. + +Agora que usamos a `aov()`, vamos ajustar o mesmo modelo com a `lm()` +para fazermos o estudo da interação com `multcomp::glht()`. Usaremos uma +matriz de delineamento apenas com colunas de parâmetros estimáveis. + +```{r} +X_ok <- X_full[, str_replace(names(coef(m0)), "X_full", "")] +m1 <- lm(y ~ 0 + X_ok, data = tb) +cbind(lm = coef(m1), aov = coef(m0)) +``` + +Por razões didáticas, será feito o estudo da interação nos dois +sentidos: comparar aplicações fixando o nível de fungicida e comparar +fungicidas fixando a forma de aplicação. No entanto, apesar de sempre +ser possível estudar a interação em todos os sentidos, na prática nem +todos são igualmente relevantes ou de significado. Tente responder o que +faz mais sentido da prática para o controle de **fusarium**: + + 1. É primeiro feita a escolha do fungicida e depois a forma de + aplicação? + 2. É primeiro feita a escolha da forma de aplicação e depois o + fungicida? + 3. É possível escolher simultâneamente o fungicida e forma de + aplicação. + +Estou inclinado a pensar que a condição 1 é mais realista que +a 2. Todavia, o caso 3 parece ser também apropriado. Para o caso 3 +podemos comparar todos os 9 pontos da porção fatorial sem precisar fazer +o estudo de um fator fixando-se os demais. Começarei por 1 e 2. + +```{r} +# Pontos experimentais únicos de A * B. +i <- tb %>% select(fung, aplic) %>% duplicated() +X_un <- X_ok[!i, ] # Estimativas. +pts <- tb[!i, c("fung", "aplic")] # Pontos experimentais. +cbind(pts, unname(X_un)) + +# Estudo dos níveis de aplicação dentro de fungicida. +L_AinF <- head(by(X_un, pts$fung, FUN = as.matrix), n = -2) +L_AinF <- lapply(L_AinF, + FUN = "rownames<-", + head(levels(tb$aplic), n = -2)) +lapply(L_AinF, + FUN = function(s) { + K <- all_pairwise(s, collapse = " vs ") + summary(glht(m1, linfct = K)) + }) + +# Estudo dos níveis de fungicida dentro de aplicação. +L_FinA <- head(by(X_un, pts$aplic, FUN = as.matrix), n = -2) +L_FinA <- lapply(L_FinA, + FUN = "rownames<-", + head(levels(tb$fung), n = -2)) +lapply(L_FinA, + FUN = function(s) { + K <- all_pairwise(s, collapse = " vs ") + summary(glht(m1, linfct = K)) + }) +``` + +Baseado nas comparações múltiplas feitas, em termos práticos, não +existem diferenças entre os fungicidas quando são aplicados antes do +polímero (será que o polímero aplicado depois dimunui a concentração do +fungicida?). Para o fugicida Derosal e Benlate, não existe diferença +entre as formas de aplicação. Para o Captam, existe diferença das outras +formas de aplicação comparadas com a aplicação do fungicida antes do +polímero. + +Com o propósito didático será feita a comparação entre os 9 pontos +experimentais. Na prática, essa abordagem pode indicar qual é tratamento +mais promissor para o controle de *fusarium*. + +```{r} +# Comparação entre todos os pontos experimentais. +i <- !with(pts, fung %in% tail(levels(fung), n = 2)) +L <- X_un[i, ] +rownames(L) <- with(pts[i, ], sprintf("%s:%s", fung, aplic)) +K <- all_pairwise(L, collapse = " vs ") + +# Número de constrastes avaliados. +c(choose(nrow(L), 2), nrow(K)) + +summary(glht(m1, linfct = K), test = adjusted(type = "fdr")) +``` + +As médias para cada ponto experimental serão determinadas agora, +acompanhadas do respectivo intervalo de confiança para que os resultados +sejam apresentados de forma gráfica. + +```{r} +# Obtém os intervalos de confiaça para as médias ajustadas. +ci <- confint(glht(m1, linfct = X_un), + calpha = univariate_calpha()) +ci <- ci$confint +colnames(ci) <- tolower(colnames(ci)) + +# Estimativas pontuais com intervalo de confiança de cobertura +# individual de 95%. +results <- cbind(pts, ci) +results + +# Exibe as estimativas com IC em gráfico. +ggplot(data = results, + mapping = aes(x = aplic, y = estimate)) + + facet_grid(facets = . ~ fung, scale = "free", space = "free") + + geom_point() + + geom_errorbar(mapping = aes(ymin = lwr, ymax = upr), + width = 0) +``` + +A função [`apmc`] do pacote [`wzRfun`] é uma função de conveniência que +faz chamada à `glht()`, retorna o intervalo de confiança e as letras +para indicar a significância dos contrastes. Para usar em modelos em +que a matriz de desenho é fornecida ao contrário do convencional uso de +fórmula, precisa adicionar `cld2 = TRUE`. + +```{r} +library(wzRfun) + +# Para comparação entre TODOS os pontos experimentais. +L <- X_un +rownames(L) <- with(pts, sprintf("%s:%s", fung, aplic)) + +# Estimativas pontuais seguido de IC e letras para os contrastes. +results <- apmc(X = L, + model = m1, + focus = "trat", + test = "fdr", + cld2 = TRUE) %>% + separate(col = "trat", into = c("fung", "aplic")) %>% + mutate(cld = ordered_cld(cld, -fit)) %>% + mutate(txt = sprintf("%0.2f%s", fit, cld)) +results + +# Gráfico com estimativas, IC e texto. +ggplot(data = results, + mapping = aes(x = aplic, y = fit)) + + facet_grid(facets = . ~ fung, scale = "free", space = "free") + geom_point() + - stat_summary(geom = "line", fun.y = "mean") + geom_errorbar(mapping = aes(ymin = lwr, ymax = upr), + width = 0) + + geom_text(mapping = aes(label = txt), + angle = 90, + vjust = 0, + nudge_x = -0.1) ``` + +Agora que a análise chegou ao final, pode-se fazer alguns comentários +importantes que justificam a adoção do modelo binomial. A mais saliente +é que o limite inferior do intervalo de confiança de algumas estimativas +de média é negativo. Isso é algo que não tem significado prático. + +A função $f(x) = \arcsin(\sqrt{x})$ tem limites +$$ +\begin{aligned} + \lim_{x \to 0} \arcsin(\sqrt{x}) &= 0 \\ + \lim_{x \to 1} \arcsin(\sqrt{x}) &= \pi/2 +\end{aligned} +$$ +e a $f^{-1}(y)$ é $\sin^{2}(y)$, $y \in [0, \pi/2]$. + +```{r} +curve(asin(sqrt(x)), from = 0, to = 1, asp = 1, xlim = c(0, pi/2)) +curve(sin(x)^2, from = 0, to = pi/2, add = TRUE, col = 2) +abline(a = 0, b = 1, lty = 2) +legend("bottomright", col = c(1, 2), lty = 1, bty = "n", + legend = c(expression(asin(sqrt(x))), + expression(sin^2 * (x)))) +``` + +Podemos aplicar a tranformação inversa para interpretar as estimativas +na escala original de proporção de sementes infectadas. Mas como os +valores limites inferiores são negativos, ao fazer-se $\sin^2(x)$, eles +se tornarão positivos e podem, inclusive deixar a estimativa pontual +fora do intervalo de confiança, o que seria bastante estranho. + +```{r} +# Apenas para provar o ponto mencionado. +results %>% + mutate_at(c("fit", "lwr", "upr"), function(x) sin(x)^2) %>% + ggplot(mapping = aes(x = aplic, y = fit)) + + facet_grid(facets = . ~ fung, scale = "free", space = "free") + + geom_point() + + geom_errorbar(mapping = aes(ymin = lwr, ymax = upr), + width = 0) +``` + +A seguir faremos a análise baseada na distribuição binomial. + +## Análise dos dados de *fusarium* com binomial + +Por se tratar de um manual de análise, não farei apresentação de todos +dos aspectos teóricos relacionados à classe de modelos lineares +generalizados. Recomendo que procure a literatura especializada para +isso. Surigo começar pelo material do Prof. Gauss & Profa. Clarice[^2] e +o materiial do Prof. Gilberto de Paula[^3]. + +O que tenho que comentar já foi brevemente mencionado: estimativa de +proporção amostral igual a 0. Como os fatores experimentais são todos +qualitativos, o modelo para porporção é baseado em estatísticas +amostrais dos pontos experimentais. No entanto, sabemos da distribuição +binomial que o espaço paramétrico de $p$ é o intervalo aberto $(0, +1)$. Ou seja, teremos problema ao ajustar o modelo aos dados por causa +de um ponto experimental com estimativa 0. Além do mais, o erro padrão +da estimativa assume um valor muito grande. + +TODO: o problema está no erro padrão da estimativa. + +```{r} +# Dados simulados para mostrar o problema da proporção amostral 0 em um +# ponto experimental. +y <- rep(0, 5) +m0 <- glm(cbind(y, 40 - y) ~ 1, family = binomial) +summary(m0) +confint.default(m0) +round(m0$family$linkinv(confint.default(m0)), 1) + +# Proporção amostral de sementes infectadas em cada ponto experimental. +with(tb, tapply(nsi/40, list(fung, aplic), FUN = mean)) + +tb$nsim <- tb$nsi + 0.2 +m0 <- glm(cbind(nsim, 40 - nsim) ~ fung * aplic, + data = tb, + family = quasibinomial) +anova(m0, test = "F") + +m1 <- update(m0, . ~ 0 + X_ok) +summary(m1) + +cbind(m0 = coef(m0)[sub("X_ok", "", names(coef(m1)))], + m1 = coef(m1)) + +# Diagnóstico não será discutivo para não afastar do foco. +# par(mfrow = c(2, 2)) +# plot(m0) +# layout(1) + +# Teste de Wald para hipóteses globais. +names(ef) +cftest(model = m1, parm = ef[[1]], test = Ftest()) +cftest(model = m1, parm = ef[[2]], test = Ftest()) +cftest(model = m1, parm = ef[[3]], test = Ftest()) +cftest(model = m1, parm = ef[[4]], test = Ftest()) +cftest(model = m1, parm = ef[[5]], test = Ftest()) + +# +``` + +Existem alguns importantes aspectos para se comentar aqui. + + * Sequencial vs Marginal. + * Diferença de deviance vs Wald. + +```{r} +# Para comparação entre TODOS os pontos experimentais. +L <- X_un +rownames(L) <- with(pts, sprintf("%s:%s", fung, aplic)) + +# Estimativas pontuais seguido de IC e letras para os contrastes. +results <- apmc(X = L, + model = m1, + focus = "trat", + test = "fdr", + cld2 = TRUE) %>% + separate(col = "trat", into = c("fung", "aplic")) %>% + mutate_at(c("fit", "lwr", "upr"), m1$family$linkinv) %>% + mutate(cld = ordered_cld(cld, -fit)) %>% + mutate(txt = sprintf("%0.2f%s", fit, cld)) +results + +# Gráfico com estimativas, IC e texto. +ggplot(data = results, + mapping = aes(x = aplic, y = fit)) + + facet_grid(facets = . ~ fung, scale = "free", space = "free") + + geom_point() + + geom_errorbar(mapping = aes(ymin = lwr, ymax = upr), + width = 0) + + geom_text(mapping = aes(label = txt), + angle = 90, + vjust = 0, + nudge_x = -0.1) + +# +``` + +<!------------------------------------------- --> +[^1]: https://www.google.com/search?q=stabilizing+variance+functions +[^2]: http://www.esalq.usp.br/departamentos/lce/arquivos/aulas/2013/LCE5868/livro.pdf +[^3]: https://www.ime.usp.br/~giapaula/texto_2013.pdf + +[`apmc`]: https://github.com/walmes/wzRfun/blob/master/R/pairwise.R +[`wzRfun`]: https://github.com/walmes/wzRfun