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

How to find fitted values from `fitdistrplus` package in R?

我现在正在使用包 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") 

这不是回归上下文,这里没有明确的拟合值。您可能想到的是估计的密度值 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 使这两个统计数据更加精确)。

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