Среднее квадратное отклонение корневого квадрата на Binded Game результаты с использованием R

StackOverflow https://stackoverflow.com/questions/3073365

Вопрос

Задний план

База данных PostgreSQL использует PL / R для вызова функций R. Вызов R для расчета корреляции Спирмана выглядит следующим образом:

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

Также в R, наивный расчет установленной обобщенной аддитивной модели (GAM):

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

Здесь x представляет годы с 1900 по 2009 год и y это среднее измерение (например, минимальная температура) на этот год.

Проблема

Установленная линия тренда (с использованием GAM) достаточно точна, так как вы можете видеть на следующем рисунке:

Проблема в том, что корреляции (показанные в нижнем левом углу) не точно отражают, насколько тесно модель соответствует данным.

Возможное решение

Одним из способов улучшения точности корреляции является использование среднеквадратичного коренного квадрата (RMSE).

Вопросы

Q.1. Как бы вы могли реализовать расчет RMSE на мусорных данных, чтобы получить корреляцию (от 0 до 1) GAM-подходящих для измерений, на языке R?

Q.2. Есть ли лучший способ найти точность Gam's Fit для данных, и если да, то, что это (например, среднеквадратичное отклонение корня)?

Попытка решения 1.

  1. Вызовите функцию PL / R, используя наблюдаемые суммы и суммы модели (GAM):
    correlation_rmse := climate.plr_corr_rmse( v_amount, v_model );
  2. Определять plr_corr_rmse следующим образом (где o а также m представлять наблюдаемые и смоделированные данные):
    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;
    

То o - m неправильно. Я хотел бы разбавить оба набора данных, вычисление mean каждые 5 точек данных (там будет не более 110 точек данных). Например:

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

Затем исправьте расчет RMSE как:

sqrt( mean( omean - mmean ) ^ 2 )

Как вы рассчитываете c( mean(o[1:5]), mean(o[6:10]), ... ) Для произвольной длины вектор в соответствующем количестве контейнеров (5, например, может быть не идеально только для 67 измерений)?

Я не думаю hist Подходит здесь, это?

Попытка решения 2.

Следующий код решит проблему, однако он удаляет точки данных из конца списка (чтобы сделать список делимым на 5). Решение не идеально, поскольку число «5» довольно волшебно.

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

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

Какие еще варианты доступны?

Заранее спасибо.

Это было полезно?

Решение

Вы говорите, что:

Проблема в том, что корреляции (показанные в нижнем левом углу) не точно отражают, насколько тесно модель соответствует данным.

Вы можете рассчитать корреляцию между установленными значениями и измеренными значениями:

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

Я не понимаю, почему вы хотите кормить ваши данные, но вы можете сделать это следующим образом:

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

Он выглядит немного уродливым, но он должен обрабатывать векторы, длина которых не является многократной длиной биннинга (т.е. 5 в вашем примере).

Вы также говорите, что:

Одним из способов улучшения точности корреляции является использование среднеквадратичного коренного квадрата (RMSE).

Я не понимаю, что вы подразумеваете под этим. Корреляция является фактором определения средней ошибки в квадрате - например, см. Уравнение 10 Мерфи (1988, ежемесячный обзор погоды, с. 116, с. 2417-2424). Отказ Но, пожалуйста, объясните, что вы имеете в виду.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top