scipy.stats.

page_trend_test#

scipy.stats.page_trend_test(данные, ранжированный=False, predicted_ranks=None, метод='auto')[источник]#

Выполнить тест Пейджа, меру тренда в наблюдениях между обработками.

Тест Пейджа (также известный как \(L\) test) полезен, когда:

  • есть \(n \geq 3\) обработки,

  • \(m \geq 2\) Взвешенная аппроксимация двумерным сплайном по методу наименьших квадратов в сферических координатах.

  • наблюдения предполагаются имеющими определенный порядок.

В частности, тест рассматривает нулевую гипотезу, что

\[m_1 = m_2 = m_3 \cdots = m_n,\]

где \(m_j\) является средним наблюдаемой величины при обработке \(j\), против альтернативной гипотезы, что

\[m_1 \leq m_2 \leq m_3 \leq \cdots \leq m_n,\]

где хотя бы одно неравенство строгое.

Как отмечено [4], Пейджа \(L\) тест имеет большую статистическую мощность, чем тест Фридмана против альтернативы, что существует разница в тренде, так как тест Фридмана рассматривает только разницу в средних значениях наблюдений, не учитывая их порядок. В то время как Спирмен \(\rho\) учитывает корреляцию между ранжированными наблюдениями двух переменных (например, скорость полета ласточки против веса кокоса, который она несет), Page's \(L\) касается тренда в наблюдении (например, скорости полёта ласточки) при нескольких различных воздействиях (например, перенос каждого из пяти кокосов разного веса), даже если наблюдение повторяется с несколькими субъектами (например, одна европейская ласточка и одна африканская ласточка).

Параметры:
данныеarray-like

A \(m \times n\) массив; элемент в строке \(i\) и столбец \(j\) это наблюдение, соответствующее субъекту \(i\) и обработка \(j\). По умолчанию предполагается, что столбцы расположены в порядке возрастания предсказанного среднего.

ранжированныйлогический, необязательный

По умолчанию, данные предполагается наблюдениями, а не рангами; он будет ранжирован с scipy.stats.rankdata вдоль axis=1. Если данные предоставляется в виде рангов, передайте аргумент True.

predicted_ranksподобный массиву, необязательный

Предсказанные ранги средних значений столбцов. Если не указано, предполагается, что столбцы расположены в порядке возрастания предсказанного среднего, поэтому по умолчанию predicted_ranks являются \([1, 2, \dots, n-1, n]\).

метод{‘auto’, ‘asymptotic’, ‘exact’}, опционально

Выбирает метод, используемый для расчета p-значение. Доступны следующие опции.

  • ‘auto’: выбирает между ‘exact’ и ‘asymptotic’ для достижения разумно точных результатов за разумное время (по умолчанию)

  • ‘asymptotic’: сравнивает стандартизированную тестовую статистику с нормальным распределением

  • 'exact': вычисляет точное p-значение путём сравнения наблюдаемого \(L\) статистики по сравнению с теми, которые реализованы всеми возможными перестановками рангов (при нулевой гипотезе, что каждая перестановка равновероятна)

Возвращает:
resPageTrendTestResult

Объект, содержащий атрибуты:

статистикаfloat

Пейджа \(L\) тестовая статистика.

p-значениеfloat

Связанный p-значение

метод{'asymptotic', 'exact'}

Метод, используемый для вычисления p-значение

Смотрите также

rankdata, friedmanchisquare, spearmanr

Примечания

Как отмечено в [1], " \(n\) ‘treatments’ могут также представлять \(n\) объекты или события или выступления или лица или испытания, ранжированные.” Аналогично, \(m\) ‘subjects’ может также означать \(m\) “группировки по способностям или другой контрольной переменной, или судьи, выполняющие ранжирование, или случайные репликации другого рода.”

