背景

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

  1. 使用观察到的数量和模型(GAM)数量调用PL/R函数:
    correlation_rmse := climate.plr_corr_rmse( v_amount, v_model );
  2. 定义 plr_corr_rmse 如下(哪里 om 表示观察到的数据和建模数据):
    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页). 。但是请解释一下您的意思。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top