Тестування випадковим чином генерованих даних на предмет їх передбачуваного розподілу


17

Я написав програму, яка генерує випадкові дані. Якщо програма працює правильно, ці дані повинні слідувати конкретному, відомому розподілу ймовірностей. Я хотів би запустити програму, зробити деякі обчислення результату та придумати p-значення.

До того, як хто-небудь ще скаже: Я розумію, що тестування гіпотез не може виявити, коли програма працює правильно. Він може виявляти лише при неправильній роботі певним чином. (І навіть тоді тест "повинен" провалити X% часу, залежно від того, який рівень значущості ви виберете ...)

Отже, я намагаюся зрозуміти, які інструменти можуть бути підходящими. Зокрема:

  • Я можу генерувати стільки випадкових даних, скільки хочу. Все, що мені потрібно зробити, - це залишити програму достатньо довго. Тому я не обмежуюся певним розміром вибірки.

  • Мене цікавлять методи, які дають p-значення. Тож дивитись на графік і говорити "так, виглядає це якось лінійно" - це не цікавий варіант. Якщо тільки не існує способу поставити важке число на "виграшність" графіка. ;-)

Що я знаю поки:

  • Я бачив три основні різновиди тестування, які звучать так, ніби вони можуть бути застосовні: тест [Пірсона] на квадрат чи, квадратний тест Колмогорова-Смірнова та тест Андерсона-Дарлінга.

  • Здається, що тест-квадратичний квадрат підходить для дискретних розподілів, тоді як інші два є більш доцільними для безперервних розподілів. (?)

  • Різні джерела натякають, що тест на AD є "кращим", ніж тест KS, але не вдається детальніше описуватись.

Зрештою, всі ці тести, імовірно, виявляють "різні способи" відхилення від заданого нульового розподілу. Але я не знаю, у чому ще є відмінності ... Підводячи підсумок, я шукаю якийсь загальний опис того, де кожен тип тесту є найбільш застосовним та які проблеми він виявляє найкраще.


Якщо ви написали свій власний, він майже не вийде з ладу, коли ви перейдете межі своїх знань (які ви вклали в дизайн). Погляньте на random.org/analysis, у якому перераховані деякі методи перевірки, і очевидно stackoverflow.com/q/2130621/717355 . По-філософськи, якщо програма детермінована, вона все одно не може бути випадковою ;-) Це, безумовно, варто вивчити (і не забудьте злом паролів криптовалюти).
Філіп Оуклі

Відповіді:


21

Ось загальний опис того, як працюють 3 згадані методи.

Метод Chi-Squared працює, порівнюючи кількість спостережень у відро і число, яке, як очікується, буде в бункері на основі розподілу. Для дискретних розподілів бункери зазвичай є дискретними можливостями або комбінаціями. Для безперервного розповсюдження ви можете вибрати точки зрізу для створення бункерів. Багато функцій, які реалізують це, автоматично створюють бункери, але ви повинні мати можливість створити власні бункери, якщо ви хочете порівняти їх у певних областях. Недоліком цього методу є те, що відмінності між теоретичним розподілом та емпіричними даними, які все-таки ставлять значення в один і той же бін, не будуть виявлені, прикладом може бути округлення, якщо теоретично числа між 2 і 3 повинні бути поширені через діапазон (ми очікуємо, що ми побачимо такі значення, як 2.34296),

Статистика тесту KS - це максимальна відстань між двома функціями кумулятивного розподілу, що порівнюються (часто теоретична та емпірична). Якщо два розподіли ймовірності мають лише 1 точку перетину, то 1 мінус максимальна відстань - це область перекриття між двома розподілами ймовірностей (це допомагає деяким людям уявити, що вимірюється). Подумайте про те, щоб побудувати на тому ж графіку теоретичну функцію розподілу та EDF, а потім виміряти відстань між двома "кривими", найбільша різниця - це тестова статистика, і вона порівнюється з розподілом значень для цього, коли нуль відповідає дійсності. Ця різниця фіксує форму розподілу або 1 розподіл зміщений або розтягнутий порівняно з іншими.1н . Цей тест залежить від того, що ви знаєте параметри еталонного розподілу, а не оцінювати їх за даними (ситуація тут здається прекрасною). Якщо ви оцінюєте параметри з одних і тих же даних, то ви все одно можете отримати дійсний тест, порівнюючи з власними моделюваннями, а не зі стандартним еталонним розподілом.

