Primeiros passos

Autor

Marlenildo Melo

Data de Publicação

21 de agosto de 2025

Começando a programar em

🔹 Módulo 1 – Introdução ao R e Organização de Dados

Aula 1 – Instalação e primeiros passos

  • Instale o R e o RStudio em seu computador.

O R é o programa principal, ou seja, a linguagem de programação e o ambiente de cálculo.
É nele que todos os comandos são processados e as análises estatísticas são realizadas.
Por isso, o primeiro passo é instalar o R no computador.
O download deve ser feito diretamente no site oficial do CRAN (Comprehensive R Archive Network):

https://cran.r-project.org/

Ao abrir o link, basta escolher o sistema operacional do seu computador (Windows, macOS ou Linux) e seguir as instruções de instalação.
Com isso, você já terá o R funcionando, embora a sua interface seja bastante simples e pouco intuitiva para quem está começando.

É justamente nesse ponto que entra o RStudio.
O RStudio não é um programa separado do R, mas sim uma IDE (Integrated Development Environment), ou seja, um ambiente de desenvolvimento que facilita o uso do R.
Ele oferece uma interface gráfica amigável, onde você pode escrever códigos, visualizar gráficos, organizar projetos e instalar pacotes com muito mais facilidade.

No entanto, é fundamental compreender que o RStudio não funciona sozinho.
Ele depende do R já instalado na máquina, pois é o R quem executa de fato os cálculos.
Por isso, a ordem correta é: primeiro instalar o R e, em seguida, instalar o RStudio.

O download do RStudio pode ser feito no site oficial da Posit (empresa responsável pelo software):

👉 https://posit.co/download/rstudio-desktop/

Ao instalar os dois programas, você terá o R como motor de cálculo e o RStudio como painel de controle, trabalhando em conjunto.
Essa combinação é a mais utilizada no mundo acadêmico e profissional para análises estatísticas e ciência de dados.

  • Conheça os principais painéis do RStudio:
    • Console (execução de comandos)
    • Source (script)
    • Environment/History (objetos)
    • Plots/Packages/Help

Verificando versão do R

# Verificando versão do R
version
               _                                
platform       x86_64-w64-mingw32               
arch           x86_64                           
os             mingw32                          
crt            ucrt                             
system         x86_64, mingw32                  
status                                          
major          4                                
minor          4.2                              
year           2024                             
month          10                               
day            31                               
svn rev        87279                            
language       R                                
version.string R version 4.4.2 (2024-10-31 ucrt)
nickname       Pile of Leaves                   

Citando o R

# Citação do R
citation()
To cite R in publications use:

  R Core Team (2024). _R: A Language and Environment for Statistical
  Computing_. R Foundation for Statistical Computing, Vienna, Austria.
  <https://www.R-project.org/>.

