Médias móveis
Médias móveis (às vezes chamadas de médias deslizantes) são usadas em análise de séries temporais para suavizar o ruído. O valor em cada ponto no tempo é substituído pela média dos valores em pontos próximos (a janela).
Uma forma natural de escrever essa função é
rollmean1 <- function(x, window = 3) {
n <- length(x)
res <- rep(NA, n)
for(i in seq(window, n)) {
res[i] <- mean(x[seq(i - window + 1, i)])
}
res
}
Isso chama mean() muitas vezes, o que é ineficiente. Uma solução é usar uma variável total para que, a cada iteração do loop, você remova o elemento que não é mais necessário e adicione o novo.
rollmean2 <- function(x, window = 3){
n <- length(x)
res <- rep(NA, n)
total <- sum(head(x, window))
res[window] <- total / window
for(i in seq(window + 1, n)) {
total <- total + x[i] - x[i - window]
res[i] <- total / window
}
res
}
De qualquer forma, é muito mais natural escrever código com loops do que código vetorizado, o que pode reduzir o desempenho. As duas versões acima são ineficientes à sua maneira. Antes de fazer a versão em C++ no próximo exercício, vamos escrever uma versão que use vetorização. rollmean1(), rollmean2() e um vetor aleatório, x, estão disponíveis no seu workspace. Agora você vai completar a definição da função rollmean3() e medir o desempenho dessas funções.
Este exercicio faz parte do curso
Otimizando código R com Rcpp
exercicio interativo prático
Tente este exercicio completando este código de exemplo.
# Complete the definition of rollmean3()
rollmean3 <- function(x, window = 3) {
# Add the first window elements of x
initial_total <- ___(head(x, window))
# The elements to add at each iteration
lasts <- tail(x, - window)
# The elements to remove
firsts <- head(x, - window)
# Take the initial total and add the
# cumulative sum of lasts minus firsts
other_totals <- ___ + ___(___ - firsts)
# Build the output vector
c(
rep(NA, window - 1), # leading NA
initial_total / ___, # initial mean
other_totals / ___ # other means
)
}