Аномалии при попытке подобрать распределение t студента с использованием scipy

Я пытаюсь сопоставить t-распределение с некоторыми имеющимися у меня данными. Чтобы проверить это, я сначала попытался создать образец из фиксированного дистрибутива и попытаться вписаться в него. Ниже приведен код, который я использую.

samp = t.rvs(loc=0, scale=0.6, df=1.3, size=150)

param = t.fit(samp)

x = linspace(-5,5,100)

pdf_fitted = t.pdf(x,loc=param[0],scale=param[1],df=param[2])
pdf = t.pdf(x,loc=0,scale=0.6,df=1.3)

title('Student\'s t Distribution')
plot(x,pdf_fitted,'r-',x,pdf,'b-')
hist(samp, normed=1,alpha=0.3)
show()
print(param)

Теперь можно было бы ожидать, что pdf и pdf_fitted будут по существу одинаковыми. Однако это не так. Когда показаны графики, исходное и подогнанное распределения выглядят очень по-разному. Более того, полученные параметры совершенно не соответствуют заданным (loc=0, scale=0.6, df=1.3)! Это меня смущает, потому что я просто адаптирую код с http://glowingpython.blogspot.com/2012/07/distribution-fitting-with-scipy.html для работы с t дистрибутивами. Может кто-нибудь сказать мне, есть ли какие-то нюансы с подгонкой t-распределений? Спасибо


person GXR    schedule 17.03.2016    source источник


Ответы (1)


Метод fit функции scipy.stats.t возвращает (df, loc, scale), поэтому эта строка

pdf_fitted = t.pdf(x,loc=param[0],scale=param[1],df=param[2])

должно быть

pdf_fitted = t.pdf(x, loc=param[1], scale=param[2], df=param[0])

В примере, на который вы ссылаетесь, используется нормальное распределение, которое не имеет дополнительного параметра формы, поэтому в этом случае param[0] — это местоположение, а param[1] — масштаб.

person Warren Weckesser    schedule 17.03.2016
comment
Спасибо, теперь все работает как положено. К сожалению, в документации не упоминается, в каком порядке они расположены. Я полагаю, что в ретроспективе сигнатура функции (x, df, loc, scale) должна была быть подсказкой. - person GXR; 17.03.2016