Instruções gerais

Pacotes

# Instalar (se necessário):
# install.packages("tidyverse")
# install.packages("lmerTest")

library(tidyverse)
library(lmerTest)

Dados

Exemplo de planilha (do professor):
https://docs.google.com/spreadsheets/d/1mpry3PyorQVfhX79ho1TBVV47-w8XuzxV_zDUhpjeHU/edit?usp=sharing

Colunas esperadas: - ID: identificador único da réplica (pote); - Tempo: dias (e.g., 1, 3, 5, 7,…); - Dia: data da coleta; - Hora: hora da coleta; - Tratamento: fator categórico (A/B etc.); - Tratamento2: variável numérica contínua (para experimentos contínuos); - N: número de frondes no dia/replica (variável de estado).

# Ajuste "Dados.csv" para o seu caminho/arquivo
dados <- read_csv("Dados.csv")

# Verificação rápida
dados
## # A tibble: 80 × 7
##       ID Tempo Dia      Hora   Tratamento Tratamento2     N
##    <dbl> <dbl> <chr>    <time> <chr>            <dbl> <dbl>
##  1     1     1 01/09/25 09:00  A                    3     3
##  2     2     1 01/09/25 09:00  A                    6     3
##  3     3     1 01/09/25 09:00  A                    9     3
##  4     4     1 01/09/25 09:00  A                   12     3
##  5     5     1 01/09/25 09:00  A                   15     3
##  6     6     1 01/09/25 09:00  A                   18     3
##  7     7     1 01/09/25 09:00  A                   21     3
##  8     8     1 01/09/25 09:00  A                   24     3
##  9     9     1 01/09/25 09:00  A                   27     3
## 10    10     1 01/09/25 09:00  A                   30     3
## # ℹ 70 more rows

Exploração gráfica do crescimento

Avaliem o padrão de crescimento global e por pote (ID): há tendência clara de aumento? As séries evoluem em ritmos semelhantes ou divergem ao longo do tempo? Lembrem-se de que a variável categórica é Tratamento e a contínua é Tratamento2; se utilizarem nomes distintos no seu conjunto de dados, ajustem o código correspondente. Por fim, cada grupo experimental deve adotar apenas um tipo de tratamento correpondente ao seu experimento (categórico ou contínuo).

Caso categórico (Tratamento como fator)

g_cat <- dados %>%
  ggplot(aes(x = Tempo, y = N,
             colour = as.factor(ID),
             shape = Tratamento,
             linetype = Tratamento)) +
  geom_point() +
  geom_line() +
  theme_bw() +
  guides(colour = "none")

g_cat

g_cat + facet_wrap(~ ID)

Caso contínuo (Tratamento2 numérico)

g_cont <- dados %>%
  ggplot(aes(x = Tempo, y = N,
             colour = Tratamento2,
             group = as.factor(ID))) +
  geom_point() +
  geom_line() +
  theme_bw()

g_cont

g_cont + facet_wrap(~ ID)

Taxa de crescimento (R)

Aqui, iremos calcular a taxa de crescimento diária de cada pote (ID), isto é, a variação proporcional no número de frondes entre dois dias consecutivos para cada réplica do experimento.

taxa_r <- function(x) {
  n <- length(x)
  R_i <- x[2:n] / x[1:(n - 1)]
  c(0, R_i)
}

dados <- dados %>%
  group_by(ID) %>%
  arrange(Tempo, .by_group = TRUE) %>%
  mutate(R = taxa_r(N)) %>%
  ungroup()

head(dados)
## # A tibble: 6 × 8
##      ID Tempo Dia      Hora   Tratamento Tratamento2     N     R
##   <dbl> <dbl> <chr>    <time> <chr>            <dbl> <dbl> <dbl>
## 1     1     1 01/09/25 09:00  A                    3     3  0   
## 2     1     3 03/09/25 09:00  A                    3     8  2.67
## 3     1     5 05/09/25 09:00  A                    3    18  2.25
## 4     1     7 07/09/25 09:00  A                    3    54  3   
## 5     2     1 01/09/25 09:00  A                    6     3  0   
## 6     2     3 03/09/25 09:00  A                    6     7  2.33

Redução a uma métrica por pote (média geométrica de R)

Para resumir a taxa média de crescimento, não é adequado usar a média aritmética, pois o crescimento de organismos (como o aumento do número de frondes) é um processo multiplicativo, não aditivo.

