Тестирование случайно сгенерированных данных по их предполагаемому распределению

17

Я написал программу, которая генерирует случайные данные. Если программа работает правильно, эти данные должны соответствовать определенному, известному распределению вероятности. Я хотел бы запустить программу, сделать некоторые расчеты по результату и получить значение p.

Прежде чем кто-либо еще скажет это: я понимаю, что проверка гипотез не может определить, когда программа работает правильно. Он может только обнаружить, когда он работает неправильно определенным образом. (И даже в этом случае тест «должен» провалиться X% времени, в зависимости от того, какой уровень значимости вы выберете ...)

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

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

  • Я заинтересован в методах, которые производят р-значение. Так что смотреть на график и говорить «да, это выглядит довольно линейно» - не интересный вариант. Если не существует какого-либо способа поставить жесткое число на «шаткость» графа. ;-)

Что я знаю до сих пор:

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

  • Похоже, что критерий хи-квадрат подходит для дискретных распределений, в то время как два других больше подходят для непрерывных распределений. (?)

  • Различные источники намекают на то, что тест AD "лучше", чем тест KS, но не вдаваться в подробности.

В конечном итоге все эти тесты предположительно обнаруживают «разные способы» отклонения от указанного нулевого распределения. Но я пока не знаю, в чем различия ... В общем, я ищу какое-то общее описание того, где каждый тип теста наиболее применим, и какие проблемы он обнаруживает лучше всего.

MathematicalOrchid
источник
Если вы написали свой собственный, он почти обязательно потерпит неудачу, когда вы выйдете за пределы своих знаний (которые вы встроили в дизайн). Взгляните на random.org/analysis, в котором перечислены некоторые методы проверки, и, очевидно, stackoverflow.com/q/2130621/717355 . С точки зрения философии, если программа детерминистическая, она все равно не может быть случайной ;-) Это определенно стоящий предмет для изучения (и не забывайте о крипо-дискуссиях по взлому паролей).
Филип Окли

Ответы:

21

Вот общее описание того, как работают 3 упомянутых метода.

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

Статистика теста KS - это максимальное расстояние между 2 сравниваемыми функциями распределения (часто теоретическим и эмпирическим). Если 2 распределения вероятностей имеют только 1 точку пересечения, то 1 минус максимальное расстояние - это область перекрытия между 2 распределениями вероятности (это помогает некоторым людям визуализировать то, что измеряется). Подумайте о том, чтобы построить на том же графике теоретическую функцию распределения и EDF, а затем измерить расстояние между двумя «кривыми», наибольшая разница - это статистика теста, и она сравнивается с распределением значений для этого, когда значение равно нулю. Это отражает различия в форме распределения или 1 распределение смещено или растянуто по сравнению с другим.1N

В тесте Андерсона-Дарлинга также используется разность между кривыми 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. Средний график затем показывает разницу в 2 кривых (вы можете увидеть, где происходит статистика KS). Нижняя часть - это квадрат, взвешенная разница, тест AD основан на площади под этой кривой (при условии, что я все понял правильно).

Другие тесты смотрят на корреляцию в qqplot, смотрят на наклон в qqplot, сравнивают среднее значение, var и другие характеристики на основе моментов.

Грег Сноу
источник
+1, это хороший ответ на актуальный вопрос (в отличие от моего ...). Описание, проходящее через середину параграфа 3, просто просит иллюстративного рисунка, если вы склонны его создать.
gung - Восстановить Монику
Это действительно хороший ответ. Просто чтобы убедиться, что я полностью понимаю: тест KS возвращает наибольшее отклонение между CDF и EDF, в то время как AD возвращает общую [взвешенную] площадь между двумя кривыми?
Математическая
@MateticOrchid, в основном правильно, AD возводит в квадрат расстояние, затем взвешивает, а затем интегрирует, поэтому оно несколько отличается от области (хотя для понимания, думать о ней как о области, вероятно, хорошо и намного проще).
Грег Сноу,
1
Я ожидаю, что если ваше теоретическое распределение имело точечную массу (вертикальный скачок в CDF в данной точке), а фактическое распределение ваших данных имело точечную массу почти, но не совсем, то же место, чем тест KS, может быть лучше к тесту AD. Но этот случай, вероятно, немного надуманный. Тест KS допускает односторонние тесты, где AD всегда двухсторонний, так что это будет еще одно различие (просто не распространенное).
Грег Сноу,
2
Мне не нравится характеристика @MatumaticOrchid, согласно которой статистика KS зависит только от "одной крайней точки". Расположение этой «одной точки» (часто в середине распределения) в CDF зависит от значений других точек в наборе и поэтому не является настолько изолированным или единичным, как этот язык может предложить наивному слушателю.
DWin
12

