我在R中使用效果包来导出(和绘制)复杂线性模型的效果 .

当我使用 allEffects(linearModel) 时,我可以在屏幕上看到结果并像往常一样将其保存到pdf文件中 . 由于该模型有许多术语,因此输出无效 .

因此,我使用 effects(someTerm, linearModel) 专注于感兴趣的条款,屏幕上的结果是我需要的 . 但是,将其保存为pdf文件时,该文件不包含有用的输出(尽管它占用3.5Kb的空间) . 控制台上的R没有错误消息 .

为了便于理解,我创建了一个简单的数据集和一个用于生成效果图的脚本,就像我尝试使用“真实”模型一样 .

factorData.csv

A,B,C,y
a1,b1,c1,3
a1,b2,c1,4
a2,b1,c1,5
a2,b2,c1,6
a1,b1,c1,2
a1,b1,c2,3.5
a1,b2,c2,4
a2,b1,c2,5.1
a2,b2,c2,6.2

plotEffect.r

require(effects)

dataFile <- '/tmp/factorData.csv'
effectABfile <- '/tmp/effect_AB.pdf'
effectABCfile <- '/tmp/effect_ABC.pdf'
allEffectFile <- '/tmp/lm_eff.pdf'

df <- read.csv(file=dataFile,header=TRUE,sep=',')
linearModel <- lm(y~A*B*C,data=df)
lm_eff <- allEffects(linearModel)

pdf(file=effectABfile)
plot(effect('A:B',linearModel))
dev.off()

pdf(file=allEffectFile)
plot(lm_eff)
dev.off()

pdf(file=effectABCfile)
plot(Effect(c('A','B','C'),linearModel))
dev.off()

如你所见,我试过 allEffectseffectEffect ; allEffects 是唯一适合我的人 . 请注意,该脚本假定数据位于 /tmp/factorData.csv 中 - 您可能需要更改路径 . 我还随机化了生成图的顺序,没有任何效果 .

我在其他地方查看了stackoverflow,并且saving plots to pdfs fails是最接近的,但是那里的建议(在每个绘图之后 dev.off() 发出'close' pdf文件)是我已经做过的事情,如plotEffect.r中所见 .

我在两台机器上尝试了这个脚本,每台机器运行Lubuntu 14.04.1 64位R版3.0.2和使用 install.packages 安装在R中的最新效果包 . 结果是一样的 .

我非常感谢有关如何解决将此绘图类型保存(实例)为pdf的问题的建议 .

Fix/workaround

正如@Roland在下面的评论中所建议的那样,如果您希望将网格图(例如本例中的 effects 图的输出)保存为pdf文件,则单独/手动生成图表会更好/更可靠(而不是在脚本中) . 对于基本图形甚至ggplot2图形来说,它似乎并不是(尽可能多)一个问题,我从来没有遇到过这个问题/过去需要这种解决方法 . 感谢@Roland建议修复此问题!

@Roland还补充说Sys.sleep()可能有助于脚本 . 虽然在我的情况下没有这样做,但我发现可以粘贴几个这样的绘图命令,R会将它们作为批处理运行,将图正确保存为pdf . 因此,我认为应该可以通过采取以下步骤来恢复运行脚本的许多好处:

  • 使用R创建 pdf()plot()dev.off() 三元组命令的文本表示

  • 主脚本将此绘图命令文本(特定于绘图的每个实例)输出到文件

  • 在文本编辑器中打开绘图命令文本

  • 复制命令文件的全部内容并将其粘贴到R控制台中

或者,您可能希望在步骤3和4中使用命令行 - How can I load a file's contents into the clipboard?提供有用的建议 .

这两个阶段的程序是一个合理的解决方法,但可以说应该没有必要 .