1

背景

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

  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]), ... )在适当数量的 bin 中计算任意长度的向量(例如,5 可能不适合仅 67 次测量)?

我觉得hist这里不适合,是吗?

尝试的解决方案 2

以下代码将解决该问题,但它会从列表末尾删除数据点(以使列表可被 5 整除)。该解决方案并不理想,因为数字“5”相当神奇。

while( length(o) %% 5 != 0 ) {
  o <- o[-length(o)]
}

omean <- apply( matrix(o, 5), 2, mean )

还有哪些其他选择?

提前致谢。

4

1 回答 1

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 的方程 10 (1988, Monthly Weather Review, v. 116, pp. 2417-2424)。但请解释一下你的意思。

于 2010-06-19T12:32:51.647 回答