Как предсказать GAM с помощью гладких терминов и базовых функций с независимыми данными?

#r #spline #smoothing #gam

#r #сплайн #сглаживание #gam

Вопрос:

Я пытаюсь подогнать модель GAM к взаимодействиям между днями (переменная tt) и запаздывающими предикторами (k = 2), используя k базисных функций.

 library(mgcv)
# Example data
data=data.frame(
tt=1:107, # days
pol=(sample.int(101,size=107,replace=TRUE)-1)/100,
at_rec=sample.int(101,size=107,replace=TRUE),
w_cas=sample.int(2000,size=107,replace=TRUE)
)

# model
gam1<-gam(pol ~ s(tt, k = 10)   
            s(tt, by = Lag(at_rec, k = 2), k = 10) 
            s(tt, by = Lag(w_cas, k = 2), k = 10), 
          data=data,method="GACV.Cp")
summary(gam1)

# while making newdata
> newdata=data.frame(tt=c(12,22),at_rec=c(44,34), w_cas=c(2011,2455))
# and prediction
> predict(gam1,newdata=newdata,se.fit=TRUE)
 

Я получил эту ошибку
«Ошибка в PredictMat (объект $ smooth [[k]], данные): не удается найти по переменной»

Как предсказать такую модель с новыми данными?

Ответ №1:

Я на 99,9% уверен, что predict метод не может найти by термины, потому что они являются функциями переменных, и он ищет переменные с точно указанными вами именами: «Lag (at_rec, k = 2)».

Попробуйте добавить эти переменные с задержкой в свой фрейм данных в качестве явных переменных и переоборудовать модель, и она должна работать:

 data <- transform(data,
                  lag_at_rec = Lag(at_rec, k=2),
                  lag_w_cas = Lag(w_cas, k=2))
gam1 <- gam(pol ~ s(tt, k = 10)   
              s(tt, by = lag_at_rec, k = 10) 
              s(tt, by = lag_w_cas, k = 10), 
            data = data, method = "GACV.Cp")
 

Комментарии:

1. Спасибо за ваш ответ. Это сработало. Т.Е. Я должен сначала применить лаг, а затем подогнать модель. Stackoverflow почему-то не позволяет мне пометить ваш ответ как полезный, потому что у меня недостаточно репутации. Если вы знаете другой способ, как я могу пометить ваш ответ как полезный — дайте мне знать. С наилучшими пожеланиями!