我正在尝试将t-distribution分配给我的数据,但我无法这样做。我的第一次尝试是
fitdistr(myData, "t")
有41个警告,都说NaN是产生的。我不知道如何,对数似乎参与其中。所以我稍微调整了我的数据,以便所有数据都是> 0,但我仍然遇到同样的问题(虽然...减少了9次警告)。与sstdFit()相同的问题是,产生NaN。
所以我尝试使用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
谢谢!
答案 0 :(得分:4)
开始是您的分发参数的初始猜测。涉及到日志,因为它使用最大可能性,因此使用了对数似然性。
library(fitdistrplus)
dat <- rt(100, df=10)
fit <- fitdist(dat, "t", start=list(df=2))
答案 1 :(得分:2)
我认为值得补充的是,在大多数情况下,使用fitdistrplus软件包将t分布拟合到实际数据会导致非常不合适,这实际上是非常误导的。这是因为使用了R中的默认t分布函数,它们不支持移位或缩放。也就是说,如果您的数据的平均值不是0,或者以某种方式缩放,那么fitdist
函数只会导致不合适。
在现实生活中,如果数据符合t分布,则通常移位(即具有0以外的平均值)和/或缩放。让我们生成一些类似的数据:
data = 1.5*rt(10000,df=5) + 0.5
鉴于这些数据是从具有5个自由度的t分布中采样的,您认为尝试将t分布拟合到此应该可以很好地工作。但实际上,这是结果。它估计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
当你适合t分布时,你不仅要估计自由度,还要估计平均和缩放参数。
metRology包提供了一个名为t.scaled的t分布版本,除了df参数[metRology]之外,还有一个mean和sd参数。现在让我们再次适应它:
> 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
好多了:-)这些参数与我们首先生成数据的方式非常接近!而QQ的情节显示出更合适的效果。