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()引数は無視されます。1 つの解決策は、 function を使用してから を使用することallEffects()ですplot()。これは function を呼び出しますplot.efflist()。この関数を使用すると、すべてのプロットが自動的に作成されるため、for ループは必要ありません。

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

編集 - for ループを使用したソリューション

for()ループで使用する「醜い」ソリューションがあります。これには package も必要gridです。まず、行と列の数を変数として作成します (現在は 1 列または 2 列でのみ機能します)。次に grid.newpage()pushViewport()グラフィカルウィンドウを設定します。

予測子の名前は、ループの外側で vector に格納されます。関数を使用する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))

plotを呼び出しplot.effて、印刷せずにプロットを作成します。

allEffectsタイプ のオブジェクトを生成しますeff.list。このオブジェクトをプロットしようとすると、 plot.efflistプロットを印刷する関数が呼び出されるため、 print like を呼び出す必要はありませんplot.eff

于 2012-12-11T09:23:21.517 に答える