Процедура вычисления \(L\) статистика, адаптированная из [1], это:

  1. «Заранее определите с тщательной логикой соответствующие гипотезы относительно предсказанного порядка экспериментальных результатов. Если нет разумного основания для упорядочивания каких-либо обработок, то \(L\) тест не подходит.”

  2. “Как и в других экспериментах, определите, на каком уровне доверия вы отвергнете нулевую гипотезу о том, что нет согласия экспериментальных результатов с монотонной гипотезой.”

  3. “Преобразуйте экспериментальный материал в двустороннюю таблицу \(n\) столбцы (обработки, ранжированные объекты, условия) и \(m\) строки (субъекты, группы репликации, уровни контрольных переменных).”

  4. "Когда экспериментальные наблюдения записаны, ранжируйте их по каждой строке", например. ranks = scipy.stats.rankdata(data, axis=1).

  5. «Сложить ранги в каждом столбце», например. colsums = np.sum(ranks, axis=0).

  6. "Умножить каждую сумму рангов на предсказанный ранг для того же столбца", например, products = predicted_ranks * colsums.

  7. “Суммировать все такие произведения”, например. L = products.sum().

[1] продолжает, предлагая использование стандартизированной статистики

\[\chi_L^2 = \frac{\left[12L-3mn(n+1)^2\right]^2}{mn^2(n^2-1)(n+1)}\]

“которое распределено приблизительно как хи-квадрат с 1 степенью свободы. Обычное использование \(\chi^2\) таблицы были бы эквивалентны двустороннему тесту согласия. Если требуется односторонний тест как почти всегда будет иметь место, вероятность, найденная в таблице хи-квадрат, должна быть уполовиненный.”

Однако эта стандартизированная статистика не различает случаи, когда наблюдаемые значения хорошо коррелируют с предсказанными рангами и когда они _анти_-коррелируют с предсказанными рангами. Вместо этого мы следуем [2] и вычислить стандартизированную статистику

\[\Lambda = \frac{L - E_0}{\sqrt{V_0}},\]

где \(E_0 = \frac{1}{4} mn(n+1)^2\) и \(V_0 = \frac{1}{144} mn^2(n+1)(n^2-1)\), "который является асимптотически нормальным при нулевой гипотезе".

The p-значение для method='exact' генерируется путем сравнения наблюдаемого значения \(L\) против \(L\) значения, сгенерированные для всех \((n!)^m\) возможных перестановок рангов. Вычисление выполняется с использованием рекурсивного метода [5].