+1 за написание четкого и подробного вопроса. Я надеюсь, что мой ответ не слишком расстраивает. Я считаю, что проверка гипотез не является подходящим подходом в вашем случае. Проверка значимости нулевой гипотезы - разумная вещь, когда ответом может быть «да» или «нет», но вы не знаете, какой именно . (К сожалению, на самом деле это не говорит о том, что именно, но это другая проблема.) В вашем случае, я понимаю, вы хотите знать, хорош ли ваш алгоритм. Однако известно (с уверенностью), что ни одна компьютерная программа не может генерировать действительно случайные данные из любого распределения вероятностей. Во-первых, это так, потому что все компьютеры являются конечными автоматами и, следовательно, могут генерировать только псевдослучайные числа., Кроме того (исключая отсутствие истинной случайности), невозможно, чтобы сгенерированные значения точно повторяли любое непрерывное распределение. Есть несколько способов понять это, но, возможно, самый простой из них состоит в том, что в числовой строке будут «пробелы», чего нельзя сказать о любой непрерывной случайной переменной. Более того, эти промежутки не все совершенно одинаково широки или совершенно одинаково разнесены. Среди компьютерных ученых, которые работают над генерацией псевдослучайных чисел, название игры заключается в том, чтобы улучшить алгоритмы так, чтобы промежутки были меньше, более равномерными, с более длительными периодами (а также которые могли генерировать больше значений быстрее). В любом случае, эти факты устанавливают, что проверка гипотез является неправильным подходом для определения того, правильно ли ваш алгоритм следует «определенному, известному распределению вероятностей», потому что это не так. (Сожалею.)

Вместо этого, более подходящей основой является определение того, насколько близки ваши данные к теоретическому распределению. Для этого я бы рекомендовал пересмотреть графики, в частности qq-plots и pp-plots1-βрзнак равно1

С другой стороны, что касается оценки качества вашего алгоритма, вы можете рассчитать его время относительно других стандартных pRNG.

Надеюсь это поможет.

Gung - Восстановить Монику
источник
Не совсем то, что я просил, но, тем не менее, проницательное. Я предполагаю, что под «не непрерывным» вы в основном ссылаетесь на тот факт, что компьютеры не реализуют арифметику с бесконечной точностью?
Математическая
Это большая часть этого, но не вся проблема. Это очень сложная тема.
gung - Восстановить Монику
1
Некоторые из идей первого абзаца @ gung реализованы в функции SnowsPenultimateNormalityTestв TeachingDemosпакете для R. Я согласен с идеей @ gung смотреть на меру близости, а не фокусироваться на p-значении. Одна из проблем, связанных с использованием корреляции на графике qq, заключается в том, что если ваши данные имеют правильную форму, но другое среднее значение, дисперсию и т. Д., Вы все равно можете получить действительно высокую корреляцию. Альтернативой является использование статистики KS или AD в качестве меры отличия от теоретической.
Грег Сноу,
@ Gung, спасибо за ответ. Не могли бы вы подробнее рассказать о том, что «соответствующим образом преобразовав свои данные для построения графика и рассчитав соответствующие значения из рассматриваемого теоретического распределения, вы можете сопоставить их»? Вычислили данные для pp- или qq-plotting, что будет следующим шагом для получения r-показателя, который вы упомянули? Это какой-то известный тест? Не могли бы вы дать ссылку? Спасибо!
Иван
1

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

Майкл Р. Черник
источник