2015-09-17 2 views
2

У меня есть эмпирическое распределение, и я пытаюсь установить его T, используя numpy и строя его с помощью matplotlib.Странное поведение распределения T

Вот что-то я не могу понять:

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.stats import t 

arr = np.array([140, 36, 44, 24, 15, 48, 19, 2, 84, 6, 70, 3, 20, 6, 133, 23, 30, 7, 37, 165]) 

params = t.fit(arr) 

mean = arr.mean() 
std = arr.std() 

r = np.arange(mean - 3 * std, mean + 3 * std, 0.01) 

pdf_fitted = t.pdf(r, *params[0:-2], loc=params[-2], scale=params[-1]) 
plt.plot(r, pdf_fitted) 

plt.plot([mean, mean], [0, max(pdf_fitted)]) 

plt.show() 

Строит:

enter image description here

Зеленая линия представляет собой среднее из emprical данных, а синяя линия установлена ​​T распределение к тем же данным.

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

Теперь, глядя на Wikipedia T distribution:

Трет-распределение симметрично и колокольчатые, как нормального распределения, но имеет более тяжелые хвосты ...

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

Мой вопрос: Есть ли что-то не так с моим кодом на Python или это ожидаемое поведение дистрибутива T? Если да, то почему? Если нет, что я делаю неправильно с моим кодом?

+2

быстрый ответ: акцент делается на более тяжелых хвостах ** в цитате. установка распределения t уменьшает вес на хвостах, чем нормальное распределение. Обрезка трех верхних наблюдений, поскольку «выбросы» делают нормальную оценку ближе к t оценкам 'stats.norm.fit (np.sort (arr) [: - 3]) -> (27.882352941176471, 22.712738983018465)'. Другое указание: медиана намного ниже среднего в данных. – user333700

+0

да, обратите внимание, что у вас 'arr.mean() == 45.6',' np.median (arr) == 27.0'. так . , , это не вопрос Питона; это математический вопрос. – dbliss

ответ

3

В коде Python нет ошибок, насколько я могу видеть; на самом деле это хороший пример, иллюстрирующий надежность модуля Student t по сравнению с гауссовым. Одна характеристика экспоненциальных семейных распределений (гауссовская, экспоненциальная, биномиальная, пуассоновская и т. Д.) Состоит в том, что у них действительно тонкие хвосты, что означает, что pdf уменьшается экспоненциально, когда вы отклоняетесь от среднего. Эта характеристика дает им хорошие теоретические свойства, но часто является узким местом в применении их к моделированию реальных распределений, где в наборе данных изобилуют выбросы. Поэтому распределение t является популярной альтернативой, потому что пара выбросов в вашем наблюдаемом наборе данных не сильно повлияет на ваши выводы. В вашем примере подумайте об исходном наборе данных, состоящем из всех точек, за исключением трех высоких уровней. Однако эти выбросы были, скажем, введены в какой-то шумный процесс. Статистический вывод направлен на описание свойств (скажем, среднего) исходного набора данных, так что предположим, что вы использовали гауссово в этом случае, вы бы грубо переоценили истинное значение. Если бы вы использовали t в этом случае, это не соответствовало бы среднему значению вашего шумного образца, но это была бы намного более точная оценка исходного истинного значения, независимо от выбросов.

Смежные вопросы