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.
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.
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 dex
a diferençax[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 pacotedplyr
25: atrasa os valores de um vetorx
porn
observações (valor predefinidon = 1
);lead(x, n)
do pacotedplyr
: adianta os valores de um vetorx
porn
observações (valor predefinidon = 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
faz parte da coleção de pacotes para ciência de dados chamada tidyverse.↩