背景
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。如何在分类数据上实现RMSE计算,以获得GAM与R语言测量拟合的相关性(在0和1之间)?
Q.2。是否有更好的方法可以找到GAM与数据拟合的准确性,若然,它是什么(例如,均方根偏差)?
尝试解决方案1
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 )
如何在适当数量的箱子中计算任意长度向量的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 )
还有哪些其他选择?
提前致谢。
答案 0 :(得分:2)
你这么说:
问题在于相关性(如左下图所示)无法准确反映模型与数据的拟合程度。
您可以计算拟合值与测量值之间的相关性:
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。但请解释一下你的意思。