Я провожу некоторые исследования, но застрял на этапе анализа (следовало бы уделять больше внимания моим статистическим лекциям).
Я собрал два одновременных сигнала: скорость потока, интегрированная для объема, и изменение объема груди. Я хотел бы сравнить сигналы и в конечном итоге надеяться получить объем из сигнала расширения груди. Но сначала я должен выровнять / синхронизировать свои данные.
Поскольку запись не начинается точно в одно и то же время, и расширение грудной клетки фиксируется в течение более длительных периодов, мне нужно найти данные, которые соответствуют моим данным объема, в наборе данных расширения грудной клетки и определить степень их выравнивания. Я не совсем уверен, как это сделать, если два сигнала не запускаются в одно и то же время или между данными в разных масштабах и с разным разрешением.
Я приложил пример двух сигналов ( https://docs.google.com/spreadsheet/ccc?key=0As4oZTKp4RZ3dFRKaktYWEhZLXlFbFVKNmllbGVXNHc ), пожалуйста, дайте мне знать, если есть что-то еще, что я мог бы предоставить.
источник
Ответы:
Вопрос состоит в том, как найти величину, на которую один временной ряд («расширение») отстает от другого («объем»), когда ряды отбираются с регулярными, но разными интервалами.
В этом случае обе серии демонстрируют достаточно непрерывное поведение, как показано на рисунках. Это подразумевает, что (1) может потребоваться небольшое или нулевое начальное сглаживание, и (2) повторная выборка может быть такой же простой, как линейная или квадратичная интерполяция. Квадратичный может быть немного лучше из-за гладкости. После повторной выборки задержка определяется путем максимизации взаимной корреляции , как показано в потоке. Для двух рядов выборочных данных со смещением, какова наилучшая оценка смещения между ними? ,
Чтобы проиллюстрировать это , мы можем использовать данные, представленные в вопросе, используя
R
псевдокод. Начнем с базовой функциональности, взаимной корреляции и повторной выборки:Это грубый алгоритм: расчет на основе БПФ будет быстрее. Но для этих данных (включая около 4000 значений) этого достаточно.
Я загрузил данные в виде файла CSV, разделенного запятыми, и удалил его заголовок. (Заголовок вызвал некоторые проблемы для R, которые я не хотел диагностировать.)
NB. Это решение предполагает, что каждая серия данных находится во временном порядке без пропусков ни в одной из них. Это позволяет ему использовать индексы в значениях в качестве прокси для времени и масштабировать эти индексы по частотам временной выборки, чтобы преобразовать их во времена.
Оказывается, что один или оба этих инструмента немного дрейфуют со временем. Это хорошо, чтобы удалить такие тенденции, прежде чем продолжить. Кроме того, поскольку в конце происходит уменьшение громкости сигнала, мы должны его обрезать.
Я пересматриваю менее частые серии, чтобы получить максимальную точность результата.
Теперь можно вычислить взаимную корреляцию - для эффективности мы ищем только разумное окно лагов - и можно определить лаг, в котором найдено максимальное значение.
Вывод говорит нам, что расширение отстает от объема на 1,85 секунды. (Если последние 3,5 секунды данных не были обрезаны, результат будет 1,84 секунды.)
Это хорошая идея, чтобы проверить все несколькими способами, желательно визуально. Во-первых, функция взаимной корреляции :
Далее, давайте зарегистрируем две серии во времени и нанесем их вместе на одной оси .
Это выглядит довольно хорошо! Тем не менее, мы можем лучше понять качество регистрации на графике рассеяния . Я меняю цвета по времени, чтобы показать прогрессию.
Мы ищем точки для отслеживания вперед-назад вдоль линии: отклонения от этого отражают нелинейности в запаздывающем отклике расширения на объем. Хотя есть некоторые варианты, они довольно маленькие. Тем не менее, как эти изменения меняются со временем, может представлять некоторый физиологический интерес. Замечательная вещь в статистике, особенно в ее исследовательском и визуальном аспектах, заключается в том, что она имеет тенденцию создавать хорошие вопросы и идеи наряду с полезными ответами.
источник
acf
функцию Р.R
, когда опубликовал этот ответ и просто забыл дать определение этой функции. Вот оригинал:normalize <- function(x) { x.max <- max(x); x.min <- min(x); dx <- x.max - x.min; if (dx==0) dx <- 1; (x-x.min) / dx }