Я пытаюсь построить QQ-график с двумя наборами данных около 1,2 млн. Точек в R (используя qqplot и передавая данные в ggplot2). Вычисление достаточно простое, но полученный график очень медленно загружается, потому что точек очень много. Я пробовал линейное приближение, чтобы уменьшить количество точек до 10000 (это то, что делает функция qqplot в любом случае, если один из ваших наборов данных больше другого), но тогда вы теряете много деталей в хвостах.
Большинство точек данных к центру в основном бесполезны - они перекрывают друг друга настолько, что, вероятно, около 100 на пиксель. Есть ли какой-нибудь простой способ удаления данных, которые расположены слишком близко друг к другу, не теряя более разреженные данные по направлению к хвостам?
источник
approx()
функция входит вqqplot()
функцию.Ответы:
Сюжеты QQ невероятно автокоррелированы, за исключением хвостов. При их рассмотрении основное внимание уделяется общей форме сюжета и поведению хвоста. Ergo , у вас все будет хорошо, если вы будете грубо выполнять субсэмплинг в центрах распределений и включать достаточное количество хвостов.
Вот код, иллюстрирующий, как делать выборку по всему набору данных, а также как принимать экстремальные значения.
Чтобы проиллюстрировать, этот смоделированный набор данных показывает структурное различие между двумя наборами данных приблизительно в 1,2 миллиона значений, а также очень небольшое количество «загрязнения» в одном из них. Кроме того, чтобы сделать этот тест строгим, интервал значений исключается из одного из наборов данных в целом: график QQ должен показывать разрыв для этих значений.
Мы можем отбирать 0,1% каждого набора данных и включать еще 0,1% их экстремальных значений, что дает 2420 точек для построения графика. Общее прошедшее время составляет менее 0,5 секунд:
Никакая информация не теряется вообще:
источник
sin
? Я прав, что нормальный CDF был бы лучшей функцией, если бы вы предположили, что x был нормально распределен? Вы просто выбрали грех, потому что его легче вычислить?В другом месте этой темы я предложил простое, но несколько нерегулярное решение для подбора точек. Это быстро, но требует некоторых экспериментов, чтобы получить отличные сюжеты. Решение, которое должно быть описано, на порядок медленнее (до 1,2 секунды для 10 миллионов точек), но оно адаптивное и автоматическое. Для больших наборов данных он должен давать хорошие результаты с первого раза и делать это достаточно быстро.
Есть некоторые детали, о которых нужно позаботиться, особенно, чтобы справиться с наборами данных различной длины. Я делаю это путем замены более короткого на квантили, соответствующие более длинному: фактически, кусочно-линейное приближение EDF более короткого используется вместо его фактических значений данных. («Короче» и «длиннее» можно поменять местами
use.shortest=TRUE
.)Вот
R
реализация.В качестве примера я использую данные, смоделированные как в моем предыдущем ответе (с чрезвычайно высоким выбросом выброса
y
и довольно большим загрязнением заx
это время):Давайте построим несколько версий, используя все меньшие и меньшие значения порога. При значении .0005 и отображении на мониторе высотой 1000 пикселей мы гарантируем погрешность не более половины вертикального пикселя повсюду на графике. Это показано серым (только 522 точки, соединенные отрезками); более грубые аппроксимации нанесены поверх него: сначала черным, затем красным (красные точки будут подмножеством черных и перекрывают их), затем синим (которые опять-таки являются подмножеством и переплетом). Время колеблется от 6,5 (синий) до 10 секунд (серый). Учитывая, что они хорошо масштабируются, можно с таким же успехом использовать около половины пикселя в качестве универсального значения по умолчанию для порога ( например , 1/2000 для монитора высотой 1000 пикселей) и покончить с этим.
редактировать
Я изменил исходный код для
qq
возврата третьего столбца индексов в самый длинный (или самый короткий, как указано) из исходных двух массивовx
и вy
соответствии с выбранными точками. Эти индексы указывают на «интересные» значения данных и поэтому могут быть полезны для дальнейшего анализа.Я также удалил ошибку, возникающую с повторяющимися значениями
x
(котораяbeta
стала неопределенной).источник
qq
аргументы для данного вектора? Кроме того, не могли бы вы посоветовать использовать вашуqq
функцию сggplot2
пакетом? Я думал об использованииggplot2
«Sstat_function
для этого.Удаление некоторых точек данных в середине изменило бы эмпирическое распределение и, следовательно, qqplot. При этом вы можете сделать следующее и непосредственно построить график квантилей эмпирического распределения по сравнению с квантилями теоретического распределения:
Вы должны будете настроить seq в зависимости от того, насколько глубоко вы хотите попасть в хвосты. Если вы хотите стать умным, вы также можете уменьшить эту последовательность в середине, чтобы ускорить сюжет. Например, используя
это возможность.
источник
Вы могли бы сделать
hexbin
сюжет.источник
Другой альтернативой является параллельный боксплот; вы сказали, что у вас есть два набора данных, так что-то вроде:
и вы можете настроить различные параметры, чтобы сделать его лучше с вашими данными.
источник