প্লাগ এম.এম.এস. তে ব্যবহার করা মানগুলি কীভাবে পাওয়া যায়?


10

আমি এমজিসিভি প্যাকেজে (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। কোন ধারণা কেন এটি কাজ করে না?

"ট্রেস" কৌশলটি আমার জন্য কাজ করত। তবে এটি সম্প্রতি আমাকে ব্যর্থ করেছিল। আমার সন্দেহ হয় এটি মিগাসিভি প্যাকেজের একটি নতুন সংস্করণ (বর্তমানে আমি v 1.8-3 ব্যবহার করছি) এর সাথে করা উচিত, যার জন্য ট্রেস ফাংশনে একটি ভিন্ন "এট" যুক্তি লাগতে পারে। ট্রেস ফাংশনটির "এট" আর্গুমেন্টের জন্য কীভাবে সঠিক ভেক্টর পাবেন তা সম্পর্কে কেউ আমাকে সহায়তা করতে পারেন? অগ্রিম ধন্যবাদ!

@ পেপিজেন আমার সম্পাদনা দেখুন।
ভক্তরা

4

প্যাকেজটি visregজ্যামের মতোই প্লট তৈরি করতে পারে (তবে সম্ভবত অভিন্ন নয়?) এবং প্লটের উপাদানগুলি আউটপুট হিসাবেও তালিকা হিসাবে ফর্ম্যাট করে। প্লাইর ব্যবহার করে আউটপুটটির ডেটাফ্রেম তৈরি করা যায়। উদাহরণ:

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মানগুলি প্লটে প্রদর্শিত হবে appear


ওহো, আমি আমার উত্তর পোস্ট করার সময় আমি আপনার দেখি নি। ঠিক আছে, যাইহোক এটি আরও কিছুটা বিস্তারিত ....
কবিরা

@ ফ্যাবিয়ানরা, কোনও উদ্বেগ নেই, আমি যদি আপনার দেখি তবে আমার পোস্ট করতাম না। আমি সাধারণ ধারণাটির রূপরেখা দিয়েছি, আপনি কোডটি সরবরাহ করেছেন। যেহেতু প্রশ্ন কোড জিজ্ঞাসা করে, আপনার উত্তর আরও ভাল better
এমপিক্টাস

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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.