A média geométrica é a medida correta nesses casos, pois representa o fator de crescimento médio que, aplicado sucessivamente, produz o mesmo efeito global observado. Em outras palavras, ela preserva a proporcionalidade entre os intervalos de tempo, evitando que valores muito altos distorçam o resultado — algo que aconteceria com a média aritmética.

Matematicamente, se \(R_1, R_2, \ldots, R_n\) são as taxas de crescimento entre dias consecutivos,
a média geométrica é dada por:

\[ \bar{R}_{geom} = \left( \prod_{i=1}^{n} R_i \right)^{1/n} \]

Essa medida reflete melhor o crescimento acumulado ao longo do tempo, sendo portanto a forma apropriada de resumir taxas de crescimento ou razões sucessivas em estudos biológicos.

dados_media <- dados %>%
  group_by(ID) %>%
  filter(R > 0) %>%
  summarise(
    Tratamento  = first(Tratamento),
    Tratamento2 = first(Tratamento2),
    R = (prod(R, na.rm = TRUE))^(1 / sum(!is.na(R)))
  )

dados_media
## # A tibble: 20 × 4
##       ID Tratamento Tratamento2     R
##    <dbl> <chr>            <dbl> <dbl>
##  1     1 A                    3  2.62
##  2     2 A                    6  2.31
##  3     3 A                    9  2.20
##  4     4 A                   12  2.55
##  5     5 A                   15  2.71
##  6     6 A                   18  2.33
##  7     7 A                   21  2.45
##  8     8 A                   24  2.31
##  9     9 A                   27  2.20
## 10    10 A                   30  2.08
## 11    11 B                   33  2.96
## 12    12 B                   36  2.45
## 13    13 B                   39  2.39
## 14    14 B                   42  2.99
## 15    15 B                   45  2.39
## 16    16 B                   48  2.47
## 17    17 B                   51  2.60
## 18    18 B                   54  2.29
## 19    19 B                   57  2.48
## 20    20 B                   60  2.39

Comparação da taxa média de crescimento

Verifique nesta etapa se o tratamento aplicado influenciou a taxa média de crescimento das réplicas.

Caso categórico (boxplot por tratamento)

dados_media %>%
  ggplot(aes(x = Tratamento, y = R,
             fill = Tratamento, colour = Tratamento)) +
  geom_boxplot(aes(alpha = .5)) +
  geom_jitter(width = 0.1, height = 0) +
  theme_classic() +
  theme(legend.position = "none")

Caso contínuo (regressão linear simples)

dados_media %>%
  ggplot(aes(x = Tratamento2, y = R)) +
  geom_point() +
  geom_smooth(method = "lm") +
  theme_classic() +
  theme(legend.position = "none")

Inferência estatística

Nesta etapa, o objetivo é verificar estatisticamente se o tratamento (categórico ou contínuo) teve efeito significativo sobre a taxa média de crescimento (R). A interpretação dos resultados depende do tipo de experimento.

Caso categórico: teste t

Use o teste t quando há dois grupos experimentais (por exemplo, Tratamento A e Tratamento B). O teste compara as médias da taxa de crescimento entre os grupos e informa se a diferença observada pode ser atribuída ao acaso.

  • Ao analisar o resultado do comando t.test(R ~ Tratamento, data = dados_media), observe:

    • t → estatística do teste (quanto maior, maior a diferença entre os grupos);

    • df → graus de liberdade, relacionados ao tamanho amostral;

    • p-value → probabilidade de obter uma diferença igual ou maior que a observada, caso não haja efeito real do tratamento (hipótese nula).

Interpretação:

- Se p < 0.05, rejeitamos a hipótese nula — o tratamento influenciou significativamente a taxa de crescimento.

- Se p ≥ 0.05, não há evidência suficiente para afirmar que os tratamentos diferem.

- Visualmente, os grupos devem mostrar caixas separadas no boxplot se houver efeito.
t.test(R ~ Tratamento, data = dados_media)
## 
##  Welch Two Sample t-test
## 
## data:  R by Tratamento
## t = -1.6429, df = 17.456, p-value = 0.1183
## alternative hypothesis: true difference in means between group A and group B is not equal to 0
## 95 percent confidence interval:
##  -0.37488303  0.04627855
## sample estimates:
## mean in group A mean in group B 
##        2.377191        2.541494

