'fitdistrplus' 包问题,t 分布

Trouble with 'fitdistrplus' package, t-distribution

我正在尝试将 t 分布拟合到我的数据中,但我做不到。我的第一次尝试是

fitdistr(myData, "t")

有 41 个警告,都说生成了 NaN。我不知道如何,似乎涉及对数。所以我稍微调整了我的数据,使所有数据都> 0,但我仍然遇到同样的问题(虽然少了 9 个警告......)。与 sstdFit() 相同的问题会产生 NaN。

所以我尝试使用我在 Whosebug 和 CrossValidated 上看到的 fitdist:

fitdist(myData, "t")

然后我得到

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

这是什么意思?我试着查看文档,但什么也没告诉我。我只想拟合一个 t 分布,这太令人沮丧了:P

谢谢!

Start 是对分布参数的初始猜测。涉及对数,因为它使用最大似然,因此使用对数似然。

library(fitdistrplus)
dat <- rt(100, df=10)
fit <- fitdist(dat, "t", start=list(df=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] 之外,它还有一个均值和 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 图显示更合适。