Как уменьшить количество точек данных в серии?


11

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

В любом случае, я хочу уменьшить количество точек данных в серии. Ось X - это количество миллисекунд с начала измерения, а ось Y - показание для этой точки.

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

Как называется процесс? (Так что я могу гуглить это) Есть ли предпочтительные алгоритмы (я буду реализовывать это в C #)

Надеюсь, у тебя есть подсказки. Извините за отсутствие надлежащей терминологии.


Изменить: Более подробная информация приходит здесь:

Необработанные данные, которые я получил, - это данные о частоте сердечных сокращений в виде количества миллисекунд с момента последнего удара. Перед построением данных я рассчитываю количество миллисекунд от первого образца и количество ударов в минуту (ударов в минуту) в каждой точке данных (60000 / timesincelastbeat).

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

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


Я забыл это: точки вдоль оси х идут с разным интервалом.

Я не уверен, что понимаю. У вас нет оси Y?

Ах, прости. Я неправильно набрал. Я сейчас изменил это выше.

Я также думаю, что вам нужно предоставить немного больше информации. Например, я до сих пор не могу визуализировать график. Какова твоя цель?

Хорошо извини Я добавил еще несколько деталей выше.

Ответы:


10

У вас две проблемы: слишком много точек и как сгладить оставшиеся точки.

Разбавление образца

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

Предположим, у вас есть N точек, и вы хотите только n из них. Затем сгенерируйте n случайных чисел из дискретного равномерного распределения U (0, N-1) . Это будут точки, которые вы используете.

Если вы хотите сделать это последовательно, то есть в каждой точке вы решаете использовать это или нет, просто примите точку с вероятностью p . Поэтому, если вы установите p = 0,01, вы примете (в среднем) 1 балл из ста.

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

1-пехр(-λT)

где - положительное число, а - время с момента последнего наблюдения. Если время между двумя точками велико, т. Е. Велико , вероятность принятия точки будет равна единице. И наоборот, если две точки находятся близко друг к другу, вероятность принятия точки будет .λTT1-п

Вам нужно будет поэкспериментировать со значениями и .λп

сглаживающий

Возможно, что-то вроде простой схемы типа скользящего среднего. Или вы можете пойти на что-то более продвинутое, например, ядро сглаженное (как и другие). Вы должны быть осторожны, чтобы не сгладить слишком много, поскольку я предполагаю, что внезапное падение должно быть очень быстро обнаружено в вашем сценарии.

Для такого рода вещей должны быть доступны библиотеки C # .

Вывод

Тонко при необходимости, затем гладко.


Ах, интересно, но мне нужно, чтобы он был предсказуемым, то есть чтобы каждый раз при просмотре данных получался один и тот же результат.

В этом случае сгенерируйте n индексов выбранных вами точек и сохраните эти индексы.
csgillespie

Или храните семена в ГСМ перед отбором проб.
Дирк Эддельбюттель

Решение Дирка относительно семян, вероятно, является лучшим вариантом.
csgillespie

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

9

Ну, я думаю, что слово, которое вы ищете, это «выборка», но я не уверен, почему вы хотите это сделать. Тысячи точек данных не очень много. Или вы хотите просто нарисовать меньшее количество точек, расположенных на одинаковом расстоянии? Обычно это называется «биннинг».

Ваша цель - создать визуализацию? В этом случае вам может потребоваться сохранить необработанные данные, построить их как диаграмму рассеяния, а затем наложить какую-то центральную тенденцию (линию регрессии, сплайн и т. Д.), Чтобы передать то, каким должно быть сообщение takehome.

Или ваша цель каким-то образом суммировать результаты? В этом случае вы можете объяснить свою проблему более подробно!


Да, визуализация это то, что я хочу. Я добавил еще немного информации в вопрос.

повторное построение необработанных данных сглаживающей линией.
JoFrhwld

для построения необработанных данных с помощью сглаживающей линии. Вы можете также представить график изменения BPM с течением времени в виде отдельной визуализации.
Джон

5

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

Если вы суммируете 125-125-0-125-125 как 100, то история, которую рассказывают данные, отличается от вашего сглаживания.

Иногда сердце даже пропускает удары, и я считаю, что это интересное событие, которое, тем не менее, хочет посмотреть на данные о частоте сердечных сокращений.

Поэтому я бы предложил вам рассчитать расстояние между двумя точками по формуле d=sqrt((time1-time2)^2 + (bpm1-bpm2)).

Вы устанавливаете минимальное расстояние в вашей программе. Затем вы перебираете свои данные и после каждой точки удаляете все последующие точки, для которых d меньше вашего минимального расстояния.

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


Интересная заметка. Я тоже посмотрю на это. Вы, вероятно, правы.

2

Если BPM остается неизменным во многих выборках (или изменяется бесконечно малым способом, который вас не беспокоит), вы можете обрезать ваши данные до значащей цифры, которая вас действительно волнует, и затем выполнить кодирование длины выполнения.

Например, в R это данные:

0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

имеет этот вывод

rle(data)
Run Length Encoding
  lengths: int [1:3] 10 15 15
  values : num [1:3] 0 1 2

1

Вы не предоставляете достаточно информации. Почему вы хотите уменьшить данные точек. Несколько тысяч - ничто в эти дни.

Учитывая, что вы хотите получать один и тот же результат каждый раз, когда просматриваете одни и те же данные, возможно, вы просто захотите усреднить бин. У вас есть переменный интервал на вашей оси X. Может быть, вы пытаетесь сделать это последовательным? В этом случае вы должны установить ширину ячейки, возможно, 50 мсек или 100, а затем усреднить все точки там. Сделайте ширину ячейки настолько большой, насколько вам нужно, чтобы уменьшить размер точек данных до размера набора, который вы хотите.

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


Хорошо извини Я добавил еще несколько деталей выше.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.