Caso contínuo: regressão linear

Use a regressão linear quando o tratamento for numérico contínuo (por exemplo, gradiente de temperatura, concentração de nutriente ou intensidade luminosa). A regressão estima a relação entre o tratamento e a taxa de crescimento, ajustando uma linha que descreve como R varia em função do tratamento.

Ao analisar o resultado de summary(lm(R ~ Tratamento2, data = dados_media)), observe:

  • Estimate → inclinação da reta (coeficiente). Indica a direção e intensidade do efeito:

    • valor positivo → crescimento aumenta com o tratamento;

    • valor negativo → crescimento diminui com o tratamento.

    • Std. Error → incerteza associada à estimativa.

    • t value e Pr(>|t|) → estatística e p-valor para testar se o coeficiente difere de zero.

    • Multiple R-squared (R²) → proporção da variação em R explicada pelo tratamento.

Interpretação:

- Se p < 0.05, há uma relação significativa entre o tratamento e a taxa de crescimento.

- Se p ≥ 0.05, não há evidência de relação linear.

- Um R² alto indica que o modelo explica bem os dados; um R² baixo sugere alta variabilidade residual.
ajuste_lm <- lm(R ~ Tratamento2, data = dados_media)
summary(ajuste_lm)
## 
## Call:
## lm(formula = R ~ Tratamento2, data = dados_media)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.37769 -0.12695 -0.04628  0.11774  0.51728 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 2.426399   0.111045  21.851 2.08e-14 ***
## Tratamento2 0.001046   0.003090   0.338    0.739    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.239 on 18 degrees of freedom
## Multiple R-squared:  0.006324,   Adjusted R-squared:  -0.04888 
## F-statistic: 0.1146 on 1 and 18 DF,  p-value: 0.7389

Dependência de densidade / capacidade de suporte

Nesta etapa, investigamos se a taxa de crescimento (R) depende do tamanho populacional (N). Em muitos sistemas biológicos, o crescimento é limitado pela densidade, ou seja, populações menores crescem rapidamente quando há abundância de recursos, mas a taxa de crescimento diminui à medida que o número de indivíduos aumenta e os recursos se tornam escassos. Esse padrão reflete a capacidade de suporte do ambiente — o ponto em que o crescimento se estabiliza.

dados %>%
  ggplot(aes(x = N, y = R)) +
  geom_smooth(method = "lm", se = FALSE, alpha = .1, colour = "gray",
              aes(group = as.factor(ID))) +
  geom_point(aes(colour = as.factor(ID))) +
  geom_smooth(method = "lm", se = FALSE, colour = "black") +
  theme_classic()

O gráfico acima mostra essa relação:

Cada linha cinza representa o ajuste linear entre N e R para um pote (ID) individual.

A linha preta indica a tendência global, obtida a partir de todos os potes combinados.

Se a inclinação das linhas for negativa, isso sugere dependência de densidade — ou seja, o crescimento tende a diminuir com o aumento do número de frondes.

Uma inclinação positiva ou nula indicaria que o crescimento se mantém ou aumenta com a densidade, o que seria atípico em sistemas limitados por recursos.

Modelo misto: efeito aleatório de ID

Como cada pote (ID) possui medições repetidas ao longo do tempo, as observações dentro do mesmo grupo não são independentes. Para levar isso em conta, utilizamos um modelo linear misto, onde N é um efeito fixo (de interesse biológico) e ID é tratado como um efeito aleatório, controlando diferenças individuais entre potes. No resultado do modelo (summary(modelo)):

modelo <- lmer(R ~ N + (1 | ID), data = dados)
summary(modelo)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: R ~ N + (1 | ID)
##    Data: dados
## 
## REML criterion at convergence: 228.8
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -1.4103 -1.0279  0.3115  0.8534  1.5272 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  ID       (Intercept) 0.0000   0.0000  
##  Residual             0.9132   0.9556  
## Number of obs: 80, groups:  ID, 20
## 
## Fixed effects:
##              Estimate Std. Error        df t value Pr(>|t|)    
## (Intercept)  1.251200   0.153926 78.000000   8.129 5.30e-12 ***
## N            0.032154   0.005918 78.000000   5.434 6.09e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##   (Intr)
## N -0.720
## optimizer (nloptwrap) convergence code: 0 (OK)
## boundary (singular) fit: see help('isSingular')