Dự đoán với các hiệu ứng ngẫu nhiên trong gamcv gam


10

Tôi quan tâm đến việc mô hình hóa tổng lượng cá đánh bắt bằng cách sử dụng gam trong mgcv để mô hình hóa các hiệu ứng ngẫu nhiên đơn giản cho từng tàu (thực hiện các chuyến đi lặp đi lặp lại theo thời gian trong nghề cá). Tôi có 98 đối tượng, vì vậy tôi nghĩ rằng tôi sẽ sử dụng gam thay vì gamm để mô hình hóa các hiệu ứng ngẫu nhiên. Mô hình của tôi là:

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

Tôi đã mã hóa hiệu ứng ngẫu nhiên với bs = "re" và by = dum (Tôi đọc rằng điều này sẽ cho phép tôi dự đoán với các hiệu ứng tàu ở các giá trị dự đoán của chúng hoặc bằng 0). "dum" là một vectơ của 1.

Mô hình chạy, nhưng tôi có vấn đề dự đoán. Tôi đã chọn một trong các tàu cho các dự đoán (V Tàu21) và các giá trị trung bình cho mọi thứ khác ngoại trừ dự đoán quan tâm cho các dự đoán (Khoảng cách).

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ỗi mà tôi nhận được là:

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

Tôi nghĩ rằng điều này đang được gọi bởi vì VesselID là một yếu tố, nhưng tôi đang sử dụng nó một cách trơn tru cho các hiệu ứng ngẫu nhiên.

Tôi đã có thể dự đoán thành công khi sử dụng gam mà không cần các hiệu ứng ngẫu nhiên đơn giản (bs = "re").

Bạn có thể cung cấp bất kỳ lời khuyên nào về cách dự đoán mô hình này mà không có thuật ngữ VesselID (nhưng vẫn bao gồm nó phù hợp) không?

Cảm ơn bạn!

Câu trả lời:


20

Từ phiên bản 1.8.8 của mgcv predict.gam đã đạt được một excludeđối số cho phép loại bỏ các thuật ngữ trong mô hình, bao gồm các hiệu ứng ngẫu nhiên, khi dự đoán, mà không có thủ thuật giả được đề xuất trước đó.

  • predict.gampredict.bambây giờ chấp nhận một 'exclude'đối số cho phép các thuật ngữ (ví dụ: hiệu ứng ngẫu nhiên) bằng 0 để dự đoán. Đối với hiệu quả, các thuật ngữ trơn tru không trong termshoặc trong excludekhông còn được đánh giá, và thay vào đó được đặt thành không hoặc không được trả về. Xem ?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

Phương pháp cũ hơn

Simon Wood đã sử dụng ví dụ đơn giản sau đây để kiểm tra xem nó có hoạt động không:

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

Mà làm việc cho tôi. Tương tự như vậy:

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

cũng hoạt động.

Vì vậy, tôi sẽ kiểm tra dữ liệu bạn đang cung cấp newdatalà những gì bạn nghĩ là do sự cố có thể không xảy ra VesselID- lỗi xuất phát từ chức năng sẽ được gọi bởi các predict()cuộc gọi trong các ví dụ ở trên Rail là một yếu tố trong ví dụ đầu tiên.


Cảm ơn bạn, Gavin, cho các ví dụ! Khi làm việc thông qua những điều đó, tôi đã tìm ra nó. Bạn đã đúng - lỗi nằm ở khung dữ liệu newdata. Khi tôi xóa các dấu ngoặc kép quanh '0' cho "dum" theo biến, tôi có thể dự đoán mà không có bất kỳ lỗi nào. Rookie nhầm, nhưng tôi đã phải vật lộn với nó cả ngày và nghĩ rằng đó là một vấn đề với yếu tố VesselID là một sự trơn tru. Cảm ơn bạn rất nhiều!
Meagan

Làm thế nào người ta có thể chỉ định nhiều hơn một hiệu ứng ngẫu nhiên để loại trừ với exclude? Tôi đã thử sử dụng c()nhưng nó dường như không hoạt động.
Stefano

Sử dụng một vectơ thuật ngữ để loại trừ các tác phẩm đối với tôi: exclude = c("s(x0)", "s(x2)")nói từ mô hình sau b<-gam(y~s(x0)+s(I(x1^2))+s(x2)+offset(x3),data=dat)từ các ?predict.gamví dụ. Bạn cần chỉ định các chuỗi trong vectơ được truyền excludevới ký hiệu được sử dụng summary()khi hiển thị thông tin về từng thuật ngữ trơn tru
Phục hồi Monica - G. Simpson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.