From a170ccb6c6997895a0725bb7ce5096b8c1e53e7b Mon Sep 17 00:00:00 2001 From: Walmes Zeviani <walmes@ufpr.br> Date: Sat, 4 Jan 2020 21:10:16 -0300 Subject: [PATCH] Improves last section of chapter. --- 04-dql.Rmd | 144 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 81 insertions(+), 63 deletions(-) diff --git a/04-dql.Rmd b/04-dql.Rmd index 0fcfde4..d62001e 100644 --- a/04-dql.Rmd +++ b/04-dql.Rmd @@ -746,14 +746,28 @@ experimentos planejados. O conjunto de dados que será análise registrou a proporção de hastes sobreviventes ao ataque de pragas em um experimento quadrado latino $11 -\times 11$ que avaliou o efeito de inseticidas para controle da -praga. Os dados já são a proporção amostral de hastes sobreviventes, -portanto, não se conhece o numerador e denominador que produziram tal -razão. Em experimentos como esse é importante ter o registro do par de -variáveis: total de hastes sobreviventes ($y$) e total de hastes sobre -exposição ($n$). Com esse par pode-se declarar uma variável com -distribuição que geralmente é considerado apropriado se assumidas certas -suposições. +\times 11$ que avaliou o efeito de inseticidas para controle da praga. A +resposta é a proporção amostral de hastes sobreviventes, em algum +momento calculada pelo quociente do número de hastes sobreviventes ($y$, +numerador) pelo total de hastes avaliadas ($n$, denominador). O ideal é +que se registre o par $y$ e $n$, mesmo que ele seja constante para todas +as unidades experimentais pois o $n$ determina a previsão das +estimativas de proporção. Com esse par pode-se declarar uma variável com +distribuição Binomial que geralmente é considerada apropriada se +assumidas certas suposições. + +O experimento tinha 4 unidades amostrais por cela experimental, o que +perfaz um vetor de valores observados de tamanho $11 \times 11 \times 4 += 484$. Para a análise, no entanto, será feita a agregação por unidade +experimental usando a média das 4 unidades amostrais. Poderia-se fazer a +análise sem agregração, mas isso demandaria um modelo de efeitos +aleatórios para dissociar o erro entre unidades experimentais do erro +entre unidades amostrais. + +O gráfico abaixo indica haver alguma efeito do inseticida sobre a +proporção de hastes sobreviventes. A variabilidade é bem pronunciada, de +forma que talvez seja detectável diferença apenas entre os tratamentos +extremos. ```{r} # help(ZimmermannTb5.11, package = "labestData", help_type = "html") @@ -762,12 +776,14 @@ suposições. da <- labestData::ZimmermannTb5.11 str(da) +db <- da %>% + group_by(linha, coluna, inset) %>% + summarise(prop = mean(prop)) + # Análise exploratória. -ggplot(data = da, +ggplot(data = db, mapping = aes(x = reorder(inset, prop), - y = prop, - color = linha, - size = coluna)) + + y = prop)) + geom_jitter(width = 0.15, show.legend = FALSE) + stat_summary(mapping = aes(group = 1), geom = "line", @@ -775,6 +791,10 @@ ggplot(data = da, show.legend = FALSE) ``` +A análise que será feita assumirá a especificação Quasi-Binomial. Para +isso, embora o $n$ seja desconhecido, será assumido que é igual para +todas as observações. + O modelo estatístico para esse experimento é $$ \begin{aligned} @@ -790,72 +810,72 @@ em que: * $\theta_{ijk} \in (0, 1)$ é a proporção de sobrevivência na condição $ijk$, * $n_{ijk}$ é o número total de hastes expostas na condição $ijk$ e - * $\phi > 0$ é o parâmetro de dispersão que acomoda a variação das - observações ao redor desse valor médio. Com base na especificação - Quasi-Binomial, $\text{Var}(Y) \propto \phi \theta (1 - \theta)$. - * $g(.)$ é a função de ligação. A função de ligação canônica para a - Quasi-Binomial é a logit. + * $\phi > 0$ é o parâmetro de dispersão que acomoda a variação não + explicada nas observações ao redor do valor central $\theta_{ijk}$. + * Com base na especificação Quasi-Binomial, tem-se que os dois + primeiros momentos são $\text{E}(Y_{ijk}) = n_{ijk} \theta_{ijk}$ e + $\text{Var}(Y_{ijk}) = \phi n_{ijk} \theta_{ijk} (1 - + \theta_{ijk})$. + * $g(.)$ é a função de ligação. A função de ligação canônica é a + logit. * $\alpha_i$ é o efeito da linha $i$ (fator qualitativo), * $\beta_j$ é o efeito da coluna $j$ (fator qualitativo) e * $\tau_j$ o efeito da variedade $j$ (fator qualitativo) sobre a variável resposta $Y$ para a qual deseja-se testar a hipótese nula $H_0: \tau_j = 0$ para todo $j$. -```{r} +Antes de declarar o modelo Quasi-Binomial, será averiguado como o modelo +Gaussiano tem os pressupostos não atendidos. Uma das características +desse material é mostrar formas alternativas de análise sempre que +possível para ampliar o conhecimento do leitor. + +```{r, results = "hide", fig.show = "hide"} # Ajusta o modelo aos dados. Resposta: proporção de sobreviventes. -m0 <- lm(prop ~ linha + coluna + inset, +m1 <- lm(prop ~ linha + coluna + inset, data = db) -# Diganóstico dos resíduos. -par(mfrow = c(1, 2)) -plot(m0, which = 2:3) -layout(1) - -# ATTENTION: Box-Cox não resolve problemas de relação média-variância -# decrescente. - # Modelo o complementar. Resposta: proporção de não sobreviventes. -m0 <- lm(c(1 - prop) ~ linha + coluna + inset, +m2 <- lm(c(1 - prop) ~ linha + coluna + inset, data = db) -# Diganóstico dos resíduos. -par(mfrow = c(1, 2)) -plot(m0, which = 2:3) -layout(1) - # Indica lambda para aplicar transformação Box-Cox. MASS::boxcox(m0) abline(v = 1/3, col = "red") +# Aplicando a transformação Box-Cox. +m3 <- lm(c(1 - prop)^(1/3) ~ linha + coluna + inset, + data = db) + # Transformação arco seno da raíz quadrada da proporção amostral. É a # transformação estabilizadora da variância quando a variável resposta # tem distribuição binomial. db$asinsqrt <- asin(sqrt(db$prop)) -m0 <- lm(asinsqrt ~ linha + coluna + inset, +m4 <- lm(asinsqrt ~ linha + coluna + inset, data = db) +``` +```{r, fig.height = 12} # Diganóstico dos resíduos. -par(mfrow = c(1, 2)) -plot(m0, which = 2:3) +par(mfrow = c(4, 2)) +plot(m1, which = 2:3) +plot(m2, which = 2:3) +plot(m3, which = 2:3) +plot(m4, which = 2:3) layout(1) - -# DISCUSSION: Pressupostos melhor atendidos. - -# ATTENTION FIXME: não sabemos o denominador dessa binomial! E pode ser -# que esse `n` seja variável em função da abundância de hastes em cada -# unidade experimental. ``` +TODO: Acima foram declarados 4 diferentes especificações. + TODO: comentar os resultados. -```{r} +```{r, eval = FALSE} # Análise com modelo linear generalizado. size <- 1 m0 <- glm(cbind(size * prop, size - size * prop) ~ linha + coluna + inset, data = db, family = quasibinomial) -deviance(m0) +m0 # TIP: as inferências são invariantes ao valor do `size` para # quasibinomial. O parâmetro de dispersão absorve o `size`. @@ -863,22 +883,27 @@ size <- 100 m0 <- glm(cbind(size * prop, size - size * prop) ~ linha + coluna + inset, data = db, family = quasibinomial) -deviance(m0) +m0 # Var(Y) \propto \phi * p * (1 - p). m0 <- glm(prop ~ linha + coluna + inset, data = db, family = quasi(link = "logit", variance = "mu(1 - mu)")) -deviance(m0) +m0 +``` + +Para facilitar a análise, será usada função de ligação identidade. Como +todos os fatores são qualitativos e não será feito extrapolação +IMPROVE. Mas atenção, isso não impede intervalos de confiança fora do +espaço paramétrico. +```{r} # Var(Y) \propto \phi * p * (1 - p). m0 <- glm(prop ~ linha + coluna + inset, data = db, family = quasi(link = "identity", variance = "mu(1 - mu)")) -deviance(m0) - # Diganóstico dos resíduos. par(mfrow = c(1, 2)) @@ -891,28 +916,16 @@ layout(1) Anova(m0, test.statistic = "F") # Estimativas dos efeitos e medidas de ajuste. -summary(m0) +m0 ``` ```{r} -# Comparações múltiplas. - # Médias marginais ajustadas. -# emmeans(m0, specs = ~inset, transform = "response") -# emmeans(m0, specs = ~inset, transform = "unlink") # Igual. -# emmeans(m0, specs = ~inset, transform = "mu") # Igual. - emm <- emmeans(m0, specs = ~inset) emm -emm %>% - as.data.frame() %>% - mutate_at(c("emmean", "asymp.LCL", "asymp.UCL"), - m0$family$linkinv) - # Retorna as médias ajustadas com teste de comparação múltipla aplicado. -results <- cld(emm) -results <- results %>% +results <- cld(emm) %>% as.data.frame() %>% mutate_at(c(2, 5, 6), m0$family$linkinv) %>% mutate(.group = as_letters(.group)) @@ -924,13 +937,18 @@ ggplot(data = results, geom_point() + geom_errorbar(mapping = aes(ymin = asymp.LCL, ymax = asymp.UCL), width = 0) + - geom_label(mapping = aes(label = sprintf("%0.2f %s", emmean, .group)), + geom_label(mapping = aes(label = sprintf("%0.3f %s", emmean, .group)), angle = 90, vjust = -0.4) + + # expand_limits(y = c(NA, 1)) + labs(x = "Tratamento", y = "Proporção de hastes sobreviventes") ``` +TODO: são tantas espeficicações possiveis. Qual é a mais adequada? +Talvez nem haja diferença apreciável nos resultados. Vai do analista +decidir. + <!------------------------------------------- --> ```{r, eval = FALSE, include = FALSE} -- GitLab