Radice dell'errore quadratico medio sui risultati GAM raggruppate utilizzando R
-
28-09-2019 - |
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
- Chiamare la funzione PL / R utilizzando gli importi osservati e il modello (GAM) ammonta:
correlation_rmse := climate.plr_corr_rmse( v_amount, v_model );
- Definisci
plr_corr_rmse
come segue (doveo
em
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.
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.