7. Sintetização

Diretório

# meu computador (mudar de acordo)
setwd("D:/Desktop/UFSC/aulas/classes/RGV410046/data")

Pacotes e dados

library(rio)
library(tidyverse)
library(metan)
library(DataExplorer)

# dados
maize <- 
  import("examples_data.xlsx",
         sheet = "maize",
         setclass = "tbl")

Sintetização

Após a organização e mutação dos dados, o cientista precisa resumi-los utilizando alguma métrica de interesse. A média, a mediana, a variância, a frequência, a proporção, por exemplo, são tipos de sumarização que trazem diferentes informações sobre uma variável. No R, a função summarise() cria um novo data frame. Ele terá uma (ou mais) linhas para cada combinação de variáveis de agrupamento; se não houver variáveis de agrupamento, a saída terá uma única linha resumindo todas as observações na entrada. Ele conterá uma coluna para cada variável de agrupamento e uma coluna para cada uma das estatísticas de resumo que você especificou.

Fonte: https://dplyr.tidyverse.org/index.html

Uma variável, uma estatística

Diversos verbos do pacote dplyr podem ser utilizados para resumir conjuntos de dados. Iniciaremos com a função count() para contar valores que se repetem em uma determinada variável. Por exemplo, é possível identificar qual é o valor de NGRA que mais se repete utilizando

maize |> count(NGRA, sort = TRUE)
# A tibble: 367 × 2
    NGRA     n
   <dbl> <int>
 1   419     8
 2   513     8
 3   503     7
 4   528     7
 5   529     7
 6   538     7
 7   451     6
 8   481     6
 9   493     6
10   530     6
# ℹ 357 more rows

Para identificar quais os valores distintos de NGRA foram observados a função distinct() é usada.

maize |> distinct(NGRA)
# A tibble: 367 × 1
    NGRA
   <dbl>
 1    NA
 2   427
 3   497
 4   523
 5   551
 6   529
 7   294
 8   528
 9   538
10   582
# ℹ 357 more rows

Para calcular a média da variável NGRA usamos a função summarise() é usada.

maize |> summarise(media_ngra = mean(NGRA))
# A tibble: 1 × 1
  media_ngra
       <dbl>
1         NA
# checar valores faltantes
plot_missing(maize)

# remover os NAs para cálculo da estatística
maize |> summarise(media_ngra = mean(NGRA, na.rm = TRUE))
# A tibble: 1 × 1
  media_ngra
       <dbl>
1       512.
#usando o R base
mean(maize$NGRA, na.rm = TRUE)
[1] 511.5186

Uma variável, diversas estatísticas

Utilizando a função summarise() é possível criar uma ou mais variáveis escalares resumindo as variáveis de um data frame existente. Como resultado, uma linha e várias colunas é retornada. O seguinte código calcula a média global e o desvio padrão amostral da variável MGRA eretorna o n utilizado na estimativa.

maize |>  
  summarise(MGRA_mean = mean(MGRA),
            MGRA_sd = sd(MGRA),
            n = n())
# A tibble: 1 × 3
  MGRA_mean MGRA_sd     n
      <dbl>   <dbl> <int>
1      173.    47.6   780

Muitas vezes é necessário computar uma determinada função (como a média) para cada nível de uma variável categórica. Continuamos no mesmo exemplo anterior, mas agora neste caso, o objetivo é calcular a média da MGRA para cada híbrido. Utilizando a função group_by() antes da função summarise() uma linha de resultado para cada nível do fator híbrido é retornado.

maize |>
  group_by(HIB) %>%
  summarise(MGRA_mean = mean(MGRA),
            MGRA_max = max(MGRA),
            MGRA_min = min(MGRA))
# A tibble: 13 × 4
   HIB   MGRA_mean MGRA_max MGRA_min
   <chr>     <dbl>    <dbl>    <dbl>
 1 H1         184.     260.     75.2
 2 H10        164.     287.     71.5
 3 H11        167.     260.     94.9
 4 H12        157.     257.     66.8
 5 H13        180.     291.     89.3
 6 H2         187.     273.     83.7
 7 H3         169.     263.     73.2
 8 H4         184.     262.    108. 
 9 H5         184.     256.     72.8
10 H6         188.     289.     65.3
11 H7         171.     254.     62.4
12 H8         160.     277.     59.5
13 H9         153.     255.     58.5

Diversas variáveis, uma estatística

Até aqui vimos como a média (global ou para cada híbrido) da MGRA pode ser calculada. Quase sempre, no entanto, quando calculamos a média (ou qualquer outra medida) em um conjunto de dados, queremos fazê-la para todas (ou algumas) variáveis numéricas dos dados. Implementar isto com dplyr é relativamente fácil. Para isto, é utilizada a função across() que aplica uma função (ou um conjunto de funções) a um conjunto de colunas. Veremos como across() pode ser utilizada para calcular a média para as variáveis numéricas do conjunto maize. No exemplo abaixo, where() aplica uma função (neste caso is.numeric()) a todas as variáveis e seleciona aquelas para as quais a função retorna TRUE. Assim, a média somente é calculada para as variáveis numéricas.