Uma entrada BibTeX para usuários(as) de LaTeX é

  @Manual{,
    title = {R: A Language and Environment for Statistical Computing},
    author = {{R Core Team}},
    organization = {R Foundation for Statistical Computing},
    address = {Vienna, Austria},
    year = {2024},
    url = {https://www.R-project.org/},
  }

We have invested a lot of time and effort in creating R, please cite it
when using it for data analysis. See also 'citation("pkgname")' for
citing R packages.

Operações simples

# Operações simples

## Soma
2 + 2
[1] 4
## Subtração
7 - 2
[1] 5
## Mutiplicação
4 * 3
[1] 12
## Divisão
10 / 3
[1] 3.333333
## Raiz quadrada
sqrt(25)
[1] 5

Aula 2 – Objetos no R

Nesta aula, aprendemos a criar e manipular objetos no R. Objetos são variáveis que armazenam valores ou resultados de cálculos, permitindo que possamos reutilizá-los em outras operações.

No exemplo apresentado, criamos dois objetos numéricos:

# Criando objetos
x <- 5
y <- 10

Aqui, x recebe o valor 5 e y recebe o valor 10. Em seguida, criamos um terceiro objeto chamado soma, que armazena a soma de x e y:

soma <- x + y
soma
[1] 15

Ao digitar apenas soma, o R retorna o valor armazenado neste objeto, que neste caso é 15.

Este exemplo ilustra a forma básica de criar objetos no R e realizar operações simples com eles, fundamental para qualquer análise de dados ou programação no software.


Aula 3 – Pacotes

No R, os pacotes são conjuntos de funções, dados e recursos que estendem as capacidades básicas do software, permitindo realizar análises mais complexas de forma prática e eficiente.

No exemplo abaixo, veja como instalar alguns pacotes importantes um de cada vez:

# Carregando pacotes
install.packages("tidyverse")   # Para manipulação e visualização de dados
install.packages("dplyr")   # Para manipulação e visualização de dados
install.packages("readxl")      # Para ler arquivos do Excel
install.packages("ExpDes.pt")   # Para planejamento e análise de experimentos agrícolas
install.packages("easyanova")   # Para facilitar análises de variância
install.packages("rstatix")     # Para estatísticas descritivas e testes inferenciais
install.packages("emmeans")     # Para estatísticas descritivas e testes inferenciais
install.packages("janitor")     # Para limpeza e organização de dados
install.packages("kableExtra")  # Para tabelas formatadas

Ouse preferir pode instalar vários de uma única vez:

# Carregando pacotes
install.packages("tidyverse", "readxl", "ExpDes.pt", "easyanova", "rstatix", "emmeans", "janitor", "kableExtra")

No exemplo abaixo, carregamos alguns pacotes importantes:

# Carregando pacotes

# ---------------------------
# Pacotes para manipulação e leitura de dados
# ---------------------------
library(tidyverse)   # Inclui dplyr, ggplot2, readr, tidyr, etc.
library(dplyr)       # Manipulação de dados
library(readxl)      # Para importar planilhas Excel

# ---------------------------
# Pacotes para análise de experimentos
# ---------------------------
library(ExpDes.pt)   # ANOVA para DIC, DBC, parcelas subdivididas etc.
library(easyanova)   # ANOVA e testes complementares de forma simplificada

# ---------------------------
# Pacotes para estatística e pós-testes
# ---------------------------
library(rstatix)     # Testes estatísticos (normalidade, homogeneidade, etc.)
library(emmeans)     # Médias ajustadas e comparações múltiplas

# ---------------------------
# Pacotes para organização e visualização de dados
# ---------------------------
library(janitor)     # Limpeza e organização de dados
library(kableExtra)  # Tabelas formatadas

Aula 4 - Organização e Padronização dos Dados

Um dos passos mais importantes em qualquer análise é a organização adequada dos dados. Dados desorganizados ou com nomes de variáveis inconsistentes podem dificultar o trabalho, aumentar a chance de erros e até inviabilizar o uso de funções em softwares estatísticos como o R.

Veja esse esse exmeplo de banco de dados (dados_ruins_dic) no Excel:

Repetição Tratamento Altura da planta (cm) Matéria seca (g)
T1 - Testemunha 1 160 280
T1 - Testemunha 2 165 300
T1 - Testemunha 3 158 290
T1 - Testemunha 4 162 295
T1 - Testemunha 5 161 285
T2 - 50kg N 1 180 360
T2 - 50kg N 2 185 370
T2 - 50kg N 3 178 365
T2 - 50kg N 4 182 368
T2 - 50kg N 5 184 362
T3 - 100kg N 1 200 450
T3 - 100kg N 2 205 460
T3 - 100kg N 3 198 455
T3 - 100kg N 4 202 465
T3 - 100kg N 5 201 458
T4 - 150kg N 1 220 550
T4 - 150kg N 2 225 560
T4 - 150kg N 3 218 545
T4 - 150kg N 4 222 555
T4 - 150kg N 5 221 548

Importância de bons títulos nas variáveis

No R, os nomes das colunas (ou títulos das variáveis) devem seguir algumas boas práticas para facilitar a análise:

  • Padrão snake_case: usar letras minúsculas e sublinhados para separar palavras, como altura_planta_g.
  • Evitar espaços: em vez de Altura da Planta, utilizar Altura_Planta.
  • Usar unidades no nome da variável: em vez de Altura da Planta (cm), utilizar Altura_Planta_cm.
  • Usar letras minúsculas (ou padrão definido): altura_planta_cm.
  • Evitar acentos e caracteres especiais: em vez de Matéria seca (g), utilizar materia_seca_g.
  • Ser descritivo, mas não excessivamente longo: peso_frutos em vez de pf_colheita_experimental_2024.

Esses cuidados tornam o banco de dados mais limpo, reprodutível e compatível com funções e pacotes do R.

Como organizar os títulos

  1. Pode fazer manulamente no Excel
    • Antes de importar o arquivo para o R, pode-se renomear diretamente no Excel.
    • Exemplo: renomear a coluna de Massa seca total (g) para massa_seca_total_g.
  2. Manualmente no R usando o pacote dplyr

A função rename() do pacote dplyr permite renomear manualmente colunas específicas.

# Renomear colunas específicas
library(dplyr)
dados_organizados_dplyr <- dados_ruins_dic |>
  rename(
    repeticao = `Repetição`,
    tratamento = Tratamento,
    altura_planta_cm = `Altura da planta (cm)`,
    materia_seca_g = `Matéria seca (g)`
  )
repeticao tratamento altura_planta_cm materia_seca_g
T1 - Testemunha 1 160 280
T1 - Testemunha 2 165 300
T1 - Testemunha 3 158 290
T1 - Testemunha 4 162 295
T1 - Testemunha 5 161 285
T2 - 50kg N 1 180 360
T2 - 50kg N 2 185 370
T2 - 50kg N 3 178 365
T2 - 50kg N 4 182 368
T2 - 50kg N 5 184 362
T3 - 100kg N 1 200 450
T3 - 100kg N 2 205 460
T3 - 100kg N 3 198 455
T3 - 100kg N 4 202 465
T3 - 100kg N 5 201 458
T4 - 150kg N 1 220 550
T4 - 150kg N 2 225 560
T4 - 150kg N 3 218 545
T4 - 150kg N 4 222 555
T4 - 150kg N 5 221 548

Nomes antes:

# Ver como eram
names(dados_ruins_dic)
[1] "Repetição"             "Tratamento"            "Altura da planta (cm)"
[4] "Matéria seca (g)"     

Nomes depois:

# Ver como ficaram
names(dados_organizados_dplyr)
[1] "repeticao"        "tratamento"       "altura_planta_cm" "materia_seca_g"  
  1. Automático usando o pacote janitor
    Existem pacotes que auxiliam na padronização dos nomes de maneira automática:

    • Pacote janitor: a função clean_names() desse pacote converte automaticamente os títulos para um formato padrão (snake_case).

Veja o que acontece com esse banco de dados (dados_ruins_dic):

# Corrigir nomes das colunas -> formato "snake_case"
dados_organizados_janitor <- dados_ruins_dic |> 
  janitor::clean_names()
repeticao tratamento altura_da_planta_cm materia_seca_g
T1 - Testemunha 1 160 280
T1 - Testemunha 2 165 300
T1 - Testemunha 3 158 290
T1 - Testemunha 4 162 295
T1 - Testemunha 5 161 285
T2 - 50kg N 1 180 360
T2 - 50kg N 2 185 370
T2 - 50kg N 3 178 365
T2 - 50kg N 4 182 368
T2 - 50kg N 5 184 362
T3 - 100kg N 1 200 450
T3 - 100kg N 2 205 460
T3 - 100kg N 3 198 455
T3 - 100kg N 4 202 465
T3 - 100kg N 5 201 458
T4 - 150kg N 1 220 550
T4 - 150kg N 2 225 560
T4 - 150kg N 3 218 545
T4 - 150kg N 4 222 555
T4 - 150kg N 5 221 548

Nomes antes:

# Ver como eram
names(dados_ruins_dic)
[1] "Repetição"             "Tratamento"            "Altura da planta (cm)"
[4] "Matéria seca (g)"     

Nomes depois:

# Ver como ficaram
names(dados_organizados_janitor)
[1] "repeticao"           "tratamento"          "altura_da_planta_cm"
[4] "materia_seca_g"     

Aula 5 – Importação de Dados

Importando dados

Importar dados para o R é um passo fundamental para qualquer análise. No R, é possível importar dados de diferentes formatos, o que é essencial para iniciar qualquer análise. O R permite ler diferentes formatos de arquivos, como CSV e Excel.

# Importando CSV
# dados_csv <- read.csv("meus_dados.csv", sep = ";", dec = ",")
# Lê arquivos CSV, permitindo especificar o separador de colunas (sep) e o separador decimal (dec)

# Importando Excel
# dados_excel <- readxl::read_excel("meus_dados.xlsx")
# Lê planilhas do Excel diretamente para o R

# Importando arquivo de texto (TXT)
# dados_txt <- read.table("meus_dados.txt", header = TRUE, sep = "\t", dec = ".")
# Lê arquivos de texto, onde 'header = TRUE' indica que a primeira linha contém os nomes das colunas,
# 'sep = "\t"' indica que as colunas são separadas por tabulação, e 'dec = "."' define o separador decimal
  • read.csv() lê arquivos no formato CSV (Comma-Separated Values), permitindo especificar o separador de colunas (sep) e o separador decimal (dec). É indicado para planilhas exportadas como CSV ou dados gerados por outros programas.

  • read_excel() (do pacote readxl) lê arquivos do Excel (.xls ou .xlsx) diretamente, mantendo nomes das colunas e tipos de dados corretamente, o que facilita a importação de planilhas complexas sem precisar convertê-las.

  • read.table() lê arquivos de texto simples (TXT ou outros delimitados), oferecendo flexibilidade para especificar se há cabeçalho (header = TRUE), o separador de colunas (sep) e o separador decimal (dec). É ideal para arquivos de texto com diferentes formatos de separação.

Visualizando os dados

Após a importação, podemos visualizar os dados para verificar se foram carregados corretamente: Após a importação, é importante visualizar os dados para conferir se foram carregados corretamente. Para isso, podem ser usadas funções como:

  • head() (exibe as primeiras linhas),
  • summary() (mostra resumo estatístico das variáveis),
  • str() (mostra a estrutura do objeto) e
  • glimpse() (exibe de forma compacta e legível a estrutura e os tipos das variáveis).
# head(dados_csv)    # Mostra as primeiras linhas do conjunto de dados
# summary(dados_csv) # Mostra um resumo estatístico das variáveis
# str(dados_csv)     # Mostra a estrutura do objeto, incluindo tipos de variáveis e dimensões
# glimpse(dados_csv)  # Mostra todas as variáveis, seus tipos e algumas observações de cada coluna

🔹 Módulo 2 – Manipulação e Exploração de Dados

Aula 6 – Tipos de Variáveis em R

  1. Variáveis numéricas
    • Contínuas (numeric / dbl): podem assumir qualquer valor dentro de um intervalo, incluindo decimais.
      Exemplo: Produtividade (t/ha), Área (m²)
    • Discretas (integer / int): assumem apenas valores inteiros.
      Exemplo: Parcela (identificador das parcelas)
  2. Variáveis categóricas (fatores) (factor / fct)
    • Representam categorias ou grupos que o R reconhece para análises estatísticas.
      Exemplo: Tratamento, Variedade
    • Ideais para análise de variância e comparações entre grupos
  3. Variáveis de texto (character / chr)
    • Contêm informações textuais ou descritivas, que não têm ordem ou significado numérico.
      Exemplo: Local (Norte, Sul, Leste)
    • Não são usadas diretamente em cálculos estatísticos, mas servem para identificar ou agrupar dados
  4. Variáveis lógicas (logical / logi)
    • Assumem apenas dois valores: TRUE ou FALSE
      Exemplo: Irrigado
    • Úteis para condições, filtros e análises condicionais
  5. Outros tipos disponíveis em R
    • Complexo (complex / sem abreviação comum): números complexos, como 1+2i
    • Raw (raw / sem abreviação comum): representa dados brutos em bytes
    • Date (Date / sem abreviação comum): datas no formato "YYYY-MM-DD"
    • POSIXct / POSIXlt (POSIXct / POSIXlt): datas e horas com tempo
    • Ordered factor (ordered / ord): fatores com ordem natural definida

Neste exemplo, iremos criar variáveis de diferentes tipos em R — numéricas contínuas, numéricas discretas e categóricas (fatores) — e, em seguida, identificar o tipo de cada variável usando a função class().

Isso nos permite compreender como o R armazena cada tipo de dado e como ele será tratado em análises estatísticas.

# Numérica contínua
num_cont <- 3.5      # numeric / dbl
class(num_cont) # Checando classes
[1] "numeric"
# Numérica discreta
num_disc <- 5L       # integer / int
class(num_disc)
[1] "integer"
# Fator (categórica)
trat <- factor(c("T1", "T2", "T3"))  # factor / fct
class(trat)
[1] "factor"
# Ordered factor
ord_trat <- factor(c("Baixo", "Médio", "Alto"), ordered = TRUE) # ordered / ord
class(ord_trat)
[1] "ordered" "factor" 
# Character
local <- c("Norte", "Sul")  # character / chr
class(local)
[1] "character"
# Lógica
irr <- c(TRUE, FALSE)       # logical / logi
class(irr)
[1] "logical"
# Complexo
cplx <- 1 + 2i              # complex
class(cplx)
[1] "complex"
# Raw
r <- charToRaw("A")         # raw
class(r)
[1] "raw"
# Datas
d <- as.Date("2025-08-29")  # Date
class(d)
[1] "Date"
dt <- as.POSIXct("2025-08-29 12:00:00") # POSIXct
class(dt)
[1] "POSIXct" "POSIXt" 


Criando banco de dados fictício

Neste exemplo, iremos criar um banco de dados fictício de um experimento agrícola com diferentes tipos de variáveis: numéricas (contínuas e discretas), categóricas, lógicas e de texto.

Em seguida, iremos visualizar o banco de dados e identificar os tipos de variáveis, para entender como o R armazena cada tipo e como podemos manipulá-las em análises estatísticas.

# Exemplo de banco de dados de experimento agrícola
dados_agro <- data.frame(
  Parcela = 1:9,                               # Numérica discreta (identificação das parcelas)
  Tratamento = factor(rep(c("T1", "T2", "T3"), each = 3)), # Fator (categórica nominal)
  Variedade = factor(c("A", "A", "A", "B", "B", "B", "C", "C", "C")), # Fator (categórica nominal)
  Area = c(10, 10, 10, 12, 12, 12, 11, 11, 11),  # Numérica contínua (m²)
  Produtividade = c(30.5, 32.0, 31.0, 28.0, 29.5, 30.0, 33.0, 34.5, 32.5), # Numérica contínua (t/ha)
  Irrigado = c(TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE),   # Lógica
  Local = c("Norte", "Norte", "Norte", "Sul", "Sul", "Sul", "Leste", "Leste", "Leste") # Texto (character)
)
# Exemplo de banco de dados de experimento agrícola
dados_agro <- data.frame(
  Parcela = 1:9,                               # Numérica discreta (identificação das parcelas)
  Tratamento = rep(c("T1", "T2", "T3"), each = 3), # Fator (categórica nominal)
  Variedade = c("A", "A", "A", "B", "B", "B", "C", "C", "C"), # Fator (categórica nominal)
  Area = c(10, 10, 10, 12, 12, 12, 11, 11, 11),  # Numérica contínua (m²)
  Produtividade = c(30.5, 32.0, 31.0, 28.0, 29.5, 30.0, 33.0, 34.5, 32.5), # Numérica contínua (t/ha)
  Irrigado = c(TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE),   # Lógica
  Local = c("Norte", "Norte", "Norte", "Sul", "Sul", "Sul", "Leste", "Leste", "Leste") # Texto (character)
)


Funções para Visualização e Estrutura de Dados no R

  1. head(dados_agro)
    Mostra as primeiras linhas do conjunto de dados.
    • Útil para ter uma visão rápida do conteúdo do banco, verificando se os dados foram importados corretamente.
    • Exemplo de saída:
head(dados_agro) 
  Parcela Tratamento Variedade Area Produtividade Irrigado Local
1       1         T1         A   10          30.5     TRUE Norte
2       2         T1         A   10          32.0     TRUE Norte
3       3         T1         A   10          31.0     TRUE Norte
4       4         T2         B   12          28.0    FALSE   Sul
5       5         T2         B   12          29.5    FALSE   Sul
6       6         T2         B   12          30.0    FALSE   Sul


  1. str(dados_agro)

Mostra a estrutura do objeto, permitindo entender rapidamente como os dados estão organizados no R.

Com essa função, é possível:

  • Ver o número de observações (linhas) e o número de variáveis (colunas) do banco de dados, por exemplo, 9 obs. of 7 variables.
  • Identificar o tipo de cada variável, como int (inteiro), num (numérico contínuo), Factor (categórica), logi (lógica/boolean) e chr (texto).
  • Conferir alguns valores iniciais de cada coluna, ajudando a verificar se os dados foram importados corretamente e se os tipos estão adequados para análise.

Em resumo, str() é uma função essencial para inspecionar rapidamente a estrutura e os tipos das variáveis, antes de realizar qualquer análise estatística ou manipulação dos dados.

str(dados_agro)
'data.frame':   9 obs. of  7 variables:
 $ Parcela      : int  1 2 3 4 5 6 7 8 9
 $ Tratamento   : chr  "T1" "T1" "T1" "T2" ...
 $ Variedade    : chr  "A" "A" "A" "B" ...
 $ Area         : num  10 10 10 12 12 12 11 11 11
 $ Produtividade: num  30.5 32 31 28 29.5 30 33 34.5 32.5
 $ Irrigado     : logi  TRUE TRUE TRUE FALSE FALSE FALSE ...
 $ Local        : chr  "Norte" "Norte" "Norte" "Sul" ...

Observe que Tratamento e Variedade aparecem como character, ou seja, texto.
Para análises estatísticas, é recomendado transformar essas variáveis em fatores.


  1. summary(dados_agro)

Mostra um resumo estatístico das variáveis:
- Para variáveis numéricas: mínimo, máximo, média, quartis
- Para fatores: contagem de cada nível
- Para lógicas: contagem de TRUE e FALSE
- Útil para identificar tendências, valores extremos e distribuição dos dados.

summary(dados_agro)
    Parcela   Tratamento         Variedade              Area    Produtividade  
 Min.   :1   Length:9           Length:9           Min.   :10   Min.   :28.00  
 1st Qu.:3   Class :character   Class :character   1st Qu.:10   1st Qu.:30.00  
 Median :5   Mode  :character   Mode  :character   Median :11   Median :31.00  
 Mean   :5                                         Mean   :11   Mean   :31.22  
 3rd Qu.:7                                         3rd Qu.:12   3rd Qu.:32.50  
 Max.   :9                                         Max.   :12   Max.   :34.50  
  Irrigado          Local          
 Mode :logical   Length:9          
 FALSE:3         Class :character  
 TRUE :6         Mode  :character  
                                   
                                   
                                   

Veja novamente que Tratamento e Variedade aparecem como character.
E não são reconhecidas como fatores.
E não é possível perceber quais são os níveis de cada variável categórica.

Convertendo variaveis categóricas em fatores

  1. Pode-se convertê-las em fatores usando a função as.factor():
dados_agro$Tratamento <- as.factor(dados_agro$Tratamento)
dados_agro$Variedade <- as.factor(dados_agro$Variedade)

Agora veja como fica a estrutura dos dados:

str(dados_agro)
'data.frame':   9 obs. of  7 variables:
 $ Parcela      : int  1 2 3 4 5 6 7 8 9
 $ Tratamento   : Factor w/ 3 levels "T1","T2","T3": 1 1 1 2 2 2 3 3 3
 $ Variedade    : Factor w/ 3 levels "A","B","C": 1 1 1 2 2 2 3 3 3
 $ Area         : num  10 10 10 12 12 12 11 11 11
 $ Produtividade: num  30.5 32 31 28 29.5 30 33 34.5 32.5
 $ Irrigado     : logi  TRUE TRUE TRUE FALSE FALSE FALSE ...
 $ Local        : chr  "Norte" "Norte" "Norte" "Sul" ...

Agora sim, Tratamento e variedade aparecem como Factor com 3 níveis cada.

veja como fica o resumo estatístico dos dados:

summary(dados_agro)
    Parcela  Tratamento Variedade      Area    Produtividade    Irrigado      
 Min.   :1   T1:3       A:3       Min.   :10   Min.   :28.00   Mode :logical  
 1st Qu.:3   T2:3       B:3       1st Qu.:10   1st Qu.:30.00   FALSE:3        
 Median :5   T3:3       C:3       Median :11   Median :31.00   TRUE :6        
 Mean   :5                        Mean   :11   Mean   :31.22                  
 3rd Qu.:7                        3rd Qu.:12   3rd Qu.:32.50                  
 Max.   :9                        Max.   :12   Max.   :34.50                  
    Local          
 Length:9          
 Class :character  
 Mode  :character  
                   
                   
                   

Agora é possível ver a contagem de cada nível das variáveis categóricas. Ou seja, são 3 níveis em cada variável (T1, T2, T3 para Tratamento e A, B, C para Variedade).

  1. Pode-se convertê-las em fatores usando a função factor():

Também dá para criar o fator diretamente com a função factor(), que é mais flexível porque permite:

  • Definir os níveis (levels)
  • Definir as etiquetas (labels)

Ou seja, permite controlar a ordem e o rótulo dos níveis (mais recomendado para ANOVA e modelos, pois evita ordem alfabética indesejada).

  1. Pode-se ainda convertê-las em fatores usando a função convert_as_factor() do pacote {rstatix}:

A função convert_as_factor() pode converter uma ou várias colunas ao mesmo tempo.


  1. glimpse(dados_agro) (do pacote dplyr)

Mostra a estrutura dos dados de forma compacta e legível, similar ao str(), mas em formato horizontal:

  • Exibe todas as variáveis, seus tipos e algumas observações iniciais
  • Mais fácil de ler quando o banco de dados tem muitas colunas

Exemplo de saída (resumida):

glimpse(dados_agro)
Rows: 9
Columns: 7
$ Parcela       <int> 1, 2, 3, 4, 5, 6, 7, 8, 9
$ Tratamento    <fct> Controle, Controle, Controle, Adubo, Adubo, Adubo, Bioes…
$ Variedade     <fct> IPA 11, IPA 11, IPA 11, Campo Lindo, Campo Lindo, Campo …
$ Area          <dbl> 10, 10, 10, 12, 12, 12, 11, 11, 11
$ Produtividade <dbl> 30.5, 32.0, 31.0, 28.0, 29.5, 30.0, 33.0, 34.5, 32.5
$ Irrigado      <lgl> TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE
$ Local         <chr> "Norte", "Norte", "Norte", "Sul", "Sul", "Sul", "Leste",…

Aula 7 – Manipulação com dplyr

# Exemplo fictício
dados <- data.frame(
  tratamento = rep(c("T1", "T2", "T3"), each = 4),
  repeticao = rep(1:4, 3),
  produtividade = c(30, 32, 28, 31, 35, 36, 34, 37, 25, 27, 26, 28)
)

# Selecionar colunas e filtrar
dados |> dplyr::select(tratamento, produtividade) |> filter(produtividade > 30)
  tratamento produtividade
1         T1            32
2         T1            31
3         T2            35
4         T2            36
5         T2            34
6         T2            37
# Resumo estatístico
dados |>
  group_by(tratamento) |>
  summarise(
    media = mean(produtividade),
    sd = sd(produtividade)
  )
# A tibble: 3 × 3
  tratamento media    sd
  <chr>      <dbl> <dbl>
1 T1          30.2  1.71
2 T2          35.5  1.29
3 T3          26.5  1.29

Aula 8 – Estatística Descritiva e Gráficos

# Histograma
ggplot(dados, aes(x = produtividade)) +
  geom_histogram(binwidth = 2, fill = "skyblue", color = "black")

# Boxplot
ggplot(dados, aes(x = tratamento, y = produtividade)) +
  geom_boxplot(fill = "orange")


🔹 Módulo 3 – Análise de Variância (ANOVA)

Aula 9 – ANOVA em DIC

# Primeiro transformar variáveis em fatores
dados$tratamento <- factor(dados$tratamento)
dados$repeticao <- factor(dados$repeticao)

# ANOVA usando aov()
modelo <- aov(produtividade ~ tratamento, data = dados)
summary(modelo)
            Df Sum Sq Mean Sq F value   Pr(>F)    
tratamento   2 163.50   81.75   39.24 3.59e-05 ***
Residuals    9  18.75    2.08                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ANOVA usando rstatix
dados |> anova_test(produtividade ~ tratamento)
ANOVA Table (type II tests)

      Effect DFn DFd     F        p p<.05   ges
1 tratamento   2   9 39.24 3.59e-05     * 0.897
# ANOVA usando ExpDes.pt
dic(
  trat = dados$tratamento,
  resp = dados$produtividade,
  quali = TRUE,
  mcomp = "tukey"
)
------------------------------------------------------------------------
Quadro da analise de variancia
------------------------------------------------------------------------
           GL     SQ     QM    Fc      Pr>Fc
Tratamento  2 163.50 81.750 39.24 3.5934e-05
Residuo     9  18.75  2.083                 
Total      11 182.25                        
------------------------------------------------------------------------
CV = 4.69 %

------------------------------------------------------------------------
Teste de normalidade dos residuos ( Shapiro-Wilk ) 
Valor-p:  0.5375769 
De acordo com o teste de Shapiro-Wilk a 5% de significancia, os residuos podem ser considerados normais.
------------------------------------------------------------------------

------------------------------------------------------------------------
Teste de homogeneidade de variancia 
valor-p:  0.8663487 
De acordo com o teste de bartlett a 5% de significancia, as variancias podem ser consideradas homogeneas.
------------------------------------------------------------------------

Teste de Tukey
------------------------------------------------------------------------
Grupos Tratamentos Medias
a    T2      35.5 
 b   T1      30.25 
  c      T3      26.5 
------------------------------------------------------------------------
# ANOVA usando easyanova
easyanova::ea1(dados[-2], design = 1, plot = 2)

$`Analysis of variance`
           df type I SS mean square F value    p>F
treatments  2    163.50     81.7500   39.24 <0.001
Residuals   9     18.75      2.0833       -      -

$Means
  treatment  mean     sd    sem min max tukey snk duncan t scott_knott
1        T2 35.50 1.2910 0.7217  34  37     a   a      a a           a
2        T1 30.25 1.7078 0.7217  28  32     b   b      b b           b
3        T3 26.50 1.2910 0.7217  25  28     c   c      c c           c

$`Multiple comparison test`
     pair contrast p(tukey) p(snk) p(duncan)   p(t)
1 T2 - T1     5.25   0.0016 0.0006    0.0006 0.0006
2 T2 - T3     9.00   0.0000 0.0000    0.0000 0.0000
3 T1 - T3     3.75   0.0128 0.0051    0.0051 0.0051

$`Residual analysis`
$`Residual analysis`$`residual analysis`
                             values
p.value Shapiro-Wilk test    0.5376
p.value Bartlett test        0.8663
coefficient of variation (%) 4.6900
first value most discrepant  3.0000
second value most discrepant 2.0000
third value most discrepant  8.0000

$`Residual analysis`$residuals
    1     2     3     4     5     6     7     8     9    10    11    12 
-0.25  1.75 -2.25  0.75 -0.50  0.50 -1.50  1.50 -1.50  0.50 -0.50  1.50 

$`Residual analysis`$`standardized residuals`
         1          2          3          4          5          6          7 
-0.1914854  1.3403980 -1.7233688  0.5744563 -0.3829708  0.3829708 -1.1489125 
         8          9         10         11         12 
 1.1489125 -1.1489125  0.3829708 -0.3829708  1.1489125 

Testes de Pressupostos

Antes da análise de variância (ANOVA), foi realizada a verificação dos pressupostos de normalidade dos resíduos e homogeneidade das variâncias, que são condições necessárias para a validade do teste F.

Normalidade dos resíduos

  • O teste de Shapiro-Wilk foi aplicado sobre os resíduos do modelo, verificando se a distribuição se aproxima da normal.
  • Além disso, a normalidade foi testada dentro de cada grupo experimental utilizando a função shapiro_test() do pacote rstatix, o que permite avaliar possíveis desvios em tratamentos específicos.
  • Quando o valor de p > 0,05, não se rejeita a hipótese nula de normalidade, indicando que os resíduos podem ser considerados normalmente distribuídos.
# Normalidade
shapiro.test(residuals(modelo))

    Shapiro-Wilk normality test

data:  residuals(modelo)
W = 0.94298, p-value = 0.5376
# Usando pacote rstatix e fazendo normalidade por grupo
dados |> group_by(tratamento) |> rstatix::shapiro_test(produtividade)
# A tibble: 3 × 4
  tratamento variable      statistic     p
  <fct>      <chr>             <dbl> <dbl>
1 T1         produtividade     0.971 0.850
2 T2         produtividade     0.993 0.972
3 T3         produtividade     0.993 0.972

Homogeneidade das variâncias

  • Para verificar se os tratamentos apresentam variâncias homogêneas, foram aplicados três testes:
    • Teste de Bartlett: sensível a desvios de normalidade, mas adequado quando os dados são normais.
    • Teste de Levene: mais robusto quando a normalidade não é estritamente atendida.
# Homogeneidade
## Teste de Bartlett
bartlett.test(produtividade ~ tratamento, data = dados)

    Bartlett test of homogeneity of variances

data:  produtividade by tratamento
Bartlett's K-squared = 0.28694, df = 2, p-value = 0.8663
## Teste de Levene
rstatix::levene_test(produtividade ~ tratamento, data = dados)
# A tibble: 1 × 4
    df1   df2 statistic     p
  <int> <int>     <dbl> <dbl>
1     2     9     0.158 0.856

Em todos os testes, valores de p > 0,05 indicam que não há evidências para rejeitar a hipótese de homogeneidade das variâncias, atendendo ao pressuposto da ANOVA.

Dessa forma, a análise de variância pode ser conduzida com confiança, uma vez que os pressupostos de normalidade e homogeneidade foram verificados.

Comparações de Médias

# Tukey no R base
TukeyHSD(modelo)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = produtividade ~ tratamento, data = dados)

