diff --git a/04-dql.Rmd b/04-dql.Rmd index afc6f6407fa604bad9d445762fed06c203616a49..06f824000cf31d25b20d3faa2ca1fe8b6d56fddf 100644 --- a/04-dql.Rmd +++ b/04-dql.Rmd @@ -364,15 +364,15 @@ pela média. Assim, a média marginal para uma variedade $k$ é obtida por $$ \begin{align*} \hat{\mu}_{..k} &= - \frac{1}{5 \cdot 5} \sum_{i} \sum_{j} \hat{\mu}_{ijk} \\ + \frac{1}{I \cdot J} \sum_{i} \sum_{j} \hat{\mu}_{ijk} \\ \hat{\mu}_{..k} &= \hat{\mu} + - \frac{1}{5} \sum_{i} \hat{\alpha}_{i} + - \frac{1}{5} \sum_{j} \hat{\theta}_{i} + + \frac{1}{I} \sum_{i} \hat{\alpha}_{i} + + \frac{1}{J} \sum_{j} \hat{\theta}_{j} + \hat{\tau}_k, \end{align*} $$ -em que o 5 nos denominadores deve-se ao fato de ser um quadrado latino -$5 \times 5$. +em que o $I = J = 5$ nos denominadores deve-se ao fato de ser um +quadrado latino $5 \times 5$. A função `emmeans()` calcula tais médias com erro-padrão e intervalo de confiança embutidos. O código abaixo extrai a matriz usada para o @@ -640,8 +640,6 @@ sobre uma relação média-variância não nula. Não é proveitoso julgar a normalidade diante de uma suspeita sobre a violação de outros pressupostos, no entanto, não se vê grave afastamento dessa suposição. -Uma solução possível é transformar - Para diminuir a violação da suposição de variância constante pode-se tentar aplicar uma transformação na variável resposta. Busca-se aqui então uma transformação que estabilize a relação média-variância. A @@ -693,7 +691,7 @@ delineamento de quadrado latino é $$ \begin{aligned} Y_{ijk} &= \text{Quasi-Poisson}(\lambda_{ijk}, \phi) \\ - g(\lambda_{ijk}) &= \mu + \alpha_i + \theta_j + \tau_k \\ + g(\lambda_{ijk}) &= \eta_{ijk} = \mu + \alpha_i + \theta_j + \tau_k \\ \phi &\propto 1 \\ \text{Var}(Y_{ijk}) &= \phi \text{E}(Y_{ijk}) \end{aligned} @@ -730,13 +728,93 @@ plot(m0) layout(1) ``` -TODO discutir os resíduos. +Os gráficos para diagnóstico não apontam violação dos pressupostos para +a especificação Quasi-Poisson. + +O gráfico *Residuals vs Fitted* exibe os resíduos de deviance contra os +valores ajustados (ou preditos) na escala do preditor linear, ou seja, +na escala $\eta = \log(\mu)$ e não $\mu$. Não há padrões que apontem a +violão da suposição de correta especificação do modelo para a +média. Além disso, os resíduos ocupam as metades superior e inferior de +forma igualmente distribuída ao longo do eixo das coordenadas. + +O gráfico *Scale-Location* apresenta a raíz quadrada do absoluto dos +resíduos de deviance padronizados contra os valores ajustados na escala +do preditor linear. Se os pressupostos não forem violados, os resíduos +de *deviance* padronizados apresentarão assintoticamente distribuição +normal. Os resíduos de deviance (e também os de Pearson) padronizados +não devem apresentar relação com a média, porque a relação +média-variância esperada foi usada para padronizá-los. Conclui-se que +não há evidências contra a suposição assumida para a média-variância. + +O gráfico *Normal Q-Q* usa os resíduos de deviance padronizados com os +quais não se vê violação da suposição de normalidade. + +Por fim, o gráfico *Residuals vs Leverage* mostra os resíduos de Pearson +padronizados contra os valores de alavancagem. Sem entrar muito em +detalhes, conclui-se que não existem observações influentes. Um aspecto +interessante é que, diferente do que foi visto para o modelo Gaussiano, +as alavancagens não são todas iguais. Isso decorre da função de +variância que acomoda o peso das observações conforme o valor de cada +uma. + +Com o compromisso de ser didático, o bloco de código abaixo mostra o que +é usado nos gráficos de resíduos que foram discutidos. + +<!-- . + https://www.sagepub.com/sites/default/files/upm-binaries/38503_Chapter6.pdf + https://r-forge.r-project.org/scm/viewvc.php/*checkout*/pkg/BinomTools/inst/ResidualsGLM.pdf?revision=6&root=binomtools&pathrev=6 +--> + +```{r, eval = FALSE} +# Diferentes tipos de resíduos em GLM. +R <- cbind( + raw = m0$model[, 1] - fitted(m0), + res = residuals(m0, type = "response"), + dev = residuals(m0, type = "deviance"), + dev_std = residuals(m0, type = "deviance")/ + (sqrt(summary(m0)$dispersion) * sqrt(1 - hatvalues(m0))), + pea = residuals(m0, type = "pearson"), + pea_std = residuals(m0, type = "pearson")/ + (sqrt(summary(m0)$dispersion) * sqrt(1 - hatvalues(m0)))) + +plot(R[, "raw"] ~ R[, "res"]) + +# Residuals vs Fitted. +plot(m0, which = 1) +points(R[, "dev"] ~ predict(m0), pch = 3, col = 2) + +# Scale-Location. +plot(m0, which = 3) +points(sqrt(abs(R[, "dev_std"])) ~ predict(m0), + pch = 3, col = 2) + +# Normal Q-Q. +plot(m0, which = 2) +qq <- qqnorm(R[, "dev_std"], plot.it = FALSE) +points(qq$x, qq$y, pch = 3, col = 2) + +# Residuals vs Leverage +plot(m0, which = 5) +points(R[, "pea_std"] ~ hatvalues(m0), + pch = 3, col = 2) +``` + +Uma vez que não se constatou afastamento das suposições, dá-se +continuidade com a avaliação da significância dos termos +experimentais. O quadro de análise de deviance pode ser produzido com a +função método `anova()` (com hipóteses sequenciais) e com a função +método `drop1()` (com hipóteses marginais). ```{r} # Quadro de análise de deviance. # drop1(m0, test = "F") # Hipóteses marginais. anova(m0, test = "F") # Hipóteses sequenciais. +# O valor da estatística F para `anova()` e `drop1()`. +(25.095/5)/summary(m0)$dispersion # Usa resíduos de Pearson. +(25.095/5)/(deviance(m0)/df.residual(m0)) # Usa resíduos de deviance. + # Estimativas dos efeitos e medidas de ajuste. summary(m0) @@ -744,25 +822,24 @@ summary(m0) # sum(residuals(m0, type = "deviance")^2) # deviance(m0) -# Como estimar o parâmetro de dispersão. +# Como é estimado o parâmetro de dispersão. # summary(m0)$dispersion sum(residuals(m0, type = "pearson")^2)/df.residual(m0) ``` -TODO WALMES FIXME - Pelo quadro de deviance, tem-se uma moderada evidência a favor da hipótese alternativa. A hipótese nula é de que não há efeito de tratamentos para o controle da praga. A estimativa do parâmetro de dispersão `r sprintf("%0.2f", summary(m0)$dispersion)` indica uma variabilidade superior àquela esperada para uma variável Poisson. Isso é esperado visto que há sempre algum nível de perturbação devido a -inúmeros fatores não controlados para inflar tal expectativa. +inúmeros fatores não controlados para inflacionar tal expectativa. -Visto que tive-se indicações de efeito de tratamentos, será feito estudo -via comparações mútiplas para detectar diferenças entre os tratamentos -para controle da praga. Apesar de estar-se com outra classe de modelos, -os métodos usados ainda são os mesmos. +Visto que teve-se indicações de efeito de tratamentos, será feito estudo +via comparações mútiplas para detectar diferenças entre eles para +subsidiar decisões sobre o controle da praga. Apesar de ser outra classe +de modelos, os métodos usados ainda são os mesmos, ou seja, `emmeans()` +e associadas. ```{r} # "Médias" ajustadas na escala do preditor linear. @@ -793,15 +870,48 @@ da %>% summarise_at(vars(colmos), mean) ``` -O código abaixo faz as comparações múltiplas entre os -tratamentos. IMPROVE! +Por padrão, as médias ajustadas são obtidas na escala do preditor linear +($\eta$). Com uso da opção `type = "response"`, a `emmeans()` apresenta +o resultado na escala da resposta aplicando a função de ligação inversa +($g^{-1}(.)$) e usa o método delta para determinar o erro-padrão. As +médias ajustadas são calculadas por +$$ +\begin{align*} + \hat{\eta}_{..k} &= + \frac{1}{I \cdot J} \sum_{i} \sum_{j} \hat{\eta}_{ijk} \\ + \hat{\eta}_{..k} &= \hat{\mu} + + \frac{1}{I} \sum_{i} \hat{\alpha}_{i} + + \frac{1}{J} \sum_{j} \hat{\theta}_{j} + + \hat{\tau}_k \\ + \hat{\mu}_{..k} &= g^{-1}(\hat{\eta}_{..k}). +\end{align*} +$$ + +É importante salientar que, apesar do experimento ser balanceado, as +médias ajustadas tem erros-padrões diferentes. Quanto maior o valor da +estimativa, maior o erro-padrão. Isso é decorrente da função de +variância da especificação Quasi-Poisson. + +O código abaixo faz as comparações múltiplas par a par entre os +tratamentos. O teste é feito com as médias na escala do preditor linear, +ou seja, os contrastes avaliados são do tipo $\eta_{..k} - \eta_{..k'} = +0$. + +A `contrast()` mostra a estimativa e significância de cada um dos +contrastes. O p-valores foram corrigidos para um erro global de +significância de 5%. Apesar do experimento ser balanceado, os +erros-padrões dos contrastes não são iguais como visto no modelo +Gaussiano. Isso decorre da existência da função de variância. Isso deixa +claro que abordagens de comparações múltiplas baseadas em diferença +mínima significativa (DMS) não são imediatamente aplicáveis porque os +contrastes não tem a mesma variância. ```{r} # Desvendando o computo das médias ajustadas. grid <- attr(emm, "grid") L <- attr(emm, "linfct") rownames(L) <- grid[[1]] -MASS::fractions(t(L)) +# MASS::fractions(t(L)) # Retorna a avaliação de cada contraste. contrast(emm, method = "pairwise") @@ -811,7 +921,8 @@ results <- cld(emm) results <- results %>% as.data.frame() %>% mutate_at(c(2, 5, 6), m0$family$linkinv) %>% - mutate(.group = as_letters(.group)) + mutate(.group = as_letters(.group)) %>% + arrange(desc(emmean)) results # Gráfico com estimativas, IC e texto. @@ -823,46 +934,39 @@ ggplot(data = results, geom_label(mapping = aes(label = sprintf("%0.2f %s", emmean, .group)), nudge_y = 0.25, vjust = 0) + - labs(x = "Tratamento", y = "Número de colmos atacados") -``` - -```{r, eval = FALSE, include = FALSE} -# Comparações múltiplas, contrastes de Tukey. -# Método de correção de p-valor: single-step. -tk_sgl <- summary(glht(m0, linfct = mcp(trat = "Tukey")), - test = adjusted(type = "single-step")) -tk_sgl - -# Resumo compacto com letras. -cld(tk_sgl, decreasing = TRUE) - -results <- wzRfun::apmc(X = L, - model = m0, - focus = "trat", - test = "single-step") %>% - mutate_at(c("fit", "lwr", "upr"), - m0$family$linkinv) + labs(x = "Tratamento", + y = "Número de colmos atacados") ``` A médias ajustadas na escala da resposta, por ter uma função de ligação -envolvida e uma agregação para marginalizar o efeito, podem ser -calculadas de outra forma, trocando a ordem das operações marginalizar e -levar para a escala da resposta. +envolvida e uma agregação para nivelar o efeito de termos acessórios, +podem ser calculadas de outra forma, trocando a ordem das operações +marginalizar e levar para a escala da resposta. * A primeira opção consiste em 1) obter os valores preditos na escala - do preditor para cada um dos $6^3$ pontos experimentais, 2) fazer a - agregação por média para os níveis de tratamento e 3) passar as + do preditor linear, 2) fazer a agregação por média e 3) passar as estimativas para a escala da resposta aplicando $g^{-1}(.)$. Fez-se - exatamente isso no código acima usando a - `emmeans(..., type = "response")`. + exatamente isso no código acima usando a `emmeans(..., type = + "response")`. Matematicamente isso é + $$ + \hat{\mu}_{..k} = + g^{-1}\left(\frac{1}{I \cdot J} \sum_{i} \sum_{j} + \hat{\eta}_{ijk}\right). + $$ * A segunda opção é 1) obter os valores preditos na escala do preditor - para cada um dos $6^3$ pontos experimentais, 2) passar as - estimativas para a escala da resposta aplicando $g^{-1}(.)$ e 3) - fazer a agregação por média para os níveis de tratamento. - -A diferença é inversão na ordem das etapas 2 e 3. Como `mean(exp(x))` é -diferente de `exp(mean(x))`, os resultados serão diferentes. O código -abaixo reproduz os resultados. + linear 2) passar as estimativas para a escala da resposta aplicando + $g^{-1}(.)$ e 3) fazer a agregação por média. Matematicamente isso + é + $$ + \hat{\mu}_{..k} = + \frac{1}{I \cdot J} \sum_{i} \sum_{j} + g^{-1}\left(\hat{\eta}_{ijk}\right). + $$ + +A diferença é inversão na ordem das etapas 2 e 3. Como $\sum_t +g^{-1}(u_t)$ é diferente de $g^{-1}(\sum_t u_t)$, os resultados serão +diferentes. O código abaixo mostra como obter as médias ajustadas nas +duas opções. ```{r} # Duas chamadas para obter as médias ajustadas. @@ -870,20 +974,17 @@ emmeans(m0, specs = ~trat, type = "response") emmeans(m0, specs = ~trat, transform = "response") ``` -As duas chamadas acima calculam as médias ajustadas das duas formas -discutidas. O código a seguir reproduz os resultados para as estimativas -pontuais com o qual fica claro a troca na ordem das operações de -transformação e agregação. - -O cálculo dos erros padrões para `transform = "response"` aplicam o -método delta, como mostra o código abaixo. Por outro lado, para os +O código a seguir reproduz os resultados para as estimativas pontuais +com o qual fica claro a troca na ordem das operações de transformação e +agregação. O cálculo dos erros padrões para `transform = "response"` +aplica o método delta, como será mostrado. Por outro lado, para os contrastes -- que de fato são o que interessa -- isso é menos relevante já que os efeitos de linha e coluna se cancelam na expressão de cada contraste entre tratamentos. ```{r} # Grid com todas as combinações 6 x 6 x 6 = 216 e o valor predito na -# escala do preditor: \hat{\eta} = X \hat{\beta}. +# escala do preditor: \eta. grid <- da %>% select(linha, coluna, trat) %>% complete(linha, coluna, trat) @@ -904,7 +1005,7 @@ grid %>% summarise(mu = mean(mu)) %>% ungroup() -# Média ajustada para a condição trat = 1 e linha = 1 (média nas colunas). +# Média ajustada para a condição trat = 1 e linha = 1. emmeans(m0, specs = ~trat, transform = "response", @@ -926,7 +1027,17 @@ rownames(dm) <- NULL dm ``` -Conclusões: TODO! +Com o que foi mostrado e discutido acima, encerra-se a análise dos dados +de contagem. Porém, outras possibilidades de análise existem, como usar +outra distribuição (Binomial Negativa, Gamma-Count, COM-Poisson, etc) ou +outras especificações na `glm()`. No fragmento de código abaixo está +indicado duas especificações equivalentes em que a função de ligação é +indentidade e a função de variância é linear. Isso corresponde a + + * Um modelo Gaussiano com função de variância do tipo $\text{Var}(Y) = + \phi \text{E}(Y)$, ou + * Um modelo Quasi-Poisson com função de ligação identidade, $g(\mu) = + \mu = \eta$. ```{r, eval = FALSE} # Análise com modelo linear Gaussiano e relação \sigma^2 = \mu. @@ -951,6 +1062,12 @@ c(deviance(m1), deviance(m2)) cbind(coef(m1), coef(m2)) ``` +Como todos os fatores do experimento são qualitativos, usar a função de +ligação identidade para um modelo Quasi-Poisson não apresenta grandes +riscos de obter predições fora do espaço paramétrico. Sendo assim, a +análise se torna um pouco mais fácil por não precisar se preocupar com +escalas. + ## Variável resposta de proporção amostral Assim como dados de contagem, dados de proporção são muito comuns em