我认为值得补充的是,在大多数情况下,使用 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 图显示了一个更好的拟合。