$tratamento
       diff        lwr        upr     p adj
T2-T1  5.25   2.400421  8.0995788 0.0015767
T3-T1 -3.75  -6.599579 -0.9004212 0.0127984
T3-T2 -9.00 -11.849579 -6.1504212 0.0000269
# Tukey no rstatix
dados |> tukey_hsd(produtividade ~ tratamento)
# A tibble: 3 × 9
  term       group1 group2 null.value estimate conf.low conf.high     p.adj
* <chr>      <chr>  <chr>       <dbl>    <dbl>    <dbl>     <dbl>     <dbl>
1 tratamento T1     T2              0     5.25     2.40     8.10  0.00158  
2 tratamento T1     T3              0    -3.75    -6.60    -0.900 0.0128   
3 tratamento T2     T3              0    -9      -11.8     -6.15  0.0000269
# ℹ 1 more variable: p.adj.signif <chr>
# Médias ajustadas
# Emmeans
emm <- emmeans(modelo, ~ tratamento)
grupos <- multcomp::cld(emm, Letters = letters, adjust = "tukey")
Note: adjust = "tukey" was changed to "sidak"
because "tukey" is only appropriate for one set of pairwise comparisons
print(grupos)
 tratamento emmean    SE df lower.CL upper.CL .group
 T3           26.5 0.722  9     24.4     28.6  a    
 T1           30.2 0.722  9     28.1     32.4   b   
 T2           35.5 0.722  9     33.4     37.6    c  

