R - Schnellere Methode zur Berechnung von Rolling Statistics über ein variables Intervall

Ich bin neugierig, ob irgendjemand da draußen eine (schnellere) Methode finden kann, um fortlaufende Statistiken (fortlaufender Mittelwert, Median, Perzentile usw.) über ein variables Zeitintervall (Fensterung) zu berechnen.

Angenommen, Sie erhalten Beobachtungen zu zufälligen Zeitpunkten (dh keine täglichen oder wöchentlichen Daten, Beobachtungen haben nur einen Zeitstempel, wie in Zeckendaten), und Sie möchten sich die Statistiken zu Mittelpunkt und Streuung ansehen, die Sie in der Lage sind Erweitern und verkürzen Sie das Zeitintervall, in dem diese Statistiken berechnet werden.

Ich habe eine einfache for-Schleife erstellt, die dies ausführt. Aber es läuft offensichtlich sehr langsam (Ich glaube, meine Schleife läuft immer noch über eine kleine Auswahl von Daten, die ich zum Testen der Geschwindigkeit eingerichtet habe). Ich habe versucht, so etwas wie ddply dazu zu bringen - was geradezu schwierig zu sein scheint, um für die täglichen Statistiken zu rennen -, aber ich kann mich anscheinend nicht daran rausarbeiten.

Beispiel:

Beispielsetup:

df <- data.frame(Date = runif(1000,0,30))
df$Price <- I((df$Date)^0.5 * (rnorm(1000,30,4)))
df$Date <- as.Date(df$Date, origin = "1970-01-01")

Beispielfunktion (die bei vielen Beobachtungen sehr langsam abläuft

SummaryStats <- function(dataframe, interval){
  # Returns daily simple summary stats, 
  # at varying intervals
  # dataframe is the data frame in question, with Date and Price obs
  # interval is the width of time to be treated as a day

  firstDay <- min(dataframe$Date)
  lastDay  <- max(dataframe$Date)
  result <- data.frame(Date = NULL,
                       Average = NULL,  Median = NULL,
                       Count = NULL,
                       Percentile25 = NULL, Percentile75 = NULL)

  for (Day in firstDay:lastDay){

    dataframe.sub = subset(dataframe,
                Date > (Day - (interval/2))
                & Date < (Day + (interval/2)))

    nu = data.frame(Date = Day, 
                    Average = mean(dataframe.sub$Price),
                    Median = median(dataframe.sub$Price),
                    Count = length(dataframe.sub$Price),
                    P25 = quantile(dataframe.sub$Price, 0.25),
                    P75 = quantile(dataframe.sub$Price, 0.75))

    result = rbind(result,nu)

  }

  return(result)

}

Ihr Rat wäre willkommen!

Antworten auf die Frage(4)

Ihre Antwort auf die Frage