Last observation carried forward
Quando hai dati mancanti in una serie temporale, una tecnica comune è propagare in avanti l’ultimo valore non mancante. Questo è noto come last observation carried forward. Si presta bene a essere espresso con codice iterativo. Ecco un’implementazione in 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
}
Come per le medie mobili, è davvero difficile vettorializzare questo codice mantenendolo leggibile. Tuttavia, dato che si tratta solo di un ciclo for, può essere facilmente tradotto in C++.
na_locf1() è disponibile nel tuo workspace. Convertirlo in C++ e assegnarlo a na_locf2().
Questo esercizio fa parte del corso
Ottimizzare il codice R con Rcpp
Istruzioni dell'esercizio
- Inizializza
currental valoreNAdiNumericVector. - La condizione dell’
ifdeve verificare se l’elementoi-esimo dixè unNAdiNumericVector. - Quando la condizione è vera, imposta l’elemento
i-esimo diresacurrent. - Altrimenti, imposta
currentall’elementoi-esimo dix.
Esercizio pratico interattivo
Prova a risolvere questo esercizio completando il codice di esempio.
#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
)
*/