Confidence level used: 0.95 
Conf-level adjustment: sidak method for 3 estimates 
P value adjustment: tukey method for comparing a family of 3 estimates 
significance level used: alpha = 0.05 
NOTE: If two or more means share the same grouping symbol,
      then we cannot show them to be different.
      But we also did not show them to be the same. 

Aula 10 – ANOVA em DBC

Anova

No DBC (delineamento em blocos casualizados) a diferença principal é que você precisa considerar o efeito de blocos no modelo. Seguindo o mesmo estilo da sua aula de DIC, aqui está a versão para DBC:

# ANOVA usando aov()
# Aqui usamos Error(bloco) ou bloco como efeito
modelo <- aov(produtividade ~ tratamento + repeticao, data = dados)
summary(modelo)
            Df Sum Sq Mean Sq F value  Pr(>F)    
tratamento   2 163.50   81.75 127.957 1.2e-05 ***
repeticao    3  14.92    4.97   7.783  0.0172 *  
Residuals    6   3.83    0.64                    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ANOVA usando rstatix
dados |> anova_test(produtividade ~ tratamento + repeticao)
ANOVA Table (type II tests)

      Effect DFn DFd       F       p p<.05   ges
1 tratamento   2   6 127.957 1.2e-05     * 0.977
2  repeticao   3   6   7.783 1.7e-02     * 0.796
# ANOVA usando ExpDes.pt
dbc(
  trat = dados$tratamento,
  bloco = dados$repeticao,
  resp = dados$produtividade,
  quali = TRUE,
  mcomp = "tukey"
)
------------------------------------------------------------------------
Quadro da analise de variancia
------------------------------------------------------------------------
           GL      SQ     QM      Fc    Pr>Fc
