Domanda

Sfondo

Un database di PostgreSQL utilizza PL / R per le funzioni di chiamata R. Una chiamata R per calcolare gli sguardi di correlazione di Spearman come segue:

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

Anche in R, un calcolo naif di un modello additivo generalizzato montato (GAM):

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

Ecco x rappresenta gli anni 1900-2009 e y è la misura media (per esempio, la temperatura minima) per lo stesso anno.

problema

La linea di tendenza attrezzata (usando GAM) è ragionevolmente accurata, come si può vedere nella figura seguente:

Il problema è che le correlazioni (mostrati in basso a sinistra) non riflettono con precisione come da vicino il modello si adatta ai dati.

Possibile Soluzione

Un modo per migliorare la precisione della correlazione è quello di utilizzare un calcolo errore quadratico medio (RMSE) in data raggruppate.

Domande

Q.1. Come si implementa il calcolo RMSE sui dati cestinate per ottenere una correlazione (tra 0 e 1) di adattamento del GAM alle misure, nel linguaggio R?

Q.2. C'è un modo migliore per trovare la precisione di adattamento del GAM ai dati, e in caso affermativo, di cosa si tratta (per esempio, radice dell'errore quadratico medio)?

Tentativo Soluzione 1

  1. Chiamare la funzione PL / R utilizzando gli importi osservati e il modello (GAM) ammonta:
    correlation_rmse := climate.plr_corr_rmse( v_amount, v_model );
  2. Definisci plr_corr_rmse come segue (dove o e m rappresentano i dati osservati e modellata):
    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;
    

Il o - m è sbagliato. Mi piacerebbe bin entrambi i set di dati calcolando la mean di ogni 5 punti di dati (non ci sarà al massimo di 110 punti di dati). Ad esempio:

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

Poi correggere il calcolo RMSE come:

sqrt( mean( omean - mmean ) ^ 2 )

Come si fa a calcolare c( mean(o[1:5]), mean(o[6:10]), ... ) per un vettore di lunghezza arbitraria in un numero adeguato di contenitori (5, ad esempio, potrebbe non essere l'ideale per solo 67 misurazioni)?

Non credo hist è adatto qui, vero?

Tentativo Soluzione 2

Il seguente codice risolverà il problema, ma si scende punti dati dalla fine della lista (a fare l'elenco divisibile per 5). La soluzione non è ideale come il numero "5" è un po 'magica.

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

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

Quali altre opzioni sono disponibili?

Grazie in anticipo.

È stato utile?

Soluzione

Lo dici:

  

Il problema è che le correlazioni (mostrati in basso a sinistra) non riflettono con precisione come da vicino il modello si adatta ai dati.

Si potrebbe calcolare la correlazione tra i valori stimati ei valori misurati:

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

Non vedo il motivo per cui si vuole bin propri dati, ma si potrebbe farlo nel seguente modo:

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

Sembra un po 'brutto, ma dovrebbe gestire vettori la cui lunghezza non è un multiplo della lunghezza binning (vale a dire 5 nel tuo esempio).

È anche dire che:

  

Un modo per migliorare la precisione del   correlazione è quello di utilizzare una media radice   errore quadratico (RMSE) calcolo su   dati cestinate.

Non capisco cosa intendi per questo. La correlazione è un fattore nel determinare l'errore quadratico medio - per esempio, vedere equazione 10 di Murphy (1988, Monthly Weather Review, v. 116, pp. 2417-2424) . Ma per favore spiegare che cosa vuoi dire.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top