Тестування на рівномірність - це щось загальне, проте мені цікаво, які способи зробити це для багатовимірної хмари точок.
Тестування на рівномірність - це щось загальне, проте мені цікаво, які способи зробити це для багатовимірної хмари точок.
Відповіді:
Стандартний метод використовує функцію K Ріплі або щось, що походить від нього, наприклад функцію L. Це графік, який підсумовує середню кількість сусідів точок як функцію максимальної відстані ( ). Для рівномірного розподілу в n розмірах цей середній показник повинен вести себе як ρ n : і завжди буде малим ρ . Він відхиляється від такої поведінки через кластеризацію, інші форми просторової незалежності та крайові ефекти (звідки важливо вказати регіон, відібраний за балами). Через це ускладнення - яке погіршується, як нзбільшується - у більшості застосувань смуга довіри встановлюється для нульової функції К за допомогою симуляції, і спостережувана функція K перенасичена для виявлення екскурсій. Маючи деяку думку та досвід, екскурсії можна інтерпретувати як тенденції до скупчення чи не на певних відстанях.
Приклади функції K та пов'язаної з нею L-функції від Dixon (2001), ibid. Функція L побудована так, що для рівномірного розподілу є горизонтальною лінією в нулі: хороша візуальна орієнтир. Штрихові лінії - це смуги довіри для даної досліджуваної області, обчислені за допомогою моделювання. Суцільний сірий слід - це функція L для даних. Позитивна екскурсія на відстані 0-20 м вказує на деяке скупчення на цих відстанях.
Я розмістив відпрацьований приклад у відповідь на відповідне запитання на /stats//a/7984 , де графік, похідний від K-функції для рівномірного розподілу на двовимірному колекторі, вбудованому в є оцінюється за допомогою моделювання.
В R
, функціонування шпателяkest
і k3est
обчислити K-функцію для і n = 3 відповідно. У більш ніж 3 вимірах ви, мабуть, самі по собі, але алгоритми були б абсолютно однакові. Ви можете зробити обчислення з дистанційної матриці так, як обчислили (з помірною ефективністю) .stats::dist
Виявляється, питання складніше, ніж я думав. Проте я робив домашнє завдання і, оглянувши навколо, знайшов два способи, крім функцій Ріплі, для перевірки рівномірності в кількох вимірах.
Я зробив R-пакет, який називається, unf
що реалізує обидва тести. Ви можете завантажити його з github за посиланням https://github.com/gui11aume/unf . Значна частина його знаходиться в C, тому вам потрібно буде скласти її на своїй машині R CMD INSTALL unf
. Статті, на яких базується реалізація, є у форматі pdf у пакеті.
library(unf)
set.seed(123)
# Put 20 points uniformally in the 5D hypercube.
x <- matrix(runif(100), ncol=20)
liang(x) # Outputs the p-value of the test.
[1] 0.9470392
Другий підхід є менш традиційним і використовує мінімально простягнуті дерева . Початкові роботи були виконані Friedman & Rafsky в 1979 році (посилання в упаковці), щоб перевірити, чи походять два багатоваріантні зразки з одного розподілу. Зображення нижче ілюструє принцип.
Точки від двох біваріантних зразків нанесені на червоний або синій колір, залежно від їх початкового зразка (ліва панель). Обчислюється мінімальне прольотове дерево об'єднаного зразка у двох вимірах (середня панель). Це дерево з мінімальною сумою довжини ребер. Дерево розкладається в підрядках, де всі точки мають однакові мітки (права панель).
На малюнку нижче я показую випадок, коли сині крапки об’єднуються, що зменшує кількість дерев в кінці процесу, як ви бачите на правій панелі. Фрідман і Рафський обчислили асимптотичний розподіл кількості дерев, яку отримує в процесі, що дозволяє виконати тест.
Ця ідея створити загальний тест на рівномірність багатовимірного зразка була розроблена Смітом і Джайном у 1984 році та реалізована Бену Пфафом у С (посилання в упаковці). Другий зразок генерується рівномірно у наближеному опуклому корпусі першого зразка, і тест Фрідмана та Рафського проводиться на пуці з двох зразків.
Перевага методу полягає в тому, що він перевіряє рівномірність кожної опуклої багатовимірної форми, а не тільки на гіперкубі. Сильним недоліком є те, що тест має випадкову складову, оскільки другий зразок генерується навмання. Звичайно, можна повторити тест і порівняти результати, щоб отримати відтворювану відповідь, але це не зручно.
Продовжуючи попередній R сеанс, ось як це відбувається.
pfaff(x) # Outputs the p-value of the test.
pfaff(x) # Most likely another p-value.
Сміливо скопіюйте / роздрібніть код з github.