Memprediksi dengan efek acak dalam mgcv gam

10

Saya tertarik dalam memodelkan total tangkapan ikan menggunakan gam dalam mgcv untuk memodelkan efek acak sederhana untuk masing-masing kapal (yang melakukan perjalanan berulang kali dalam perikanan). Saya memiliki 98 subjek, jadi saya pikir saya akan menggunakan gam daripada gamm untuk memodelkan efek acak. Model saya adalah:

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

Saya telah mengkodekan efek acak dengan bs = "re" dan by = dum (saya membaca bahwa ini akan memungkinkan saya untuk memprediksi dengan efek kapal pada nilai prediksi atau nol). "dum" adalah vektor 1.

Model berjalan, tetapi saya mengalami masalah dalam memprediksi. Saya memilih salah satu kapal untuk prediksi (Vessel21) dan nilai rata-rata untuk semua yang lain kecuali prediktor minat untuk prediksi (Jarak).

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)

Kesalahan yang saya dapatkan adalah:

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

Saya pikir ini dipanggil karena VesselID adalah faktor, tapi saya menggunakannya dengan lancar untuk efek acak.

Saya telah berhasil memprediksi penggunaan gam tanpa efek acak sederhana (bs = "re").

Bisakah Anda memberikan saran tentang cara memprediksi model ini tanpa istilah VesselID (tetapi masih memasukkannya dalam kesesuaian)?

Terima kasih!

Meagan
sumber

Jawaban:

20

Dari versi 1.8.8 mgcv predict.gam telah memperoleh excludeargumen yang memungkinkan untuk zeroing out of term dalam model, termasuk efek acak, ketika memprediksi, tanpa trik dummy yang disarankan sebelumnya.

  • predict.gamdan predict.bamsekarang menerima 'exclude'argumen yang memungkinkan istilah (misalnya efek acak) menjadi nol untuk prediksi. Untuk efisiensi, istilah halus yang tidak ada termsatau excludetidak lagi dievaluasi, dan sebaliknya diatur ke nol atau tidak dikembalikan. Lihat ?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

Pendekatan yang lebih tua

Simon Wood telah menggunakan contoh sederhana berikut untuk memeriksa ini berfungsi:

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

Yang berhasil buat saya. Juga:

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

juga berfungsi.

Jadi saya akan memeriksa data yang Anda masukkan newdataadalah apa yang Anda pikirkan karena masalahnya mungkin tidak terjadi VesselID- kesalahan berasal dari fungsi yang akan dipanggil oleh predict()panggilan dalam contoh di atas, dan Rail merupakan faktor dalam contoh pertama.

Gavin Simpson
sumber
Terima kasih, Gavin, untuk contohnya! Dalam mengerjakannya, saya menemukan jawabannya. Anda benar - kesalahan ada di bingkai data data baru. Setelah saya menghapus tanda kutip di sekitar '0' untuk "dum" oleh variabel, saya dapat memprediksi tanpa kesalahan. Kesalahan Rookie, tapi aku telah berjuang dengan itu sepanjang hari dan berpikir itu adalah masalah dengan faktor VesselID yang mulus. Terima kasih banyak!
Meagan
Bagaimana cara menentukan lebih dari satu efek acak untuk dikecualikan exclude? Saya mencoba menggunakan c()tetapi sepertinya tidak berhasil.
Stefano
Menggunakan vektor istilah untuk mengecualikan karya untuk saya: exclude = c("s(x0)", "s(x2)")katakan dari model berikut b<-gam(y~s(x0)+s(I(x1^2))+s(x2)+offset(x3),data=dat)dari ?predict.gamcontoh. Anda perlu menentukan string dalam vektor diteruskan excludedengan notasi yang digunakan oleh summary()saat menampilkan informasi tentang setiap istilah halus
Gavin Simpson