3

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

fitdistr(myData, "t")

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

因此,我尝试使用我在 stackoverflow 和 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

谢谢!

4

2 回答 2

5

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

library(fitdistrplus)
dat <- rt(100, df=10)
fit <- fitdist(dat, "t", start=list(df=2))
于 2015-05-27T23:34:00.907 回答
4

我认为值得补充的是,在大多数情况下,使用 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 分布拟合到我们从 df 5 的 t 分布中采样的数据会导致拟合不佳!

当您拟合 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

尝试将 t 分布拟合到我们从 df 5 的 t 分布中采样的数据会得到很好的拟合,因为我们可以考虑均值和缩放比例

好多了:-) 参数非常接近我们最初生成数据的方式!并且 QQ 图显示了一个更好的拟合。

于 2017-06-25T19:37:23.330 回答