BaşlayınÜcretsiz başlayın

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

Kursa Göz Atın

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
  )
}
Kodu Düzenle ve Çalıştır