3

下面是一些代码,它试图计算模型中每个预测变量的边际效应(使用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)

我究竟做错了什么?

4

2 回答 2

3

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

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

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

有一个“丑陋”的解决方案可以与for()循环一起使用。为此,我们还需要 package 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)
  }
于 2012-12-11T08:47:48.727 回答
1

添加print到您的循环中解决问题。

 print(plot(effLogitFrogs))

plotcall plot.eff,它创建绘图而不打印它。

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

于 2012-12-11T09:23:21.517 回答