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)
}
Ваш совет будет приветствоваться!