R - более быстрый способ расчета скользящей статистики за переменный интервал

Мне любопытно, может ли кто-нибудь придумать (более быстрый) способ расчета скользящей статистики (скользящее среднее, медиана, процентили и т. Д.) За переменный интервал времени (управление окнами).

То есть, предположим, что каждому дается случайное время наблюдений (т. Е. Не ежедневные или еженедельные данные, наблюдения просто имеют метку времени, как в данных тиков), и предположим, что вы хотите посмотреть статистику центра и дисперсии, которую вы можете расширить и сузить интервал времени, в течение которого рассчитывается эта статистика.

Я сделал простой цикл, который делает это. Но он, очевидно, работает очень медленно (на самом деле я думаю, что мой цикл все еще работает на небольшом образце данных, которые я настроил для проверки его скорости). Я пытался заставить что-то наподобие ddply сделать это - что кажется нелегким делом, чтобы бегать за ежедневной статистикой - но я не могу найти выход из этого.

Пример:

Образец настройки:

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")

Пример функции (которая работает очень медленно со многими наблюдениями

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)

}

Ваш совет будет приветствоваться!

Ответы на вопрос(4)

Ваш ответ на вопрос