如何从R中的`fitdistrplus`包中找到拟合值?

时间:2018-12-22 22:08:00

标签: r distribution data-fitting

我现在正在使用软件包fitdistrplus来构造Gamma分布,我的问题是如何提取拟合值以计算均方根误差?感谢您的帮助。

library(fitdistrplus)
Sev = c(1.42,5.15,2.5,2.29,12.36,2.82,1.4,3.53,1.17,1.0,4.03,5.26,1.65,1.41,3.75,1.09,
    3.44,1.36,1.19,4.76,5.58,1.23,2.29,7.71,1.12,1.26,2.78,1.13,3.87,15.43,1.19,
    4.95,7.69,1.17,3.27,1.44,1.05,3.94,1.58,2.29,2.73,3.75,6.80,1.16,1.01,1.00,
    1.02,2.32,2.86,22.90,1.42,1.10,2.78,1.23,1.61,1.33,3.53,10.44)
fg <- fitdist(data = Sev, distr = "gamma", method = "mle") 

1 个答案:

答案 0 :(得分:1)

这不是回归上下文,这里没有明确的拟合值。您可能会想到的是估计的密度值f(Sev; theta),其中theta是fg给出的估计值。那是

fit <- dgamma(Sev, fg$estimate[1], fg$estimate[2])

,它是一个有意义且定义明确的对象。但是,在尝试计算RMSE时会遇到麻烦:将fit与之比较的是什么?您在1.42下的样品密度值是多少?由于您要处理连续分布,因此必须使用一些内核估计器,该估计器又有一个参数-带宽!一个非常粗糙的东西是

den <- density(Sev)
sqrt(mean((den$y - dgamma(den$x, fg$estimate[1], fg$estimate[2]))^2))
# [1] 0.0146867

这是fg给出的MLE估计值与内核密度估计值den之间的RMSE。与np

相比,使用density.包可以更好地估计密度

您可以做一些更明智的事情:将数据的经验CDF与fg给出的CDF进行比较。前者由empCDF <- ecdf(Sev)给出,后者由pgamma给出相应的参数值。举例来说,Kolmogorov-Smirnov统计信息大约为

x <- seq(min(Sev), max(Sev), length = 10000)
max(abs(empCDF(x) - pgamma(x, fg$estimate[1], fg$estimate[2])))
# [1] 0.1725476

一种RMSE应该是

sqrt(mean((empCDF(x) - pgamma(x, fg$estimate[1], fg$estimate[2]))^2))
# [1] 0.04585509

(分别使用optimintegrate可以使统计数据更加精确)。

总而言之,由于它不是回归上下文,因此情况有所不同,并且根据您想要的严格程度,有很多可供选择的方法可供探索。