LoslegenKostenlos loslegen

Gleitende Mittelwerte

Gleitende Mittelwerte (manchmal auch gleitende Durchschnitte genannt) werden in der Zeitreihenanalyse verwendet, um Rauschen zu glätten. Der Wert an jedem Zeitpunkt wird durch den Mittelwert der Werte an benachbarten Zeitpunkten (dem Fenster) ersetzt.

Eine naheliegende Art, diese Funktion zu schreiben, ist

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
}

Das ruft mean() sehr oft auf und ist daher ineffizient. Eine Lösung ist, eine Variable total zu verwenden, sodass du in jeder Iteration des Loops das Element entfernst, das du nicht mehr brauchst, und das neue hinzufügst.

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
}

So oder so ist es oft natürlicher, Schleifencode als vektorisierten Code zu schreiben, was die Performance verringern kann. Beide obigen Versionen sind auf ihre Weise ineffizient. Bevor wir in der nächsten Aufgabe die C++‑Version schreiben, erstellen wir eine Version mit Vektorisierung. rollmean1(), rollmean2() und ein Zufallsvektor x sind in deinem Workspace verfügbar. Du vervollständigst jetzt die Funktionsdefinition von rollmean3() und vergleichst die Performance dieser Funktionen.

Diese Übung ist Teil des Kurses

R-Code mit Rcpp optimieren

Kurs anzeigen

Interaktive Übung

Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.

# 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
  )
}
Code bearbeiten und ausführen