2

我在 R 中使用 BayesTree 包。使用作者的示例:

##simulate data (example from Friedman MARS paper)
f = function(x){
10*sin(pi*x[,1]*x[,2]) + 20*(x[,3]-.5)^2+10*x[,4]+5*x[,5]
}
sigma = 1.0 #y = f(x) + sigma*z , z~N(0,1)
n = 100 #number of observations
set.seed(99)
x=matrix(runif(n*10),n,10) #10 variables, only first 5 matter
Ey = f(x)
y=Ey+sigma*rnorm(n)

##run BART
set.seed(99)
bartFit = bart(x,y)
plot(bartFit) # plot bart fit

执行 plot(bartFit) 时,它会生成两个图“绘图方法将 mfrow 设置为 c(1,2) 并制作两个图。” 我希望只使用此命令生成的第二个图。有没有一种简单的方法可以只提取第二个情节?

这也提供:

## S3 method for class 'bart':
plot((
   x,
   plquants=c(.05,.95), cols =c('blue','black'),
   ...))

我对 R 比较陌生,一般来说,如果一个命令给出的情节超过 1 个,你怎么能选择你想要的特定情节?例如,在线性模型 (lm) 绘图命令中,您还可以获得多个绘图。

4

1 回答 1

1

好的,我没有解决方案,但也许我正在做某事。首先,我试图弄清楚bartFit第二个图上绘制了哪些列表元素。您可以使用 . 查看 bart 的结构str(bartFit)。似乎第二个情节是从$yand创建的$yhat.train.mean,当您查看它时,这似乎是正确的:

plot(bartFit$yhat.train.mean ~ bartFit$y)

但它显然缺少酒吧。所以我决定改变策略,traceback()看看这些情节是如何创建的。没有运气,直到我更改了 x-scale 的名称以强制出错。

plot(bartFit, xlab="something")

这给了我只有第一个情节,错误信息,但也有能力traceback()。在那里,我可以看到第二个情节是使用以下方法创建的:

4: plot.default(x$y, qm, ylim = range(ql, qu), xlab = "y", ylab = "posterior interval for E(Y|x)", ...)
3: plot(x$y, qm, ylim = range(ql, qu), xlab = "y", ylab = "posterior interval for E(Y|x)", ...)

但这不好。我不知道是什么qm,也不知道ylim范围从何而来。所以我开始玩par. 在那里,我发现了非常非常粗略的解决方案,使用par参数mfg来“强制”仅绘制第二个情节。这仍然会为一个情节留下空白空间,但不会绘制它。但它的行为也很奇怪。棘手的一个。

plot(bartFit)
par(mfg=c(1,2))
plot(bartFit)
于 2013-03-24T19:11:08.203 回答