「ハンドルバー」プロットの代替グラフィックス


15

私の研究分野では、データを表示する一般的な方法は、棒グラフと「ハンドルバー」の組み合わせを使用することです。例えば、

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

「ハンドルバー」は、作成者に応じて標準誤差と標準偏差を交互に切り替えます。通常、各「バー」のサンプルサイズはかなり小さく、約6です。

これらのプロットは、生物科学で特に人気があるようです-BMC Biologyの最初のいくつかの論文、第3巻を参照してください。

それでは、このデータをどのように提示しますか?

これらのプロットが嫌いな理由

個人的に私はこれらのプロットが好きではありません。

  1. サンプルサイズが小さい場合は、個々のデータポイントを表示しないだけです。
  2. 表示されているのはsdまたはseですか?どちらを使用するかに同意する人はいません。
  3. なぜバーを使用するのですか。データは(通常)0からはなりませんが、グラフの最初のパスからわかるようになっています。
  4. グラフは、データの範囲やサンプルサイズについてはわかりません。

Rスクリプト

これは、プロットの生成に使用したRコードです。そうすれば、(必要に応じて)同じデータを使用できます。

                                        #Generate the data
set.seed(1)
names = c("A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3")
prevs = c(38, 37, 31, 31, 29, 26, 40, 32, 39)

n=6; se = numeric(length(prevs))
for(i in 1:length(prevs))
  se[i] = sd(rnorm(n, prevs, 15))/n

                                        #Basic plot
par(fin=c(6,6), pin=c(6,6), mai=c(0.8,1.0,0.0,0.125), cex.axis=0.8)
barplot(prevs,space=c(0,0,0,3,0,0, 3,0,0), names.arg=NULL, horiz=FALSE,
        axes=FALSE, ylab="Percent", col=c(2,3,4), width=5, ylim=range(0,50))

                                        #Add in the CIs
xx = c(2.5, 7.5, 12.5, 32.5, 37.5, 42.5,  62.5, 67.5, 72.5)
for (i in 1:length(prevs)) {
  lines(rep(xx[i], 2), c(prevs[i], prevs[i]+se[i]))
  lines(c(xx[i]+1/2, xx[i]-1/2), rep(prevs[i]+se[i], 2))
}

                                        #Add the axis
axis(2, tick=TRUE, xaxp=c(0, 50, 5))
axis(1, at=xx+0.1, labels=names, font=1,
     tck=0, tcl=0, las=1, padj=0, col=0, cex=0.1)

6
sd質問とsd質問だけであなたの分野が合意に達するのを助けることは、大きな前進です。それらは完全に異なるものを意味します。
ジョン

私は同意します-それはより小さな地域を与えるため、通常seが選択されます!
csgillespie

たぶんもっと有益なタイトルでしょうか?

3
参考までに、これらの棒グラフには「ダイナマイトプロット」と呼ばれるエラーバーがあります。ここに、他の人が持っているものとまったく同じ推奨事項を示す参考文献をいくつか示します(ドットチャート)。小山達樹、ダイナマイトポスタードラモンド&バウラー、2011年注意してください
アンディW

1
可能であれば、画像を再度追加してください。今度は画像アップローダーを使用して、デッドリンクにならないようにします。
エンドリス

回答:


16

答えてくれてありがとう。完全を期すために、私は通常行うことを含めるべきだと考えました。私は、与えられた提案の組み合わせを行う傾向があります:ドット、箱ひげ図(nが大きい場合)、およびse(またはsd)範囲。

画像をホストしているサイトが正しく機能していないように見えるため、モデレーターによって削除されました。

ドットプロットから、「ハンドルバー」プロットが示唆するデータがはるかに広がっていることが明らかです。実際、A3には負の値があります!


私はこの答えをCWにしたので、私は担当者を獲得しません


3
それは良い答えです。さらに、特にグループごとにこれよりも多くのポイントがある場合、ポイントを水平方向にジッタリングすることをお勧めします。ggplot2では、geom_jitter()がそれを行います。
ハーラン

@ハーラン:同意します。さらに多くのポイントがある場合は、おそらく箱ひげ図を使用します。
csgillespie

1
また、小さなデータセットの散布図も好きです(nb、「ドットプロット」という用語を使用して、わずかに異なるプロットを指します)。ただし、価値があるのは、上のバープロットがこれよりもきれいで読みやすいことです。それが良くなるかどうかはわかりませんが、指摘する価値はあります。
グング-モニカの復職

