Подтвердить что ты не робот

Временные интервалы скольжения для данных временных рядов в R

Я пытаюсь извлечь интересную статистику для набора данных с нерегулярными временными рядами, но не знаю, как найти нужные инструменты для работы. Инструменты для манипулирования регулярно сэмплированными временными рядами или серии на основе индексов в любое время довольно легко найти, хотя мне не очень повезло с проблемами, которые я пытаюсь решить.

Во-первых, воспроизводимый набор данных:

library(zoo)
set.seed(0)
nSamples    <- 5000
vecDT       <- rexp(nSamples, 3)
vecTimes    <- cumsum(c(0,vecDT))
vecDrift    <- c(0, rnorm(nSamples, mean = 1/nSamples, sd = 0.01))
vecVals     <- cumsum(vecDrift)
vecZ        <- zoo(vecVals, order.by = vecTimes)
rm(vecDT, vecDrift)

Предположим, что время находится в секундах. В серии vecZ почти 1700 секунд (всего за 30 минут) и 5001 записей за это время. (NB: я бы попытался использовать xts, но xts, похоже, нуждается в информации о дате, и я бы предпочел не использовать конкретную дату, когда это не имеет значения.)

Мои цели следующие:

  • Определите индексы значений за 3 минуты до и через 3 минуты после каждой точки. Поскольку время непрерывное, я сомневаюсь, что любые две точки находятся точно в 3 минуты друг от друга. То, что я хотел бы найти, - это точки, которые не более 3 минут и, по крайней мере, через 3 минуты после данной точки, то есть что-то вроде следующего (в псевдокоде):

    backIX(t, vecZ, tDelta) = min{ix in length(vecZ) : t - time(ix) < tDelta} forwardIX(t, vecZ, tDelta) = min{ix in length(vecZ) : time(ix) - t > tDelta}

    Итак, в течение 3 минут, tDelta = 180. Если t=2500, то результатом для forwardIX() будет 3012 (т.е. время (vecZ) [2500] равно 860.1462, а время (vecZ) [3012] равно 1040.403 или чуть более 180 секунд), а выход backwardIX() будет 2020 (соответствует времени 680.7162 секунды).

    В идеале я хотел бы использовать функцию, которая не требует t, поскольку она потребует вызовов length(vecZ) к функции, которая игнорирует тот факт, что скользящие окна времени могут быть рассчитаны более эффективно.

  • Применить функцию ко всем значениям в скользящем окне времени. Я видел rollapply, который принимает фиксированный размер окна (т.е. Фиксированное число индексов, но не фиксированное окно времени). Я могу решить этот наивный путь, с циклом (или foreach;-)), который вычисляется на индекс t, но я задавался вопросом, есть ли какие-то простые функции, уже реализованные, например. функция для вычисления среднего значения всех значений за данный временной интервал. Поскольку это можно сделать эффективно с помощью простых сводных статистических данных, которые скользят по окну, это должно быть вычислительно дешевле, чем функция, которая обращается ко всем данным несколько раз, чтобы рассчитать каждую статистику. Некоторые довольно естественные функции: среднее, мин, макс и медиана.

    Даже если окно не меняется во времени, возможность варьировать размер окна будет достаточной, и я могу найти этот размер окна, используя результат вышеупомянутого вопроса. Тем не менее, по-прежнему, по-видимому, требуются избыточные вычисления, поэтому возможность определять временные интервалы представляется более эффективной.

Существуют ли пакеты в R, которые облегчают такие манипуляции с данными во временных окнах, или мне не повезло, и я должен написать свои собственные функции?


Примечание 1: Этот вопрос пытается сделать что-то подобное, за исключением непересекающихся интервалов, а не перекатывать окна времени, например. Я мог бы приспособить это, чтобы сделать мой анализ на каждом последующем 3-минутном блоке, но я не вижу способа адаптировать его для выполнения трехминутных интервалов.

Примечание 2: Я обнаружил, что переключение с объекта zoo на числовой вектор (по времени) значительно ускорило проблему идентификации дальности поиска/определения конечной точки окна для первой цели. Это еще наивный алгоритм, но стоит упомянуть, что работа с объектами zoo может оказаться не оптимальной для наивного подхода.

4b9b3361

Ответ 1

Вот что я предлагал, но я не уверен, что он точно отвечает на ваш вопрос

#Picking up where your code left off
library(xts)
library(TTR)
x <- .xts(vecZ, vecTimes)
xx <- na.locf(cbind(xts(, seq.POSIXt(from=start(x), to=end(x), by='sec')), x))
x$means <- runMean(xx, n=180)
out <- x[!is.na(x[, 1]), ]
tail(out)

                                  x     means
1969-12-31 18:28:17.376141 0.2053531 0.1325938
1969-12-31 18:28:17.379140 0.2101565 0.1329065
1969-12-31 18:28:17.619840 0.2139770 0.1332403
1969-12-31 18:28:17.762765 0.2072574 0.1335843
1969-12-31 18:28:17.866473 0.2065790 0.1339608
1969-12-31 18:28:17.924270 0.2114755 0.1344264