37

qqmath 関数は、lmer パッケージからの出力を使用して、ランダム効果の優れたキャタピラー プロットを作成します。つまり、qqmath は、階層モデルからの切片と点推定値の誤差をプロットするのに優れています。Dyestuff と呼ばれる lme4 パッケージの組み込みデータを使用した lmer 関数と qqmath 関数の例を以下に示します。このコードは、ggmath 関数を使用して、階層モデルと適切なプロットを生成します。

library("lme4")
data(package = "lme4")

# Dyestuff 
# a balanced one-way classiï¬cation of Yield 
# from samples produced from six Batches

summary(Dyestuff)             

# Batch is an example of a random effect
# Fit 1-way random effects linear model
fit1 <- lmer(Yield ~ 1 + (1|Batch), Dyestuff) 
summary(fit1)
coef(fit1) #intercept for each level in Batch 

# qqplot of the random effects with their variances
qqmath(ranef(fit1, postVar = TRUE), strip = FALSE)$Batch

コードの最後の行は、各推定値の周りの誤差を含む各切片の非常に優れたプロットを生成します。しかし、qqmath 関数の書式設定は非常に難しいようで、プロットの書式設定に苦労しています。私は答えられないいくつかの質問を思いつきました.lmer/qqmathの組み合わせを使用している場合、他の人も恩恵を受けることができると思います:

  1. 上記のqqmath関数を使用して、特定のポイントを空にするか塗りつぶすか、ポイントごとに異なる色にするなど、いくつかのオプションを追加する方法はありますか? たとえば、バッチ変数の A、B、および C のポイントを塗りつぶし、残りのポイントを空にすることはできますか?
  2. 各ポイントに軸ラベルを追加することはできますか (たとえば、上または右の y 軸に沿って)。
  3. データの切片は 45 に近いので、ラベルが互いにぶつからないようにラベル間にスペースを追加することはできますか? 主に、グラフ上のポイントを区別/ラベル付けすることに興味がありますが、これは ggmath 関数では面倒/不可能と思われます。

これまでのところ、qqmath 関数に任意のオプションを追加すると、標準プロットであればエラーにならないエラーが発生するので、途方に暮れています。

また、lmer 出力からの切片をプロットするためのより良いパッケージ/関数があると思われる場合は、ぜひお聞かせください。(たとえば、dotplot を使用してポイント 1 ~ 3 を実行できますか?)

編集:合理的にフォーマットできる場合は、代替のドットプロットも受け入れます。私は ggmath プロットの外観が好きなので、それについての質問から始めます。

4

4 に答える 4

42

1つの可能性は、ライブラリを使用ggplot2して同様のグラフを描画し、プロットの外観を調整することです。

まず、ranefオブジェクトはとして保存されrandomsます。次に、切片の分散がオブジェクトに保存されますqq

randoms<-ranef(fit1, postVar = TRUE)
qq <- attr(ranef(fit1, postVar = TRUE)[[1]], "postVar")

オブジェクトrand.intercには、レベル名を持つランダムな切片のみが含まれています。

rand.interc<-randoms$Batch

すべてのオブジェクトが1つのデータフレームに配置されます。エラー間隔sd.intercの場合、分散の平方根の2倍として計算されます。

df<-data.frame(Intercepts=randoms$Batch[,1],
              sd.interc=2*sqrt(qq[,,1:length(qq)]),
              lev.names=rownames(rand.interc))

切片を値に従ってプロットlev.namesで並べ替える必要がある場合は、並べ替える必要があります。インターセプトをレベル名で並べ替える必要がある場合は、この行をスキップできます。

df$lev.names<-factor(df$lev.names,levels=df$lev.names[order(df$Intercepts)])

このコードはプロットを生成します。これで、ポイントはshapeファクターレベルによって異なります。

library(ggplot2)
p <- ggplot(df,aes(lev.names,Intercepts,shape=lev.names))

#Added horizontal line at y=0, error bars to points and points with size two
p <- p + geom_hline(yintercept=0) +geom_errorbar(aes(ymin=Intercepts-sd.interc, ymax=Intercepts+sd.interc), width=0,color="black") + geom_point(aes(size=2)) 

#Removed legends and with scale_shape_manual point shapes set to 1 and 16
p <- p + guides(size=FALSE,shape=FALSE) + scale_shape_manual(values=c(1,1,1,16,16,16))

#Changed appearance of plot (black and white theme) and x and y axis labels
p <- p + theme_bw() + xlab("Levels") + ylab("")

#Final adjustments of plot
p <- p + theme(axis.text.x=element_text(size=rel(1.2)),
               axis.title.x=element_text(size=rel(1.3)),
               axis.text.y=element_text(size=rel(1.2)),
               panel.grid.minor=element_blank(),
               panel.grid.major.x=element_blank())

#To put levels on y axis you just need to use coord_flip()
p <- p+ coord_flip()
print(p)

ここに画像の説明を入力してください

于 2012-12-17T20:36:32.353 に答える