【发布时间】: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 )
还有哪些可用的选项?
提前致谢。
【问题讨论】:
标签: r statistics binning plr gam