2013-11-29 12 views
6

私は、ggplot2を使用して、影付き領域で表された「信頼区間」を持つデータのECDFを描画しようとしています。 geom_ribbon()stat_ecdf()を組み合わせると問題が発生し、後の効果が得られません。stat_ecdfとgeom_ribbonを組み合わせるにはどうすればいいですか?

は、次の例のデータを考えてみましょう:

set.seed(1) 
dat <- data.frame(variable = rlnorm(100) + 2) 
dat <- transform(dat, lower = variable - 2, upper = variable + 2) 

> head(dat) 
    variable  lower upper 
1 2.534484 0.5344838 4.534484 
2 3.201587 1.2015872 5.201587 
3 2.433602 0.4336018 4.433602 
4 6.929713 4.9297132 8.929713 
5 3.390284 1.3902836 5.390284 
6 2.440225 0.4402254 4.440225 

私はのyminymax美学としてlowerupperを使用することができませんしかし

library("ggplot2") 
ggplot(dat, aes(x = variable)) + 
    geom_step(stat = "ecdf") 

を使用してvariableの関数ecdfを生成することができていますgeom_ribbon()を使用して、プロットの信頼区間を別の層としてスーパーインポーズします。私が試してみました:

ggplot(dat, aes(x = variable)) + 
    geom_ribbon(aes(ymin = lower, ymax = upper), stat = "ecdf") + 
    geom_step(stat = "ecdf") 

をしかし、これは、次のエラー

Error: geom_ribbon requires the following missing aesthetics: ymin, ymax 

を上げる日陰信頼区間を生成するためにstat_ecdf()での作業にgeom_ribbon()を同軸する方法はありますか?あるいは、lowerupperで定義された網掛けのポリゴンをECDFプロットのレイヤーとして追加する方法をお勧めしますか?

ggplot(dat, aes(x = variable)) + 
    geom_ribbon(aes(x = variable,ymin = ..y..-2,ymax = ..y..+2), stat = "ecdf",alpha=0.2) + 
    geom_step(stat = "ecdf") 

オクラホマので、それはあなたがやろうとしたものと同じものではないが、それが起こっているのかを説明する必要があります

答えて

3

は(暗闇の中でショットのビット)、これを試してみてください。 statは、元のxと計算されたyだけのデータフレームを返しています。だから私はそれがあなたと一緒に作業する必要があると思います。すなわちstat_ecdfは、一度に1つのxに対する累積分布関数のみを計算する。

私は考えることができる唯一の他の事は、別にこのような何か下限と上限を計算し、明らかである:

l <- ecdf(dat$lower) 
u <- ecdf(dat$upper) 
v <- ecdf(dat$variable) 
dat$lower1 <- l(dat$variable) 
dat$upper1 <- u(dat$variable) 
dat$variable1 <- v(dat$variable) 

ggplot(dat,aes(x = variable)) + 
    geom_step(aes(y = variable1)) + 
    geom_ribbon(aes(ymin = upper1,ymax = lower1),alpha = 0.2) 
+0

ありがとうございます。最後の文章を拡大できますか?私がこれを完全に守っているかどうかは確かではありませんが、あなたの答えからわかる限り、 'lower'と' upper'がすでに存在するなら 'stat_ecdf'でこれを行うことはできませんか? +/- 2ビットは単にダミーデータでした。私が持っているCI情報は、適合モデルから計算された導出統計の事後シミュレーションの結果です。 –

+1

@GavinSimpsonはい、それはggplotで直接には不可能だと思いますが(これは追加するには便利な機能かもしれませんが)私が最後のビットで意味したのは、すべてのECDF値を手動で計算してプロットしなければならないかもしれないということでした。 – joran

+0

ありがとう、私はあなたが意味するものを参照して、直接累積比率を計算します。私はそれを与えるでしょう。 +1 –

2

ないあなたはCIを反映したい正確にどのように確かに、しかしggplot_build()はあなたが得ることができますプロットから生成されたデータを元に戻し、好きなものを上書きすることができます。

このグラフに示す:

  • を元=赤リボン
  • 青=元のCIベクトルをとり、上下の一連の関数ecdfを計算し、プロット
  • =緑色
  • 関数ecdf曲線に適用します

enter image description here

g<-ggplot(dat, aes(x = variable)) + 
     geom_step(stat = "ecdf") + 
     geom_ribbon(aes(ymin = lower, ymax = upper), alpha=0.5, fill="red") 

    inside<-ggplot_build(g) 
    matched<-merge(inside$data[[1]],data.frame(x=dat$variable,dat$lower,dat$upper),by=("x")) 

    g + 
     geom_ribbon(data=matched, aes(x = x, 
             ymin = y + dat.upper-x, 
             ymax = y - x + dat.lower), 
        alpha=0.5, fill="blue") + 
     geom_ribbon(data=matched, aes(x = x, 
             ymin = ecdf(dat.lower)(x), 
             ymax = ecdf(dat.upper)(x)), 
        alpha=0.5, fill="green") 
+0

ありがとうトロイ;あなたの最終的なアイデアは、プロットが示したことを理解すると、@ joranの考え方に似ています。すなわち、 'ecdf()'を使って下位および上位CIの適切な 'y'データを計算できます。緑色のリボンは基本的に私が描きたいものです。 –

関連する問題