maize |> 
  summarise(across(.cols = where(is.numeric),
                   .fns =  mean,
                   na.rm = TRUE)) 
Warning: There was 1 warning in `summarise()`.
ℹ In argument: `across(.cols = where(is.numeric), .fns = mean, na.rm = TRUE)`.
Caused by warning:
! The `...` argument of `across()` is deprecated as of dplyr 1.1.0.
Supply arguments directly to `.fns` through an anonymous function instead.

  # Previously
  across(a:b, mean, na.rm = TRUE)

  # Now
  across(a:b, \(x) mean(x, na.rm = TRUE))
# A tibble: 1 × 7
  APLA_PLANT AIES_PLANT  CESP  DIES  MGRA   MMG  NGRA
       <dbl>      <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1       2.47       1.34  15.2  49.5  173.  339.  512.

Funções próprias podem ser aplicadas dentro da função summarise() para computar uma estatística personalizada. Como exemplo, vamos criar uma função chamada se que retornará o erro padrão da média e aplicá-la a todas as variáveis que iniciam "M", para cada nível do fator AMB.

se <- function(dados){
  sd(dados, na.rm = TRUE) / sqrt(length(na.omit(dados)))
}

maize |>
  group_by(AMB) %>%
  summarise(across(.cols = contains("_PLANT"),
                   .fns = se,
                   .names = "{.col}.se"))
# A tibble: 4 × 3
  AMB   APLA_PLANT.se AIES_PLANT.se
  <chr>         <dbl>         <dbl>
1 A1           0.0156        0.0134
2 A2           0.0339        0.0264
3 A3           0.0246        0.0161
4 A4           0.0178        0.0152

Diversas variáveis, diversas estatísticas

Se desejamos computar mais de uma estatística para variáveis específicas, então o próximo código nos ajudará. Note que para aplicar mais de uma função é necessário criar uma lista com o nome das funções. Neste caso, os sufixos _m e _sd representam a média e o desvio padrão, respectivamente. Faremos isso para cada nível da variável HIB.

maize %>%
  group_by(HIB, AMB) |> 
  summarise(across(starts_with("M"),
                   .fns =  list(m = mean, sd = sd)))
`summarise()` has grouped output by 'HIB'. You can override using the `.groups`
argument.
# A tibble: 52 × 6
# Groups:   HIB [13]
   HIB   AMB   MGRA_m MGRA_sd MMG_m MMG_sd
   <chr> <chr>  <dbl>   <dbl> <dbl>  <dbl>
 1 H1    A1      203.    42.2  382.   48.1
 2 H1    A2      188.    27.7  389.   22.2
 3 H1    A3      157.    54.8  369.   65.2
 4 H1    A4      187.    37.0  319.   43.6
 5 H10   A1      192.    50.0  372.   54.0
 6 H10   A2      160.    37.0  316.   52.8
 7 H10   A3      121.    36.7  247.   41.6
 8 H10   A4      183.    45.5  345.   51.3
 9 H11   A1      188.    38.9  353.   45.7
10 H11   A2      164.    34.3  342.   29.3
# ℹ 42 more rows

Quick tips

my_quantile <- function(x, probs) {
  tibble::tibble(x = quantile(x, probs), probs = probs)
}
mtcars %>%
  group_by(cyl) %>%
  summarise(my_quantile(disp, c(0.25, 0.75)))
Warning: Returning more (or less) than 1 row per `summarise()` group was deprecated in
dplyr 1.1.0.
ℹ Please use `reframe()` instead.
ℹ When switching from `summarise()` to `reframe()`, remember that `reframe()`
  always returns an ungrouped data frame and adjust accordingly.
`summarise()` has grouped output by 'cyl'. You can override using the `.groups`
argument.
# A tibble: 6 × 3
# Groups:   cyl [3]
    cyl     x probs
  <dbl> <dbl> <dbl>
1     4  78.8  0.25
2     4 121.   0.75
3     6 160    0.25
4     6 196.   0.75
5     8 302.   0.25
6     8 390    0.75
maize %>%
   group_by(HIB) %>%
  summarise(my_quantile(MGRA, c(0.25, 0.75)))
Warning: Returning more (or less) than 1 row per `summarise()` group was deprecated in
dplyr 1.1.0.
ℹ Please use `reframe()` instead.
ℹ When switching from `summarise()` to `reframe()`, remember that `reframe()`
  always returns an ungrouped data frame and adjust accordingly.
`summarise()` has grouped output by 'HIB'. You can override using the `.groups`
argument.
# A tibble: 26 × 3
# Groups:   HIB [13]
   HIB       x probs
   <chr> <dbl> <dbl>
 1 H1     162.  0.25
 2 H1     211.  0.75
 3 H10    131.  0.25
 4 H10    199.  0.75
 5 H11    144.  0.25
 6 H11    193.  0.75
 7 H12    121.  0.25
 8 H12    186.  0.75
 9 H13    146.  0.25
10 H13    211.  0.75
# ℹ 16 more rows
Free Website Hit Counter
Free website hit counter