以下是一些代码,它们尝试计算模型中每个预测变量的边际效应(使用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)
我做错了什么?
答案 0 :(得分:3)
虽然你调用函数plot()
,但实际上它调用函数plot.eff()
并且它是格点图,因此忽略par()
参数。一种解决方案是使用函数allEffects()
,然后使用plot()
。这将调用函数plot.efflist()
。使用此功能,您不需要循环,因为所有绘图都是自动生成的。
effLogitFrogs <- allEffects(predictorName, logitFrogs)
plot(effLogitFrogs)
使用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。