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)
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)
回答:
mgcv
1.8-6以降plot.gam
、プロットの生成に使用するデータを非表示で返します。つまり、
pd <- plot(<some gam() model>)
のプロットデータのリストが表示されpd
ます。
以下のANSWER 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
。それが機能しない理由はありますか?
これは完全な答えにはなりません。gam
オブジェクトのすべてのプロットはfunctionで行われていますplot.gam
。入力するだけでコードを見ることができます
> plot.gam
Rコンソールで。ご覧のとおり、コードは巨大です。私がそれから収集したことは、すべてのプロットpd
は、リストであるオブジェクトに関連情報を収集することによって行われるということです。したがって、考えられる解決策の1つは、たとえばplot.gam
を使用edit
してeditを実行し、そのオブジェクトを返すことです。pd
最後の前に追加する}
だけで十分です。を追加することをお勧めしますinvisible(pd)
。これにより、要求した場合にのみこのオブジェクトが返されます。
> pd <- plot(b,seWithMean = TRUE)
次に、このオブジェクトを検査plot.gam
しplot
、およびの行をコードで検索しますlines
。次に、プロットに表示される関連する値x
とy
値を確認します。
## 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)
gam
モデルに精通していませんが、そのオブジェクトのさまざまな属性を調べましたか?オブジェクトの名前はで確認できますnames(b)
。あなたが求めている詳細は、どこかのそのオブジェクト内に保持されると思います。