CommencerCommencer gratuitement

Dernière observation reportée

Lorsque vous avez des données manquantes dans une série temporelle, une technique courante consiste à reporter la dernière valeur non manquante. On parle de dernière observation reportée. Cela s'exprime naturellement avec du code itératif. Voici une implémentation 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
}

Comme pour les moyennes glissantes, il est très difficile de vectoriser ce code tout en le gardant lisible. Cependant, puisqu'il s'agit simplement d'une boucle for, on peut facilement le traduire en C++.

na_locf1() est fourni dans votre espace de travail. Convertissez-le en C++ et assignez-le à na_locf2().

Cet exercice fait partie du cours

Optimiser du code R avec Rcpp

Afficher le cours

Instructions

  • Initialisez current avec la valeur NA du NumericVector.
  • La condition du if doit vérifier si le i-ème élément de x est un NA de NumericVector.
  • Lorsque cette condition est vraie, affectez current au i-ème élément de res.
  • Sinon, affectez au current le i-ème élément de x.

Exercice interactif pratique

Essayez cet exercice en complétant cet exemple de code.

#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
  )
*/
Modifier et exécuter le code