จะรับค่าที่ใช้ใน plot.gam เป็น mgcv ได้อย่างไร?


10

ฉันต้องการทราบค่าที่(x, y)ใช้ในการลงจุดplot(b, seWithMean=TRUE)ในแพ็คเกจmgcv ไม่มีใครรู้ว่าฉันสามารถแยกหรือคำนวณค่าเหล่านี้ได้อย่างไร

นี่คือตัวอย่าง:

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)คุณสามารถดูรายชื่อของวัตถุที่มี ฉันคาดเดารายละเอียดอะไรก็ตามที่คุณเป็นจะถูกเก็บไว้ในวัตถุนั้น
Chase

คำตอบ:


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) ซึ่งอาจต้องการอาร์กิวเมนต์ "at" ที่แตกต่างกันในฟังก์ชันติดตาม ทุกคนสามารถช่วยฉันในการหาเวกเตอร์ที่ถูกต้องสำหรับอาร์กิวเมนต์ "at" ของฟังก์ชันติดตามได้หรือไม่ ขอบคุณมากล่วงหน้า!

@Pepijn ดูการแก้ไขของฉัน
fabians

4

แพ็คเกจvisregสามารถสร้างเอฟเฟกต์คล้ายกับ GAM (แต่อาจไม่เหมือนกันหรือไม่) และให้องค์ประกอบของพล็อตเป็นเอาต์พุตเช่นกันโดยจัดรูปแบบเป็นรายการ การใช้ plyr one สามารถสร้าง dataframe ของเอาต์พุตได้ ตัวอย่าง:

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

ในคอนโซล R อย่างที่คุณจะเห็นรหัสมีขนาดใหญ่มาก สิ่งที่ฉันรวบรวมได้จากนั้นการวางแผนทั้งหมดทำได้โดยการรวบรวมข้อมูลที่เกี่ยวข้องในpdวัตถุซึ่งเป็นรายการ ดังนั้นหนึ่งในวิธีแก้ปัญหาที่เป็นไปได้คือการแก้ไขplot.gamโดยใช้editตัวอย่างเพื่อให้ส่งคืนวัตถุนั้น การเพิ่มpdก่อนหน้า}นั้นจะเพียงพอ ฉันขอแนะนำให้เพิ่มinvisible(pd)เพื่อให้วัตถุนี้ถูกส่งกลับเฉพาะในกรณีที่คุณขอมัน:

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

จากนั้นตรวจสอบวัตถุนี้และค้นหาในรหัสของplot.gamสายด้วยและplot linesจากนั้นคุณจะเห็นว่าเกี่ยวข้องกับอะไรxและyค่าปรากฏในพล็อต


อ๊ะฉันไม่เห็นของคุณเมื่อฉันโพสต์คำตอบของฉัน เอาละมันมีรายละเอียดเล็ก ๆ น้อย ๆ อยู่แล้ว ....
fabians

@fabians ไม่ต้องกังวลฉันจะไม่โพสต์ของฉันถ้าฉันเห็นคุณ ฉันสรุปแนวคิดทั่วไปคุณได้ให้รหัสแล้ว เมื่อคำถามถามหารหัสคำตอบของคุณดีกว่า
mpiktas

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.