我现在正在使用软件包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")
答案 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
(分别使用optim
和integrate
可以使统计数据更加精确)。
总而言之,由于它不是回归上下文,因此情况有所不同,并且根据您想要的严格程度,有很多可供选择的方法可供探索。