Мне любопытно, может ли кто-нибудь придумать (более быстрый) способ вычисления скользящей статистики (скользящее среднее, медиана, процентили и т. Д.) За переменный интервал времени (оконное управление).
То есть, предположим, что кому-то даны случайно рассчитанные по времени наблюдения (то есть не ежедневные или еженедельные данные, наблюдения просто имеют отметку времени, как в тиковых данных), и предположим, что вы хотите посмотреть статистику центра и дисперсии, которую вы можете расширять и сужать интервал времени, за который рассчитывается эта статистика.
Я сделал простой цикл, который делает это. Но он явно работает очень медленно (на самом деле я думаю, что мой цикл все еще работает с небольшой выборкой данных, которую я настроил для проверки его скорости). Я пытался заставить что-то вроде 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)
}
Ваш совет будет приветствоваться!