Разработка сценариев с использованием моделей GAM

Я работаю с моделью mgcv::gam в R для создания прогнозов, в которых взаимосвязь между временем (year) и переменной результата (out) меняется. Например, в одном сценарии я хотел бы заставить время влиять на переменную результата линейным образом, в другом — незначительно уменьшающимся образом, а в третьем я хотел бы указать конкретные наклоны взаимодействия времени и результата. Я не уверен, как заставить прогноз обрабатывать взаимодействие между временем и переменной результата определенным образом:

res <- gam(out ~ s(time) + s(GEOID, bs='re'), data = df, method = "REML")
pred <- predict(gam, newdata = ndf, type="response", se=T)

person Emily    schedule 02.04.2019    source источник


Ответы (1)


Между time и out нет взаимодействия; здесь time имеет потенциально нелинейный эффект на out.

Мы говорим о попытках заставить определенные формы выполнять функцию time? Если это так, вам нужно будет оценить различные модели; используйте time, если вам нужен линейный эффект:

res_lin <- gam(out ~ time + s(GEOID, bs='re'), data = df, method = "REML")

и посмотрите на p-сплайны с ограниченной формой, чтобы обеспечить монтонность или отношения вогнутости/выпуклости.

Пакет scam имеет такого рода ограничения и использует mgcv с выбором гладкости GCV, чтобы соответствовать моделям с ограничениями формы.

Что касается указания конкретного наклона для линейного эффекта времени, я думаю, вам нужно будет включить time в качестве смещения в модель. Итак, скажем, наклон, который вы хотите, равен 0,5. Я думаю, вам нужно сделать + offset(I(0.5*time)), потому что смещение по определению имеет коэффициент 1. Я бы еще раз проверил это, хотя, возможно, я испортил свое мышление здесь.

person Gavin Simpson    schedule 03.04.2019
comment
Это действительно полезно - я действительно хотел бы (1) оценить наиболее подходящую историческую модель, а затем (2) заставить временной эффект иметь линейную форму в прогнозах на будущее (поэтому при использовании predict.gam() ) - не уверены, что это возможно? Спасибо! - person Emily; 04.04.2019
comment
Кроме того, можете ли вы добавить масштабирующий ВЕКТОР, а не одно значение? Спасибо еще раз. - person Emily; 04.04.2019
comment
Я не знаю, что вы подразумеваете под вектором масштабирования. Для первого бита посмотрите справку для базиса b-сплайна ?smooth.construct.bs.smooth.spec, так как вам нужно оценить с помощью базиса b-сплайна и соответствующим образом установить диапазон штрафа, чтобы включить период прогноза. - person Gavin Simpson; 05.04.2019
comment
Спасибо, я посмотрю на это. Масштабированный вектор - поэтому вместо масштабирования всего вектора времени на 0,5 я бы масштабировал каждый элемент вектора времени с помощью вектора масштабирования той же длины. длина (масштабный_вектор) = длина (время) - поэтому масштабируйте каждый элемент в векторе на элемент в масштабном_векторе. - person Emily; 05.04.2019