Predire con effetti casuali nella gamma mgcv


10

Sono interessato a modellare il pescato totale usando gam in mgcv per modellare semplici effetti casuali per le singole navi (che effettuano viaggi ripetuti nel tempo nel settore della pesca). Ho 98 soggetti, quindi ho pensato di usare gam invece di gamm per modellare gli effetti casuali. Il mio modello è:

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")

Ho codificato l'effetto casuale con bs = "re" e con = dum (ho letto che questo mi permetterebbe di prevedere con gli effetti della nave ai loro valori previsti o zero). "dum" è un vettore di 1.

Il modello funziona, ma ho problemi di previsione. Ho scelto una delle navi per le previsioni (Vessel21) e valori medi per tutto il resto tranne il predittore di interesse per le previsioni (Distanza).

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)

L'errore che sto ricevendo è:

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

Penso che questo venga chiamato perché VesselID è un fattore, ma lo sto usando per gli effetti casuali.

Sono stato in grado di prevedere con successo l'utilizzo di gam senza i semplici effetti casuali (bs = "re").

Potete fornire qualche consiglio su come prevedere questo modello senza il termine VesselID (ma includendolo comunque nell'adattamento)?

Grazie!

Risposte:


20

Dalla versione 1.8.8 di mgcv predict.gam ha ottenuto un excludeargomento che consente di azzerare i termini nel modello, inclusi gli effetti casuali, quando si prevede, senza il trucco fittizio che era stato suggerito in precedenza.

  • predict.game predict.bamora accetta un 'exclude'argomento che consente di azzerare i termini (ad esempio effetti casuali) per la previsione. Per l'efficienza, liscia termini non in termso excludenon sono più valutate, e sono invece impostato a zero o non restituiti. Vedere ?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

Approccio precedente

Simon Wood ha usato il seguente semplice esempio per verificare che funzioni:

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

Che funziona per me. Allo stesso modo:

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))

funziona anche.

Quindi verificherei che i dati che stai fornendo newdatasono ciò che pensi sia perché il problema potrebbe non essere VesselID- l'errore proviene dalla funzione che sarebbe stata chiamata dalle predict()chiamate negli esempi sopra, ed Rail è un fattore nel primo esempio.


Grazie, Gavin, per gli esempi! Nel lavorare su quelli, l'ho capito. Avevi ragione: l'errore era nel frame di dati newdata. Una volta rimosse le virgolette intorno a '0' per "dum" per variabile, sono stato in grado di prevedere senza errori. Errore da principiante, ma avevo lottato per tutto il giorno e ho pensato che fosse un problema con il fattore VesselID che era liscio. Grazie mille!
Meagan,

Come si può specificare più di un effetto casuale da escludere exclude? Ho provato a usare c()ma non sembra funzionare.
Stefano

Usare un vettore di termini per escludere funziona per me: exclude = c("s(x0)", "s(x2)")diciamo dal seguente modello b<-gam(y~s(x0)+s(I(x1^2))+s(x2)+offset(x3),data=dat)dagli ?predict.gamesempi. Devi specificare le stringhe nel vettore passato a excludecon la notazione usata da summary()quando si visualizzano le informazioni su ciascun termine regolare
Gavin Simpson
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.