Скользящие временные интервалы для данных временных рядов в 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-минутного блока, но я не вижу способа адаптировать это для прокатки 3-минутных интервалов.

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

15
задан Community 23 May 2017 в 11:44
поделиться