Predecir con efectos aleatorios en mgcv gam

10

Estoy interesado en modelar la captura total de peces usando gam en mgcv para modelar efectos aleatorios simples para buques individuales (que realizan viajes repetidos a lo largo del tiempo en la pesquería). Tengo 98 sujetos, así que pensé que usaría gam en lugar de gamm para modelar los efectos aleatorios. Mi modelo es:

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

He codificado el efecto aleatorio con bs = "re" y by = dum (leí que esto me permitiría predecir con los efectos del vaso a sus valores pronosticados o cero). "dum" es un vector de 1.

El modelo funciona, pero tengo problemas para predecir. Elegí uno de los recipientes para las predicciones (Vessel21) y los valores promedio para todo lo demás, excepto el predictor de interés para las predicciones (Distancia).

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)

El error que obtengo es:

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

Creo que esto se llama porque VesselID es un factor, pero lo estoy usando sin problemas para los efectos aleatorios.

He podido predecir con éxito el uso de gam sin los simples efectos aleatorios (bs = "re").

¿Puede dar algún consejo sobre cómo predecir este modelo sin el término VesselID (pero aún así incluirlo en la adaptación)?

¡Gracias!

Meagan
fuente

Respuestas:

20

De la versión 1.8.8 de mgcv se predict.gam ha ganado un excludeargumento que permite la reducción a cero de los términos en el modelo, incluidos los efectos aleatorios, al predecir, sin el truco ficticio que se sugirió anteriormente.

  • predict.gamy predict.bamahora acepte un 'exclude'argumento que permita que los términos (por ejemplo, efectos aleatorios) se pongan a cero para la predicción. Para mayor eficiencia, los términos suaves que no están en termso dentro excludeya no se evalúan, y en su lugar se establecen en cero o no se devuelven. Ver ?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

Enfoque anterior

Simon Wood ha utilizado el siguiente ejemplo simple para comprobar que esto funciona:

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

Lo que funciona para mi. Igualmente:

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

También funciona.

Por lo tanto, verificaría que los datos que está proporcionando newdatason lo que cree que es, ya que el problema puede no estar VesselID: el error proviene de la función que las predict()llamadas en los ejemplos anteriores habrían llamado , y Rail es un factor en el primer ejemplo

Gavin Simpson
fuente
¡Gracias, Gavin, por los ejemplos! Al trabajar en eso, lo descubrí. Estaba en lo correcto: el error estaba en el nuevo marco de datos. Una vez que eliminé las comillas alrededor de '0' para el "dum" por variable, pude predecir sin ningún error. Error de novato, pero había estado luchando con eso todo el día y pensé que era un problema porque el factor VesselID era fluido. Muchas gracias!
Meagan
¿Cómo se puede especificar más de un efecto aleatorio para excluir exclude? Intenté usarlo c()pero no parece funcionar.
Stefano
Usar un vector de términos para excluir funciona para mí: exclude = c("s(x0)", "s(x2)")digamos del siguiente modelo a b<-gam(y~s(x0)+s(I(x1^2))+s(x2)+offset(x3),data=dat)partir de ?predict.gamejemplos. Debe especificar las cadenas en el vector al que se pasó excludecon la notación utilizada summary()al mostrar la información sobre cada término uniforme
Gavin Simpson