@Harlan:あるいは、ドットを透明にして、複数のドットを積み重ねてより暗いドットを生成しますか?
エンドリス

このデッドリンクを置き換える元の画像はありますか?
エンドリス14年

10

useRでの「情報アレルギー」と題されたフランクハレルの(最も優秀な)基調講演!先月はこれらに代わるものを示しました。バーが提供する集計によって生データを隠すのではなく、生データは点(または点)としても表示されます。「データを隠す理由」フランクのコメントでした。

アルパブレンディングを考えると、それは最も賢明な提案としてストライキします(そして、全体の話は最も良い、そして重要なナゲットでいっぱいです)。


1
ビデオとして入手できますか?いいな。
ヘンリック

1
その言葉は「最終的にはそうなる」と思います。基調講演が録音されました。
ダークエデルビュッテル

1
これはggplotでは簡単です。つまり、had.co.nz / ggplot2 / geom_jitter.html
マイクデュワー

1
jitterまた、プレーンRです。

2
ただ、プロトコルのために、(ビデオで)フランクの話は今オンラインである:r-bloggers.com/RUG/2010/08/user-2010-conference-videos
タルGalili

7

心理学的な観点から、データとデータに関する不確実性をプロットすることを推奨します。したがって、あなたが示すようなプロットでは、データの範囲の違いを区別する目の能力を最小限に抑えるのに役立つだけで、バーをゼロまで延長することに煩わされることはありません。

さらに、私は率直に反棒グラフです。棒グラフは、2つの変数を同じ美的属性(x軸の位置)にマップします。これにより、混乱が生じる可能性があります。より良いアプローチは、1つの変数をx軸にマッピングし、別の変数を別の美的属性(ポイントの形状や色、またはその両方など)にマッピングすることにより、冗長な美的マッピングを回避することです。

最後に、上記のプロットでは、値の上のエラーバーのみを含めます。これは、値の上下のバーに対する不確実性の間隔を比較する能力を妨げます。

データをプロットする方法は次のとおりです(ggplot2パッケージを使用)。同じシリーズのポイントを結ぶ線を追加することに注意してください。これは、x軸変数のレベル間に合理的な順序関係がある限り、線が接続されている系列が数値の場合にのみ適切であると主張する人もいます(この場合のように)。接続線は、目がx軸上のポイントを関連付けるのに役立ちます。これは、線で際立っている相互作用を検出するのに特に役立ちます。

library(ggplot2)
a = data.frame(names,prevs,se)
a$let = substr(a$names,1,1)
a$num = substr(a$names,2,2)
ggplot(data = a)+
layer(
    geom = 'point'
    , mapping = aes(
        x = num
        , y = prevs
        , colour = let
        , shape = let
    )
)+
layer(
    geom = 'line'
    , mapping = aes(
        x = num
        , y = prevs
        , colour = let
        , linetype = let
        , group = let
    )    
)+
layer(
    geom = 'errorbar'
    , mapping = aes(
        x = num
        , ymin = prevs-se
        , ymax = prevs+se
        , colour = let
    )
    , alpha = .5
    , width = .5
)

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


1
「データと不確実性のみをプロットする」という推奨事項が適格であることを追加する必要があります。プロットされる変数の経験/専門知識を持つ聴衆にデータを提示するときは、データと不確実性のみをプロットします。素朴なオーディエンスにデータを提示し、ゼロが意味のあるデータポイントである場合、オーディエンスがスケールに適応できるようにデータをゼロに拡張してから、ズームインしてデータと不確実性のみを表示します。
マイクローレンス

Rコードを書くのに苦労したので、最終プロットのjpegイメージを含めることができます。画像をimg84.imageshack.usにアップロードするだけで、簡単にリンクできます。ああ、答えてくれてありがとう:)
csgillespie

@csgillespie:完了。
マイクローレンス

geom_ribbon()エラーを示すと、このようなプロットを読みやすくなることがわかりました。1〜2の領域の見かけの推定値を生成したくない場合は、少なくともエラーバーの幅を減らします。
JoFrhwld

@JoFrwld:私もリボンが好きですが、x軸変数が本当に数値である場合のためにリボンを予約する傾向があります。上記の私の回答で違反していると公言する「x軸変数が数値でない限り線を描画しない」ルールの私のバージョン:オップ
マイクローレンス

2

