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

#r

#r

Вопрос:

Я работаю с потоком данных временных рядов из эксперимента. Мы записываем несколько каналов данных, включая триггерный канал (‘X7.ramptrig’ в связанных данных: пример данных временных рядов), который указывает, когда происходит соответствующее событие в других каналах.

Я пытаюсь создать подмножества следующих n строк (например, 15 000) временного ряда (временные шаги составляют 0,1 мс), которые происходят после запуска триггера (‘1’). В этом столбце есть несколько триггеров (‘1’), расположенных с нерегулярными интервалами. Каждый второй временной шаг равен ‘0’, что указывает на отсутствие нового события.

Я прошу посмотреть, существует ли более эффективное решение для прямого подмножества последующих n строк после обнаружения триггера вместо косвенного (возможно, негибкого) решения, которое я придумал.

Ссылка на простой пример данных: https://gtvault-my.sharepoint.com/:t:/g/personal/shousley6_gatech_edu/EZZSVk6pPpJPvE0fXq1W2KkBhib1VDoV_X5B0CoSerdjFQ?e=izlkml

У меня есть рабочее решение, которое создает индекс из триггерного канала и разбивает набор данных по этому индексу. Поскольку триггеры имеют изменчивое размещение во времени, последующие подмножества фреймов данных не согласованы, и иногда встречаются «дополнительные» подмножества, которые предшествуют «важным» (‘res $ 0’ в примере). Кроме того, мне нужно, чтобы подмножества были сопоставлены по общему времени и выровнены для начала запуска.

Мое текущее решение «сокращает» списки фреймов данных до одинакового размера (в примере до первых 15 000 строк). Хотя это технически работает, это кажется неуклюжим. Я также пытался перевести решение SQL с помощью FETCH NEXT, но эти функции недоступны в SQLite, поддерживаемом в R.

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

 ##create index to detect whenever an event trigger occurs 
idx<-c(0, cumsum(diff(Time_Series_Data_Example$X7.ramptrig) >0))

## split the original dataframe on event triggers
split1<-split(Time_Series_Data_Example, idx) 

## cuts DFs down to 1.5s 
res <- lapply(split1, function(x){ 
  x <- top_n(x, -15000) 
})
  

Вот пример вывода данных: ‘head(res[[«1»]]’ 2

Для приведенных в примере данных и кода на выходе получается 4 подмножества, 3 из которых «важны» и синхронизированы по времени с триггером. Первое ‘res $ 0’ — это выбрасываемое подмножество.

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

Комментарии:

1. Можно показать небольшой пример желаемого результата?

2. Привет, Эндрю, я отредактировал исходный пост, чтобы включить краткий пример вывода.

3. Произойдет ли что-то важное в пакетах по 1,5 секунды или они просто удобного размера? Возможно, вам нужен Postgresql, а не SQLite, и, вероятно, пакет r tsmp и все документы из Калифорнийского университета в Риверсайде будут интересны как для автономного анализа, так и для анализа в реальном времени, что может избавить от необходимости создавать фреймы данных одинакового размера.

4. Хорошо, похоже, что подмножества 2-4 желательны? Что 1-го нет — так что в основном сделайте так, чтобы подмножество 1 никогда не появлялось, а желаемый результат состоял только из подмножеств 2-4? Похоже, вы заканчиваете с вашей собственной версией — или как вы можете увидеть улучшение отсюда?

5. Крис — спасибо, что взглянул и дал мне некоторую обратную связь. Я изучу работу Кеога. Да, в этих экспериментах 1,5-секундные пакеты определяют важные события, потому что мы их навязываем. Мы отходим от этих стереотипных событий, поэтому я беспокоюсь о его негибкости. Надеюсь, работа Кеога послужит источником вдохновения.