Тест Андерсона-Дарлінга також використовує різницю між кривими CDF, як тест KS, але замість того, щоб використовувати максимальну різницю, він використовує функцію загальної площі між двома кривими (він фактично квадратики різниць, зважує їх, так що хвости мають більше впливу, то інтегрується над областю розподілів). Це надає більшої ваги людям, ніж KS, а також дає більше ваги, якщо є кілька невеликих відмінностей (порівняно з 1 великою різницею, яку KS наголошує). Це може закінчитися пересиленням тесту, щоб знайти відмінності, які ви вважаєте невагомими (легке округлення тощо). Як і тест KS, це передбачає, що ви не оцінювали параметри з даних.

Ось графік, який показує загальні ідеї останніх 2:

введіть тут опис зображення

на основі цього коду R:

set.seed(1)
tmp <- rnorm(25)
edf <- approxfun( sort(tmp), (0:24)/25, method='constant', 
    yleft=0, yright=1, f=1 )

par(mfrow=c(3,1), mar=c(4,4,0,0)+.1)
curve( edf, from=-3, to=3, n=1000, col='green' )
curve( pnorm, from=-3, to=3, col='blue', add=TRUE)

tmp.x <- seq(-3, 3, length=1000)
ediff <- function(x) pnorm(x) - edf(x)
m.x <- tmp.x[ which.max( abs( ediff(tmp.x) ) ) ]
ediff( m.x )  # KS stat
segments( m.x, edf(m.x), m.x, pnorm(m.x), col='red' )  # KS stat

curve( ediff, from=-3, to=3, n=1000 )
abline(h=0, col='lightgrey')    

ediff2 <- function(x) (pnorm(x) - edf(x))^2/( pnorm(x)*(1-pnorm(x)) )*dnorm(x)
curve( ediff2, from=-3, to=3, n=1000 )
abline(h=0)

Верхній графік показує EDF зразка зі стандартної норми порівняно з CDF стандартної норми з лінією, що показує стан KS. Потім середній графік показує різницю у двох кривих (ви можете бачити, де знаходиться статистика KS). Знизу - це квадратна, зважена різниця, тест AD базується на площі під цією кривою (за умови, що я все правильно).

Інші тести розглядають кореляцію в qqplot, дивляться на схил qqplot, порівнюють середнє значення, var та інші статистичні дані за моментами.


+1, це гарна відповідь на власне питання (на відміну від мого ...). Опис, що проходить через середину абзацу 3, просто благає ілюстративну фігуру, якщо ви відчуваєте схильність її зробити.
gung - Відновіть Моніку

Це дійсно приємна відповідь. Просто для переконання, що я повністю розумію: тест KS повертає найбільше відхилення між CDF та EDF, тоді як AD повертає загальну [зважену] область між двома кривими?
Математична

@MathematicalOrchid, здебільшого правильний, AD квадратує відстань, потім зважує, потім інтегрується, так що він дещо відрізняється від області (хоча для розуміння, мислення про це як про область, мабуть, нормально і набагато простіше).
Грег Сніг

1
Я думаю, що якщо ваш теоретичний розподіл мав точкову масу (вертикальний стрибок CDF в заданій точці) і фактичний розподіл ваших даних мав точкову масу майже, але не зовсім одне і те ж місце, то тест KS може бути вищим до тесту на AD. Але цей випадок, мабуть, трохи надуманий. Тест KS дозволяє проводити однобічні тести, коли AD завжди двосторонній, так що це буде ще одна відмінність (просто не поширена).
Грег Сніг

2
Мені не подобається характеристика @MathematicalOrchid, що статистика KS залежить лише від "однієї крайньої точки". Розташування тієї "однієї точки" (часто в середині розподілу) в CDF залежить від значень інших точок у наборі, тому не є настільки ізольованою чи самотньою, як ця мова підказала б наївному слухачеві.
DWin

