Mgcv गम में यादृच्छिक प्रभावों के साथ भविष्यवाणी करना


10

मैं व्यक्तिगत जहाजों के लिए सरल यादृच्छिक प्रभावों को मॉडल करने के लिए mgcv में गम का उपयोग करके मछली पकड़ने की कुल मॉडलिंग में दिलचस्पी रखता हूं (जो कि मत्स्य में समय के साथ बार-बार यात्राएं करता है)। मेरे पास 98 विषय हैं, इसलिए मैंने सोचा कि मैं यादृच्छिक प्रभावों को मॉडल करने के लिए गम के बजाय गम का उपयोग करूंगा। मेरा मॉडल है:

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" और by = 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

मुझे लगता है कि यह इसलिए कहा जा रहा है क्योंकि वेसलिड एक कारक है, लेकिन मैं यादृच्छिक प्रभावों के लिए इसका उपयोग कर रहा हूं।

मैं सरल यादृच्छिक प्रभावों (bs = "re") के बिना गम का उपयोग करके सफलतापूर्वक भविष्यवाणी करने में सक्षम रहा हूं।

क्या आप इस मॉडल के बिना वेसलिड शब्द की भविष्यवाणी करने के बारे में कोई सलाह दे सकते हैं (लेकिन फिर भी इसे फिटिंग में शामिल करें)?

धन्यवाद!

जवाबों:


20

एमजीसीवी के संस्करण 1.8.8 से 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

पुराना दृष्टिकोण

साइमन वुड ने यह काम करने के लिए निम्नलिखित सरल उदाहरण का उपयोग किया है:

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 यह एक कारक है पहला उदाहरण।


उदाहरण के लिए, गेविन, धन्यवाद! उन लोगों के माध्यम से काम करने में, मुझे लगा। आप सही थे - त्रुटि नएडेटा डेटा फ्रेम में थी। एक बार जब मैंने चर के द्वारा "0" के आसपास के उद्धरण चिह्नों को हटा दिया, तो मैं बिना किसी त्रुटि के भविष्यवाणी करने में सक्षम था। धोखेबाज़ गलती, लेकिन मैं पूरे दिन इसके साथ संघर्ष कर रहा था और सोचा था कि यह वेसलिड फैक्टर के एक चिकनी होने के साथ एक समस्या थी। आपको बहुत - बहुत धन्यवाद!
मेगन

बाहर करने के लिए कोई एक से अधिक यादृच्छिक प्रभाव कैसे निर्दिष्ट कर सकता है exclude? मैं का उपयोग करने की कोशिश की, c()लेकिन यह काम करने के लिए प्रतीत नहीं होता है।
स्टेफानो

मेरे लिए कार्यों को बाहर करने के लिए शब्दों के वेक्टर का उपयोग करना: उदाहरणों से 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()जाने वाले नोटेशन के साथ उत्तीर्ण वेक्टर में तार निर्दिष्ट करने की आवश्यकता है
गेविन सिम्पसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.