Jak zmniejszyć liczbę punktów danych w serii?


11

Nie studiowałem statystyk przez ponad 10 lat (a potem tylko podstawowy kurs), więc może moje pytanie jest trochę trudne do zrozumienia.

W każdym razie chcę zmniejszyć liczbę punktów danych w serii. Oś X jest liczbą milisekund od początku pomiaru, a oś Y jest odczytem tego punktu.

Często istnieją tysiące punktów danych, ale może potrzebuję tylko kilkuset. Więc moje pytanie brzmi: jak dokładnie zmniejszyć liczbę punktów danych?

Jak nazywa się ten proces? (Więc mogę google go) Czy są jakieś preferowane algorytmy (zaimplementuję to w C #)

Mam nadzieję, że masz jakieś wskazówki. Przepraszam za brak odpowiedniej terminologii.


Edycja: Więcej szczegółów tutaj:

Surowe dane, które otrzymałem, to dane dotyczące tętna, w formie liczby milisekund od ostatniego uderzenia. Przed wykreśleniem danych obliczam liczbę milisekund z pierwszej próbki i bpm (uderzenia na minutę) w każdym punkcie danych (60000 / razyincelastbeat).

Chcę wizualizować dane, tj. Wykreślić je na wykresie liniowym. Chcę zmniejszyć liczbę punktów na wykresie z tysięcy do kilkuset.

Jedną z opcji byłoby obliczenie średniego bpm dla każdej sekundy w serii, a może co około 5 sekund. Byłoby to dość łatwe, gdybym wiedział, że będę mieć co najmniej jedną próbkę dla każdego z tych okresów (sekundy w odstępach 5-sekundowych).


Zapomniałem: punkty wzdłuż osi X mają różne odstępy.

Nie jestem pewien, czy rozumiem. Nie masz osi Y?

O przepraszam. Źle wprowadziłem. Teraz zmieniłem to powyżej.

Myślę też, że musisz podać nieco więcej informacji. Na przykład nadal nie mogę wizualizować wykresu. Jaki jest twój cel

Ok przepraszam. Dodałem więcej szczegółów powyżej.

Odpowiedzi:


10

Masz dwa problemy: zbyt wiele punktów i jak wygładzić pozostałe punkty.

Rozrzedzenie próbki

Jeśli masz zbyt wiele obserwacji przybywających w czasie rzeczywistym, zawsze możesz użyć prostego losowego próbkowania, aby rozrzedzić próbkę. Zauważ, że to również prawda, liczba punktów musiałaby być bardzo duża.

Załóżmy, że masz N punktów i chcesz tylko n z nich. Następnie wygeneruj n liczb losowych z dyskretnie jednolitego rozkładu U (0, N-1) . To byłyby punkty, których używasz.

Jeśli chcesz to zrobić sekwencyjnie, tj. W każdym punkcie decydujesz się go użyć, czy nie, po prostu zaakceptuj punkt z prawdopodobieństwem p . Więc jeśli ustawisz p = 0,01 , zaakceptowałbyś (średnio) 1 punkt na sto.

Jeśli twoje dane są nierównomiernie rozłożone i chcesz jedynie cienkie gęste obszary punktów, po prostu spraw, aby funkcja przerzedzania była nieco bardziej wyrafinowana. Na przykład zamiast p , co z:

1-pexp(-λt)

gdzie jest liczbą dodatnią, a jest czasem od ostatniej obserwacji. Jeśli czas między dwoma punktami jest duży, tj. Duży , prawdopodobieństwo przyjęcia punktu będzie wynosić jeden. I odwrotnie, jeśli dwa punkty są blisko siebie, prawdopodobieństwo przyjęcia punktu wyniesie .λtt1-p

Będziesz musiał eksperymentować z wartościami i .λp

Wygładzanie

Być może coś w rodzaju prostego schematu średniej ruchomej. Lub możesz wybrać coś bardziej zaawansowanego, jak wygładzacz jądra (jak sugerowali inni). Musisz uważać, aby nie wygładzić zbyt wiele, ponieważ zakładam, że nagły spadek powinien zostać bardzo szybko zauważony w twoim scenariuszu.

Powinny być dostępne biblioteki C # dla tego rodzaju rzeczy.

Wniosek

W razie potrzeby cienkie, a następnie gładkie.


Ach, ciekawe, ale muszę to przewidzieć, tzn. Mieć taki sam wynik za każdym razem, gdy przeglądam dane.

W takim przypadku wygeneruj n indeksów wybranych punktów i zapisz te indeksy.
csgillespie

Lub zapisz nasiona w RNG przed pobraniem próbek.
Dirk Eddelbuettel

Rozwiązanie Dirka dotyczące nasion jest prawdopodobnie lepszą opcją.
csgillespie

Obliczanie średnich na sekundę jest w porządku, ale co robię, gdy nie ma danych dla konkretnej sekundy. Myślę, że mógłbym wykonać interpolację z kilku sekund przed i po niej, ale byłoby to świetne z jakąś konkretną (nazwaną) metodą do tego, więc nie próbuję wymyślać czegoś, co już zostało wynalezione.

9

Cóż, myślę, że słowo, którego szukasz, to „próbkowanie”, ale nie jestem pewien, dlaczego chcesz to zrobić. Tysiące punktów danych to niewiele. A może chcesz po prostu wykreślić mniejszą liczbę równo rozmieszczonych punktów? Zwykle nazywa się to „binowaniem”.

Czy Twoim celem jest wygenerowanie wizualizacji? W takim przypadku możesz zachować surowe dane, wykreślić je jako wykres rozproszony, a następnie nałożyć jakąś centralną tendencję (linia regresji, splajn, cokolwiek) do komunikowania się, czym powinna być wiadomość takehome.

A może Twoim celem jest liczbowe podsumowanie wyników w jakiś sposób? W takim przypadku możesz bardziej szczegółowo wyjaśnić swój problem!


Tak, wizualizacja jest tym, czego chcę. Dodałem więcej informacji w pytaniu.

delegowanie drukowania surowych danych za pomocą linii wygładzającej.
JoFrhwld

po trzecie kreślenie nieprzetworzonych danych za pomocą linii wygładzającej --- Być może zechcesz również wykreślić zmiany w BPM w czasie jako osobną wizualizację.
John

5

Obliczanie średnich prowadzi do innego zestawu danych niż po prostu zmniejszenie liczby punktów danych. Jeśli jedno uderzenie serca na minutę jest znacznie szybsze niż drugie uderzenie serca, utracisz sygnał podczas wygładzania.

Jeśli podsumujesz 125-125-0-125-125 jako 100, to historia, którą opowiadają dane, różni się poprzez wygładzanie.

Czasami serce nawet pomija uderzenia i uważam, że jest to wydarzenie, które jest interesujące, ale chce się przyjrzeć wykresom danych dotyczących tętna.

Proponuję zatem obliczyć odległość między dwoma punktami za pomocą wzoru podobnego d=sqrt((time1-time2)^2 + (bpm1-bpm2)).

W swoim programie ustawiasz minimalną odległość. Następnie iterujesz swoje dane i po każdym punkcie usuwasz wszystkie kolejne punkty, dla których d jest mniejsze niż minimalna odległość.

Ponieważ jednostka czasu i bpm nie jest taka sama, możesz pomyśleć o tym, jak znaleźć sposób na znaczące skalowanie jednostek. Aby wykonać to zadanie poprawnie, powinieneś porozmawiać z lekarzami, którzy ostatecznie muszą zinterpretować twoje wykresy i zapytać ich, jakie informacje uważają za niezbędne.


Ciekawe posty Też się przyjrzę. Prawdopodobnie masz rację.

2

Jeśli BPM pozostaje taki sam przez wiele próbek (lub zmienia się nieskończenie w sposób, w jaki się nie martwisz), możesz skrócić swoje dane do znaczącej cyfry, na której ci zależy, a następnie wykonać kodowanie długości.

Na przykład w R te dane:

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

ma to wyjście

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

1

Nie podajesz wystarczających informacji. Dlaczego chcesz zmniejszyć punkty danych? Kilka tysięcy to w dzisiejszych czasach nic.

Biorąc pod uwagę, że chcesz uzyskać ten sam wynik za każdym razem, gdy przeglądasz te same dane, być może chcesz po prostu pomnożyć średnie. Na osi x masz zmienne odstępy. Może próbujesz zachować spójność? W takim przypadku ustawisz szerokość pojemnika na około 50 ms lub 100, a następnie uśrednisz wszystkie znajdujące się tam punkty. Ustaw szerokość pojemnika tak dużą, jak potrzebujesz, aby zmniejszyć liczbę punktów danych do wymaganego rozmiaru zestawu.

Odpowiedź na pytanie, dlaczego pozbywasz się danych, jest naprawdę trudna.


Ok przepraszam. Dodałem więcej szczegółów powyżej.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.