Última observación arrastrada
Cuando tienes datos ausentes en una serie temporal, una técnica común es arrastrar hacia adelante el último valor que no estaba ausente. Esto se conoce como last observation carried forward. Se puede expresar de forma natural con código iterativo. Aquí tienes una implementación en 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
}
Al igual que las medias móviles, es muy difícil vectorizar este código y mantenerlo legible. Sin embargo, como solo es un bucle for, se puede traducir fácilmente a C++.
na_locf1() está disponible en tu espacio de trabajo. Convierte esta función a C++ y asígnala a na_locf2().
Este ejercicio forma parte del curso
Optimizar código de R con Rcpp
Instrucciones del ejercicio
- Inicializa
currentcon el valorNAdeNumericVector. - La condición del
ifdebe comprobar si el elementoi-ésimo dexes unNAdeNumericVector. - Cuando se cumpla esa condición, establece el elemento
i-ésimo deresencurrent. - En caso contrario, asigna a
currentel elementoi-ésimo dex.
Ejercicio interactivo práctico
Prueba este ejercicio y completa el código de muestra.
#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
)
*/