バックグラウンド
PostgreSQL データベースは PL/R を使用して R 関数を呼び出します。スピアマンの相関を計算するための R 呼び出しは次のようになります。
cor( rank(x), rank(y) )
また、R では、当てはめられた一般化加法モデル (GAM) の単純な計算:
data.frame( x, fitted( gam( y ~ s(x) ) ) )
x
これは 1900 年から 2009 年までの年を表し、その年のy
平均測定値 (最低気温など) です。
問題
次の図に示すように、近似傾向線 (GAM を使用) はかなり正確です。
問題は、相関関係 (左下に表示) が、モデルがデータにどの程度適合しているかを正確に反映していないことです。
考えられる解決策
相関の精度を向上させる 1 つの方法は、ビニングされたデータに対して二乗平均平方根誤差 (RMSE) 計算を使用することです。
質問
Q.1. ビニングされたデータに RMSE 計算を実装して、R 言語で 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 )
他にどのようなオプションがありますか?
前もって感謝します。