在R和knitr中,我如何绘制INLA结果?

时间:2014-02-03 18:22:08

标签: r graphics latex knitr

我正在尝试在我的编织文档中添加一些INLA代码并打印图表:

使用一个简单的例子

\documentclass{article}

\begin{document}

<<c1>>=
library("INLA")

n = 100
z = runif(n)
eta = 1 + 0.1*z
N = 20

p = exp(eta)/(1+exp(eta))
y = rbinom(n,  size = N, prob = p)
r = inla(y ~ 1 + z,  
         data = data.frame(y, z), 
         family = "binomial", 
         Ntrials = rep(N, n),
        control.family = list(link = "logit"), 
        control.predictor = list(compute=TRUE)
        )
@

<<c2>>=
plot(r, single=TRUE)
@

\end{document}

当我在RStudio中以交互方式运行此代码时,一切正常,我得到了一系列图表。然而,在编织文档之后 - 没有一个被包括在内。

我该如何解决?

更新1我在Google groups上发布了问题,要求包装软件包开发人员澄清。

UPDATE 2 INLA开发者小组的Havard Rue在Google网上论坛上发布了一个Sweave解决方案。诀窍是:

<<results=tex, echo=FALSE>>=
figs = plot(r, single=TRUE, postscript=TRUE, prefix="Sweave/ex1/figure-")

cat("\\begin{figure}[tbp]\n")
cat("\n")
cat("\\centering\n")

for(i in 1:length(figs)) {
    cat("\\includegraphics[width=7cm,height=7cm,angle=-90]{",
    gsub("[.]eps$","",figs[i]), "}\n", sep="")
}

cat("\\caption{XXX}\n")
cat("\\label{fig:11}\n")
cat("\\end{figure}\n")
@

这确实可以胜任这项工作。图形在指定目录中创建,然后放在pdf输出中。然而,由于knitr控件似乎不再起作用,因此需要进行一些修改以进行放置和调整大小。

3 个答案:

答案 0 :(得分:3)

在绘图时,

INLA似乎在做一些非标准的事情。如果没有在RStudio中运行,它会在绘图时打开一个新的绘图窗口(设备)。我认为这意味着knitr没有看到情节,因为它们不在knitr正在使用/监控的设备上。

<击>

<击>

也许你可以通过添加一个块来欺骗INLA

<<>>=
op <- options(device="RStudioGD")
@

在你的knitr文件的开头和

<<>>=
options(op)
@

在文件的末尾(将默认设备重置为适当的位置)。

这是未经测试的,因为我没有安装INLA

<击>

可能需要修改INLA(特别是inla.dev.new)才能打开新设备。一种可行的方法是

noop <- function(...) NULL
assignInNamespace("inla.dev.new", noop, ns="INLA")

这也是未经测试的,可能会破坏INLA的其他部分。

答案 1 :(得分:2)

对INLA开发者之一的讨论的回应

plot()的用途是用结果图生成图(是的,很多)。它们旨在使用标准GUI /终端或RStudio进行交互式使用。

在knitr环境或Sweave中使用时,这种生成图的方式可能不再合适。当有人告诉我们时,我们的包中的问题是固定的。上面提到的修复是由于我自己对Sweave的有限经验,并且众所周知,它不是最好的。如果有人告诉我们他们想要/需要什么,我们很乐意为knitr / Sweave环境添加任何好的解决方案。

最佳, HåvardRue

www.r-inla.org

答案 2 :(得分:0)

我偶然发现了INLAutils package,它有望用ggplot2解决问题。示例代码:

  data(Epil)
  ##Define the model
  formula = y ~ Trt + Age + V4 +
           f(Ind, model="iid") + f(rand,model="iid")
  result = inla(formula, family="poisson", data = Epil, control.predictor = list(compute = TRUE))

  p <- autoplot(result)

结果图:

enter image description here