Frage

Hintergrund

Ein PostgreSQL-Datenbank verwendet PL / R Aufruf R Funktionen. Ein R Aufruf Spearman-Korrelation sieht wie folgt zu berechnen:

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

Auch in R, eine naive Berechnung einer Einbau verallgemeinerten Additivmodell (GAM):

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

Hier x repräsentiert die Jahre 1900 bis 2009 und y ist die durchschnittliche Messung (zum Beispiel Mindesttemperatur) für dieses Jahr.

Problem

Die Einbautrendlinie (unter Verwendung von GAM) ist einigermaßen genau, wie Sie im folgenden Bild sehen kann:

Das Problem ist, dass die Korrelationen (unten links) nicht genau widerspiegeln, wie eng das Modell an die Daten angepasst.

Mögliche Lösung

Eine Möglichkeit, die Genauigkeit der Korrelation zu verbessern, ist eine Wurzel mittlere quadratische Fehler (RMSE) Berechnung auf binned Daten zu verwenden.

Fragen

Q.1. Wie würden Sie die RMSE Berechnung auf den klassierten Daten implementieren eine Korrelation zu erhalten (zwischen 0 und 1) der Anpassung der GAM zu den Messungen in der R Sprache?

Q.2. Gibt es einen besseren Weg, um die Genauigkeit der GAM Anpassung an die Daten zu finden, und wenn ja, was ist es (zum Beispiel mittlere quadratische Abweichung)?

Versuchte Lösung 1

  1. Rufen Sie die PL / R-Funktion unter Verwendung der beobachteten Mengen und das Modell (GAM) beträgt:
    correlation_rmse := climate.plr_corr_rmse( v_amount, v_model );
  2. definieren plr_corr_rmse wie folgt (wobei o und m stellen die beobachteten und modellierten Daten):
    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;
    

Die o - m ist falsch. Ich bin Sätze sowohl Daten möchten, indem Sie die mean von jeweils 5 Datenpunkte Berechnung (es wird höchstens 110 Datenpunkte sein). Zum Beispiel:

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

korrigiert dann die RMSE Berechnung wie:

sqrt( mean( omean - mmean ) ^ 2 )

Wie berechnen Sie für eine beliebige Länge Vektor in einer entsprechenden Anzahl von Behältern c( mean(o[1:5]), mean(o[6:10]), ... ) (5, zum Beispiel könnte nicht ideal sein für nur 67 Messungen)?

Ich glaube nicht, hist geeignet ist hier, oder?

Versuchte Lösung 2

Der folgende Code wird das Problem lösen, jedoch fällt es Datenpunkte aus dem Ende der Liste (auf die Liste teilbar macht von 5). Die Lösung ist nicht ideal, da die Zahl „5“ ist eher magisch.

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

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

Was andere Optionen stehen zur Verfügung?

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Sie sagen, dass:

  

Das Problem ist, dass die Korrelationen (unten links) nicht genau widerspiegeln, wie eng das Modell an die Daten angepasst.

Sie können die Korrelation zwischen den angepassten Werte berechnen und die Messwerte:

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

Ich sehe nicht, warum Sie ist Ihre Daten will, aber Sie könnten es tun, wie folgt:

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

Es sieht ein bisschen hässlich, aber es sollte Vektoren, deren Länge Griff ist nicht ein Vielfaches der Binning-Länge (das heißt 5 in Ihrem Beispiel).

Sie sagen auch, dass:

  

Eine Möglichkeit, die Richtigkeit der zur Verbesserung der   Die Korrelation ist ein Root Mean zu verwenden,   quadratische Fehler (RMSE) Berechnung   binned Daten.

Ich verstehe nicht, was Sie damit meinen. Die Korrelation ist ein Faktor in den mittleren quadratischen Fehler zu bestimmen - siehe zum Beispiel der Gleichung 10 von Murphy (1988 Monthly Weather Review, v. 116, S.. 2417-2424) . Aber bitte erklären, was Sie meinen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top