12

+1 для написання чіткого та детального запитання. Я сподіваюся, що моя відповідь не надто засмучує. Я вважаю, що тестування гіпотез не є відповідним підходом у вашому випадку. Тестування значущості гіпотези є розумною справою, коли відповідь може бути так чи ні, але ви не знаєте, яка . (На жаль, це насправді не говорить вам, що, але це вже інше питання.) У вашому випадку я збираюсь, ви хочете знати, чи хороший ваш алгоритм. Однак відомо (з певністю), що жодна комп'ютерна програма не може генерувати справді випадкові дані з будь-якого розподілу ймовірностей. Це вірно, по-перше, тому що всі комп'ютери є машинами з кінцевим станом , і таким чином можуть створювати лише псевдовипадкові числа. Крім того (відміняючи відсутність справжньої випадковості), неможливо, щоб згенеровані значення чудово слідували за будь-яким безперервним розподілом. Є кілька способів зрозуміти це, але, мабуть, найпростішим є те, що у рядку чисел будуть «прогалини», що не відповідає дійсності будь-якої безперервної випадкової величини. Більше того, ці прогалини не всі ідеально однаково широкі або ідеально однаково розташовані. Серед вчених-комп'ютерів, які працюють над генерацією псевдовипадкових чисел, назва гри полягає в удосконаленні алгоритмів, щоб прогалини були меншими, більш рівними, з більш тривалими періодами (а також, що можуть генерувати більше значень швидше). У будь-якому випадку ці факти встановлюють, що тестування гіпотез є неправильним підходом для визначення того, чи правильно ваш алгоритм дотримується "конкретного, відомого розподілу ймовірностей", тому що це не так. (Вибачте.)

Натомість більш прийнятною основою є визначення наближення ваших даних до теоретичного розподілу. Для цього я рекомендую переглянути сюжети, зокрема qq-графіки та pp-графіки1-βr=1

З іншого боку, що стосується оцінки якості вашого алгоритму, можливо, ви захочете виконати його порівняно з іншими стандартними стандартами pRNG.

Сподіваюся, це допомагає.


Не точно те, про що я просив, але все-таки проникливий. Я припускаю, що "не безперервно" ви в основному маєте на увазі той факт, що комп'ютери не застосовують арифметику з нескінченною точністю?
Математична

Це велика частина цього, але не все питання. Це надзвичайно складна тема.
gung - Відновіть Моніку

1
Деякі ідеї першого абзацу @ gung реалізовані у функції SnowsPenultimateNormalityTestв TeachingDemosпакеті для R. Я погоджуюся з ідеєю @ gung дивитись на міру близькості, а не зосереджуватись на p-значенні. Одна з проблем використання кореляції в qq-графіці для цього полягає в тому, що якщо ваші дані мають правильну форму, але різні значення, дисперсія тощо, ви все одно можете отримати дійсно високу кореляцію. Альтернативою є використання статистики KS або статистики AD як міри відмінності від теоретичної.
Грег Сніг

@gung, дякую за відповідь. Не могли б ви детальніше розібратися в тому, що "перетворивши свої дані належним чином для побудови графіків і обчисливши відповідні значення з розглядуваного теоретичного розподілу, ви можете їх співвіднести"? Вирахувавши дані для pp- або qq-графіки, що буде наступним кроком для отримання r-балу, який ви згадали? Це якийсь відомий тест? Скажіть, будь ласка, посилання? Дякую!
Іван

1

Я не повністю прочитав усі відповіді, але я бачу, що вони досить ретельні та точні. Рискуючи, що я повторюю щось поховане в довгих відповідях, я просто хочу сказати, що v = тест квадратних чі може бути використаний для постійних даних. Це може бути не найкращим тестом, і, як і багато тестів, він покладається на асимптотичну теорію, і тому може бути неточним у невеликих зразках із розрідженими клітинами (це також залежить від того, як ви виконуєте бінінг). Андерсон-Дарлінг є більш потужним для тестування на нормальність, ніж тест KS, але KS може бути кращим для інших постійних розподілів. Ліллефорс має тест, призначений для експоненціальних розподілів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.