Question

Historique

Une base de données PostgreSQL utilise PL / R pour les fonctions appel R. Un appel R pour calculer les regards de corrélation de Spearman comme suit:

cor( rank(x), rank(y) )

Aussi dans R, un calcul naïve d'un modèle additif généralisé équipée (GAM):

data.frame( x, fitted( gam( y ~ s(x) ) ) )

Ici x représente les années 1900-2009 et y est la mesure moyenne (par exemple, la température minimale) pour cette année.

Problème

La ligne de tendance ajustée (en utilisant GAM) est raisonnablement précis, comme vous pouvez le voir dans l'image suivante:

Le problème est que les corrélations (indiquées en bas à gauche) ne reflètent pas exactement à quel point le modèle correspond aux données.

Solution possible

Une façon d'améliorer la précision de la corrélation consiste à utiliser une racine carrée moyenne calcul d'erreur (erreur quadratique moyenne) sur les données regroupées par casiers.

Questions

Q.1. Comment qualifieriez-vous mettre en œuvre le calcul RMSE sur les données regroupées par casiers pour obtenir une corrélation (entre 0 et 1) de l'ajustement de GAM aux mesures, dans la langue de R?

Q.2. Y at-il une meilleure façon de trouver la précision de l'ajustement aux données de GAM, et si oui, quel est-il (par exemple, l'écart racine carrée moyenne)?

Solution 1 Tentative

  1. Appelez la fonction PL / R en utilisant les quantités observées et le modèle (GAM) revient:
    correlation_rmse := climate.plr_corr_rmse( v_amount, v_model );
  2. Définir plr_corr_rmse comme suit (où o et m représentent les données observées et modélisées):
    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;
    

Le o - m est erroné. Je voudrais bin deux ensembles de données en calculant la mean de tous les 5 points de données (il y aura au plus 110 points de données). Par exemple:

omean <- c( mean(o[1:5]), mean(o[6:10]), ... )
mmean <- c( mean(m[1:5]), mean(m[6:10]), ... )

Ensuite, corriger le calcul RMSE comme:

sqrt( mean( omean - mmean ) ^ 2 )

Comment calculer c( mean(o[1:5]), mean(o[6:10]), ... ) pour un vecteur de longueur arbitraire dans un nombre approprié de bacs (5, par exemple, pourrait ne pas être idéal pour seulement 67 mesures)?

Je ne pense pas que hist convient ici, est-il?

Solution 2 Tentative

Le code suivant va résoudre le problème, mais il laisse tomber les points de données à partir de la fin de la liste (pour faire la liste divisibles par 5). La solution est pas idéale que le nombre « 5 » est plutôt magique.

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

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

Quelles autres options sont disponibles?

Merci à l'avance.

Était-ce utile?

La solution

Vous dites que:

  

Le problème est que les corrélations (indiquées en bas à gauche) ne reflètent pas exactement à quel point le modèle correspond aux données.

Vous pourriez calculer la corrélation entre les valeurs ajustées et les valeurs mesurées:

cor(y,fitted(gam(y ~ s(x))))

Je ne vois pas pourquoi vous voulez regrouper vos données, mais vous pouvez le faire comme suit:

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))
}

Il semble un peu laid, mais il doit gérer des vecteurs dont la longueur est pas un multiple de la longueur de binning (par exemple 5 dans votre exemple).

Vous dites aussi que:

  

Une façon d'améliorer la précision de la   corrélation consiste à utiliser un moyen de racine   erreur quadratique (EMQ) de calcul sur   données mis en cellule.

Je ne comprends pas ce que vous entendez par là. La corrélation est un facteur dans la détermination de l'erreur quadratique moyenne - par exemple, voir équation 10 de Murphy (1988, Monthly Weather Review, v. 116, pp. 2417-2424) . Mais s'il vous plaît expliquer ce que vous voulez dire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top