การทำนายด้วยเอฟเฟกต์แบบสุ่มในเกม mgcv


10

ฉันสนใจในการสร้างแบบจำลองการจับปลาทั้งหมดโดยใช้ gam ใน mgcv เพื่อสร้างเอฟเฟกต์แบบสุ่มง่าย ๆ สำหรับเรือแต่ละลำ ฉันมีวิชา 98 วิชาดังนั้นฉันคิดว่าฉันจะใช้ gam แทน gamm เพื่อจำลองเอฟเฟกต์แบบสุ่ม แบบจำลองของฉันคือ:

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" และโดย = dum (ฉันอ่านว่าสิ่งนี้จะทำให้ฉันสามารถทำนายผลกระทบของเรือที่ค่าที่ทำนายไว้หรือศูนย์ได้) "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เป็นปัจจัยใน ตัวอย่างแรก


ขอบคุณ Gavin สำหรับตัวอย่าง! ในการทำงานผ่านสิ่งเหล่านั้นฉันคิดออก คุณถูกต้อง - ข้อผิดพลาดอยู่ใน data data ของ newdata เมื่อฉันลบเครื่องหมายคำพูดรอบ ๆ '0' สำหรับ "dum" โดยตัวแปรฉันก็สามารถทำนายได้โดยไม่มีข้อผิดพลาดใด ๆ ความผิดพลาดของมือใหม่ แต่ฉันพยายามอย่างหนักตลอดทั้งวันและคิดว่ามันเป็นปัญหากับปัจจัย VesselID ที่ราบรื่น ขอบคุณมาก!
Meagan

เราจะระบุเอฟเฟกต์แบบสุ่มมากกว่าหนึ่งอย่างที่จะยกเว้นได้excludeอย่างไร ฉันพยายามใช้c()แต่ดูเหมือนจะไม่ทำงาน
Stefano

การใช้เวกเตอร์ของคำศัพท์เพื่อยกเว้นผลงานสำหรับฉัน: 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()เมื่อแสดงข้อมูลเกี่ยวกับแต่ละเทอมที่ราบรื่น
Gavin Simpson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.