Модели нелинейной регрессии в PostgreSQL с использованием R - PullRequest
4 голосов
/ 28 мая 2010

Фон

У меня есть климатические данные (температура, осадки, глубина снега) по всей Канаде в период с 1900 по 2009 год. Я написал базовый веб-сайт, и самая простая страница позволяет пользователям выбирать категорию и город. Затем они получают очень простой отчет (без раздела параметров и расчетов):

image

The primary purpose of the web application is to provide a simple user interface so that the general public can explore the data in meaningful ways. (A list of numbers is not meaningful to the general public, nor is a website that provides слишком много входных данных .) Вторичная цель приложения - предоставить климатологам и другим ученым более глубокие способы просмотра данных. (Конечно, используя слишком много входов.)

Набор инструментов

База данных - PostgreSQL с установленным R (в основном). Отчеты пишутся с использованием iReport и генерируются с использованием JasperReports.

Плохой выбор модели

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

SELECT 
  regr_slope( amount, year_taken ),
  regr_intercept( amount, year_taken ),
  corr( amount, year_taken )
FROM
  temp_regression
INTO STRICT slope, intercept, correlation;

Результаты возвращаются в JasperReports с использованием:

SELECT
  year_taken,
  amount,
  year_taken * slope + intercept,
  slope,
  intercept,
  correlation,
  total_measurements
INTO result;

JasperReports вызывает PostgreSQL, используя следующую параметризованную функцию анализа:

SELECT
  year_taken,
  amount,
  measurements,
  regression_line,
  slope,
  intercept,
  correlation,
  total_measurements,
  execute_time
FROM
  climate.analysis(
    $P{CityId},
    $P{Elevation1},
    $P{Elevation2},
    $P{Radius},
    $P{CategoryId},
    $P{Year1},
    $P{Year2}
  )
ORDER BY year_taken

Это не оптимальное решение, поскольку оно создает ложное впечатление, что климат меняется медленно, но устойчиво.

Вопросы

Использование функций, которые принимают два параметра (например, год [X] и количество [Y]), таких как PostgreSQL regr_slope:

  • Какую модель регрессии лучше применить?
  • Какие пакеты CPAN-R предоставляют такие модели? (Устанавливается, в идеале, используя apt-get.)
  • Как можно вызывать функции R в функции PostgreSQL?

Если таких функций не существует:

  • Какие параметры я должен попытаться получить для функций, которые будут производить желаемую подгонку?
  • Как бы вы порекомендовали показать кривую наилучшего соответствия?

Имейте в виду, что это веб-приложение для широкой публики. Если единственный способ проанализировать данные - это оболочка R, то цель была побеждена. (Я знаю, что это не относится к большинству функций R, на которые я смотрел до сих пор.)

Спасибо!

Ответы [ 3 ]

3 голосов
/ 28 мая 2010

Я не думаю, что авторегрессия - это то, что вы хотите. Нелинейный не то, что вы хотите, потому что подразумевает дискретные данные. У вас есть непрерывные данные, это может быть не прямая линия. Если вы просто визуализируете, и особенно если вы не знаете, какой должна быть форма, тогда вам нужна лесса.

Легко также получить полосу доверительного интервала вокруг линии, если вы просто нанесите данные с помощью ggplot2.

qplot(x, y, data = df, geom = 'point') + stat_smooth()

Это будет хороший сюжет.

Если вы хотите более простой граф в прямой R.

plot(x, y)
lines(loess.smooth(x,y))
3 голосов
/ 28 мая 2010

Потрясающий пакет pl / r позволяет вам запускать R внутри PostgreSQL в качестве процедурного языка. Есть некоторые ошибки, потому что R любит думать о данных с точки зрения векторов, а это не то, что делает СУБД. Это по-прежнему очень полезный пакет, поскольку он дает вам R внутри PostgreSQL , сохраняя при этом некоторые обходы вашей архитектуры.

И pl / r для вас apt-get, поскольку некоторое время он был частью Debian / Ubuntu. Начните с apt-cache show postgresql-8.4-plr (то есть на тестировании, есть и другие версии / разновидности).

Что касается подходящего моделирования: это совершенно другая игра в мяч. loess - это справедливое предложение для чего-то непараметрического, и вам, вероятно, также нужна какая-то динамическая модель, либо ARMA / ARIMA, либо лаговая регрессия. Выбор моделирования очень важен, учитывая политизированность темы.

1 голос
/ 28 мая 2010

Могу ли я предложить другое решение? Просто используйте PostgreSQL для извлечения данных, вставьте их в R-скрипт и, наконец, покажите результаты. Сценарий R может быть настолько сложным, насколько вы хотите, если пользователю не нужно иметь с ним дело.

Возможно, вы захотите взглянуть на rapache , модуль Apache, который позволяет запускать R-скрипты на веб-странице. Пара видео, иллюстрирующих его использование:

В частности, проверьте, как Инструмент веб-запросов Estuary Institue Сан-Франциско позволяет пользователю взаимодействовать с параметрами.

Что касается регрессии, я не эксперт, поэтому, возможно, я говорю что-то чрезвычайно глупое ... но разве для этого не подходит что-то вроде регрессии LOESS?

...