Mgcv में plot.gam में उपयोग किए गए मान कैसे प्राप्त करें?


10

मैं mgcv पैकेज (x, y)में प्लॉटिंग plot(b, seWithMean=TRUE)में उपयोग किए गए मूल्यों का पता लगाना चाहता हूं । क्या किसी को पता है कि मैं इन मूल्यों को कैसे निकाल या गणना कर सकता हूं?

यहाँ एक उदाहरण है:

library(mgcv) 
set.seed(0)
dat <- gamSim(1, n=400, dist="normal", scale=2) 
b   <- gam(y~s(x0), data=dat) 
plot(b, seWithMean=TRUE)

मैं gamमॉडल से परिचित नहीं हूं , लेकिन क्या आपने उस वस्तु की विभिन्न विशेषताओं की जांच की है? आप के साथ वस्तुओं के नाम देख सकते हैं names(b)। मैं अनुमान लगा रहा हूँ कि आपके बाद जो भी विवरण हैं वह उस वस्तु के भीतर कहीं न कहीं रखे जाएंगे।
चेज

जवाबों:


19

mgcv1.8-6 से शुरू करके, plot.gamभूखंडों को उत्पन्न करने के लिए डेटा का उपयोग करता है, यानी कर रहा है

pd <- plot(<some gam() model>)

आपको प्लॉटिंग डेटा के साथ एक सूची देता है pd


उत्तर के लिए mgcv<= 1.8-5:

मैंने बार-बार इस तथ्य को शाप दिया है कि जिस प्लॉट के लिए mgcvवे प्लॉटिंग कर रहे हैं उसे वापस न करने के लिए प्लॉट फ़ंक्शंस - जो निम्न प्रकार बदसूरत है, लेकिन यह काम करता है:

library(mgcv) 
set.seed(0)
dat <- gamSim(1, n = 400, dist = "normal", scale = 2)
b <- gam(y ~ s(x0) + s(x1) + s(x2) + s(x3), data = dat)

plotData <- list()
trace(mgcv:::plot.gam, at = list(c(27, 1)), 
  ## tested for mgcv_1.8-4. other versions may need different at-argument.
  quote({
    message("ooh, so dirty -- assigning into globalenv()'s plotData...")
    plotData <<- pd
    }))
mgcv::plot.gam(b, seWithMean = TRUE, pages = 1)

par(mfrow = c(2, 2))
for (i in 1:4) {
  plot(plotData[[i]]$x, plotData[[i]]$fit, type = "l", xlim = plotData[[i]]$xlim,
    ylim = range(plotData[[i]]$fit + plotData[[i]]$se, plotData[[i]]$fit -
      plotData[[i]]$se))
  matlines(plotData[[i]]$x, cbind(plotData[[i]]$fit + plotData[[i]]$se, 
    plotData[[i]]$fit - plotData[[i]]$se), lty = 2, col = 1)
  rug(plotData[[i]]$raw)  
}

आपकी मदद के लिए बहुत धन्यवाद। जब मैं आपका कोड पुन: पेश करता हूं plotData <<- c(plotData, pd[[i]])})) , तो निम्न संदेश आता है Error in fBody[[i]] : no such index at level 3। किसी भी विचार क्यों यह काम नहीं करता है?

"ट्रेस" चाल मेरे लिए काम करती थी। हालाँकि, इसने हाल ही में मुझे विफल कर दिया। मुझे संदेह है कि इसे mgcv पैकेज के नए संस्करण के साथ करना है (मैं वर्तमान में v 1.8-3 का उपयोग कर रहा हूं), जिसे ट्रेस फ़ंक्शन में "तर्क" में एक अलग "की आवश्यकता हो सकती है। क्या कोई मेरी मदद कर सकता है कि ट्रेस फ़ंक्शन के "एट" तर्क के लिए सही वेक्टर कैसे प्राप्त करें? अग्रिम में बहुत धन्यवाद!

@Pepijn मेरा संपादन देखें
फबियों

4

पैकेज visregGAM (लेकिन शायद समान नहीं?) के समान प्रभाव वाले भूखंड बना सकता है और एक सूची के रूप में स्वरूपित के रूप में अच्छी तरह से प्लॉट घटकों को भी देता है। प्लायर का उपयोग करके आउटपुट का डेटाफ्रेम किया जा सकता है। उदाहरण:

plot <- visreg(model, type = "contrast")
smooths <- ldply(plot, function(part)   
  data.frame(x=part$x$xx, smooth=part$y$fit, lower=part$y$lwr, upper=part$y$upr))

3

यह पूर्ण उत्तर नहीं होगा। gamऑब्जेक्ट के लिए सभी प्लॉटिंग फ़ंक्शन के साथ किया जा रहा है plot.gam। आप बस टाइप करके इसके कोड को देख सकते हैं

> plot.gam

आर कंसोल में। जैसा कि आप देखेंगे कोड बहुत बड़ा है। मैंने इससे क्या उगल दिया है, कि सभी प्लॉटिंग प्रासंगिक जानकारी pdको एक वस्तु में एकत्रित करके किया जाता है जो कि एक सूची है। इसलिए संभव समाधान में से एक उदाहरण के लिए plot.gamउपयोग करके संपादित करना होगा edit, ताकि यह उस वस्तु को वापस कर दे। pdअंतिम }से पहले जोड़ना पर्याप्त होगा। मैं जोड़ने की सलाह दूंगा invisible(pd), ताकि यह वस्तु तभी वापस लौटाया जाए जब आप इसे मांगेंगे:

> pd <- plot(b,seWithMean = TRUE)

फिर इस ऑब्जेक्ट का निरीक्षण करें और plot.gamलाइनों के लिए कोड में खोजें plotऔर lines। फिर आप देखेंगे कि प्लॉट में कौन से प्रासंगिक xऔर yमूल्य दिखाई देते हैं।


जब मैंने अपना उत्तर पोस्ट किया, तो मैं आपका नहीं देखा। खैर, यह वैसे भी थोड़ा अधिक विस्तृत है ....
फैबियों

@ फबियां, कोई चिंता नहीं, अगर मैंने तुम्हारा देखा तो मैं अपनी पोस्ट नहीं करता। मैंने सामान्य विचार को रेखांकित किया है, आपने कोड प्रदान किया है। चूंकि प्रश्न कोड के लिए पूछता है, इसलिए आपका उत्तर बेहतर है।
एमपिकटास

0
## And this is the code for multiple variables!
require(mgcv)
n      = 100
N      = n
tt     = 1:n
arfun  = c(rep(.7,round(n/3)),rep(.3,round(n/3)),rep(-.3,ceiling(n/3)))
arfun2 = c(rep(.8,round(n/3)),rep(.3,round(n/3)),rep(-.3,ceiling(n/3)))
int    = .1*(tt-mean(tt))/max(tt)-.1*((tt-mean(tt))/(max(tt)/10))^2
y      = rep(NA,n)
s.sample <- N
x        <- 10*rnorm(s.sample)
z        <- 10*rnorm(s.sample)
for(j in 1:n){
  y[j]=int[j]+x[j]*arfun[j]+z[j]*arfun2[j]+rnorm(1)  
}

mod = gam(y ~ s(tt) + s(tt, by=x) + s(tt, by=z)) 
## getting the data out of the plot
plotData <- list()
trace(mgcv:::plot.gam, at=list(c(25,3,3,3)),
      # this gets you to the location where plot.gam calls 
      #    plot.mgcv.smooth (see ?trace)
      # plot.mgcv.smooth is the function that does the actual plotting and
      # we simply assign its main argument into the global workspace
      # so we can work with it later.....

      quote({
        # browser()
        print(pd)
        plotData <<- c(plotData, pd)
      }))

# test: 
mgcv::plot.gam(mod, seWithMean=TRUE)


# see if it succeeded
slct = 3
plot(plotData[[slct]]$x, plotData[[slct]]$fit, type="l", xlim=plotData$xlim, 
     ylim=range(plotData[[slct]]$fit + plotData[[slct]]$se, plotData[[slct]]$fit - 
                plotData[[slct]]$se))
matlines(plotData[[slct]]$x, 
         cbind(plotData[[slct]]$fit + plotData[[slct]]$se, 
               plotData[[slct]]$fit - plotData[[slct]]$se), lty=2, col=1)
rug(plotData[[slct]]$raw)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.