循环遍历属性向量以生成组合图

时间:2012-12-11 08:05:58

标签: r graph attr effects

以下是一些代码,它们尝试计算模型中每个预测变量的边际效应(使用effects包),然后绘制结果。为此,我循环遍历"term.labels" glm对象的terms属性。

library(DAAG)
library(effects)

formula = pres.abs ~ altitude + distance + NoOfPools + NoOfSites + avrain + meanmin + meanmax
summary(logitFrogs <- glm(formula = formula, data = frogs, family = binomial(link = "logit")))


par(mfrow = c(4, 2))
for (predictorName in attr(logitFrogs$terms, "term.labels")) {
    print(predictorName)
    effLogitFrogs <- effect(predictorName, logitFrogs)
    plot(effLogitFrogs)
}

这根本不会产生任何图片。另一方面,明确说明预测变量名称确实有效:

effLogitFrogs <- effect("distance", logitFrogs)
plot(effLogitFrogs)

我做错了什么?

2 个答案:

答案 0 :(得分:3)

虽然你调用函数plot(),但实际上它调用函数plot.eff()并且它是格点图,因此忽略par()参数。一种解决方案是使用函数allEffects(),然后使用plot()。这将调用函数plot.efflist()。使用此功能,您不需要循环,因为所有绘图都是自动生成的。

effLogitFrogs <- allEffects(predictorName, logitFrogs)
plot(effLogitFrogs)

编辑 - 带有for循环的解决方案

使用for()循环有“丑陋”的解决方案。为此,我们还需要打包grid。首先,将变量作为行数和列数(现在只能使用1或2列)。然后 grid.newpage()pushViewport()设置图形窗口。

预测变量名称存储在循环外的向量中。使用函数pushViewport()popViewport()所有图都放在同一个图形窗口中。

  library(lattice)
  library(grid)

  n.col=2
  n.row= 4 
  grid.newpage()      
  pushViewport(viewport(layout = grid.layout(n.row,n.col)))

  predictorName <- attr(logitFrogs$terms, "term.labels")

  for (i in 1:length(predictorName)) {
    print(predictorName[i])
    effLogitFrogs <- effect(predictorName[i], logitFrogs)
    pushViewport(viewport(layout.pos.col=ceiling(i/n.row), layout.pos.row=ifelse(i-n.row<=0,i,i-n.row)))
    p<-plot(effLogitFrogs)
    print(p,newpage=FALSE)
    popViewport(1)
  }

答案 1 :(得分:1)

在你的循环中添加print解决问题。

 print(plot(effLogitFrogs))

plot调用plot.eff,无需打印即可创建绘图。

allEffects生成eff.list类型的对象。当我们尝试绘制此对象时,其调用plot.efflist函数会打印图,因此无需像plot.eff那样调用print。