11

データと ANOVA 統計を視覚化したいと考えています。重要な違いと相互作用を示す線が追加された棒グラフを使用してこれを行うのが一般的です。Rを使用してこのようなプロットを作成するにはどうすればよいですか?

これは私が望むものです:

大きな違い:

大きな違い

重要な相互作用:

重要な相互作用

バックグラウンド

私は現在barplot2{ggplots}、バーと信頼区間をプロットするために使用していますが、仕事を成し遂げるために任意のパッケージ/手順を使用したいと思っています. 私が現在使用している統計を取得するには、TukeyHSD{stats}またはpairwise.t.test{stats}違いと、交互作用の anova 関数 ( aovezANOVA{ez}gls{nlme}) のいずれかを取得します。

アイデアを与えるために、これは私の現在のプロットです: CI を含む barplot2

4

3 に答える 3

9

barplot2()ライブラリの関数を使用しているのでgplots、このアプローチを使用した例を示します。

まず、関数のヘルプファイルに記載されている棒グラフを作成しましたbarplot2()ci.lおよびci.uは偽の信頼区間値です。棒グラフはオブジェクトとして保存する必要があります。

hh <- t(VADeaths)[1:2, 5:1]
mybarcol <- "gray20"
ci.l <- hh * 0.85
ci.u <- hh * 1.15
mp <- barplot2(hh, beside = TRUE,
               col = c("grey12", "grey82"),
               legend = colnames(VADeaths)[1:2], ylim = c(0, 100),
               cex.names = 1.5, plot.ci = TRUE, ci.l = ci.l, ci.u = ci.u)

オブジェクトを見るとmp、すべてのバーのx座標が含まれています。

 mp
     [,1] [,2] [,3] [,4] [,5]
[1,]  1.5  4.5  7.5 10.5 13.5
[2,]  2.5  5.5  8.5 11.5 14.5

ここで、信頼区間の上限値を使用して、セグメントのy値の座標を計算します。セグメントは、信頼区間の終わりより1高い位置から開始します。y.cord4つの行が含まれています。最初の行と2番目の行は最初のバーに対応し、他の2つの行は2番目のバーに対応します。最高のy値は、各バーペアの信頼区間の最大値から計算されます。 値は、オブジェクトにx.cordある同じ値を2回ずつ繰り返すだけです。mp

y.cord<-rbind(c(ci.u[1,]+1),c(apply(ci.u,2,max)+5),
          c(apply(ci.u,2,max)+5),c(ci.u[2,]+1))
x.cord<-apply(mp,2,function(x) rep(x,each=2))

棒グラフを使用sapply()して、計算された座標を使用して5つの線分を作成した後(今回は5つのグループがあるため)。

sapply(1:5,function(x) lines(x.cord[,x],y.cord[,x]))

セグメントの上にテキストをプロットするには、x座標とy座標を計算します。ここで、xは2つのバーのx値の中間点であり、y値は各バーペアの信頼区間の最大値に定数を加えて計算されます。次に、関数text()を使用して情報を追加します。

x.text<-colMeans(mp)
y.text<-apply(ci.u,2,max)+7
text(c("*","**","***","NS","***"),x=x.text,y=y.text)

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

于 2013-03-21T13:02:32.463 に答える
3

あなたの質問は多かれ少なかれ解決されたと思いますので、代わりに、データの視覚的表現にはるかに優れた別の方法であるドットプロットを使用することをお勧めします。例として、棒グラフを同様のデータ ポイントで作成されたドット プロットと比較します。

#example data similar to your barplot
d <- data.frame(group=rep(c("control","group1","group2"),each=4),
                esker=c(1.6,1.4,1.8,1.5,2,1.8,1.6,1.4,2.3,2,1.7,1.4),
                se=rep(0.1,12),
                cond=rep(c("t1","t2","t3","t4"),3))
#dotplot - you need Hmisc library for version with error bars
library(Hmisc)
Dotplot(cond ~ Cbind(esker, esker+se, esker-se) | group, data=d, col=1, 
        layout=c(1,3), aspect="xy",
        par.settings = list(dot.line=list(lwd=0), plot.line=list(col=1)))

ここに画像の説明を入力

それをバープロットと比較します。ドットプロットでは、水平方向にプロットすると違いがずっと簡単にわかります。条件を示すために追加の凡例やバー、色は必要ありません。ガイドラインやその他のノイズ要素は必要ありません。これらの 3 つのパネルにすべてが含まれています。もちろん、重要な効果を強調したい場合や、少数の条件でうまく機能する場合があることは理解しています. しかし、因子の数が増えると、プロットは星やたわごとであふれます。

複雑にしないでおく。それをドットプロットにしてください。詳細については、William Cleveland と Edward Tufte の書籍を参照してください。

于 2013-03-21T16:53:18.407 に答える
0

barplot の代わりに ggplot を使用することをお勧めします。次のように手動で線を作成できます。

これは、次のような data.table で始まります: data.table used

gg <- ggplot(data, aes(x = time, y = mean, fill = type)) +
    geom_bar(stat = "identity", position = "dodge") +
    scale_fill_manual(values = c("RGX" = "royalblue2", "EX" = "tomato2")) +
    xlab("Post-treatment Time Point (months)") +
    ylab(paste("data", "Change Score")) +
    scale_y_continuous(expand = c(0, 0)) +
    ylim(c(0,max(data$mean*1.5)))

# add horizontal bars
gg <- gg + geom_errorbar(aes(ymax = hline, ymin = hline), width = 0.45)

# add vertical bars
gg <- gg + geom_linerange(aes(ymax = max(data$mean)+3, ymin = max(data$mean)+1), position = position_dodge(0.9))

# add asterisks   
gg <- gg + geom_text(data = data[1:2], aes(y = max(data$mean)+4), label = ifelse(data$p_value[1:2] <= 0.4, "*", ifelse(data$p_value[1:2] <= 0.05, "*", "")), size = 8)

gg

プロット出力

于 2017-01-11T23:11:34.623 に答える