시작하기무료로 시작하기

이전 관측값 유지(Last observation carried forward)

시계열에 결측치가 있을 때, 흔히 쓰는 기법 중 하나는 마지막으로 관측된(결측이 아닌) 값을 앞으로 끌어와 채우는 것입니다. 이를 last observation carried forward라고 합니다. 이 방법은 반복문 형태로 자연스럽게 표현할 수 있습니다. 아래는 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
}

롤링 평균과 마찬가지로, 이 코드를 가독성을 유지하면서 벡터화하기는 매우 어렵습니다. 하지만 단순한 for 루프이므로 C++로 쉽게 옮길 수 있어요.

na_locf1()가 작업 공간에 제공되어 있습니다. 이를 C++로 변환해 na_locf2()에 할당하세요.

이 연습은 강의의 일부입니다

Rcpp로 R 코드 최적화하기

강의 보기

연습 안내

  • currentNumericVectorNA 값으로 초기화하세요.
  • if 조건에서는 xi번째 요소가 NumericVectorNA인지 확인해야 합니다.
  • 조건이 참이면 resi번째 요소를 current로 설정하세요.
  • 그렇지 않으면 currentxi번째 요소로 설정하세요.

실습형 인터랙티브 연습

이 예제를 이 샘플 코드를 완성하여 풀어보세요.

#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
  )
*/
코드 편집 및 실행