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

  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 );
  2. Definir plr_corr_rmse como sigue (donde o y m 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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top