7.11 Funções móveis úteis

Se queremos obter um valor que leve em consideração todos os valores anteriores e o valor atual, podemos usar funções da família cum{fun}(), como a cumsum() para somar valores à medida que avançamos na sequência. Esta operação é conhecida como soma cumulativa, total móvel ou soma móvel.

Vamos obter a soma cumulativa da série da precipitação mensal abaixo.

# serie de com 2 anos de prec mensal
prec <- c(
    230, 205, 160, 100, 60, 30, 
    40, 60, 110, 165, 200, 220, 
    250,200, 210, 12, 0, 30, 
    21, 42, 100, 120, 10, 208
  )
prec
#>  [1] 230 205 160 100  60  30  40  60 110 165 200 220 250 200 210  12   0  30  21
#> [20]  42 100 120  10 208
# meses de prec como datas
dts <- seq(
  from = as.Date("2010-01-01"),
  by = "month",
  length.out = length(prec)
)
dts
#>  [1] "2010-01-01" "2010-02-01" "2010-03-01" "2010-04-01" "2010-05-01"
#>  [6] "2010-06-01" "2010-07-01" "2010-08-01" "2010-09-01" "2010-10-01"
#> [11] "2010-11-01" "2010-12-01" "2011-01-01" "2011-02-01" "2011-03-01"
#> [16] "2011-04-01" "2011-05-01" "2011-06-01" "2011-07-01" "2011-08-01"
#> [21] "2011-09-01" "2011-10-01" "2011-11-01" "2011-12-01"
prec_ac <- cumsum(prec)
prec_ac
#>  [1]  230  435  595  695  755  785  825  885  995 1160 1360 1580 1830 2030 2240
#> [16] 2252 2252 2282 2303 2345 2445 2565 2575 2783

A relação entre essas duas variáveis pode ser melhor compreendida pelo gráfico da Figura 7.1.

Visualização da soma acumulada. A precipitação será representada por barras e a precipitação acumulada até o mês decorrido como linha. Nós abordaremos os recursos para visualização gráfica na seção **Visualização de dados**.

Figura 7.1: Visualização da soma acumulada. A precipitação será representada por barras e a precipitação acumulada até o mês decorrido como linha. Nós abordaremos os recursos para visualização gráfica na seção Visualização de dados.

As funções cummax() e cummin() fornecem os valores mínimo e máximo entre o início do vetor e a posição de cada elemento. Para enfatizar a utilidade destas funções, vamos considerar o vetor y abaixo, representando uma onda com amplitude que aumenta no tempo.

(x <- seq(from = 0, to = 2.75*pi, length.out = 20))
#>  [1] 0.0000000 0.4547042 0.9094084 1.3641126 1.8188168 2.2735210 2.7282252
#>  [8] 3.1829294 3.6376336 4.0923378 4.5470420 5.0017462 5.4564504 5.9111546
#> [15] 6.3658588 6.8205630 7.2752672 7.7299714 8.1846756 8.6393798
(y <- round(-x*cos(2*x), 2))
#>  [1]  0.00 -0.28  0.22  1.25  1.60  0.37 -1.85 -3.17 -1.99  1.33  4.30  4.19
#> [13]  0.45 -4.35 -6.28 -3.25  2.92  7.49  6.46  0.00
# maximos e minimos móveis de y
(y_env_sup <- cummax(y))
#>  [1] 0.00 0.00 0.22 1.25 1.60 1.60 1.60 1.60 1.60 1.60 4.30 4.30 4.30 4.30 4.30
#> [16] 4.30 4.30 7.49 7.49 7.49
(y_env_inf <- cummin(y))
#>  [1]  0.00 -0.28 -0.28 -0.28 -0.28 -0.28 -1.85 -3.17 -3.17 -3.17 -3.17 -3.17
#> [13] -3.17 -4.35 -6.28 -6.28 -6.28 -6.28 -6.28 -6.28

A Figura 7.2 permite visualizar que estas funções fornecem os envelopes superior e inferior de variação de um vetor.

Visualização do potencial uso das funções `cummax()` e `cummin()`.

Figura 7.2: Visualização do potencial uso das funções cummax() e cummin().

Em alguns casos precisamos comparar os valores em relação a valores antes ou depois de um elemento do vetor. Para este tipo de operação podemos usar as funções:

  • diff(x): diferencial ou primeira diferença, calcula para cada elemento de x a diferença x[i] - x[i-1] para i de 2 até length(x). Resulta em um vetor com um elemento a menos que o vetor de entrada.

  • lag(x, n) do pacote dplyr25: atrasa os valores de um vetor x por n observações (valor predefinido n = 1);

  • lead(x, n) do pacote dplyr: adianta os valores de um vetor x por n observações (valor predefinido n = 1);

Vamos comparar o resultado da diff() aplicada ao vetor de prec acumulado (prec_ac) com os valores prec.

diff(prec_ac) 
#>  [1] 205 160 100  60  30  40  60 110 165 200 220 250 200 210  12   0  30  21  42
#> [20] 100 120  10 208
#length(diff(prec_ac))
prec
#>  [1] 230 205 160 100  60  30  40  60 110 165 200 220 250 200 210  12   0  30  21
#> [20]  42 100 120  10 208
#length(prec)

Se precisássemos comparar prec com valores do mês anterior e posterior, estes vetores poderiam ser obtidos simplesmente com:

# vetor prec deslocado para frente (atrasado)
lag(prec)
#>  [1]  NA 230 205 160 100  60  30  40  60 110 165 200 220 250 200 210  12   0  30
#> [20]  21  42 100 120  10
# vetor prec deslocado para trás (adiantados)
lead(prec)
#>  [1] 205 160 100  60  30  40  60 110 165 200 220 250 200 210  12   0  30  21  42
#> [20] 100 120  10 208  NA

Para detectar períodos de aumento (ou redução) da precipitação do mês atual em relação ao anterior.

prec - lag(prec) > 0
#>  [1]    NA FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
#> [13]  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE
prec - lag(prec) < 0
#>  [1]    NA  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
#> [13] FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE

  1. faz parte da coleção de pacotes para ciência de dados chamada tidyverse.