Plot.gam içinde kullanılan değerler mgcv olarak nasıl elde edilir?


10

Ben değerlerini öğrenmek istiyorum (x, y)komplo kullanılan plot(b, seWithMean=TRUE)içinde mgcv paketinde. Bu değerleri nasıl çıkarabileceğimi veya hesaplayabileceğimi bilen var mı?

İşte bir örnek:

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)

gamModellere aşina değilim , ama o nesnenin farklı özelliklerini incelediniz mi? İle nesnelerin adlarına bakabilirsiniz names(b). Tahmin edeyim ki, hangi detaylarda olursanız olun o nesnenin içinde bir yerde saklanacaktır.
Chase

Yanıtlar:


19

mgcv1.8-6 ile başlayarak plot.gam, grafikleri oluşturmak için kullandığı verileri görünmez bir şekilde döndürür, yani

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

çizim verilerini içeren bir liste verir pd.


AŞAĞIDAKİ CEVAP mgcv<= 1.8-5:

Ben arsa için arsa fonksiyonları çizmek mgcvşeyler dönmüyor gerçeği tekrar tekrar lanetledim - aşağıdaki çirkin ama çalışır:

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)  
}

Yardımın için çok teşekkürler. Kodunuzu en fazla çoğalttığımda plotData <<- c(plotData, pd[[i]])})) , aşağıdaki ileti oluşur Error in fBody[[i]] : no such index at level 3. Neden işe yaramadığı hakkında bir fikrin var mı?

"İz" hilesi benim için çalışırdı. Ancak, son zamanlarda beni başarısız oldu. İzleme fonksiyonunda farklı bir "at" argümanı gerektirebilecek mgcv paketinin yeni bir sürümü (şu anda v 1.8-3 kullanıyorum) ile ilgili olduğundan şüpheleniyorum. Birisi izleme işlevinin "at" argümanı için doğru vektörü nasıl elde edeceğim konusunda bana yardımcı olabilir mi? Şimdiden çok teşekkürler!

@Pepijn benim düzenlememi gör.
fabians

4

Paket visreg, GAM'a benzer efekt grafikleri oluşturabilir (ancak belki de aynı değil mi?) Ve bir liste olarak biçimlendirilmiş çizim bileşenlerini de çıktı olarak verir. Plyr kullanılarak çıktının veri çerçevesi yapılabilir. Misal:

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

Bu tam bir cevap olmayacak. gamNesneler için tüm çizim fonksiyonu ile yapılıyor plot.gam. Sadece yazarak koduna bakabilirsiniz

> plot.gam

R konsolunda. Gördüğünüz gibi kod çok büyük. Bundan çıkardığım şey, tüm çizimlerin ilgili bilgileri toplayarak yapıldığıpd bir liste olan nesnede . Olası çözümün bir düzenleme olacaktır Yani plot.gamkullanarak, edito nesneyi döndüren böylece, mesela. Sondan pdönce eklemek }yeterli olacaktır. invisible(pd)Bu nesneyi yalnızca siz sorarsanız döndürülecek şekilde eklemeyi öneririm :

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

Daha sonra bu nesneyi kontrol ve kod arama plot.gamhatlar için plotvelines . Sonra ilgili xve ydeğerlerden hangisinin grafikte göründüğünü göreceksiniz .


Hata! Cevabımı gönderdiğimde seninkini görmedim. Neyse, biraz daha detaylı ....
fabians

@fabians, endişelenme, seninkini görürsem benimkini göndermezdim. Genel fikri özetledim, kodu girdiniz. Soru kod istediğinden cevabınız daha iyidir.
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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.