Neste guia, vamos abordar os principais métodos estatísticos básicos aplicados em microbiologia, com foco em testes de hipóteses e modelos clássicos. Para cada método, apresentamos uma breve introdução teórica (quando e por que utilizá-lo), um exemplo prático em R com dados simulados (representativos de situações em microbiologia), visualizações gráficas usando tidyverse para auxiliar na interpretação, verificação de pressupostos (normalidade, homogeneidade de variâncias etc. quando aplicável) e uma interpretação acessível dos resultados. O público alvo são alunos de pós-graduação em microbiologia com conhecimento básico de R, portanto as explicações são didáticas e intercaladas ao código.
Preparação: Vamos carregar o pacote tidyverse
(que inclui ggplot2 para gráficos e dplyr para
manipulação de dados). Também utilizaremos funções estatísticas básicas
do R (como t.test
, aov
, lm
, etc.)
e alguns testes de pressupostos disponíveis na base do R. Além disso,
iremos utilizar o pacote lmtest
e o pacote
car
. Caso não tenha esses pacotes, use a função
install.packages
para instalar-los.
# Carregar pacote principal para gráficos e manipulação de dados
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# Pacote para análises
library(lmtest)
## Warning: package 'lmtest' was built under R version 4.4.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.4.3
##
## Attaching package: 'zoo'
##
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(car)
## Warning: package 'car' was built under R version 4.4.2
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.4.2
##
## Attaching package: 'car'
##
## The following object is masked from 'package:dplyr':
##
## recode
##
## The following object is masked from 'package:purrr':
##
## some
A seguir, cada seção corresponde a um método estatístico.
O teste t de Student é um teste paramétrico utilizado para comparar médias de duas amostras. Ele assume que os dados (ou pelo menos a distribuição da média amostral) seguem aproximadamente uma distribuição normal. Existem duas principais variações: (1) teste t para amostras independentes (compara dois grupos distintos) e (2) teste t pareado (para dados antes/depois ou medidas repetidas nos mesmos indivíduos). Em microbiologia, por exemplo, poderíamos usar um teste t independente para comparar a contagem média de bactérias em dois tratamentos diferentes, ou um teste t pareado para avaliar se um determinado parâmetro mudou significativamente em amostras coletadas antes e depois de um tratamento no mesmo conjunto de culturas.
Quando usar: O teste t de amostras independentes aplica-se quando queremos comparar as médias de duas populações distintas (e.g., grupo controle vs. grupo tratado), sob hipótese de dados aproximadamente normais e variâncias populacionais iguais ou próximas. Por exemplo, podemos comparar o crescimento médio de bactérias em dois meios de cultura diferentes. A hipótese nula (H0) normalmente afirma que as médias são iguais, enquanto a alternativa (Ha) afirma que as médias diferem.
Exemplo prático: Suponha que tenhamos medidas de OD (densidade óptica) de culturas bacterianas em dois grupos: um Controle e um Tratamento. Vamos simular 20 observações em cada grupo, onde esperamos que o tratamento aumente a média do OD. Em seguida, aplicaremos o teste t e interpretaremos o resultado.
# Simular dados de OD para dois grupos independentes
set.seed(42) # fixar semente diferente para este exemplo
n <- 20
grupo <- factor(rep(c("Controle", "Tratamento"), each = n))
# Suponha média 0.5 para controle e 0.8 para tratamento, desvio padrão ~0.1
od <- c(rnorm(n, mean = 0.5, sd = 0.1),
rnorm(n, mean = 0.8, sd = 0.1))
dados_t <- tibble(Grupo = grupo, OD = od)
# Visualizar algumas das primeiras linhas dos dados simulados
head(dados_t)
## # A tibble: 6 × 2
## Grupo OD
## <fct> <dbl>
## 1 Controle 0.637
## 2 Controle 0.444
## 3 Controle 0.536
## 4 Controle 0.563
## 5 Controle 0.540
## 6 Controle 0.489
No data frame dados_t
, temos duas colunas:
Grupo (controle ou tratamento) e OD (valor de
densidade óptica). Vamos criar um gráfico de caixas (boxplot)
comparando a distribuição de OD entre os grupos, juntamente com os
pontos das observações individuais, para inspecionar visualmente as
diferenças.
# Gráfico: distribuição de OD por grupo (boxplot + jitter dos pontos individuais)
dados_t %>%
ggplot(aes(x = Grupo, y = OD, fill = Grupo)) +
geom_boxplot(alpha = 0.6, outlier.shape = NA) + # boxplot sem mostrar outliers separadamente
geom_jitter(width = 0.1, shape = 21, alpha = 0.8) + # pontos espalhados com jitter horizontal
scale_fill_brewer(palette = "Pastel2") +
labs(title = "Distribuição de OD por Grupo",
y = "Densidade Óptica (OD)") +
theme_minimal()
Exemplo de visualização das distribuições de dois grupos independentes. Observa-se, neste caso simulado, que o grupo Tratamento tende a apresentar valores de OD maiores que o Controle.
Pela figura acima, parece haver uma diferença na média de OD
entre os grupos. Agora realizamos o teste t de Student para amostras
independentes. Usaremos t.test
especificando
var.equal = TRUE
se assumirmos variâncias iguais nos grupos
(podemos inicialmente verificar a homogeneidade de variâncias com um
teste de F de Fisher ou Levene, mas dado o tamanho pequeno de
amostra, podemos seguir com Welch por segurança). Por padrão,
t.test
em R usa a correção de Welch (não assumindo
variâncias iguais). Aqui manteremos o padrão.
# Teste t para amostras independentes (Welch's t-test por padrão)
resultado_t <- t.test(OD ~ Grupo, data = dados_t)
resultado_t
##
## Welch Two Sample t-test
##
## data: OD by Grupo
## t = -6.6012, df = 36.976, p-value = 9.72e-08
## alternative hypothesis: true difference in means between group Controle and group Tratamento is not equal to 0
## 95 percent confidence interval:
## -0.3315850 -0.1758327
## sample estimates:
## mean in group Controle mean in group Tratamento
## 0.5191920 0.7729008
Interpretação: Neste exemplo simulado, o p-valor é extremamente baixo (<< 0,001), indicando evidência forte para rejeitar H0 e concluir que há uma diferença significativa entre as médias dos dois grupos. A média do grupo Tratamento (~0.772) foi maior que a do Controle (~0.519), sugerindo que o tratamento elevou a densidade óptica média das culturas. O intervalo de confiança de 95% para a diferença de médias não inclui 0 (no exemplo, cerca de -0.3 a -0.17 para Controle - Tratamento, ou seja, Tratamento é maior por ~0.26 em média). Assim, reportaríamos que o tratamento apresentou média significativamente maior que o controle (teste t, p < 0,05).
Pressupostos e checagem: Para o teste t independente ser válido, assumimos (a) aproximação de normalidade nas distribuições dos grupos e (b) homogeneidade de variâncias entre os grupos (quando usando a versão padrão do teste t de Student). É aconselhável verificar esses pressupostos:
shapiro.test(dados_t$OD[dados_t$Grupo=="Controle"])
##
## Shapiro-Wilk normality test
##
## data: dados_t$OD[dados_t$Grupo == "Controle"]
## W = 0.94403, p-value = 0.2854
shapiro.test(dados_t$OD[dados_t$Grupo=="Tratamento"])
##
## Shapiro-Wilk normality test
##
## data: dados_t$OD[dados_t$Grupo == "Tratamento"]
## W = 0.97966, p-value = 0.9297
var.test(OD ~ Grupo, data=dados_t)
(teste F de Fisher) ou o
teste de Levene (car::leveneTest
). Se o p-value
for alto (p.ex., > 0,05), não rejeitamos homogeneidade. Caso haja
heterocedasticidade, preferimos a versão de Welch (que já é padrão no
R). No nosso exemplo, as variâncias foram similares, mas usamos Welch de
qualquer forma por segurança.Em suma, constatamos uma diferença significativa entre os grupos. Se este fosse um experimento microbiológico real, poderíamos concluir, por exemplo, que o tratamento resultou em maior crescimento bacteriano médio comparado ao controle, com base no teste t.
Quando usar: O teste t pareado é usado quando as duas observações que queremos comparar estão emparelhadas de alguma forma – tipicamente, medidas no mesmo indivíduo ou unidade antes e depois de um tratamento (ou sob duas condições distintas). Em microbiologia, poderíamos usar um teste t pareado para comparar a contagem de colônias de uma amostra antes e depois de adicionar um agente inibidor, em que cada amostra serve como seu próprio controle. O teste t pareado avalia se a diferença média entre as medições emparelhadas é significativamente diferente de zero. Importante: assume-se que as diferenças entre pares seguem aproximadamente distribuição normal.
Exemplo prático: Vamos simular um experimento em que medimos o pH de um meio de cultura antes e depois de aplicar certa bactéria fermentativa. Teremos 15 amostras emparelhadas (mesmo meio antes e depois). Suponha que esperamos que o pH diminua em média após o crescimento bacteriano (devido à produção de ácidos).
# Simular dados pareados (Antes vs Depois)
set.seed(123)
n <- 15
antes <- rnorm(n, mean = 7.0, sd = 0.2) # pH inicial ~7.0
depois <- antes + rnorm(n, mean = -0.5, sd = 0.2) # após fermentação, queda média de 0.5 no pH
dados_pareado <- tibble(ID = 1:n,
Antes = antes,
Depois = depois)
# Visualizar parte dos dados simulados
dados_pareado %>% slice(1:5)
## # A tibble: 5 × 3
## ID Antes Depois
## <int> <dbl> <dbl>
## 1 1 6.89 6.75
## 2 2 6.95 6.55
## 3 3 7.31 6.42
## 4 4 7.01 6.65
## 5 5 7.03 6.43
A estrutura dados_pareado
contém uma coluna de
identificador da amostra (ID) e as colunas Antes e
Depois com o valor de pH. Vamos reformatar esses dados para
formato longo (variável Tempo com níveis “Antes” e
“Depois”, e coluna pH) a fim de facilitar análises e gráficos
comparativos.
# Converter para formato longo
dados_long <- dados_pareado %>%
pivot_longer(cols = c(Antes, Depois), names_to = "Tempo", values_to = "pH")
head(dados_long)
## # A tibble: 6 × 3
## ID Tempo pH
## <int> <chr> <dbl>
## 1 1 Antes 6.89
## 2 1 Depois 6.75
## 3 2 Antes 6.95
## 4 2 Depois 6.55
## 5 3 Antes 7.31
## 6 3 Depois 6.42
Agora geramos uma visualização: um gráfico de linhas conectando, para cada amostra, o valor de pH antes e depois. Isso nos dá uma ideia das mudanças individuais. Idealmente, veremos a maioria das linhas descendo (indicando redução de pH).
# Gráfico: valores de pH antes e depois para cada amostra (linhas pareadas)
dados_long %>%
ggplot(aes(x = Tempo, y = pH, group = ID)) +
geom_line(color = "#636EAF", size = 1, alpha = 0.6) +
geom_point(color = "#36454F", size = 2) +
labs(title = "Valores de pH Antes e Depois para cada amostra",
y = "pH") +
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Visualização de dados pareados (simulados): cada linha representa uma amostra, conectando seu valor “Antes” e “Depois”. Neste exemplo, todas as amostras tiveram queda no pH após o tratamento.
No gráfico, todas as linhas apresentam declínio do pH, sugerindo uma redução consistente. Vamos realizar o teste t pareado para verificar se a redução média é significativa.
# Teste t pareado
resultado_t_pareado <- t.test(dados_pareado$Antes, dados_pareado$Depois,
paired = TRUE)
resultado_t_pareado
##
## Paired t-test
##
## data: dados_pareado$Antes and dados_pareado$Depois
## t = 9.7362, df = 14, p-value = 1.299e-07
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
## 0.4283092 0.6703275
## sample estimates:
## mean difference
## 0.5493184
Observamos um p-valor extremamente baixo (p = 1.299e-07), confirmando que a diferença média (Depois - Antes) é significativamente diferente de zero. A estimativa da diferença média foi de -0,5 (queda de 0,5 unidades de pH), com intervalo de confiança indicando que a redução média está entre 0,4 e 0,6 unidades de pH. Interpretação: Há evidências estatísticas robustas de que, em média, o pH após o tratamento é menor do que antes (teste t pareado, p < 0,001). Em contexto microbiológico, isso sugeriria que a bactéria fermentativa de fato reduziu o pH do meio.
Pressupostos: No teste pareado, a suposição chave é que a distribuição das diferenças (Depois - Antes) seja aproximadamente normal. Podemos verificar a normalidade dessas diferenças:
# Calcular diferenças e testar normalidade
dif <- dados_pareado$Depois - dados_pareado$Antes
shapiro.test(dif)
##
## Shapiro-Wilk normality test
##
## data: dif
## W = 0.97293, p-value = 0.8988
Se o teste de Shapiro-Wilk não indicar violação severa (p > 0,05), seguimos tranquilos. Caso a normalidade das diferenças seja questionável (especialmente com n pequeno), podemos recorrer a um teste não paramétrico equivalente, como o teste dos sinais de Wilcoxon pareado.
Em conclusão, o teste t pareado mostrou-se adequado e confirmou a alteração significativa pretendida.
A Análise de Variância (ANOVA) é uma extensão dos testes de comparação de médias para situações com mais de dois grupos ou com mais de um fator explicativo. Em vez de comparar pares de médias isoladamente, a ANOVA avalia a variabilidade entre grupos comparada à variabilidade dentro dos grupos, para julgar se pelo menos um dos grupos difere significativamente dos outros.
A ANOVA assume, similarmente ao teste t, que os resíduos do modelo seguem distribuição normal e com variâncias homogêneas entre os grupos, além de as observações serem independentes. A seguir, veremos exemplos para ANOVA de um fator e de dois fatores.
Quando usar: Quando há três ou mais grupos independentes e deseja-se testar se há diferença significativa em pelo menos uma das médias. A hipótese nula H0 afirma que todas as médias dos grupos são iguais, enquanto Ha afirma que pelo menos uma é diferente. Um caso típico em microbiologia seria comparar a eficácia de três métodos de sanitização diferentes medindo a contagem bacteriana residual em cada grupo.
Exemplo prático: Suponha que avaliamos o diâmetro de colônias fúngicas em três meios de cultura diferentes (Meio A, B e C), com 10 réplicas cada. Vamos simular dados onde o meio B, por exemplo, resulte em colônias maiores em média.
# Simular dados para ANOVA de um fator
set.seed(111)
meio <- factor(rep(c("A", "B", "C"), each = 10))
# Médias simuladas: A=4.0, B=5.0, C=4.2 (e.g., diâmetro médio em mm)
diam <- c(rnorm(10, mean = 4.0, sd = 0.5),
rnorm(10, mean = 5.0, sd = 0.5),
rnorm(10, mean = 4.2, sd = 0.5))
dados_anova1 <- tibble(Meio = meio, Diametro = diam)
# Estatísticas descritivas por grupo
dados_anova1 %>% group_by(Meio) %>%
summarise(n = n(), media = mean(Diametro), dp = sd(Diametro))
## # A tibble: 3 × 4
## Meio n media dp
## <fct> <int> <dbl> <dbl>
## 1 A 10 3.67 0.392
## 2 B 10 4.98 0.487
## 3 C 10 4.27 0.603
Acima, calculamos as médias simuladas: imagina-se ~3.6 mm (Meio A), ~5.0 mm (Meio B) e ~4.2 mm (Meio C). Vamos visualizar os dados com um boxplot para ver se essas diferenças são aparentes:
# Gráfico de caixas dos diâmetros por meio de cultura
dados_anova1 %>%
ggplot(aes(x = Meio, y = Diametro, fill = Meio)) +
geom_boxplot(alpha = 0.7) +
geom_jitter(width = 0.1) +
labs(title = "Diâmetro de colônias por Meio de Cultura",
y = "Diâmetro da colônia (mm)") +
theme_minimal()
Visualmente, espera-se que o meio B tenha caixa deslocada para cima (maior diâmetro médio). Para confirmar estatisticamente, conduzimos a ANOVA one-way:
# ANOVA de um fator
anova1 <- aov(Diametro ~ Meio, data = dados_anova1)
summary(anova1)
## Df Sum Sq Mean Sq F value Pr(>F)
## Meio 2 8.668 4.334 17.24 1.5e-05 ***
## Residuals 27 6.788 0.251
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
A saída da ANOVA apresentará a fonte de variação Entre Grupos (Meio) e Dentro dos Grupos (Resíduos), com seus graus de liberdade, Soma de Quadrados, Quadrados Médios, estatística F e p-value.
Aqui, o fator Meio teve p ≈ 0.0001, indicando diferença significativa entre as médias de pelo menos um par de meios. Interpretação: Rejeitamos H0; pelo menos um meio de cultura produz diâmetros de colônia diferentes. Para identificar onde estão as diferenças, faríamos testes post-hoc (por exemplo, Tukey HSD):
TukeyHSD(anova1)
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = Diametro ~ Meio, data = dados_anova1)
##
## $Meio
## diff lwr upr p adj
## B-A 1.3153002 0.75934411 1.8712562 0.0000088
## C-A 0.6060097 0.05005369 1.1619658 0.0305694
## C-B -0.7092904 -1.26524647 -0.1533344 0.0103734
O teste de Tukey indicou que há diferença significativa entre todos os grupos nesse exemplo.
Verificação de pressupostos: Antes de concluir, checamos os pressupostos da ANOVA:
plot(anova1)
no R para ver gráficos diagnósticos
(especialmente o Q-Q plot dos resíduos). Ou usar
shapiro.test(residuals(anova1))
. Se p > 0,05, não
rejeitamos normalidade dos resíduos (boa notícia). Se houver leve desvio
mas n é moderado, a ANOVA é robusta; desvios severos
demandariam transformação ou teste não paramétrico
(Kruskal-Wallis).leveneTest(Diametro ~ Meio, data = dados_anova1)
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 2 0.1133 0.8933
## 27
Se p > 0,05, assumimos variâncias homogêneas (premissa atendida).
Em caso de violação (p < 0,05), uma alternativa é usar a correção de
Welch na ANOVA
(oneway.test(Diametro ~ Meio, data=dados_anova1)
), ou usar
métodos robustos. No geral, no nosso cenário simulado as variâncias eram
semelhantes.
Após verificar premissas, concluímos os achados da ANOVA one-way no contexto microbiológico. Por exemplo: “O meio de cultura influenciou significativamente o tamanho das colônias fúngicas (ANOVA, p < 0,001). Colônias no meio B foram, em média, maiores que nos meios A e C, e C maior que A.”
Quando usar: Quando queremos estudar simultaneamente dois fatores (por exemplo, dois diferentes tratamentos aplicados ao mesmo tempo, ou tratamento e cepa, etc.) e possivelmente sua interação. Em microbiologia, um exemplo poderia ser testar o efeito da temperatura (fator A) e do pH do meio (fator B) no rendimento de uma fermentação, com cada combinação de temperatura e pH sendo um tratamento. A ANOVA fatorial testará: efeito principal da temperatura, efeito principal do pH e efeito de interação (temperatura*pH). A hipótese nula para cada efeito é que não há diferença nas médias para os níveis daquele fator (ou nenhuma interação presente, no caso do termo de interação).
Exemplo prático: Vamos simular um experimento 2×2 simples: fator A = Temperatura (30°C vs 37°C) e fator B = pH (6.0 vs 7.0). Suponha que esperamos que o rendimento (em, digamos, densidade celular) seja maior em pH 7 e também maior a 37°C, e que os efeitos sejam aditivos (sem interação significativa). Teremos 5 réplicas em cada combinação (total 20 observações).
# Simular dados para ANOVA fatorial 2x2
set.seed(222)
temp <- factor(rep(c("30°C","37°C"), each = 10))
ph <- factor(rep(c("pH6","pH7"), times = 10))
# Definir médias para cada combinação (sem interação significativa neste caso)
# 30°C, pH6: 8; 30°C, pH7: 10; 37°C, pH6: 9; 37°C, pH7: 11 (aditivo: +2 por pH7, +1 por 37°C)
mu <- with(data.frame(temp, ph),
ifelse(temp=="30°C" & ph=="pH6", 8,
ifelse(temp=="30°C" & ph=="pH7", 10,
ifelse(temp=="37°C" & ph=="pH6", 9, 11))))
rendimento <- rnorm(20, mean = mu, sd = 1) # adicionar algum desvio padrão
dados_anova2 <- tibble(Temperatura = temp, pH = ph, Rendimento = rendimento)
Temos assim um dataset com as colunas Temperatura, pH e Rendimento (simulado). Vamos visualizar as médias de cada combinação em um gráfico de interações:
# Gráfico de interação: efeito de Temperatura e pH no rendimento
dados_anova2 %>%
group_by(Temperatura, pH) %>%
summarise(media = mean(Rendimento), .groups="drop") %>%
ggplot(aes(x = pH, y = media, color = Temperatura, group = Temperatura)) +
geom_point(size = 3) +
geom_line(size = 1) +
labs(title = "Efeito de Temperatura e pH no Rendimento (simulado)",
y = "Rendimento médio") +
theme_minimal()
No gráfico, esperamos ver ambas as linhas (30°C e 37°C) ascendendo de pH6 para pH7, e a linha de 37°C acima da de 30°C, aproximadamente paralelas (indicando pouca interação visível). Agora executamos a ANOVA de dois fatores:
# ANOVA fatorial dois fatores (two-way)
anova2 <- aov(Rendimento ~ Temperatura * pH, data = dados_anova2)
summary(anova2)
## Df Sum Sq Mean Sq F value Pr(>F)
## Temperatura 1 0.821 0.821 0.769 0.39336
## pH 1 13.063 13.063 12.239 0.00297 **
## Temperatura:pH 1 0.076 0.076 0.071 0.79345
## Residuals 16 17.078 1.067
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
A saída ANOVA agora terá linhas para Temperatura, pH e Temperatura:pH (interação).
Interpretação: O fator Temperatura tem p = 0,39 (não significativo), o fator pH tem p < 0,001 (altamente significativo), enquanto a interação Temperatura:pH não é significativa (p = 0,79). Isso sugere que: (a) temperaturas de 37°C não produzem maior rendimento médio que 30°C, (b) pH 7,0 produz maior rendimento médio que pH 6,0, e (c) o efeito da temperatura parece consistente em ambos os pHs (sem interação significativa). Em outros termos, os fatores agem de forma aditiva no rendimento.
Para comunicar: “Houve efeito significativo do pH no rendimento (p<0,001). Culturas a 37°C não tiveram rendimento maior que a 30°C, já o pH 7,0 resultou em maior rendimento que pH 6,0. Não houve interação significativa entre temperatura e pH (p=0,79), indicando que o efeito de cada fator independe do nível do outro.”
Pressupostos: Valem os mesmos da ANOVA one-way:
normalidade dos resíduos e variâncias homogêneas em todas as combinações
fatoriais, além de observações independentes. Podemos verificar resíduos
com plot(anova2)
ou
shapiro.test(residuals(anova2))
, e variâncias com Levene
(por exemplo
leveneTest(Rendimento ~ Temperatura*pH, data=dados_anova2)
).
Se alguma premissa for violada, existem alternativas como transformação
de dados ou métodos não paramétricos (ex.: teste de Friedman para casos
especiais) ou modelos lineares generalizados.
Observação: Em experimentos fatoriais maiores (ex.: 3 fatores), a interpretação segue o mesmo princípio, analisando efeitos principais e interações de 2ª ordem, 3ª ordem etc., porém a complexidade cresce. Sempre que uma interação significativa é encontrada, interpreta-se com cuidado os efeitos principais (pode não fazer sentido discutir efeito isolado de um fator se há forte interação – deve-se então reportar o efeito de um fator condicionado ao nível do outro).
A regressão linear é uma técnica estatística utilizada para modelar a relação entre uma variável dependente (resultado contínuo) e uma ou mais variáveis independentes (preditoras), assumindo que essa relação pode ser aproximada por uma linha reta. Em microbiologia, poderíamos usar regressão linear para, por exemplo, relacionar a densidade de células (OD) com o tempo de incubação, ou prever a contagem de bactérias a partir da concentração de nutriente no meio.
Aqui focaremos na regressão linear simples (uma variável preditora) para ilustração, mas os princípios se estendem à múltipla. A equação de modelo é Y = beta0 + beta1 * X + erro, onde Y é a variável resposta, X a preditora, beta0 (ou alfa) o intercepto (valor médio de Y quando X=0) e beta1 o coeficiente angular (quanto Y muda em média a cada unidade de $X$), e $$ é o erro aleatório assumido ~ Normal(0, $^2$).
Diagnóstico de resíduos: Após ajustar um modelo linear, é fundamental verificar se os pressupostos do modelo linear foram atendidos: (a) os resíduos seguem distribuição aproximadamente normal, (b) homocedasticidade (variância constante dos resíduos ao longo dos valores preditos), (c) linearidade (a forma funcional linear está adequada) e (d) independência dos erros. Vamos abordar esses pontos no exemplo a seguir.
Exemplo prático: Suponha que medimos o crescimento de uma cultura (por exemplo, densidade celular OD) em função do tempo de incubação (horas). Simularemos 50 observações de tempo e OD. Esperamos uma relação linear positiva (mais tempo, maior OD) até certa fase.
# Simular dados de regressão linear (tempo de incubação vs OD)
set.seed(99)
tempo <- runif(50, min = 0, max = 24) # tempo em horas, entre 0 e 24h
# Suponha OD ~ 0.1 + 0.05*tempo + erro
OD <- 0.1 + 0.05*tempo + rnorm(50, sd = 0.1) # algum erro aleatório
dados_reg <- tibble(Tempo_h = tempo, OD = OD)
# Visualização dos dados simulados
dados_reg %>% ggplot(aes(x = Tempo_h, y = OD)) +
geom_point(color = "#36454F") +
labs(title = "OD vs Tempo de incubação (dados simulados)",
x = "Tempo de incubação (h)", y = "Densidade Óptica (OD)") +
theme_minimal()
O diagrama de dispersão acima deve mostrar uma tendência crescente aproximadamente linear. Vamos ajustar uma regressão linear simples OD ~ Tempo.
# Ajustar modelo de regressão linear
modelo <- lm(OD ~ Tempo_h, data = dados_reg)
summary(modelo)
##
## Call:
## lm(formula = OD ~ Tempo_h, data = dados_reg)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.18175 -0.04748 0.01391 0.05118 0.18709
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.041193 0.023673 1.74 0.0882 .
## Tempo_h 0.052635 0.001747 30.12 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.08382 on 48 degrees of freedom
## Multiple R-squared: 0.9498, Adjusted R-squared: 0.9487
## F-statistic: 907.4 on 1 and 48 DF, p-value: < 2.2e-16
A saída do summary(modelo)
incluirá os coeficientes
estimados $_0$ e $_1$, seus erros padrão, estatísticas t e p-valores,
$R^2$ etc. Por exemplo, pode mostrar algo como:
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.1205 0.0387 3.12 0.0031 **
Tempo_h 0.0486 0.0032 15.19 <2e-16 ***
---
Residual standard error: 0.105 on 48 degrees of freedom
Multiple R-squared: 0.827, Adjusted R-squared: 0.823
F-statistic: 231.0 on 1 and 48 DF, p-value: < 2.2e-16
Interpretação dos coeficientes: O intercepto $ $ indica o valor de OD estimado no tempo 0 (faz sentido ser próximo de 0.1 simulado). O coeficiente de Tempo $ $ significa que a cada 1 hora, espera-se um aumento de ~0.049 na OD, em média. Este coeficiente é altamente significativo (p < 2e-16), indicando uma relação linear significativa entre tempo e OD no intervalo considerado. O $R^2 $ indica que ~82.7% da variação nos valores de OD é explicada pelo tempo de incubação – um ajuste muito bom.
Diagnóstico de resíduos: Vamos verificar graficamente se os resíduos atendem aos pressupostos:
# Diagnóstico de resíduos
par(mfrow=c(2,2))
plot(modelo)
Os gráficos gerados (padrão do R para objetos lm) incluem: (1) Resíduos vs Valores Ajustados – deve aparecer um espalhamento aleatório (sem padrões) se a variância é constante e modelo linear apropriado; (2) Q-Q plot dos resíduos – deve seguir aproximadamente a linha se os resíduos são normais; (3) Escala-Local (sqrt resíduos padronizados vs ajustados) – para verificar homocedasticidade; (4) Resíduos vs Leverage – para detectar pontos influentes. No nosso exemplo simulado, provavelmente estará tudo adequado, pois geramos dados conforme o modelo linear com erros normais constantes.
Além da inspeção visual, podemos fazer testes formais: por exemplo, Shapiro-Wilk para normalidade dos resíduos, e teste de Breusch-Pagan para homocedasticidade:
shapiro.test(residuals(modelo)) # teste de normalidade
##
## Shapiro-Wilk normality test
##
## data: residuals(modelo)
## W = 0.98357, p-value = 0.7089
bptest(modelo) # teste de Breusch-Pagan para heterocedasticidade
##
## studentized Breusch-Pagan test
##
## data: modelo
## BP = 0.043837, df = 1, p-value = 0.8342
Supondo que obtenhamos p > 0,05 em ambos, não há evidência de violação séria de normalidade ou homocedasticidade.
Visualização com linha de regressão: Vamos apresentar o gráfico de dispersão com a reta de regressão ajustada sobreposta, para ilustrar o ajuste do modelo:
# Gráfico de dispersão com linha de regressão ajustada
dados_reg %>%
ggplot(aes(x = Tempo_h, y = OD)) +
geom_point(color="#36454F") +
geom_smooth(method = "lm", se = FALSE, color="#636EAF") +
labs(title = "Ajuste de regressão linear: OD ~ Tempo",
x = "Tempo de incubação (h)", y = "Densidade Óptica (OD)") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
Exemplo de regressão linear: os pontos representam dados simulados de OD vs Tempo, e a linha indica o ajuste linear. Observa-se um bom ajuste linear neste caso.
Interpretação global: O modelo sugere que existe uma relação linear positiva entre o tempo de incubação e a densidade óptica da cultura (OD). Para cada hora adicional, a OD aumenta em torno de 0,05 (unidades de OD), com alta significância estatística. Antes de aceitar o modelo, verificamos que os resíduos não apresentam padrão sistemático e têm distribuição aproximadamente normal e variância constante, o que dá credibilidade ao modelo. Em contexto microbiológico, podemos dizer: “Houve um aumento linear significativo da densidade óptica com o tempo de incubação (coeficiente = 0,049 OD/hora, p < 0,001), explicando ~83% da variação total. Os diagnósticos do modelo não indicaram violações dos pressupostos de regressão linear.”
Nota: Se algum pressuposto fosse violado – por exemplo, se os resíduos aumentassem com os valores ajustados (heterocedasticidade) – poderíamos considerar uma transformação (como log(OD)) ou usar modelos lineares generalizados apropriados. Se a relação não parecesse linear (ex: saturação do crescimento em tempos altos), poderíamos ajustar modelos polinomiais ou não-lineares. Aqui mantivemos um cenário simples para fins didáticos.
A Análise de Covariância (ANCOVA) combina ideias de ANOVA e regressão linear. Basicamente, é uma ANOVA que inclui uma ou mais variáveis contínuas adicionais (covariáveis) no modelo para explicar parte da variação residual. A ANCOVA é útil quando queremos comparar médias de grupos ajustando pelo efeito de alguma variável contínua que influencia a resposta mas não é de interesse primário. Por exemplo, em microbiologia poderíamos comparar a eficácia de dois tratamentos na redução de contaminação bacteriana, ajustando pelo valor inicial de contaminação (usando o nível inicial como covariável). Assim, a ANCOVA avaliará a diferença entre tratamentos após remover o efeito da diferença inicial.
Quando usar: Use ANCOVA quando você tem um fator categórico principal e deseja controlar (ajustar) o efeito de uma covariável contínua. As premissas são as do modelo linear geral: normalidade dos resíduos, homogeneidade de variâncias e adicionalmente assume-se geralmente que não haja interação entre o fator e a covariável (i.e., as inclinações das retas de regressão nos grupos sejam paralelas), a menos que explicitamente modelada.
Exemplo prático: Suponha um experimento para comparar duas cepas bacterianas quanto à produção de uma enzima, mas sabemos que o rendimento enzimático também depende da densidade celular alcançada. Temos duas cepas (Fator, com níveis A e B) e medimos a atividade enzimática final (resposta) bem como a densidade celular (OD) atingida ao final (covariável). A ANCOVA nos dirá se há diferença na média de atividade enzimática entre as cepas, ajustando para diferenças de OD final.
Vamos simular dados: 30 observações (15 de cada cepa). Suponha que cepa A e B em média não difiram drasticamente em OD, mas cepa B talvez tenha atividade enzimática um pouco maior independentemente do OD.
# Simular dados para ANCOVA
set.seed(333)
n <- 30
cepa <- factor(rep(c("A","B"), each = n/2))
OD_final <- rnorm(n, mean = 1.0, sd = 0.2) # densidade final alcançada
# Atividade enzimática (UA - unidades arbitrárias):
# Suponha efeito da cepa: B tem +1 UA a mais que A em média, além do efeito do OD
atividade <- 5 + 2*OD_final + ifelse(cepa=="B", 1, 0) + rnorm(n, sd = 0.5)
dados_ancova <- tibble(Cepa = cepa, OD_final = OD_final, Atividade = atividade)
Inspecionar os dados simulados:
dados_ancova %>%
group_by(Cepa) %>%
summarise(media_OD = mean(OD_final), media_Ativ = mean(Atividade), .groups="drop")
## # A tibble: 2 × 3
## Cepa media_OD media_Ativ
## <fct> <dbl> <dbl>
## 1 A 0.954 6.78
## 2 B 1.04 8.25
Suponha que as médias de OD final sejam semelhantes entre cepas (~1.0), e a média de atividade ~7 para A e ~8 para B (refletindo o +1 simulado). Vamos visualizar a relação entre OD e Atividade para as duas cepas:
# Gráfico: Atividade vs OD_final, diferenciando cepas
dados_ancova %>%
ggplot(aes(x = OD_final, y = Atividade, color = Cepa)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE) +
labs(title = "Atividade enzimática vs OD final por Cepa",
x = "Densidade final (OD)", y = "Atividade enzimática (UA)") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
Nesse gráfico, as duas retas (uma para cada cepa) deverão ter inclinações semelhantes (ambas estimando coeficiente ~2 para OD) e a reta da cepa B deslocada para cima em relação à de A (intercepto maior), indicando maior atividade para B em qualquer OD dado – isso condiz com a forma como simulamos os dados.
Agora, ajustamos um modelo ANCOVA: Atividade ~ Cepa + OD_final (i.e., efeito da cepa ajustado pelo OD final).
# Ajustar modelo de ANCOVA
modelo_ancova <- lm(Atividade ~ OD_final + Cepa, data = dados_ancova)
anova(modelo_ancova) # tabela ANOVA para o modelo linear
## Analysis of Variance Table
##
## Response: Atividade
## Df Sum Sq Mean Sq F value Pr(>F)
## OD_final 1 8.5451 8.5451 46.989 2.303e-07 ***
## Cepa 1 12.3846 12.3846 68.102 7.360e-09 ***
## Residuals 27 4.9101 0.1819
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(modelo_ancova) # coeficientes detalhados
##
## Call:
## lm(formula = Atividade ~ OD_final + Cepa, data = dados_ancova)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.88951 -0.21540 -0.04178 0.26203 0.72293
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.8930 0.3926 12.464 1.04e-12 ***
## OD_final 1.9734 0.3948 4.998 3.06e-05 ***
## CepaB 1.3135 0.1592 8.252 7.36e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4264 on 27 degrees of freedom
## Multiple R-squared: 0.81, Adjusted R-squared: 0.7959
## F-statistic: 57.55 on 2 and 27 DF, p-value: 1.836e-10
A tabela ANOVA do modelo nos mostrará significância dos termos OD_final (covariável) e Cepa. Esperamos ver OD_final altamente significativo (p < 0,001 talvez) pois influencia fortemente a atividade, e também um efeito significativo da Cepa (devido ao +1 UA de B).
A covariável OD_final foi significativa (faz sentido: maior densidade
-> mais atividade). Mesmo ajustando para OD, a diferença
entre cepas também é significativa (p ≈ 1e-8), indicando que a cepa B
produz, em média, mais enzima que A quando comparadas no mesmo OD final.
Os coeficientes do summary
confirmariam: intercepto
(atividade média da cepa A quando OD_final = 0), slope de OD (~2 UA por
unidade de OD), e um coeficiente para CepaB ~ +1 UA (diferença ajustada
entre B e A).
Interpretação: A ANCOVA indica que as cepas diferem na atividade enzimática produzida (p < 0,001), após controlar o efeito da densidade celular final. A cepa B apresentou, em média, ~1 UA a mais de atividade do que a cepa A para um mesmo OD final. A covariável OD_final também teve efeito significativo (p < 0,001), ou seja, independentemente da cepa, culturas com maior densidade final tendem a ter maior atividade (aproximadamente 2 UA de atividade a mais por cada 1.0 de OD).
Em resumo: “Cepa B produz significativamente mais enzima que cepa A ao fim do experimento, mesmo após ajustar pela densidade celular alcançada (ANCOVA, efeito da cepa p<0,001). Além disso, a atividade enzimática aumenta com a densidade celular (p<0,001).”
Pressupostos e considerações: Verificamos novamente
os resíduos do modelo linear ajustado (plot(modelo_ancova)
)
para garantir normalidade e homocedasticidade – semelhantes aos
procedimentos já descritos na regressão. Um pressuposto específico da
ANCOVA clássica é a homogeneidade das inclinações de regressão:
assumimos que o efeito da covariável OD_final foi semelhante para ambas
as cepas (linhas paralelas). Podemos testar a interação
Cepa*OD_final
no modelo:
modelo_ancova_interacao <- lm(Atividade ~ OD_final * Cepa, data = dados_ancova)
anova(modelo_ancova_interacao)
## Analysis of Variance Table
##
## Response: Atividade
## Df Sum Sq Mean Sq F value Pr(>F)
## OD_final 1 8.5451 8.5451 45.5254 3.686e-07 ***
## Cepa 1 12.3846 12.3846 65.9805 1.328e-08 ***
## OD_final:Cepa 1 0.0299 0.0299 0.1591 0.6932
## Residuals 26 4.8802 0.1877
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Se o termo de interação Cepa:OD_final não for significativo (p alto), como no nosso caso simulado, a premissa de inclinações paralelas é válida. Caso contrário (interação significativa), significaria que a relação entre a covariável e a resposta difere entre grupos – nessa situação, a interpretação se modifica (talvez cada reta tenha slope diferente) e um modelo ANCOVA simples não é adequado sem incluir essa interação.
A ANCOVA, quando adequada, aumenta o poder do teste sobre diferenças entre grupos removendo a variação extra devida à covariável. Neste exemplo, ao considerar OD_final, reduzimos a variabilidade residual e destacamos melhor a diferença entre cepas. Isso é uma aplicação típica em que ajustar por um fator de confusão ou covariável contínua esclarece o efeito de interesse.
Quando a variável resposta é categórica binária (sucesso/fracasso, presença/ausência, doente/sadio etc.), a Regressão Logística é o método estatístico adequado para modelar a relação entre essa resposta e variáveis explicativas. Em microbiologia, poderíamos usar regressão logística para modelar a probabilidade de um evento, por exemplo: probabilidade de uma cultura ter contaminante (sim/não) em função de condições de incubação, ou probabilidade de um paciente apresentar infecção bacteriana dado alguns parâmetros clínicos.
Ideia básica: A regressão logística estima a probabilidade do evento de interesse (codificado como 1) dado os preditores. Ela utiliza a função logística para garantir que as predições fiquem entre 0 e 1. O modelo logístico binário pode ser escrito como:
\(\text{logit}(P(Y=1)) = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \dots + \beta_k X_k,\)
onde $(p) = $. Em outras palavras, o log da razão de chances (odds) do evento é modelado linearmente. Os coeficientes $$ representam o impacto das variáveis em log-odds; exponenciando $$ obtemos o odds ratio associado. Pressupostos: não requer normalidade dos preditores nem homocedasticidade (pois a resposta não é contínua), mas assume-se independência das observações e relação linear entre preditores contínuos e o logito da resposta (pode-se verificar essa linearidade residual).
Exemplo prático: Suponha que estamos estudando a probabilidade de uma determinada bactéria sobreviver a um tratamento térmico em função da temperatura de aquecimento. Temos dados de várias amostras aquecidas a diferentes temperaturas (variável contínua Temp, em °C) e registramos se a bactéria sobreviveu (1) ou não (0). Vamos simular 100 observações, cobrindo uma faixa de temperaturas, onde a chance de sobrevivência decai conforme a temperatura aumenta.
# Simular dados para regressão logística
set.seed(444)
N <- 100
Temp <- runif(N, min = 40, max = 80) # temperatura de 40 a 80 °C
# Modelo verdadeiro: logit(P(sobrevive)) = 5 - 0.1*Temp
# => P diminui com Temp. Aproximadamente 50% chance em 50°C, <10% em 80°C.
prob <- 1/(1 + exp(-(5 - 0.1*Temp)))
Sobrevive <- rbinom(N, size = 1, prob = prob)
dados_log <- tibble(Temp, Sobrevive = factor(Sobrevive, labels=c("Não","Sim")))
Aqui Sobrevive é um fator “Sim”/“Não”. Vamos ajustar uma regressão logística para prever a probabilidade de sobrevivência em função de Temp:
# Ajustar modelo de regressão logística
modelo_log <- glm(Sobrevive ~ Temp, data = dados_log, family = binomial)
summary(modelo_log)
##
## Call:
## glm(formula = Sobrevive ~ Temp, family = binomial, data = dados_log)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.15678 1.28515 3.234 0.001219 **
## Temp -0.08281 0.02315 -3.577 0.000347 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 132.81 on 99 degrees of freedom
## Residual deviance: 117.00 on 98 degrees of freedom
## AIC: 121
##
## Number of Fisher Scoring iterations: 4
Isso indicaria beta0=4.15 e beta1=-0.08. Em termos de interpretação: o odds ratio = exp(-0.08) ≈ 0.920 por °C – ou seja, a cada aumento de 1°C, as chances de sobrevivência são multiplicadas por ~0,92 (uma redução de ~8% na odds de sobreviver).
Visualização do ajuste: Vamos plotar os dados e a curva logística ajustada:
# Obter probabilidades preditas do modelo
dados_log <- dados_log %>% mutate(prob_pred = predict(modelo_log, type="response"))
# Gráfico de dispersão (jitter) e curva
dados_log %>%
ggplot(aes(x = Temp, y = as.numeric(Sobrevive=="Sim"))) +
geom_jitter(height=0.05, alpha=0.5, color="#36454F") +
geom_line(aes(x = Temp, y = prob_pred), color="#636EAF", size=1) +
labs(title="Probabilidade de sobrevivência vs Temperatura",
y="Probabilidade de Sobrevivência") +
theme_minimal()
Regressão logística ajustada (simulação): os pontos representam sobrevivências observadas (jitter vertical para visualizar 0/1), e a linha mostra a probabilidade estimada de sobrevivência em função da temperatura. Nota-se o declínio sigmoidal da probabilidade de sobrevivência conforme a temperatura aumenta.
No gráfico acima, a curva logística decrescente reflete bem a tendência: altas temperaturas quase eliminam a chance de sobrevivência.
Interpretação dos resultados: O modelo logístico encontrou um efeito significativo da temperatura (p < 0,001). Podemos relatar que “A temperatura de tratamento teve efeito significativo sobre a sobrevivência bacteriana (regressão logística, p < 0,001). A cada aumento de 1°C, as chances de sobrevivência diminuem cerca de 8% (odds ratio ≈ 0,92 por °C).”
Avaliação do modelo: Além dos coeficientes,
olharíamos medidas de ajuste como o pseudo-R2 (por exemplo, R2 de
Nagelkerke) e faríamos validações se necessário. Podemos usar a função
predict
para classificar e comparar com observações para
avaliar acurácia. Exemplo:
# Taxa de acerto ao classificar sobrevivência com cutoff 0.5
pred_class <- ifelse(dados_log$prob_pred > 0.5, "Sim", "Não")
mean(pred_class == dados_log$Sobrevive)
## [1] 0.68
Isso daria a proporção de acertos do modelo. Como nosso modelo é forte, provavelmente alto. Também poderíamos construir a matriz de confusão.
Diagnóstico: Na regressão logística, checar outliers e influência (ex.: distância de Cook) e a suposição de linearidade no logito para preditores contínuos (podemos fazer gráficos dos resíduos deviance ou usar testes como o de Hosmer-Lemeshow para qualidade do ajuste). No nosso exemplo, o ajuste é bom.
Resumindo, a regressão logística é uma ferramenta poderosa para predições de probabilidades e para entender fatores de risco. Diferentemente de regressão linear, interpretamos resultados em termos de odds/probabilidades. E sempre indicamos medidas de efeito como odds ratio para facilitar entendimento aplicado.
O teste chi2 (qui-quadrado) abrange uma família de testes não-paramétricos usados em dados categóricos. Os dois usos mais comuns são: teste de aderência (goodness-of-fit) – verificando se as proporções observadas em uma categoria seguem uma certa distribuição teórica – e teste de independência (ou homogeneidade) – verificando se duas variáveis categóricas estão associadas (dependentes) ou não. Aqui focaremos no teste de independência em tabelas de contingência, pois é muito aplicado em microbiologia para dados de frequências (por exemplo, presença/ausência de determinado microrganismo em diferentes grupos de amostra).
Quando usar: Use o teste chi2 de independência para avaliar se há associação significativa entre duas variáveis categóricas, baseando-se na diferença entre frequências observadas e esperadas sob a hipótese de independência (variáveis sem relação). Exemplo: queremos saber se a proporção de culturas contaminadas difere entre laboratórios A, B, C (variável 1: laboratório, variável 2: contaminada sim/não). H0: “ser contaminada é independente do laboratório (mesma proporção em todos)”; Ha: “alguma diferença de proporções existe”.
Premissas: (a) As observações devem ser independentes umas das outras; (b) as frequências esperadas em cada célula da tabela idealmente não devem ser muito baixas – um critério comum é todas esperadas ≥ 5, ou pelo menos ≥ 5 em 80% das células e nenhuma 0. Se essa condição falha (tabelas pequenas), usamos correção de Yates para 2x2 ou teste exato de Fisher.
Exemplo prático: Suponha que testamos 50 amostras de dois tipos de desinfetante (A e B) para ver se eliminam uma bactéria contaminante. Resultado categórico: “sucesso” (contaminação eliminada) ou “falha” (bactéria ainda presente). Obtemos contagens: Desinfetante A teve 32 sucessos e 18 falhas; Desinfetante B teve 18 sucessos e 32 falhas. Vamos organizar isso e aplicar o teste chi2:
# Construir tabela de contingência 2x2
conting <- matrix(c(32,18, 18,32), nrow = 2, byrow = TRUE)
rownames(conting) <- c("Desinfetante A","Desinfetante B")
colnames(conting) <- c("Sucesso","Falha")
conting
## Sucesso Falha
## Desinfetante A 32 18
## Desinfetante B 18 32
Vamos aplicar o teste chi2 de independência:
chisq.test(conting, correct = FALSE)
##
## Pearson's Chi-squared test
##
## data: conting
## X-squared = 7.84, df = 1, p-value = 0.00511
Definimos correct=FALSE
para não usar correção de Yates
(neste caso as frequências esperadas são >= 15, não é
necessário).
Temos chi2 = 7,84, p = 0,0051. Interpretação: Rejeitamos H0 de independência. Há evidência de associação entre o tipo de desinfetante e o sucesso no controle da bactéria (p < 0,01). Observando a tabela, A teve 64% de sucesso (32/50) contra 36% para B (18/50). Portanto, o desinfetante A superou o B em eficácia.
Reportaríamos algo como: “O tipo de desinfetante apresentou associação significativa com o desfecho de contaminação (teste chi2, X2 = 7,84, p = 0,005). Desinfetante A eliminou a bactéria em 64% das amostras, significativamente mais que o desinfetante B (36%).”
Se quisermos quantificar a magnitude, poderíamos calcular a razão de chances (odds ratio) = (32/18) / (18/32) ≈ 3.16, ou diferença de proporções 28%. Poderíamos também calcular o V de Cramér para um efeito de tamanho em tabelas maiores.
Observação: Em tabelas RxC maiores, a interpretação é que pelo menos uma proporção difere. Podemos examinar resíduos padronizados para ver quais células contribuíram mais. Em nosso exemplo 2x2, como há apenas 1 grau de liberdade, o teste já indica diferença entre as duas proporções.
Pressupostos check: Podemos verificar as frequências esperadas:
chisq.test(conting)$expected
## Sucesso Falha
## Desinfetante A 25 25
## Desinfetante B 25 25
Isso retornaria a tabela esperada se não houvesse associação. No nosso exemplo: ambos teriam 25 sucessos e 25 falhas se iguais. Vemos que as esperadas (25 e 25 em cada linha) são ≥ 5, então estamos ok. Se alguma esperada fosse < 5, por segurança usaríamos o teste exato de Fisher:
fisher.test(conting)
##
## Fisher's Exact Test for Count Data
##
## data: conting
## p-value = 0.008985
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
## 1.296580 7.763988
## sample estimates:
## odds ratio
## 3.122263
No caso de tabelas 2x2 com baixas contagens, o teste exato fornece p-valor mais acurado. Para tabelas maiores, às vezes não há alternativa exata facilmente, então agrupar categorias ou coletar mais dados pode ser necessário.
Resumindo, o teste qui-quadrado é uma ferramenta simples mas crucial para analisar dados categóricos em microbiologia, seja para verificar distribuições ou associações. Ele nos permite, por exemplo, concluir se um determinado tratamento ou condição está associado a uma maior frequência de um determinado resultado em relação a outro. A interpretação deve sempre voltar aos percentuais/proporções para clareza (já que o chi2 em si não diz a direção da diferença, apenas que existe – cabe a nós ver quais categorias têm mais do que o esperado).