Подтвердить что ты не робот

Как определить, что такое функция распределения вероятности из массива numpy?

Я искал вокруг и, к моему удивлению, кажется, что на этот вопрос не ответил.

У меня есть массив Numpy, содержащий 10000 значений из измерений. Я построил гистограмму с Matplotlib, и визуальным контролем значения обычно распределяются:

Histogram

Однако я хотел бы подтвердить это. Я нашел тест нормальности, реализованный в scipy.stats.mstats.normaltest, но результат говорит иначе. Я получаю этот вывод:

(masked_array(data = [1472.8855375088663],
         mask = [False],
   fill_value = 1e+20)
, masked_array(data = [ 0.],
         mask = False,
   fill_value = 1e+20)

)

что означает, что вероятность того, что набор данных обычно распределяется, равна 0. Я снова запустил эксперименты и снова проверил их, получив тот же результат, а в "лучшем" случае значение p было 3.0e-290.

Я тестировал функцию со следующим кодом и, похоже, делаю то, что хочу:

import numpy
import scipy.stats as stats

mu, sigma = 0, 0.1
s = numpy.random.normal(mu, sigma, 10000)

print stats.normaltest(s)

(1.0491016699730547, 0.59182113002186942)

Если я правильно понял и правильно использовал функцию, это означает, что значения обычно не распределяются. (И, честно говоря, я понятия не имею, почему разница в выходе, т.е. Меньше деталей.)

Я был уверен, что это нормальное распространение (хотя мои знания статистики являются основными), и я не знаю, что может быть альтернативой. Как я могу проверить, что такое функция распределения вероятности?

EDIT:

Мой массив Numpy, содержащий 10000 значений, генерируется следующим образом (я знаю, что это не лучший способ заполнения массива Numpy), а затем запускается нормальный тест:

values = numpy.empty(shape=10000, 1))
for i in range(0, 10000):
    values[i] = measurement(...) # The function returns a float

print normaltest(values)

ИЗМЕНИТЬ 2:

Я только что понял, что несоответствие между выходами состоит в том, что я случайно использовал две разные функции (scipy.stats.normaltest() и scipy.stats.mstats.normaltest()), но это не имеет значения, поскольку соответствующая часть вывода одинакова независимо от используемой функции.

ИЗМЕНИТЬ 3:

Установка гистограммы с предложением от askewchan:

plt.plot(bin_edges, scipy.stats.norm.pdf(bin_edges, loc=values.mean(), scale=values.std()))

приводит к следующему:

Fitted histogram

РЕДАКТИРОВАТЬ 4:

Установка гистограммы с предложением пользователя user333700:

scipy.stats.t.fit(data)

приводит к следующему:

enter image description here

4b9b3361

Ответ 1

Предполагая, что вы правильно использовали тест, я предполагаю, что у вас есть отклонение small от нормального распределения, и поскольку ваш размер выборки настолько велик, даже небольшие отклонения приведут к отказу от нулевая гипотеза нормального распределения.

Одна из возможностей - визуально проверить ваши данные, построив гистограмму normed с большим количеством ящиков и pdf с loc=data.mean() и scale=data.std().

Существуют альтернативные тесты для тестирования нормальности, в статистических моделях используются тесты Андерсона-Дарлинга и Лилифорса (Колмогоров-Смирнов), когда оцениваются параметры распределения.

Однако я ожидаю, что результаты не будут сильно отличаться при большом размере выборки.

Основной вопрос заключается в том, хотите ли вы проверить, соответствует ли ваш образец "точно" из нормального дистрибутива, или вас просто интересует, относится ли ваш образец к распределению, которое очень близко к нормальному распределению, закрыть с точки зрения практического использования.

Чтобы уточнить последний пункт:

http://jpktd.blogspot.ca/2012/10/tost-statistically-significant.html http://www.graphpad.com/guides/prism/6/statistics/index.htm?testing_for_equivalence2.htm

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

Альтернативный тип теста гипотез - это то, где мы хотим показать, что наш образец близок к данной гипотезе точки, например, два образца имеют почти одно и то же среднее значение. Проблема в том, что мы должны определить, какова наша область эквивалентности.

В случае хороших тестов пригодности нам нужно выбрать меру расстояния и определить порог для измерения расстояния между образцом и предполагаемым распределением. Я не нашел объяснений, где интуиция поможет выбрать этот порог расстояния.

stats.normaltest основан на отклонениях перекоса и эксцесса от изменений нормального распределения.

Андерсон-Дарлинг основан на интеграле от взвешенных квадратов различий между cdf.

Колмогоров-Смирнов основан на максимальной абсолютной разности между cdf.

chisquare для двоичных данных будет основываться на взвешенной сумме квадратичных вероятностей.

и т.д.

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

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