Прогнозирование со случайными эффектами в MGCV GAM

10

Я заинтересован в моделировании общего вылова рыбы с использованием gam в mgcv для моделирования простых случайных эффектов для отдельных судов (которые совершают многократные поездки во время промысла). У меня 98 предметов, поэтому я решил использовать гамму вместо гамма для моделирования случайных эффектов. Моя модель:

modelGOM <- gam(TotalFish ~ factor(SetYear) + factor(SetMonth) + factor(TimePeriod) +     
s(SST) + s(VesselID, bs = "re", by = dum) + s(Distance, by = TimePeriod) + 
offset(log(HooksSet)), data = GOM, family = tw(), method = "REML")

Я закодировал случайный эффект с помощью bs = "re" и by = dum (я читал, что это позволило бы мне прогнозировать с помощью эффектов судна при их прогнозируемых значениях или нулевых значениях). «dum» - это вектор 1.

Модель работает, но у меня проблемы с прогнозированием. Я выбрал один из сосудов для предсказаний (Vessel21) и средние значения для всего остального, кроме предиктора интереса для предсказаний (Расстояние).

data.frame("Distance"=seq(min(GOM$Distance),max(GOM$Distance),length = 100),
                             "SetYear" = '2006',
                             "SetMonth" = '6',
                             "TimePeriod" = 'A',
                             "SST" = mean(GOM$SST),
                             "VesselID" = 'Vessel21', 
                             "dum" = '0', #to predict without vessel effect
                             "HooksSet" = mean(GOM$HooksSet))

pred_GOM_A_Swordfish <- predict(modelGOM, grid.bin.GOM_A_Swordfish, type = "response", 
se = T)

Я получаю ошибку:

Error in Predict.matrix.tprs.smooth(object, dk$data) : 
    NA/NaN/Inf in foreign function call (arg 1)
    In addition: Warning message:
    In Ops.factor(xx, object$shift[i]) : - not meaningful for factors

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

Я был в состоянии успешно предсказать, используя gam без простых случайных эффектов (bs = "re").

Можете ли вы дать какой-либо совет о том, как предсказать эту модель без термина VesselID (но все же включить его в пример)?

Спасибо!

Мэган
источник

Ответы:

20

Начиная с версии 1.8.8 mgcv predict.gam получил excludeаргумент, который позволяет обнулить термины в модели, включая случайные эффекты, при прогнозировании, без фиктивного трюка, который был предложен ранее.

  • predict.gamи predict.bamтеперь принять 'exclude'аргумент, позволяющий обнулять термины (например, случайные эффекты) для прогнозирования. Для эффективности, сглаженные термины, не входящие termsили excludeне входящие, больше не оцениваются, а вместо этого устанавливаются в ноль или не возвращаются. См ?predict.gam.
library("mgcv")
require("nlme")
dum <- rep(1,18)
b1 <- gam(travel ~ s(Rail, bs="re", by=dum), data=Rail, method="REML")
b2 <- gam(travel ~ s(Rail, bs="re"), data=Rail, method="REML")

head(predict(b1, newdata = cbind(Rail, dum = dum)))    # ranefs on
head(predict(b1, newdata = cbind(Rail, dum = 0)))      # ranefs off
head(predict(b2, newdata = Rail, exclude = "s(Rail)")) # ranefs off, no dummy

> head(predict(b1, newdata = cbind(Rail, dum = dum)))    # ranefs on
       1        2        3        4        5        6 
54.10852 54.10852 54.10852 31.96909 31.96909 31.96909  
> head(predict(b1, newdata = cbind(Rail, dum = 0)))      # ranefs off
   1    2    3    4    5    6 
66.5 66.5 66.5 66.5 66.5 66.5
> head(predict(b2, newdata = Rail, exclude = "s(Rail)")) # ranefs off, no dummy
   1    2    3    4    5    6 
66.5 66.5 66.5 66.5 66.5 66.5

Старый подход

Саймон Вуд использовал следующий простой пример, чтобы убедиться, что это работает:

library("mgcv")
require("nlme")
dum <- rep(1,18)
b <- gam(travel ~ s(Rail, bs="re", by=dum), data=Rail, method="REML")
predict(b, newdata=data.frame(Rail="1", dum=0)) ## r.e. "turned off"
predict(b, newdata=data.frame(Rail="1", dum=1)) ## prediction with r.e

Который работает для меня. Точно так же:

dum <- rep(1, NROW(na.omit(Orthodont)))
m <- gam(distance ~ s(age, bs = "re", by = dum) + Sex, data = Orthodont)
predict(m, data.frame(age = 8, Sex = "Female", dum = 1))
predict(m, data.frame(age = 8, Sex = "Female", dum = 0))

тоже работает.

Поэтому я хотел бы проверить, что данные, которые вы предоставляете, newdataпредставляют собой то, что, по вашему мнению, является проблемой, с которой может и не быть проблемы VesselID- ошибка исходит от функции, которая была бы вызвана predict()вызовами в приведенных выше примерах, и Rail является фактором первый пример.

Гэвин Симпсон
источник
Спасибо, Гэвин, за примеры! Работая с ними, я понял это. Вы были правы - ошибка была во фрейме данных newdata. Как только я удалил кавычки вокруг «0» для «dum» по переменной, я смог предсказать без каких-либо ошибок. Ошибка новичка, но я боролся с этим весь день и думал, что это была проблема с гладким фактором VesselID. Спасибо огромное!
Meagan
Как можно указать более одного случайного эффекта для исключения exclude? Я пытался использовать, c()но это не похоже на работу.
Стефано
Использование вектора терминов для исключения работ для меня: exclude = c("s(x0)", "s(x2)")скажем, из следующей модели b<-gam(y~s(x0)+s(I(x1^2))+s(x2)+offset(x3),data=dat)из ?predict.gamпримеров. Вам нужно указать строки в векторе, передаваемом excludeв нотации, используемой summary()при отображении информации о каждом гладком члене
Гэвин Симпсон