题
背景
PostgreSQL数据库使用PL/R来调用R函数。呼叫来计算Spearman的相关性,如下所示:
cor( rank(x), rank(y) )
同样在r中,对拟合的广义添加剂模型(GAM)的幼稚计算:
data.frame( x, fitted( gam( y ~ s(x) ) ) )
这里 x
代表1900年至2009年的年份 y
是当年的平均测量(例如,最低温度)。
问题
正如您在下面的图片中看到的那样,拟合趋势线(使用GAM)是相当准确的:
问题在于相关性(显示在左下方)不能准确反映模型拟合数据的程度。
可能的解决方案
提高相关性准确性的一种方法是在BINNED数据上使用均方根误差(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
是错的。我想通过计算 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]), ... )
对于适当数量的垃圾箱中的任意长度向量(例如,5仅适用于67个测量值)?
我不认为 hist
在这里合适吗?
尝试解决方案2
以下代码将解决该问题,但是它从列表末尾删除数据点(使列表可排除在5)。该解决方案并不理想,因为数字“ 5”是相当神奇的。
while( length(o) %% 5 != 0 ) {
o <- o[-length(o)]
}
omean <- apply( matrix(o, 5), 2, mean )
还有哪些其他选项可用?
提前致谢。
解决方案
你说:
问题在于相关性(显示在左下方)不能准确反映模型拟合数据的程度。
您可以计算拟合值和测量值之间的相关性:
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))
}
它看起来有些丑陋,但是它应该处理其长度不属于binning长度的向量(即您的示例中5)。
您还说:
提高相关性准确性的一种方法是在BINNED数据上使用均方根误差(RMSE)计算。
我不明白你的意思。相关性是确定平均误差的一个因素 - 例如,请参见 墨菲(1988,每月天气评论,第116页,第2417-2424页). 。但是请解释一下您的意思。