Kayan ortalamalar
Kayan ortalamalar (bazen hareketli ortalamalar olarak da adlandırılır) zaman serisi analizinde gürültüyü yumuşatmak için kullanılır. Her zaman noktasındaki değer, yakın zaman noktalarındaki değerlerin (yani, pencerenin) ortalamasıyla değiştirilir.
Bu işlevi yazmanın doğal bir yolu şöyledir
rollmean1 <- function(x, window = 3) {
n <- length(x)
res <- rep(NA, n)
for(i in seq(window, n)) {
res[i] <- mean(x[seq(i - window + 1, i)])
}
res
}
Bu, mean() fonksiyonunu birçok kez çağırır ve verimsizdir. Çözüm yollarından biri, döngünün her yinelemesinde artık ihtiyaç duyulmayan elemanı çıkarıp yenisini eklediğin bir total değişkeni kullanmaktır.
rollmean2 <- function(x, window = 3){
n <- length(x)
res <- rep(NA, n)
total <- sum(head(x, window))
res[window] <- total / window
for(i in seq(window + 1, n)) {
total <- total + x[i] - x[i - window]
res[i] <- total / window
}
res
}
Her iki durumda da, vektörize koda göre döngü kodu yazmak çok daha doğaldır; bu da performansı düşürebilir. Yukarıdaki iki sürüm de kendi içinde verimsizdir. Sonraki egzersizde C++ sürümünü yapmadan önce, vektörizasyon kullanan bir sürüm yazalım. rollmean1(), rollmean2() ve rastgele bir vektör olan x çalışma alanında mevcut. Şimdi rollmean3() işlev tanımını tamamlayacak ve bu işlevlerin performansını karşılaştırmalı ölçeceksin.
Bu egzersiz, kursun bir parçasıdır
Rcpp ile R Kodunu Optimize Etme
Uygulamalı etkileşimli egzersiz
Bu egzersizi bu örnek kodu tamamlayarak deneyin.
# Complete the definition of rollmean3()
rollmean3 <- function(x, window = 3) {
# Add the first window elements of x
initial_total <- ___(head(x, window))
# The elements to add at each iteration
lasts <- tail(x, - window)
# The elements to remove
firsts <- head(x, - window)
# Take the initial total and add the
# cumulative sum of lasts minus firsts
other_totals <- ___ + ___(___ - firsts)
# Build the output vector
c(
rep(NA, window - 1), # leading NA
initial_total / ___, # initial mean
other_totals / ___ # other means
)
}