Tratamento  2 163.500 81.750 127.957 0.000012
Bloco       3  14.917  4.972   7.783 0.017195
Residuo     6   3.833  0.639                 
Total      11 182.250                        
------------------------------------------------------------------------
CV = 2.6 %

------------------------------------------------------------------------
Teste de normalidade dos residuos 
valor-p:  0.4793843 
De acordo com o teste de Shapiro-Wilk a 5% de significancia, os residuos podem ser considerados normais.
------------------------------------------------------------------------

------------------------------------------------------------------------
Teste de homogeneidade de variancia 
valor-p:  0.1530654 
De acordo com o teste de oneillmathews a 5% de significancia, as variancias podem ser consideradas homogeneas.
------------------------------------------------------------------------

Teste de Tukey
------------------------------------------------------------------------
Grupos Tratamentos Medias
a    T2      35.5 
 b   T1      30.25 
  c      T3      26.5 
------------------------------------------------------------------------
# ANOVA usando easyanova
# design = 2 corresponde a DBC
easyanova::ea1(dados, design = 2, plot = 2)

$`Analysis of variance`
           df type III SS mean square  F value    p>F
treatments  2    163.5000     81.7500 127.9565 <0.001
blocks      3     14.9167      4.9722   7.7826 0.0172
residuals   6      3.8333      0.6389        -      -

$`Adjusted means`
  treatment adjusted.mean     sd    sem min max tukey snk duncan t scott_knott
1        T2         35.50 1.2910 0.3997  34  37     a   a      a a           a
2        T1         30.25 1.7078 0.3997  28  32     b   b      b b           b
3        T3         26.50 1.2910 0.3997  25  28     c   c      c c           c

$`Multiple comparison test`
     pair contrast p(tukey) p(snk) p(duncan)  p(t)
1 T2 - T1     5.25   0.0002  1e-04     1e-04 1e-04
2 T2 - T3     9.00   0.0000  0e+00     0e+00 0e+00
3 T1 - T3     3.75   0.0014  6e-04     6e-04 6e-04

$`Residual analysis`
$`Residual analysis`$`residual analysis`
                              values
p.value Shapiro-Wilk test     0.4794
p.value Bartlett test         0.8663
coefficient of variation (%)  2.6000
first value most discrepant  11.0000
second value most discrepant  3.0000
third value most discrepant   2.0000

$`Residual analysis`$residuals
          1           2           3           4           5           6 
 0.50000000  0.83333333 -0.83333333 -0.50000000  0.25000000 -0.41666667 
          7           8           9          10          11          12 
-0.08333333  0.25000000 -0.75000000 -0.41666667  0.91666667  0.25000000 

$`Residual analysis`$`standardized residuals`
         1          2          3          4          5          6          7 
 0.8469896  1.4116493 -1.4116493 -0.8469896  0.4234948 -0.7058246 -0.1411649 
         8          9         10         11         12 
 0.4234948 -1.2704843 -0.7058246  1.5528142  0.4234948 

Observações importantes:

  • No aov(), o termo + bloco garante que a variação entre blocos seja considerada.
  • No ExpDes.pt, usamos dbc() no lugar de dic().
  • No easyanova, o argumento design = 2 é usado para DBC.

Testes de Pressupostos

# Normalidade
shapiro.test(residuals(modelo))

    Shapiro-Wilk normality test

data:  residuals(modelo)
W = 0.93854, p-value = 0.4794
# Usando pacote rstatix e fazendo normalidade por grupo
dados |> group_by(tratamento) |> rstatix::shapiro_test(produtividade)
# A tibble: 3 × 4
  tratamento variable      statistic     p
  <fct>      <chr>             <dbl> <dbl>
1 T1         produtividade     0.971 0.850
2 T2         produtividade     0.993 0.972
3 T3         produtividade     0.993 0.972
# Homogeneidade
## Teste de Bartlett
bartlett.test(produtividade ~ tratamento, data = dados)

    Bartlett test of homogeneity of variances

data:  produtividade by tratamento
Bartlett's K-squared = 0.28694, df = 2, p-value = 0.8663
## Teste de Levene
rstatix::levene_test(produtividade ~ tratamento, data = dados)
# A tibble: 1 × 4
    df1   df2 statistic     p
  <int> <int>     <dbl> <dbl>
1     2     9     0.158 0.856
## Teste de ONeill e Mathews
oneilldbc(trat = dados$tratamento, resp = dados$produtividade, bloco = dados$repeticao)
[1] 0.1530654

Em DBC também foi realizado Teste de O’Neill e Mathews, específico para experimentos em blocos casualizados (DBC), sendo recomendado como alternativa robusta para esse delineamento.

Em todos os testes, valores de p > 0,05 indicam que não há evidências para rejeitar a hipótese de homogeneidade das variâncias, atendendo ao pressuposto da ANOVA.

Comparações de Médias

# Tukey no R base
TukeyHSD(modelo)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = produtividade ~ tratamento + repeticao, data = dados)

$tratamento
       diff        lwr       upr     p adj
T2-T1  5.25   3.515829  6.984171 0.0002167
T3-T1 -3.75  -5.484171 -2.015829 0.0013765
T3-T2 -9.00 -10.734171 -7.265829 0.0000092

$repeticao
          diff        lwr         upr     p adj
2-1  1.6666667 -0.5925501  3.92588339 0.1472526
3-1 -0.6666667 -2.9258834  1.59255006 0.7441939
4-1  2.0000000 -0.2592167  4.25921672 0.0796674
3-2 -2.3333333 -4.5925501 -0.07411661 0.0438895
4-2  0.3333333 -1.9258834  2.59255006 0.9535148
4-3  2.6666667  0.4074499  4.92588339 0.0248704
# Tukey no rstatix
dados |> tukey_hsd(produtividade ~ tratamento)
# A tibble: 3 × 9
  term       group1 group2 null.value estimate conf.low conf.high     p.adj
