Última observação carregada adiante
Quando você tem dados ausentes em uma série temporal, uma técnica comum é carregar adiante o último valor que não estava ausente. Isso é conhecido como last observation carried forward. Naturalmente, pode ser expresso com código iterativo. Aqui está uma implementação em R:
na_locf1 <- function(x) {
current <- NA
res <- x
for(i in seq_along(x)) {
if(is.na(x[i])) {
# Replace with current
res[i] <- current
} else {
# Set current
current <- x[i]
}
}
res
}
Assim como médias móveis, é realmente difícil vetorizar esse código mantendo a legibilidade. Porém, como isso é apenas um laço for, pode ser facilmente traduzido para C++.
na_locf1() está disponível no seu ambiente de trabalho. Converta-o para C++ e atribua a função resultante a na_locf2().
Este exercicio faz parte do curso
Otimizando código R com Rcpp
Instruções do exercicio
- Inicialize
currentcom o valorNAdoNumericVector. - A condição do
ifdeve verificar se o elementoidexé umNAdeNumericVector. - Quando essa condição for verdadeira, defina o elemento
iderescomocurrent. - Caso contrário, defina
currentcomo o elementoidex.
exercicio interativo prático
Tente este exercicio completando este código de exemplo.
#include
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector na_locf2(NumericVector x) {
// Initialize to NA
double current = ___::___();
int n = x.size();
NumericVector res = clone(x);
for(int i = 0; i < n; i++) {
// If ith value of x is NA
if(___::___(___)) {
// Set ith result as current
res[i] = ___;
} else {
// Set current as ith value of x
current = ___;
}
}
return res ;
}
/*** R
library(microbenchmark)
set.seed(42)
x <- rnorm(1e5)
# Sprinkle some NA into x
x[sample(1e5, 100)] <- NA
microbenchmark(
na_locf1(x),
na_locf2(x),
times = 5
)
*/