使用 R 的分级 GAM 结果的均方根偏差
Posted
技术标签:
【中文标题】使用 R 的分级 GAM 结果的均方根偏差【英文标题】:Root mean square deviation on binned GAM results using R 【发布时间】:2011-03-05 15:22:49 【问题描述】:背景
PostgreSQL 数据库使用 PL/R 调用 R 函数。计算 Spearman 相关性的 R 调用如下所示:
cor( rank(x), rank(y) )
同样在 R 中,拟合广义加法模型 (GAM) 的简单计算:
data.frame( x, fitted( gam( y ~ s(x) ) ) )
这里x
代表从 1900 年到 2009 年的年份,y
是该年的平均测量值(例如最低温度)。
问题
拟合的趋势线(使用 GAM)相当准确,如下图所示:
问题在于相关性(显示在左下方)不能准确反映模型与数据的拟合程度。
可能的解决方案
提高相关准确性的一种方法是对分箱数据使用均方根误差 (RMSE) 计算。
问题
Q.1.您将如何在 R 语言中对分箱数据执行 RMSE 计算,以获得 GAM 与测量值的相关性(0 到 1 之间)?
Q.2. 有没有更好的方法来确定 GAM 对数据的拟合精度,如果有,它是什么(例如,均方根偏差)?
尝试的解决方案 1
-
使用观察量和模型 (GAM) 量调用 PL/R 函数:
correlation_rmse := climate.plr_corr_rmse( v_amount, v_model );
如下定义plr_corr_rmse
(其中o
和m
代表观察和建模数据):CREATE OR REPLACE FUNCTION climate.plr_corr_rmse(
o double precision[], m double precision[])
RETURNS double precision AS
$BODY$
sqrt( mean( o - m ) ^ 2 )
$BODY$
LANGUAGE 'plr' VOLATILE STRICT
COST 100;
o - m
是错误的。我想通过计算每 5 个数据点的 mean
来合并两个数据集(最多有 110 个数据点)。例如:
omean <- c( mean(o[1:5]), mean(o[6:10]), ... )
mmean <- c( mean(m[1:5]), mean(m[6:10]), ... )
然后将RMSE计算修正为:
sqrt( mean( omean - mmean ) ^ 2 )
如何在适当数量的 bin 中计算任意长度向量的 c( mean(o[1:5]), mean(o[6:10]), ... )
(例如,5 可能不适用于仅 67 次测量)?
我觉得hist
不适合这里,是吗?
尝试的解决方案 2
以下代码将解决该问题,但它会从列表末尾删除数据点(以使列表可被 5 整除)。解决方案并不理想,因为数字“5”相当神奇。
while( length(o) %% 5 != 0 )
o <- o[-length(o)]
omean <- apply( matrix(o, 5), 2, mean )
还有哪些可用的选项?
提前致谢。
【问题讨论】:
【参考方案1】:你这么说:
问题在于相关性(显示在左下方)不能准确反映模型与数据的拟合程度。
您可以计算拟合值和测量值之间的相关性:
cor(y,fitted(gam(y ~ s(x))))
我不明白您为什么要对数据进行分类,但您可以按以下方式进行:
mean.binned <- function(y,n = 5)
apply(matrix(c(y,rep(NA,(n - (length(y) %% n)) %% n)),n),
2,
function(x)mean(x,na.rm = TRUE))
它看起来有点难看,但它应该处理长度不是分箱长度的倍数(即您的示例中的 5)的向量。
你也这么说:
提高准确性的一种方法 相关性是使用根均值 平方误差 (RMSE) 计算 分箱数据。
我不明白你的意思。相关性是确定均方误差的一个因素——例如,参见Murphy (1988, Monthly Weather Review, v. 116, pp. 2417-2424) 的公式 10。但请解释一下你的意思。
【讨论】:
以上是关于使用 R 的分级 GAM 结果的均方根偏差的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用DALEX包的model_performance函数对h2o包生成的多个算法模型进行残差分布分析并使用箱图进行残差分布的可视化直方图中的大红点为残差的均方根误差RMSE