これらのプロットが好きではない理由に興味があります。私は常にそれらを使用しています。明らかなブルーミングを述べることなく、異なるグループの平均を比較し、95%CIが重複するかどうかを確認できます(つまり、真の平均が異なる可能性が高い)。

さまざまな目的のために、シンプルさと情報のバランスをとることが重要だと思います。しかし、これらのプロットを使用すると、「これらの2つのグループは重要な点で互いに異なります」と言っています。

私にはかなり素晴らしいように思えますが、反例を聞きたいと思います。プロットの使用に暗黙的に含まれているのは、データに平均が無効または誤解を招く奇怪な分布がないことです。


これらのプロットが嫌いな理由に関する小さなセクションを追加しました。
csgillespie

1
重複したCIは解釈については、このアウトをチェック@クリスpubs.amstat.org/doi/abs/10.1198/000313001317097960また元の質問は、彼らが二つの異なるものがありながら、交換可能にSEやSDを使用しての混乱の周りにもある
tosonb1

または、このサイトの分析については、stats.stackexchange.com / questions / 18215を参照してください。@ tosonb1リンクがタイムアウトしています。論文への参照を提供してもらえますか?
whuber

2

データが率である場合、つまり成功数を試行回数で割った場合、非常にエレガントな方法はファンネルプロットです。たとえば、http//qshc.bmj.com/content/11/4/390.2.fullを参照してください(リンクにサブスクリプションが必要な場合はおologiesび申し上げます。お知らせください。別のリンクが見つかります)。

それを他のタイプのデータに適応させることは可能かもしれませんが、私は例を見ていません。

更新:

ここに、サブスクリプションを必要としない例へのリンクがあります(そしてそれらがどのように使用されるかについての良い説明があります):http : //understandinguncertainty.org/fertility

標準誤差に対して平均をプロットするだけで、非レートデータに使用できますが、単純さの一部が失われる可能性があります。

ウィキペディアの記事は、メタ分析での使用についてのみ説明しているため、あまり良くありません。私は、それらが他の多くの状況で役立つ可能性があると主張します。


データは必要な料金ではありません。それは何でもかまいません。
csgillespie

残念ながら、サブスクリプションリンク。
マットパーカー

...しかし、ここで漏斗プロット上のWikipediaのリンクです:en.wikipedia.org/wiki/Funnel_plot
マット・パーカー

2

ここでは箱ひげ図を使用します。クリーンで、意味のある、ノンパラメトリック...または分布がより興味深い場合はvioplot


2
私は箱ひげ図やvioplotsは、このような小さなサンプルサイズと適しているだろうかわからない(N = 6)
csgillespie

そうです、質問を十分に注意深く読んでいないので、それはかなり一般的な考えでした。それにもかかわらず、6ポイントは最小限ですが、箱ひげ図には十分だと思います。私はいくつかの実験を行いましたが、それらは有意義でした。一方、箱ひげ図は観測数を示していないことは明らかです(ここでは重要な情報です)。そのため、それとポイントの組み合わせを使用します。

6点で-散布図がおそらく最適です(平均に赤い点を追加することで)
タルガリリ

2
私は通常、ポイントを重ねたボックスプロットを使用しますが、非常に「視覚的」です。代わりに、バイオリンのプロットは私の意見では理解するのが少し難しいです。
ニコ

1
@csgillespie:バーとウィスカのプロットが優れていることを示すものは何ですか?彼らは基本的に箱ひげ図と同じ情報を示しています(あなたが指摘するように、ひげはさまざまなものを表すことができます)、彼らはただ一方向にのみエラーを与えます。 。しかし、ビーンプロット/バイオリンプロットは、ここで説明したように、単なるガウス密度の推定であるため、比較的小さなサンプルサイズでも機能するはずです
naught101

1

上記の@csgillespieの素晴らしいコードを簡素化する:

qplot(
    data=a,
    x=num,
    y=prevs,
    colour=let,
    shape=let,
    group=let,
    ymin=prevs-se,
    ymax=prevs+se,
    position=position_dodge(width=0.25),
    geom=c("point", "line", "errorbar")
    )

0

エラーバーよりもgeom_pointrangeの方が好きで、ラインは役に立つというよりむしろ気を散らすと思います。これは、@ Jamesまたは@csgillespieバージョンよりもずっときれいだと思うバージョンです。

qplot(
 data=a,
 x=num,
 y=prevs,
 colour=let,
 ymin=prevs-se,
 ymax=prevs+se,
 position=position_dodge(width=0.25),
 geom=c("pointrange"), size=I(2)
 )
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.