WikiDer > Medcouple
В статистика, то медицинская пара это надежная статистика это измеряет перекос из одномерное распределение.[1] Он определяется как масштабированная медианная разница левой и правой половины распределения. Его надежность делает его пригодным для идентификации выбросы в скорректированные коробчатые участки.[2][3] Обычный коробчатые участки плохо справляются с асимметричным распределением, поскольку они помечают более длинные несимметричные хвосты как выбросы. Используя medcouple, усы коробчатой диаграммы можно отрегулировать для асимметричных распределений и, таким образом, получить более точную идентификацию выбросов для несимметричных распределений.
Как своего рода статистика заказов, медпара относится к классу неполных обобщенных L-статистика.[1] Как обычный медиана или же иметь в виду, медпара - это непараметрическая статистика, поэтому его можно вычислить для любого распределения.
Определение
Чтобы гармонировать с индексация с нуля во многих языках программирования мы будем индексировать с нуля все последующее.
Позволять быть заказанным образцом размера , и разреши быть медиана из . Определите наборы
- ,
- ,
размеров и соответственно. За и , мы определяем функция ядра
куда это функция знака.
В медицинская пара тогда является медианой множества[1]:998
- .
Другими словами, мы разделяем распределение на все значения, большие или равные медиане, и все значения, меньшие или равные медиане. Мы определяем функцию ядра, первая переменная которой находится над большие значения и вторая переменная которого превышает меньшие значения. Для частного случая значений, связанных с медианой, мы определяем ядро как сигнум функция. Тогда медпара - это медиана по всем ценности .
Поскольку медиана не применяется ко всем парам, но только тем, для которых , он принадлежит к классу неполных обобщенных L-статистика.[1]:998
Свойства медпары
Medcouple имеет ряд желательных свойств. Некоторые из них напрямую унаследованы от функции ядра.
Ядро medcouple
Сделаем следующие наблюдения о функции ядра :
- Функция ядра не зависит от местоположения.[1]:999 Если мы добавим или вычтем какое-либо значение к каждому элементу выборки , соответствующие значения функции ядра не меняются.
- Ядерная функция масштабно инвариантна.[1]:999 Равномерное масштабирование всех элементов образца не изменяет значения функции ядра.
Эти свойства в свою очередь наследуются медицинской парой. Таким образом, медицинская пара не зависит от иметь в виду и стандартное отклонение распределения, желаемое свойство для измерения перекос.Для простоты вычислений эти свойства позволяют нам определить два набора
куда . Это делает набор имеют классифицировать не более 1, медиана 0, и сохраните ту же пару, что и .
За , ядро medcouple сводится к
Использование недавно измененного и измененного набора мы можем наблюдать следующее.
- Функция ядра находится между -1 и 1,[1]:998 то есть, . Это следует из обратное неравенство треугольника с и и тот факт, что .
- Ядро medcouple не убывает по каждой переменной.[1]:1005 В этом можно убедиться с помощью частных производных и , оба неотрицательны, так как .
Таким образом, с помощью свойств 1, 2 и 4 мы можем определить следующие матрица,
Если мы отсортируем наборы и в порядке убывания, то матрица имеет отсортированные строки и отсортированные столбцы,[1]:1006
Тогда medcouple - это медиана этой матрицы с отсортированными строками и отсортированными столбцами. Тот факт, что строки и столбцы отсортированы, позволяет реализовать быстрый алгоритм для расчета медпары.
Надежность
В точка разрушения - это количество значений, которым статистика может сопротивляться, прежде чем она станет бессмысленной, то есть количество произвольно больших выбросов, которым набор данных может иметь до того, как значение статистики будет затронуто. Для медицинской пары точка разрушения составляет 25%, поскольку это медиана, принятая для пар. такой, что .[1]:1002
Значения
Как и все меры перекос, medcouple положителен для распределений, которые смещены вправо, отрицателен для распределений, смещенных влево, и равен нулю для симметричных распределений. Кроме того, значения medcouple ограничены 1 по абсолютной величине.[1]:998
Алгоритмы расчета медпары
Перед тем, как представить алгоритмы медпары, напомним, что существуют алгоритмы нахождения медианы. Поскольку медиана - это медиана, важны обычные алгоритмы нахождения медианы.
Наивный алгоритм
Наивный алгоритм для вычисления medcouple медленный.[1]:1005 Это происходит в два этапа. Во-первых, он строит матрицу medcouple который содержит все возможные значения ядра medcouple. На втором этапе он находит медиану этой матрицы. Поскольку есть записи в матрицу в случае, когда все элементы набора данных уникальны, алгоритмическая сложность наивного алгоритма .
Более конкретно, наивный алгоритм работает следующим образом. Напомним, что мы используем индексация с нуля.
функция naïve_medcouple (вектор ИКС): // X - вектор размера n. // Сортировку в порядке убывания можно выполнить на месте за время O (n log n) sort_decreasing(X) xm: = медиана (X) xscale: = 2 * max (abs (X)) // Определяем верхний и нижний центрированные и масштабированные векторы // они наследуют собственную убывающую сортировку X Zplus: = [(x - xm) / xscale | Икс в Икс такой, что x> = xm] Zminus: = [(x - xm) / xscale | Икс в Икс такой, что x <= xm] p: = размер (Zplus) q: = размер (Zminus) // Определяем функцию ядра закрытие над Zplus и Zminus функция h (i, j): a: = Zplus [i] b: = Zminus [j] если а == б: возвращаться сигнум(п - 1 - я - к) еще: возвращаться (а + б) / (а - б) endif конечная функция // O (n ^ 2) операций, необходимых для формирования этого вектора H: = [h (i, j) | я в [0, 1, ..., p - 1] и j в [0, 1, ..., q - 1]] возвращаться медиана (H)конечная функция
Последний призыв к медиана на векторе размера можно сделать сам в операций, следовательно, весь наивный алгоритм medcouple имеет такую же сложность.
Быстрый алгоритм
Быстрый алгоритм превосходит наивный алгоритм за счет использования отсортированного характера матрицы медицинских пар. . Вместо вычисления всех элементов матрицы быстрый алгоритм использует Kth парный алгоритм Джонсона и Мизогучи.[4]
Первый этап быстрого алгоритма продолжается как наивный алгоритм. Сначала мы вычисляем необходимые ингредиенты для матрицы ядра, , с отсортированными строками и отсортированными столбцами в порядке убывания. Вместо того, чтобы вычислять все значения , вместо этого мы используем монотонность строк и столбцов с помощью следующих наблюдений.
Сравнение значения с матрицей ядра
Прежде всего отметим, что мы можем сравнивать любые со всеми ценностями из в время.[4]:150 Например, для определения всех и такой, что , у нас есть следующая функция:
функция больше_ч(ядро час, int п, int q, настоящий ты): // h - функция ядра, h (i, j) дает i-ю, j-ю запись H // p и q - количество строк и столбцов матрицы ядра H // вектор размера p п := вектор(п) // индексация с нуля j := 0 // начиная снизу, вычисляем [[супремум | наименьшую верхнюю границу]] для каждой строки за я := п - 1, п - 2, ..., 1, 0: // ищем в этой строке, пока не найдем значение меньше u пока j < q и час(я, j) > ты: j := j + 1 в конце концов // запись, предшествующая найденной, больше, чем u п[я] := j - 1 конец возвращаться п конечная функция
Этот больше_ч функция проходит по матрице ядра от нижнего левого угла до верхнего правого и возвращает вектор индексов, указывающих для каждой строки, где проходит граница между значениями, превышающими и те, которые меньше или равны . Этот метод работает из-за свойства сортировки по столбцам строк . С больше_ч вычисляет самое большее ценности , его сложность .[4]:150
Концептуально получившийся вектор можно визуализировать как устанавливающий границу на матрице, как показано на следующей диаграмме, где все красные элементы больше, чем :
Симметричный алгоритм вычисления значений меньше, чем очень похожа. Вместо этого он продолжается в обратном направлении, сверху справа налево:
функция less_h(ядро час, int п, int q, настоящий ты): // вектор размера p Q := вектор(п) // последний возможный индекс строки j := q - 1 // начиная сверху, вычисляем [[infimum | точная нижняя граница]] для каждой строки за я := 0, 1, ..., п - 2, п - 1: // ищем в этой строке, пока не найдем значение больше u пока j >= 0 и час(я, j) < ты: j := j - 1 в конце концов // запись, следующая за той, которую мы только что нашли, меньше u Q[я] := j + 1 конец возвращаться Q конечная функция
Эту нижнюю границу можно визуализировать так, где синие записи меньше, чем :
Для каждого у нас есть это , причем строгое неравенство имеет место только для тех строк, которые имеют значения, равные .
У нас также есть, что суммы
дают соответственно количество элементов которые больше, чем , и количество элементов, которые больше или равны . Таким образом, этот метод также дает классифицировать из внутри элементов из .[4]:149
Средневзвешенная медиана медианы строк
Второе наблюдение заключается в том, что мы можем использовать структуру отсортированной матрицы для мгновенного сравнения любого элемента по крайней мере с половиной элементов матрицы. Например, медиана медиан строк по всей матрице меньше верхнего левого квадранта красного цвета, но больше правого нижнего квадранта синего цвета:
В более общем плане, используя границы, заданные и векторов из предыдущего раздела, мы можем предположить, что после некоторых итераций мы точно определили положение медицинской пары между красной левой границей и синей правой границей:[4]:149
Желтые записи обозначают медианное значение каждой строки. Если мы мысленно перестроим строки так, чтобы медианы выровнялись и игнорировали отброшенные записи за пределами границ,
мы можем выбрать взвешенная медиана из этих медиан, каждая запись взвешивается по количеству оставшихся записей в этой строке. Это гарантирует, что мы можем отбросить не менее 1/4 всех оставшихся значений независимо от того, нужно ли отбрасывать большие значения красным или меньшие значения синим:
Медиана каждой строки может быть вычислена в время, так как строки отсортированы, а взвешенная медиана можно вычислить в раз, используя бинарный поиск.[4]:148
Kth парный алгоритм
Объединив эти два наблюдения, алгоритм быстрой медицинской пары в общих чертах работает следующим образом.[4]:148
- Вычислить необходимые ингредиенты для функции ядра medcouple с отсортированные строки и отсортированные столбцы.
- На каждой итерации аппроксимируйте медицинскую пару с взвешенная медиана медианы ряда.[4]:148
- Сравните это предварительное предположение со всей матрицей, получив правые и левые граничные векторы и соответственно. Сумма этих векторов также дает нам классифицировать этой экспериментальной пары.
- Если ранг предварительной медицинской пары точно равен , затем остановись. Мы нашли медпару.
- В противном случае отбросьте записи больше или меньше, чем предварительное предположение, выбрав либо или же в качестве новой правой или левой границы, в зависимости от того, с какой стороны элемент ранга находится в. На этом шаге всегда отбрасывается не менее 1/4 всех оставшихся записей.
- Как только количество кандидатов в медицинские пары между правой и левой границами станет меньше или равно , выполнить выбор ранга среди оставшихся записей, так что ранг в этом меньшем наборе кандидатов соответствует ранг медпары во всей матрице.
Первоначальная сортировка с целью формирования функция принимает время. На каждой итерации взвешенная медиана принимает время, а также вычисления нового ориентировочного и левая и правая границы. Поскольку каждая итерация отбрасывает не менее 1/4 всех оставшихся записей, будет не более итераций.[4]:150 Таким образом, весь быстрый алгоритм занимает время.[4]:150
Сформулируем более подробно быстрый алгоритм.
функция медпара (вектор ИКС): // X - вектор размера n // Рассчитываем начальные ингредиенты как для наивная пара sort_decreasing(X) xm: = медиана (X) xscale: = 2 * max (abs (X)) Zplus: = [(x - xm) / xscale | Икс в Икс такой, что x> = xm] Zminus: = [(x - xm) / xscale | Икс в Икс такой, что x <= xm] p: = размер (Zplus) q: = размер (Zminus) функция h (i, j): a: = Zplus [i] b: = Zminus [j] если а == б: возвращаться сигнум(п - 1 - я - к) еще: возвращаться (а + б) / (а - б) endif конечная функция // Начать алгоритм пары K (Johnson & Mizoguchi) // Начальные левая и правая границы, два вектора размера p L: = [0, 0, ..., 0] R: = [q - 1, q - 1, ..., q - 1] // количество записей слева от левой границы Ltotal: = 0 // количество записей слева от правой границы Rtotal: = p * q // Поскольку мы индексируем с нуля, индекс medcouple равен единице // меньше своего ранга. medcouple_index: = этаж(Rtotal / 2) // Итерация, пока количество записей между границами равно // больше, чем количество строк в матрице. пока Rtotal - Ltotal> p: // Вычислить медианы строк и связанные с ними веса, но пропустить // любые строки, которые уже пусты. middle_idx: = [i | я в [0, 1, ..., p - 1] такой который L [i] <= R [i]] row_medians: = [h (i, этаж((L [i] + R [i]) / 2) | я в middle_idx] веса: = [R [i] - L [i] + 1 | я в middle_idx] WM: = взвешенная медиана(row_medians, веса) // Новые ориентировочные правая и левая границы P: = больше_ч(h, p, q, WM) Q: = less_h(h, p, q, WM) Ptotal: = sum (P) + size (P) Qtotal: = sum (Q) // Определяем, какие записи следует отбросить, или если мы нашли медицинскую пару если medcouple_index <= Ptotal - 1: R: = P Rtotal: = Ptotal еще: если medcouple_index> Qtotal - 1: L: = Q Ltotal: = Qtotal еще: // Найдена медицинская пара, ранг взвешенной медианы равен индексу медпары возвращаться WM endif endif в конце концов // Не удалось найти медицинскую пару, но осталось очень мало пробных записей: = [h (i, j) | я в [0, 1, ..., p - 1], j в [L [i], L [i] + 1, ..., R [i]] такой который L [i] <= R [i]] // Выбираем медпару по рангу среди оставшихся записей medcouple: = select_nth(Осталось, medcouple_index - Ltotal) возвращаться медицинская параконечная функция
В реальных условиях алгоритм также должен учитывать ошибки, связанные с конечной точностью. арифметика с плавающей запятой. Например, сравнения для функции ядра medcouple должны выполняться в машина эпсилон, а также сравнения порядков в то больше_ч и less_h функции.
Программное обеспечение / исходный код
- Алгоритм быстрой пары реализован в рс пакет robustbase.
- Алгоритм fast medcouple реализован в расширении C для Python в Пакет Python Robustats.
- Под лицензией GPL C ++ реализация быстрый алгоритм, полученный из реализации R.
- А Stata реализация быстрый алгоритм.
- Реализация наивный алгоритм в Matlab (и поэтому GNU Octave).
- Наивный алгоритм реализован и для Python упаковка statsmodels.
Смотрите также
Рекомендации
- ^ а б c d е ж грамм час я j k л Brys, G .; Юбер, М.; Струйф, А. (ноябрь 2004 г.). «Надежная мера перекоса». Журнал вычислительной и графической статистики. 13 (4): 996–1017. Дои:10.1198 / 106186004X12632. МИСТЕР 2425170.
- ^ Hubert, M .; Вандервирен, Э. (2008). «Скорректированная коробчатая диаграмма для искаженных распределений». Вычислительная статистика и анализ данных. 52 (12): 5186–5201. Дои:10.1016 / j.csda.2007.11.008. МИСТЕР 2526585.
- ^ Пирсон, Рон (6 февраля 2011 г.). "Коробчатые сюжеты и не только - Часть II: Асимметрия". ИзучениеДанныхБлог. Получено 6 апреля, 2015.
- ^ а б c d е ж грамм час я j Джонсон, Дональд Б.; Мидзогути, Тецуо (май 1978 г.). "Выбор Kth элемент в Икс + Y и Икс1 + Икс2 +...+ Иксм". SIAM Журнал по вычислениям. 7 (2): 147–153. Дои:10.1137/0207013. МИСТЕР 0502214.