* <chr>      <chr>  <chr>       <dbl>    <dbl>    <dbl>     <dbl>     <dbl>
1 tratamento T1     T2              0     5.25     2.40     8.10  0.00158  
2 tratamento T1     T3              0    -3.75    -6.60    -0.900 0.0128   
3 tratamento T2     T3              0    -9      -11.8     -6.15  0.0000269
# ℹ 1 more variable: p.adj.signif <chr>
# Médias ajustadas
# Emmeans
emm <- emmeans(modelo, ~ tratamento)
grupos <- multcomp::cld(emm, Letters = letters, adjust = "tukey")
Note: adjust = "tukey" was changed to "sidak"
because "tukey" is only appropriate for one set of pairwise comparisons
print(grupos)
 tratamento emmean  SE df lower.CL upper.CL .group
 T3           26.5 0.4  6     25.2     27.8  a    
 T1           30.2 0.4  6     28.9     31.6   b   
 T2           35.5 0.4  6     34.2     36.8    c  

Results are averaged over the levels of: repeticao 
Confidence level used: 0.95 
Conf-level adjustment: sidak method for 3 estimates 
P value adjustment: tukey method for comparing a family of 3 estimates 
significance level used: alpha = 0.05 
NOTE: If two or more means share the same grouping symbol,
      then we cannot show them to be different.
      But we also did not show them to be the same. 

Aula 11 – ANOVA Fatorial em DIC

# Exemplo com dois fatores
dados2 <- expand.grid(
  adubacao = c("A1", "A2"),
  cultivar = c("C1", "C2", "C3"),
  rep = 1:4
)

set.seed(123)

dados2$produtividade <- rnorm(24, mean = 30, sd = 3)
dados2$adubacao <- factor(dados2$adubacao)
dados2$cultivar <- factor(dados2$cultivar)
dados2$rep <- factor(dados2$rep)

# ANOVA usando aov()
modelo2 <- aov(produtividade ~ adubacao * cultivar, data = dados2)
summary(modelo2)
                  Df Sum Sq Mean Sq F value Pr(>F)
adubacao           1   2.09   2.089   0.217  0.647
cultivar           2   1.07   0.536   0.056  0.946
adubacao:cultivar  2  13.72   6.861   0.712  0.504
Residuals         18 173.43   9.635               
# rstatix
dados2 |> anova_test(produtividade ~ adubacao * cultivar)
ANOVA Table (type II tests)

             Effect DFn DFd     F     p p<.05   ges
1          adubacao   1  18 0.217 0.647       0.012
2          cultivar   2  18 0.056 0.946       0.006
3 adubacao:cultivar   2  18 0.712 0.504       0.073
# ExpDes.pt
fat2.dic(
  fator1 = dados2$adubacao,
  fator2 = dados2$cultivar,
  resp = dados2$produtividade,
  quali = c(TRUE, TRUE),
  mcomp = "tukey"
)
------------------------------------------------------------------------
Legenda:
FATOR 1:  F1 
FATOR 2:  F2 
------------------------------------------------------------------------


Quadro da analise de variancia
------------------------------------------------------------------------
        GL      SQ QM      Fc   Pr>Fc
F1       1   2.089  3 0.21680 0.64708
F2       2   1.073  2 0.05566 0.94602
F1*F2    2  13.723  4 0.71212 0.50391
Residuo 18 173.435  5                
Total   23 190.319  1                
------------------------------------------------------------------------
CV = 10.36 %

------------------------------------------------------------------------
Teste de normalidade dos residuos (Shapiro-Wilk)
valor-p:  0.6606527 
De acordo com o teste de Shapiro-Wilk a 5% de significancia, os residuos podem ser considerados normais.
------------------------------------------------------------------------

Interacao nao significativa: analisando os efeitos simples
------------------------------------------------------------------------
F1
De acordo com o teste F, as medias desse fator sao estatisticamente iguais.
------------------------------------------------------------------------
  Niveis   Medias
1     A1 30.26899
2     A2 29.67895
------------------------------------------------------------------------
F2
De acordo com o teste F, as medias desse fator sao estatisticamente iguais.
------------------------------------------------------------------------
  Niveis   Medias
1     C1 29.67946
2     C2 30.16574
3     C3 30.07672
------------------------------------------------------------------------
# easyanova
easyanova::ea2(dados2[-3], design = 1, plot = 2)

$`Analysis of variance`
                  df type III SS mean square F value    p>F
factor_1           1      2.0889      2.0889  0.2168 0.6471
factor_2           2      1.0726      0.5363  0.0557  0.946
factor_1:factor_2  2     13.7229      6.8614  0.7121 0.5039
residuals         18    173.4346      9.6353       -      -

$`Adjusted means (factor 1)`
  factor_1 adjusted.mean     sd    sem tukey snk duncan t scott_knott
1       A1        30.269 2.5979 0.8961     a   a      a a           a
2       A2        29.679 3.2191 0.8961     a   a      a a           a

$`Multiple comparison test (factor 1)`
     pair contrast p(tukey) p(snk) p(duncan)   p(t)
1 A1 - A2     0.59   0.6471 0.6471    0.6471 0.6471

$`Adjusted means (factor 2)`
  factor_2 adjusted.mean     sd    sem tukey snk duncan t scott_knott
1       C2       30.1657 3.1608 1.0975     a   a      a a           a
2       C3       30.0767 3.6356 1.0975     a   a      a a           a
3       C1       29.6795 1.9564 1.0975     a   a      a a           a

$`Multiple comparison test (factor 2)`
     pair contrast p(tukey) p(snk) p(duncan)   p(t)
1 C2 - C3   0.0890   0.9982 0.9549    0.9549 0.9549
2 C2 - C1   0.4862   0.9475 0.9475    0.7709 0.7577
3 C3 - C1   0.3972   0.9646 0.8009    0.8009 0.8009

$`Adjusted means (factor 1 in levels of factor 2)`
$`Adjusted means (factor 1 in levels of factor 2)`$`factor_1 in  C1`
  treatment adjusted.mean     sd   sem tukey snk duncan t scott_knott
1     A1.C1       30.7519 1.6684 1.552     a   a      a a           a
2     A2.C1       28.6070 1.7550 1.552     a   a      a a           a

$`Adjusted means (factor 1 in levels of factor 2)`$`factor_1 in  C2`
  treatment adjusted.mean     sd   sem tukey snk duncan t scott_knott
4     A2.C2       30.8953 3.0436 1.552     a   a      a a           a
3     A1.C2       29.4361 3.5536 1.552     a   a      a a           a

$`Adjusted means (factor 1 in levels of factor 2)`$`factor_1 in  C3`
  treatment adjusted.mean     sd   sem tukey snk duncan t scott_knott
5     A1.C3       30.6189 2.8171 1.552     a   a      a a           a
6     A2.C3       29.5345 4.7032 1.552     a   a      a a           a


$`Multiple comparison test (factor 1 in levels of factor 2)`
$`Multiple comparison test (factor 1 in levels of factor 2)`$`factor_1 in  C1`
           pair contrast p(tukey) p(snk) p(duncan)   p(t)
1 A1.C1 - A2.C1   2.1449   0.3414 0.3414    0.3414 0.3414

$`Multiple comparison test (factor 1 in levels of factor 2)`$`factor_1 in  C2`
           pair contrast p(tukey) p(snk) p(duncan)   p(t)
1 A2.C2 - A1.C2   1.4592   0.5146 0.5146    0.5146 0.5146

$`Multiple comparison test (factor 1 in levels of factor 2)`$`factor_1 in  C3`
           pair contrast p(tukey) p(snk) p(duncan)   p(t)
1 A1.C3 - A2.C3   1.0844   0.6272 0.6272    0.6272 0.6272


$`Adjusted means (factor 2 in levels of factor 1)`
$`Adjusted means (factor 2 in levels of factor 1)`$`factor_2 in  A1`
  treatment adjusted.mean     sd   sem tukey snk duncan t scott_knott
1     A1.C1       30.7519 1.6684 1.552     a   a      a a           a
5     A1.C3       30.6189 2.8171 1.552     a   a      a a           a
3     A1.C2       29.4361 3.5536 1.552     a   a      a a           a

$`Adjusted means (factor 2 in levels of factor 1)`$`factor_2 in  A2`
  treatment adjusted.mean     sd   sem tukey snk duncan t scott_knott
