mgcv에서 plot.gam에 사용 된 값을 얻는 방법?


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). 나는 당신이 추구하는 세부 사항이 어딘가에 그 객체 안에 유지 될 것이라고 추측합니다.
체이스

답변:


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. 왜 작동하지 않는 아이디어가 있습니까?

"추적"트릭은 저에게 효과적이었습니다. 그러나 최근에 실패했습니다. 추적 기능에서 다른 "at"인수가 필요할 수있는 새로운 버전의 mgcv 패키지 (현재는 v 1.8-3을 사용하고 있음)와 관련이 있다고 생각합니다. 추적 함수의 "at"인수에 대한 올바른 벡터를 얻는 방법에 대해 누구든지 나를 도울 수 있습니까? 미리 감사드립니다!

@Pepijn 내 편집 내용을 참조하십시오.
fabians

4

패키지 visreg는 효과 플롯을 GAM과 유사하게 만들 수 있지만 (동일하지는 않습니까?) 플롯 구성 요소를 출력 형식으로 목록으로 제공합니다. plyr one을 사용하면 출력의 데이터 프레임을 만들 수 있습니다. 예:

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객체에 대한 모든 플로팅은 function으로 수행됩니다 plot.gam. 간단히 입력하여 코드를 볼 수 있습니다

> plot.gam

R 콘솔에서. 보시다시피 코드가 거대합니다. 내가 얻은 것은 모든 음모가 pd목록 인 객체에 관련 정보를 수집하여 수행된다는 것 입니다. 따라서 가능한 해결책 중 하나는 예 를 들어을 plot.gam사용하여 편집 하여 edit해당 객체를 반환하는 것입니다. pd마지막 전에 추가하면 }충분합니다. invisible(pd)이 객체는 요청하는 경우에만 반환되도록을 추가하는 것이 좋습니다.

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

그런 다음이 개체를 검사하고의 코드 검색 plot.gam과 함께 라인 plotlines. 그런 다음 플롯에 나타나는 관련 값 xy값 을 볼 수 있습니다.


죄송합니다. 답변을 게시했을 때 귀하의 것을 보지 못했습니다. 음, 어쨌든 조금 더 자세합니다 ....
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.