如何从 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
(可以分别使用 optim
和 integrate
使这两个统计数据更加精确)。
总而言之,由于它不是回归上下文,因此情况有所不同,并且根据您想要的严谨程度,还有许多可供探索的选择。
我现在正在使用包 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
(可以分别使用 optim
和 integrate
使这两个统计数据更加精确)。
总而言之,由于它不是回归上下文,因此情况有所不同,并且根据您想要的严谨程度,还有许多可供探索的选择。