使用R的分组GAM结果的均方根偏差

时间:2010-06-18 22:08:06

标签: r statistics binning plr gam

背景

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 ​​

  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;
    
  3. 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 )
    

    还有哪些其他选择?

    提前致谢。

1 个答案:

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