2015-05-27 5 views
2

Я пытаюсь подправить t-дистрибутивы к своим данным, но не могу этого сделать. Моя первая попытка былаПроблема с пакетом 'fitdistrplus', t-распространение

fitdistr(myData, "t") 

Есть 41 предупреждение, все говорят, что производятся NaN. Я не знаю, как, по-видимому, задействованы логарифмы. Поэтому я скорректировал свои данные несколько, чтобы все данные были> 0, но у меня все еще есть одна и та же проблема (9 меньше предупреждений, хотя ...). Такая же проблема с sstdFit(), создает NaNs.

Так вместо этого я стараюсь с fitdist, которые я видел на StackOverflow и CrossValidated:

fitdist(myData, "t") 

тогда я получаю

Error in mledist(data, distname, start, fix.arg, ...) : 
'start' must be defined as a named list for this distribution 

Что это значит? Я попытался заглянуть в документацию, но ничего не сказал. Я просто хочу, возможно, поместить t-распределение, это так расстраивает: P

Спасибо!

ответ

4

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

library(fitdistrplus) 
dat <- rt(100, df=10) 
fit <- fitdist(dat, "t", start=list(df=2)) 
+0

Большое вам спасибо! –

1

Я думаю, что стоит добавить, что в большинстве случаев, с помощью пакета fitdistrplus, чтобы соответствовать т-распределение к реальным данным, приведет к очень плохой подгонки, которая на самом деле довольно заблуждение. Это связано с тем, что используются функции t-распределения по умолчанию в R, и они не поддерживают сдвиг или масштабирование. То есть, если ваши данные имеют значение, отличное от 0, или каким-то образом масштабируется, то функция fitdist просто приведет к плохой подгонке.

В реальной жизни, если данные соответствуют t-распределению, оно обычно смещается (то есть имеет среднее значение, отличное от 0) и/или масштабируется. Давайте генерировать некоторые данные, такие как, что:

data = 1.5*rt(10000,df=5) + 0.5 

Учитывая это выборка данных из распределения Стьюдента с 5 степенями свободы, можно подумать, что подстраиваться Т-распределение на это должно работать достаточно хорошо. Но на самом деле, вот результат. Он оценивает df равным 2 и обеспечивает плохое соответствие, как показано на графике qq.

> fit_bad <- fitdist(data,"t",start=list(df=3)) 
> fit_bad 

Fitting of the distribution ' t ' by maximum likelihood 
Parameters: 
    estimate Std. Error 
df 2.050967 0.04301357 

> qqcomp(list(fit_bad)) # generates plot to show fit 

Trying to fit a t-distribution to the data we sampled from a t-distribution with df 5 leads to a bad fit!

Когда вы подходите к т-распределения вы хотите не только оценить степень свободы, но и среднего и масштабирования параметра.

Пакет metRology предоставляет версию t-распределения, называемую t.scaled, которая имеет дополнительный параметр и sd в дополнение к параметру df [metRology]. Теперь давайте уместить его снова:

> library("metRology") 
> fit_good <- fitdist(data,"t.scaled", 
         start=list(df=3,mean=mean(data),sd=sd(data))) 
> fit_good 
Fitting of the distribution ' t.scaled ' by maximum likelihood 
Parameters: 
    estimate Std. Error 
df 4.9732159 0.24849246 
mean 0.4945922 0.01716461 
sd 1.4860637 0.01828821 

> qqcomp(list(fit_good)) # generates plot to show fit 

Trying to fit a t-distribution to the data we sampled from a t-distribution with df 5 leads to a good fit now that we can take the mean and scaling into account

Намного лучше :-) параметры очень близки к тому, как мы получили данные в первую очередь! И график QQ показывает гораздо приятнее.

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