4     A2.C2       30.8953 3.0436 1.552     a   a      a a           a
6     A2.C3       29.5345 4.7032 1.552     a   a      a a           a
2     A2.C1       28.6070 1.7550 1.552     a   a      a a           a


$`Multiple comparison test (factor 2 in levels of factor 1)`
$`Multiple comparison test (factor 2 in levels of factor 1)`$`factor_2 in  A1`
           pair contrast p(tukey) p(snk) p(duncan)   p(t)
1 A1.C1 - A1.C3   0.1330   0.9980 0.9523    0.9523 0.9523
2 A1.C1 - A1.C2   1.3158   0.8221 0.8221    0.5783 0.5563
3 A1.C3 - A1.C2   1.1828   0.8533 0.5966    0.5966 0.5966

$`Multiple comparison test (factor 2 in levels of factor 1)`$`factor_2 in  A2`
           pair contrast p(tukey) p(snk) p(duncan)   p(t)
1 A2.C2 - A2.C3   1.3608   0.8112 0.5430    0.5430 0.5430
2 A2.C2 - A2.C1   2.2883   0.5605 0.5605    0.3371 0.3109
3 A2.C3 - A2.C1   0.9275   0.9068 0.6776    0.6776 0.6776


$`Residual analysis`
$`Residual analysis`$`residual analysis`
                                    values
p.value Shapiro-Wilk test           0.6607
p.value Bartlett test (factor_1)    0.5289
p.value Bartlett test (factor_2)    0.1309
p.value Bartlett test (treatments)  0.5464
coefficient of variation (%)       10.3600
first value most discrepant         6.0000
second value most discrepant       18.0000
third value most discrepant         3.0000

$`Residual analysis`$residuals
          1           2           3           4           5           6 
-2.43335287  0.70247809  5.23998198 -0.68381331 -0.23104847  5.61066714 
          7           8           9          10          11          12 
 0.63082268 -2.40217314 -1.49670152 -2.23232439  3.05333372  1.54491366 
         13          14          15          16          17          18 
 0.45038842  1.72505871 -1.10366637  4.46540093  0.87463976 -5.43437929 
         19          20          21          22          23          24 
 1.35214177 -0.02536366 -2.63961408 -1.54926323 -3.69692502 -1.72120151 

$`Residual analysis`$`standardized residuals`
           1            2            3            4            5            6 
-0.886137644  0.255816692  1.908208766 -0.249019664 -0.084139356  2.043198673 
           7            8            9           10           11           12 
 0.229722427 -0.874783133 -0.545043662 -0.812930463  1.111911873  0.562600750 
          13           14           15           16           17           18 
 0.164014901  0.628202953 -0.401914711  1.626134829  0.318511642 -1.979001121 
          19           20           21           22           23           24 
 0.492400316 -0.009236513 -0.961250393 -0.564184702 -1.346284159 -0.626798303 

Aula 12 – ANOVA Fatorial em DBC

# ANOVA usando aov()
# Aqui, bloco é adicionado como efeito de erro
modelo_dbc <- aov(produtividade ~ rep + adubacao * cultivar, data = dados2)
summary(modelo_dbc)
                  Df Sum Sq Mean Sq F value Pr(>F)
rep                3  22.94   7.647   0.762  0.533
adubacao           1   2.09   2.089   0.208  0.655
cultivar           2   1.07   0.536   0.053  0.948
adubacao:cultivar  2  13.72   6.861   0.684  0.520
Residuals         15 150.49  10.033               
# rstatix
dados2 |> anova_test(produtividade ~ rep + adubacao * cultivar)
ANOVA Table (type II tests)

             Effect DFn DFd     F     p p<.05   ges
1               rep   3  15 0.762 0.533       0.132
2          adubacao   1  15 0.208 0.655       0.014
3          cultivar   2  15 0.053 0.948       0.007
4 adubacao:cultivar   2  15 0.684 0.520       0.084
# ExpDes.pt
# fat2.dbc é a função para fatorial em blocos no pacote ExpDes.pt
fat2.dbc(
  bloco = dados2$rep,
  fator1 = dados2$adubacao,
  fator2 = dados2$cultivar,
  resp = dados2$produtividade,
  quali = c(TRUE, TRUE),
  mcomp = "tukey"
)
------------------------------------------------------------------------
Legenda:
FATOR 1:  F1 
FATOR 2:  F2 
------------------------------------------------------------------------


Quadro da analise de variancia
------------------------------------------------------------------------
        GL      SQ QM      Fc   Pr>Fc
Bloco    3  22.942  6 0.76223 0.53264
F1       1   2.089  4 0.20821 0.65471
F2       2   1.073  2 0.05345 0.94813
F1*F2    2  13.723  5 0.68390 0.51971
Residuo 15 150.493  3                
Total   23 190.319  1                
------------------------------------------------------------------------
CV = 10.57 %

------------------------------------------------------------------------
Teste de normalidade dos residuos (Shapiro-Wilk)
valor-p:  0.6960048 
De acordo com o teste de Shapiro-Wilk a 5% de significancia, os residuos podem ser considerados normais.
------------------------------------------------------------------------

Interacao nao significativa: analisando os efeitos simples
------------------------------------------------------------------------
F1
De acordo com o teste F, as medias desse fator sao estatisticamente iguais.
------------------------------------------------------------------------
  Niveis   Medias
1     A1 30.26899
2     A2 29.67895
------------------------------------------------------------------------
F2
De acordo com o teste F, as medias desse fator sao estatisticamente iguais.
------------------------------------------------------------------------
  Niveis   Medias
1     C1 29.67946
2     C2 30.16574
3     C3 30.07672
------------------------------------------------------------------------
# easyanova
# Em DBC, design = 2 (fatorial em blocos)
easyanova::ea2(dados2, design = 2, plot = 2)

$`Analysis of variance`
                  df type III SS mean square F value    p>F
factor_1           1      2.0889      2.0889  0.2082 0.6547
factor_2           2      1.0726      0.5363  0.0535 0.9481
blocks             3     22.9420      7.6473  0.7622 0.5326
factor_1:factor_2  2     13.7229      6.8614  0.6839 0.5197
residuals         15    150.4926     10.0328       -      -

$`Adjusted means (factor 1)`
  factor_1 adjusted.mean     sd    sem tukey snk duncan t scott_knott
1       A1        30.269 2.5979 0.9144     a   a      a a           a
2       A2        29.679 3.2191 0.9144     a   a      a a           a

$`Multiple comparison test (factor 1)`
     pair contrast p(tukey) p(snk) p(duncan)   p(t)
1 A1 - A2     0.59   0.6547 0.6547    0.6547 0.6547

$`Adjusted means (factor 2)`
  factor_2 adjusted.mean     sd    sem tukey snk duncan t scott_knott
1       C2       30.1657 3.1608 1.1199     a   a      a a           a
2       C3       30.0767 3.6356 1.1199     a   a      a a           a
3       C1       29.6795 1.9564 1.1199     a   a      a a           a

$`Multiple comparison test (factor 2)`
     pair contrast p(tukey) p(snk) p(duncan)   p(t)
1 C2 - C3   0.0890   0.9983 0.9559    0.9559 0.9559
2 C2 - C1   0.4862   0.9495 0.9495    0.7754 0.7631
3 C3 - C1   0.3972   0.9660 0.8054    0.8054 0.8054

$`Adjusted means (factor 1 in levels of factor 2)`
$`Adjusted means (factor 1 in levels of factor 2)`$`factor_1 in  C1`
  treatment adjusted.mean     sd    sem tukey snk duncan t scott_knott
1     A1.C1       30.7519 1.6684 1.5837     a   a      a a           a
2     A2.C1       28.6070 1.7550 1.5837     a   a      a a           a

$`Adjusted means (factor 1 in levels of factor 2)`$`factor_1 in  C2`
  treatment adjusted.mean     sd    sem tukey snk duncan t scott_knott
4     A2.C2       30.8953 3.0436 1.5837     a   a      a a           a
3     A1.C2       29.4361 3.5536 1.5837     a   a      a a           a

$`Adjusted means (factor 1 in levels of factor 2)`$`factor_1 in  C3`
  treatment adjusted.mean     sd    sem tukey snk duncan t scott_knott
5     A1.C3       30.6189 2.8171 1.5837     a   a      a a           a
6     A2.C3       29.5345 4.7032 1.5837     a   a      a a           a


$`Multiple comparison test (factor 1 in levels of factor 2)`
$`Multiple comparison test (factor 1 in levels of factor 2)`$`factor_1 in  C1`
           pair contrast p(tukey) p(snk) p(duncan)   p(t)
1 A1.C1 - A2.C1   2.1449   0.3534 0.3534    0.3534 0.3534

