Son gözlemi ileri taşıma
Bir zaman serisinde eksik verilerin olduğunda, yaygın bir teknik, eksik olmayan son değeri ileri taşımaktır. Buna son gözlemi ileri taşıma denir. Bu yaklaşım doğal olarak yinelemeli kodla ifade edilebilir. İşte R ile bir uygulaması:
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
}
Yuvarlanan ortalamalarda olduğu gibi, bu kodu okunabilirliğini koruyarak vektörleştirmek gerçekten zordur. Ancak bu sadece bir for döngüsü olduğundan, C++'a kolayca çevrilebilir.
na_locf1() çalışma alanında sağlanmıştır. Bunu C++'a çevir ve na_locf2()'ye ata.
Bu egzersiz, kursun bir parçasıdır
Rcpp ile R Kodunu Optimize Etme
Egzersiz talimatları
current'ıNumericVector'ınNAdeğeriyle başlat.ifkoşulu,x'ini. elemanınınNumericVector'ınNA'si olup olmadığını kontrol etmeli.- Bu koşul doğruysa,
res'ini. elemanınıcurrentolarak ayarla. - Aksi halde,
current'ıx'ini. elemanına ayarla.
Uygulamalı etkileşimli egzersiz
Bu egzersizi bu örnek kodu tamamlayarak deneyin.
#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
)
*/