Distancia media cuadrática mínima en los resultados GAM agrupadas utilizando R
-
28-09-2019 - |
Pregunta
Fondo
base de datos PostgreSQL A utiliza PL / R a las funciones de llamada R. Una llamada R para calcular las miradas de correlación de Spearman de la siguiente manera:
cor( rank(x), rank(y) )
También en R, un cálculo ingenuo de un modelo aditivo generalizado equipada (GAM):
data.frame( x, fitted( gam( y ~ s(x) ) ) )
Aquí x
representa los años 1900 a 2009 y y
es la medición promedio (por ejemplo, la temperatura mínima) para ese año.
Problema:
La línea de tendencia ajustada (usando GAM) es razonablemente exacta, como se puede ver en la siguiente imagen:
El problema es que las correlaciones (que se muestran en la parte inferior izquierda) no reflejan con exactitud cómo de cerca el modelo se ajusta a los datos.
Solución posible
Una forma de mejorar la precisión de la correlación es utilizar un cálculo de error cuadrático medio (RMSE) agrupadas en los datos.
Preguntas
P.1. ¿Cómo aplicar el cálculo RMSE en los datos agrupadas para obtener una correlación (entre 0 y 1) de ajuste de GAM a las mediciones, en el lenguaje R?
P.2. ¿Hay una mejor manera de encontrar la precisión de ajuste de GAM a los datos, y si es así, ¿qué es (por ejemplo, la desviación de la raíz cuadrática media)?
intento de solución 1
- Llame a la función PL / R usando las cantidades observadas y el modelo (GAM) asciende:
correlation_rmse := climate.plr_corr_rmse( v_amount, v_model );
- Definir
plr_corr_rmse
como sigue (dondeo
ym
representan los datos observados y modelado):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;
El o - m
está mal. Me gustaría bin ambos conjuntos de datos mediante el cálculo de la mean
de cada 5 puntos de datos (habrá como máximo 110 puntos de datos). Por ejemplo:
omean <- c( mean(o[1:5]), mean(o[6:10]), ... )
mmean <- c( mean(m[1:5]), mean(m[6:10]), ... )
A continuación, corregir el cálculo RMSE como:
sqrt( mean( omean - mmean ) ^ 2 )
¿Cómo se calcula c( mean(o[1:5]), mean(o[6:10]), ... )
de un vector de longitud arbitraria en un número adecuado de contenedores (5, por ejemplo, puede no ser ideal para sólo 67 mediciones)?
No creo hist
es adecuado aquí, ¿verdad?
intento de solución 2
El siguiente código va a resolver el problema, sin embargo, cae puntos de datos desde el final de la lista (para hacer la lista divisible por 5). La solución no es ideal como el número "5" es más bien mágico.
while( length(o) %% 5 != 0 ) {
o <- o[-length(o)]
}
omean <- apply( matrix(o, 5), 2, mean )
¿Qué otras opciones están disponibles?
Gracias de antemano.
Solución
Usted dice que:
El problema es que las correlaciones (que se muestran en la parte inferior izquierda) no reflejan con exactitud cómo de cerca el modelo se ajusta a los datos.
Se puede calcular la correlación entre los valores ajustados y los valores medidos:
cor(y,fitted(gam(y ~ s(x))))
No veo por qué quiere bin sus datos, pero se puede hacer de la siguiente manera:
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))
}
Se ve un poco feo, pero debe manejar vectores cuya longitud no es un múltiplo de la longitud binning (es decir, 5 en su ejemplo).
También dice que:
Una forma de mejorar la exactitud de la correlación es utilizar una media de raíz error cuadrático medio (RMSE) cálculo en datos agrupada.
No entiendo lo que quiere decir con esto. La correlación es un factor en la determinación del error cuadrático medio - por ejemplo, véase la ecuación 10 de Murphy (1988, Monthly Weather Review, v. 116, pp. 2417-2424) . Pero, por favor explique lo que quiere decir.