The p-значения не корректируются на возможность совпадений. При наличии совпадений, сообщаемые 'exact' p-значения могут быть несколько больше (т.е. более консервативными), чем истинные p-значение [2]. 'asymptotic'` p-значения, однако, обычно меньше (т.е. менее консервативны), чем 'exact' p-значения.

Ссылки

[1] (1,2,3,4)

Эллис Баттен Пейдж, "Упорядоченные гипотезы для множественных обработок: значимый тест для линейных рангов", Журнал Американской Статистической Ассоциации 58(301), p. 216–230, 1963.

[2] (1,2)

Markus Neuhauser, Непараметрический статистический тест: вычислительный подход, CRC Press, p. 150–152, 2012.

[3] (1,2)

Statext LLC, "Page’s L Trend Test - Easy Statistics", Statext - Изучение статистики, https://www.statext.com/practice/PageTrendTest03.php, Доступ 12 июля 2020 г.

[4]

«Трендовый тест Пейджа», Википедия, WikimediaFoundation, https://en.wikipedia.org/wiki/Page%27s_trend_test, Доступ 12 июля 2020 г.

[5]

Роберт Э. Оде, «Точное распределение L-статистики Пейджа в двухфакторной схеме», Communications in Statistics - Simulation and Computation, 6(1), стр. 49–61, 1977.

Примеры

Мы используем пример из [3]: 10 студентов попросили оценить три метода обучения - практическое занятие, лекция и семинар - по шкале от 1 до 5, где 1 - самая низкая оценка, а 5 - самая высокая. Мы решили, что для отклонения нулевой гипотезы в пользу альтернативной - что семинар получит наивысшие оценки, а практическое занятие - самые низкие - требуется уровень доверия 99%. Изначально данные были сведены в таблицу, где каждая строка представляет оценки одного студента по трём методам в следующем порядке: практическое занятие, лекция, семинар.

>>> table = [[3, 4, 3],
...          [2, 2, 4],
...          [3, 3, 5],
...          [1, 3, 2],
...          [2, 3, 2],
...          [2, 4, 5],
...          [1, 2, 4],
...          [3, 4, 4],
...          [2, 4, 5],
...          [1, 3, 4]]

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

>>> from scipy.stats import page_trend_test
>>> res = page_trend_test(table)
>>> res
PageTrendTestResult(statistic=133.5, pvalue=0.0018191161948127822,
                    method='exact')

Это p-значение указывает, что существует 0.1819% вероятность того, что \(L\) статистика достигла бы такого экстремального значения при нулевой гипотезе. Поскольку 0.1819% меньше 1%, у нас есть основания отвергнуть нулевую гипотезу в пользу альтернативной с уровнем доверия 99%.

Значение \(L\) статистика равна 133.5. Чтобы проверить это вручную, мы ранжируем данные так, чтобы высокие оценки соответствовали высоким рангам, разрешая ничьи средним рангом:

>>> from scipy.stats import rankdata
>>> ranks = rankdata(table, axis=1)
>>> ranks
array([[1.5, 3. , 1.5],
       [1.5, 1.5, 3. ],
       [1.5, 1.5, 3. ],
       [1. , 3. , 2. ],
       [1.5, 3. , 1.5],
       [1. , 2. , 3. ],
       [1. , 2. , 3. ],
       [1. , 2.5, 2.5],
       [1. , 2. , 3. ],
       [1. , 2. , 3. ]])

Мы складываем ранги внутри каждого столбца, умножаем суммы на предсказанные ранги и суммируем произведения.

>>> import numpy as np
>>> m, n = ranks.shape
>>> predicted_ranks = np.arange(1, n+1)
>>> L = (predicted_ranks * np.sum(ranks, axis=0)).sum()
>>> res.statistic == L
True

Как представлено в [3], асимптотическое приближение p-значение — это функция выживания нормального распределения, вычисленная для стандартизированной тестовой статистики:

>>> from scipy.stats import norm
>>> E0 = (m*n*(n+1)**2)/4
>>> V0 = (m*n**2*(n+1)*(n**2-1))/144
>>> Lambda = (L-E0)/np.sqrt(V0)
>>> p = norm.sf(Lambda)
>>> p
0.0012693433690751756

Это не совсем соответствует p-значение, сообщаемое page_trend_test выше. Асимптотическое распределение не очень точное и не консервативное для \(m \leq 12\) и \(n \leq 8\), поэтому page_trend_test выбрали использовать method='exact' на основе размеров таблицы и рекомендаций в оригинальной статье Пейджа [1]. Чтобы переопределить page_trend_testвыбор, предоставить метод аргумент.

>>> res = page_trend_test(table, method="asymptotic")
>>> res
PageTrendTestResult(statistic=133.5, pvalue=0.0012693433690751756,
                    method='asymptotic')

Если данные уже ранжированы, мы можем передать ranks вместо table для экономии времени вычислений.

>>> res = page_trend_test(ranks,             # ranks of data
...                       ranked=True,       # data is already ranked
...                       )
>>> res
PageTrendTestResult(statistic=133.5, pvalue=0.0018191161948127822,
                    method='exact')

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

>>> table = np.asarray(table)[:, [1, 2, 0]]

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

>>> res = page_trend_test(table,             # data as originally tabulated
...                       predicted_ranks=[2, 3, 1],  # our predicted order
...                       )
>>> res
PageTrendTestResult(statistic=133.5, pvalue=0.0018191161948127822,
                    method='exact')