이전 관측값 유지(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 코드 최적화하기
연습 안내
current를NumericVector의NA값으로 초기화하세요.if조건에서는x의i번째 요소가NumericVector의NA인지 확인해야 합니다.- 조건이 참이면
res의i번째 요소를current로 설정하세요. - 그렇지 않으면
current를x의i번째 요소로 설정하세요.
실습형 인터랙티브 연습
이 예제를 이 샘플 코드를 완성하여 풀어보세요.
#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
)
*/