$`Multiple comparison test (factor 1 in levels of factor 2)`$`factor_1 in  C2`
           pair contrast p(tukey) p(snk) p(duncan)   p(t)
1 A2.C2 - A1.C2   1.4592   0.5246 0.5246    0.5246 0.5246

$`Multiple comparison test (factor 1 in levels of factor 2)`$`factor_1 in  C3`
           pair contrast p(tukey) p(snk) p(duncan)   p(t)
1 A1.C3 - A2.C3   1.0844   0.6353 0.6353    0.6353 0.6353


$`Adjusted means (factor 2 in levels of factor 1)`
$`Adjusted means (factor 2 in levels of factor 1)`$`factor_2 in  A1`
  treatment adjusted.mean     sd    sem tukey snk duncan t scott_knott
1     A1.C1       30.7519 1.6684 1.5837     a   a      a a           a
5     A1.C3       30.6189 2.8171 1.5837     a   a      a a           a
3     A1.C2       29.4361 3.5536 1.5837     a   a      a a           a

$`Adjusted means (factor 2 in levels of factor 1)`$`factor_2 in  A2`
  treatment adjusted.mean     sd    sem tukey snk duncan t scott_knott
4     A2.C2       30.8953 3.0436 1.5837     a   a      a a           a
6     A2.C3       29.5345 4.7032 1.5837     a   a      a a           a
2     A2.C1       28.6070 1.7550 1.5837     a   a      a a           a


$`Multiple comparison test (factor 2 in levels of factor 1)`
$`Multiple comparison test (factor 2 in levels of factor 1)`$`factor_2 in  A1`
           pair contrast p(tukey) p(snk) p(duncan)   p(t)
1 A1.C1 - A1.C3   0.1330   0.9981 0.9534    0.9534 0.9534
2 A1.C1 - A1.C2   1.3158   0.8288 0.8288    0.5862 0.5656
3 A1.C3 - A1.C2   1.1828   0.8589 0.6051    0.6051 0.6051

$`Multiple comparison test (factor 2 in levels of factor 1)`$`factor_2 in  A2`
           pair contrast p(tukey) p(snk) p(duncan)   p(t)
1 A2.C2 - A2.C3   1.3608   0.8182 0.5526    0.5526 0.5526
2 A2.C2 - A2.C1   2.2883   0.5751 0.5751    0.3481 0.3231
3 A2.C3 - A2.C1   0.9275   0.9104 0.6846    0.6846 0.6846


$`Residual analysis`
$`Residual analysis`$`residual analysis`
                                    values
p.value Shapiro-Wilk test           0.6960
p.value Bartlett test (factor_1)    0.5441
p.value Bartlett test (factor_2)    0.6041
p.value Bartlett test (treatments)  0.8490
coefficient of variation (%)       10.5700
first value most discrepant        18.0000
second value most discrepant       16.0000
third value most discrepant         6.0000

$`Residual analysis`$residuals
         1          2          3          4          5          6          7 
-3.8008383 -0.6650073  3.8724965 -2.0512987 -1.5985339  4.2431817  0.7811775 
         8          9         10         11         12         13         14 
-2.2518183 -1.3463467 -2.0819696  3.2036886  1.6952685  0.2874814  1.5621517 
        15         16         17         18         19         20         21 
-1.2665734  4.3024939  0.7117327 -5.5972863  2.7321794  1.3546740 -1.2595765 
        22         23         24 
-0.1692256 -2.3168874 -0.3411639 

$`Residual analysis`$`standardized residuals`
          1           2           3           4           5           6 
-1.48588700 -0.25997574  1.51390084 -0.80192786 -0.62492549  1.65881525 
          7           8           9          10          11          12 
 0.30539092 -0.88031831 -0.52633627 -0.81391821  1.25243928  0.66274259 
         13          14          15          16          17          18 
 0.11238701  0.61070235 -0.49514996  1.68200256  0.27824241 -2.18818437 
         19          20          21          22          23          24 
 1.06810906  0.52959170 -0.49241461 -0.06615649 -0.90575620 -0.13337347 

🔹 Módulo 4 – Regressão

Aula 13 – Regressão Linear

dose <- c(0, 50, 100, 150, 200)
prod <- c(20, 28, 35, 40, 38)
dados_reg <- data.frame(dose, prod)

modelo_reg <- lm(prod ~ dose, data = dados_reg)
a <- summary(modelo_reg)

# Coeficientes
coeficientes <- coef(modelo_reg)
intercepto <- round(coeficientes[1], 2) # sem sinal extra
slope <- formatC(coeficientes[2], format = "f", digits = 2, flag = "+") # sempre com sinal

# Estatísticas do modelo
r2 <- round(a$r.squared, 4)
f_value <- a$fstatistic[1]
df1 <- a$fstatistic[2]
df2 <- a$fstatistic[3]
p_value_anova <- pf(f_value, df1, df2, lower.tail = FALSE)




# Equação no formato correto
equacao <- paste0("y = ", intercepto, slope, "x")

legenda <- paste0(
  equacao,
  "  R² = ", r2,
  "\nF = ", f_value,
  "; p = ", format.pval(p_value_anova, digits = 4, eps = 0.001)
)



dados_reg |>
  ggplot(aes(x = dose, y = prod)) +
  geom_point(size = 3) +
  geom_smooth(method = "lm", se = FALSE, color = "black") +
  annotate("text",
           x = 100, y = 10,
           label = legenda,
           hjust = 0, size = 5) +
  labs(x = "Frequência de irrigação", y = "CRA (%)") +
  theme_bw() +
  theme(panel.grid = element_blank()) +
  ylim(0, 50)
`geom_smooth()` using formula = 'y ~ x'


Aula 14 – Regressão Quadrática

# Ajustar modelo de regressão quadrática
modelo_quad <- lm(prod ~ dose + I(dose^2), data = dados_reg)
a <- summary(modelo_quad)
a

Call:
lm(formula = prod ~ dose + I(dose^2), data = dados_reg)

Residuals:
      1       2       3       4       5 
 0.5429 -0.9714 -0.3429  1.4286 -0.6571 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)   
(Intercept) 19.4571429  1.3021176  14.943  0.00445 **
dose         0.2217143  0.0308492   7.187  0.01882 * 
I(dose^2)   -0.0006286  0.0001479  -4.250  0.05116 . 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.384 on 2 degrees of freedom
Multiple R-squared:  0.9858,    Adjusted R-squared:  0.9715 
F-statistic: 69.21 on 2 and 2 DF,  p-value: 0.01424
# Coeficientes da regressão quadrática (com mais casas decimais)
coef_quad <- coef(modelo_quad)
intercepto <- formatC(coef_quad[1], format = "f", digits = 4)
linear     <- formatC(coef_quad[2], format = "f", digits = 4, flag = "+")
quadratico <- formatC(coef_quad[3], format = "f", digits = 4, flag = "+") 
# usei 6 casas para o termo quadrático porque geralmente é bem pequeno

# Estatísticas do modelo
r2 <- round(a$r.squared, 4)
f_value <- a$fstatistic[1]
df1 <- a$fstatistic[2]
df2 <- a$fstatistic[3]
p_value_anova <- pf(f_value, df1, df2, lower.tail = FALSE)

# Equação para legenda
equacao <- paste0("y = ", intercepto, " ", linear, "x ", quadratico, "x²")
legenda <- paste0(
  equacao,
  "  R² = ", r2,
  "\nF = ", round(f_value, 2),
  "; p = ", format.pval(p_value_anova, digits = 4, eps = 0.001)
)

# Gráfico
library(ggplot2)

regressao_quad <- ggplot(dados_reg, aes(x = dose, y = prod)) +
  geom_point(size = 3) +
  stat_smooth(
    method = "lm",
    formula = y ~ x + I(x^2),
    se = FALSE,
    color = "black"
  ) +
  annotate("text", x = 50, y = 10, label = legenda, hjust = 0, size = 5) +
  labs(x = "Dose", y = "Produção") +
  theme_bw() +
  theme(panel.grid = element_blank()) +
  ylim(0, 50)

# Exibir gráfico
regressao_quad

🔹 Módulo 5 – Relatórios e Projeto Final

Aula 15 – Relatórios com RMarkdown

  • Este próprio arquivo é um exemplo.
  • Pode ser exportado em HTML, Word ou PDF.

✅ Projeto Final

Analise um conjunto de dados agrícolas (real ou fornecido):
- Estruture os dados no Excel/CSV.
- Importe para o R.
- Realize ANOVA (com aov(), ExpDes.pt, easyanova e rstatix).
- Teste pressupostos.
- Se necessário, ajuste modelos de regressão.
- Gere gráficos com ggplot2.
- Organize os resultados em relatório RMarkdown.