背景
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) 计算。
问题
问题 1。您将如何在 R 语言中对分箱数据执行 RMSE 计算以获得 GAM 与测量值的相关性(0 到 1 之间)?
问题 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
是错的。我想通过计算mean
每 5 个数据点(最多有 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 )
如何c( mean(o[1:5]), mean(o[6:10]), ... )
在适当数量的 bin 中计算任意长度的向量(例如,5 可能不适合仅 67 次测量)?
我觉得hist
这里不适合,是吗?
尝试的解决方案 2
以下代码将解决该问题,但它会从列表末尾删除数据点(以使列表可被 5 整除)。该解决方案并不理想,因为数字“5”相当神奇。
while( length(o) %% 5 != 0 ) {
o <- o[-length(o)]
}
omean <- apply( matrix(o, 5), 2, mean )
还有哪些其他选择?
提前致谢。