【问题标题】:Root mean square deviation on binned GAM results using R使用 R 的分级 GAM 结果的均方根偏差
【发布时间】: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

  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 是错误的。我想通过计算每 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


    【解决方案1】:

    你这么说:

    问题在于相关性(显示在左下方)不能准确反映模型与数据的拟合程度。

    您可以计算拟合值和测量值之间的相关性:

    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。但请解释一下你的意思。

    【讨论】:

      猜你喜欢
      • 2020-03-18
      • 2022-01-06
      • 2018-12-27
      • 1970-01-01
      • 2014-04-27
      • 2018-08-03
      • 2020-03-29
      • 2014-03-07
      • 1970-01-01
      相关资源
      最近更新 更多