Прогнозування з випадковими ефектами в мгcv gam


10

Мене цікавить моделювання загального вилову риби з використанням гами в мгкв для моделювання простих випадкових ефектів для окремих суден (які роблять багаторазові поїздки з часом у риболовлі). У мене 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 (я прочитав, що це дозволить мені передбачити ефекти судна за їх прогнозованими значеннями або нулем). "дум" - вектор 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 є фактором, але я використовую це як гладкий для випадкових ефектів.

Мені вдалося спрогнозувати використання гри без простих випадкових ефектів (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

Старіший підхід

Simon Wood використав наступний простий приклад, щоб перевірити, чи працює це:

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 є фактором перший приклад.


Дякую, Гевін, за приклади! Опрацьовуючи це, я зрозумів це. Ви були правильні - помилка була в кадрі даних нових даних. Після того, як я видалив лапки навколо "0" для "dum" за змінною, я зміг передбачити без помилок. Помилка новачка, але я цілий день боровся з цим і вважав, що це проблема з тим, що фактор VesselID є рівним. Дуже дякую!
Меган

Як можна вказати більше одного випадкового ефекту, який слід виключити за допомогою 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()при відображенні інформації про кожен гладкий термін
Гевін Сімпсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.