Próbuję wykreślić wykres QQ z dwoma zestawami danych około 1,2 miliona punktów, w R (używając qqplot i wprowadzając dane do ggplot2). Obliczenia są dość łatwe, ale wynikowy wykres jest boleśnie powolny do ładowania, ponieważ jest tak wiele punktów. Próbowałem aproksymacji liniowej, aby zmniejszyć liczbę punktów do 10000 (to właśnie robi funkcja qqplot, jeśli jeden z twoich zestawów danych jest większy od drugiego), ale wtedy tracisz wiele szczegółów w ogonach.
Większość punktów danych w kierunku centrum jest w zasadzie bezużyteczna - pokrywają się tak bardzo, że prawdopodobnie około 100 na piksel. Czy istnieje prosty sposób usuwania danych, które są zbyt blisko siebie, bez utraty bardziej rzadkich danych w kierunku ogonów?
r
data-visualization
qq-plot
naught101
źródło
źródło
approx()
funkcja działa w tejqqplot()
funkcji.Odpowiedzi:
Wykresy QQ są niezwykle autokorelowane, z wyjątkiem ogonów. Przeglądając je, skupiamy się na ogólnym kształcie fabuły i zachowaniu ogona. Ergo , poradzisz sobie z gruboziarnistym podpróbkowaniem w środkach dystrybucji i dołączeniem wystarczającej ilości ogonów.
Oto kod ilustrujący, jak próbkować w całym zestawie danych, a także jak przyjmować ekstremalne wartości.
Aby to zilustrować, ten symulowany zestaw danych pokazuje różnicę strukturalną między dwoma zestawami danych o wartości około 1,2 miliona wartości, a także bardzo niewielką ilość „zanieczyszczenia” w jednym z nich. Ponadto, aby ten test był bardziej rygorystyczny, przedział wartości jest całkowicie wykluczony z jednego z zestawów danych: wykres QQ musi pokazywać przerwę dla tych wartości.
Możemy podpróbować 0,1% każdego zestawu danych i uwzględnić kolejne 0,1% ich skrajności, co daje 2420 punktów do wykreślenia. Całkowity czas, który upłynął, wynosi mniej niż 0,5 sekundy:
Żadne informacje nie zostaną utracone:
źródło
sin
? Czy mam rację, że normalny CDF byłby lepszą funkcją, gdyby założyć, że x był normalnie dystrybuowany? Czy właśnie wybrałeś grzech, ponieważ łatwiej jest go obliczyć?W innym miejscu tego wątku zaproponowałem proste, ale nieco ad hoc rozwiązanie podpróbkowania punktów. Jest szybki, ale wymaga eksperymentów, aby stworzyć świetne fabuły. Rozwiązanie, które ma zostać opisane, jest o rząd wielkości wolniejsze (zajmuje do 10 sekund dla 1,2 miliona punktów), ale jest adaptacyjne i automatyczne. W przypadku dużych zbiorów danych za pierwszym razem powinien dawać dobre wyniki i robić to dość szybko.
Jest kilka szczegółów, którymi należy się zająć, zwłaszcza w przypadku zestawów danych o różnej długości. Robię to, zastępując krótszy kwantylem odpowiadającym dłuższemu: w efekcie zamiast rzeczywistych wartości danych stosuje się częściowe przybliżenie liniowe EDF krótszego. („Krótsze” i „dłuższe” można odwrócić poprzez ustawienie
use.shortest=TRUE
).Oto
R
implementacja.Jako przykład wykorzystuję dane symulowane jak w mojej wcześniejszej odpowiedzi (z ekstremalnie wysoką wartością odstającą
y
i wx
tym czasie znacznie większym zanieczyszczeniem ):Narysujmy kilka wersji, używając coraz mniejszych wartości progu. Przy wartości 0,0005 i wyświetlaniu na monitorze o wysokości 1000 pikseli gwarantowalibyśmy błąd nie większy niż połowa pionowego piksela wszędzie na wykresie. Jest to pokazane na szaro (tylko 522 punkty, połączone segmentami linii); grubsze aproksymacje są wykreślone na nim: najpierw na czarno, potem na czerwono (czerwone punkty będą podzbiorem czarnych i nadplanują je), a następnie na niebiesko (które znowu są podzbiorem i nadplotem). Zakresy czasowe wynoszą od 6,5 (niebieski) do 10 sekund (szary). Biorąc pod uwagę, że skalują się tak dobrze, równie dobrze można użyć około połowy piksela jako uniwersalnej wartości domyślnej dla progu ( np. 1/2000 dla monitora o wysokości 1000 pikseli) i można to zrobić.
Edytować
Zmodyfikowałem oryginalny kod,
qq
aby zwracał trzecią kolumnę indeksów do najdłuższej (lub najkrótszej, jak określono) z dwóch oryginalnych tablicx
iy
odpowiadającej wybranym punktom. Indeksy te wskazują na „interesujące” wartości danych, a zatem mogą być przydatne do dalszej analizy.Usunąłem również błąd występujący przy powtarzających się wartościach
x
(które spowodowałybeta
niezdefiniowanie).źródło
qq
argumenty dla danego wektora? Czy mógłbyś również doradzić w używaniuqq
funkcji zggplot2
pakietem? Myślałem o użyciuggplot2
„sstat_function
do tego.Usunięcie niektórych punktów danych w środku zmieniłoby rozkład empiryczny, a zatem qqplot. Biorąc to pod uwagę, możesz wykonać następujące czynności i bezpośrednio wykreślić kwantyle rozkładu empirycznego w porównaniu z kwantylami rozkładu teoretycznego:
Będziesz musiał dostosować sekwencję w zależności od tego, jak głęboko chcesz dostać się do reszki. Jeśli chcesz być sprytny, możesz również rozrzedzić tę sekwencję na środku, aby przyspieszyć fabułę. Na przykład za pomocą
jest możliwość.
źródło
Możesz zrobić
hexbin
fabułę.źródło
Inną alternatywą jest równoległy wykres pudełkowy; powiedziałeś, że masz dwa zestawy danych, więc coś takiego:
i możesz dostosować różne opcje, aby poprawić swoje dane.
źródło