2013-11-29 105 views
6

我想用一個「置信區間」來描繪一些數據的ECDF,這個「置信區間」是用陰影區域代表的,使用ggplot2。我無法合併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 

我能夠使用

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

但是我無法使用lowerupper爲一體的yminymax美學產生的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 

是否有辦法哄geom_ribbon()stat_ecdf()工作產生陰影的置信區間?或者,任何人都可以提出一種替代方法,將由lowerupper定義的陰影多邊形添加爲ECDF圖的圖層?

回答

3

試試這個(在黑暗中拍攝一點的):

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") 

好了,這是不一樣的東西,你想要做什麼,但它應該解釋發生了什麼事情。 stat正在返回一個只包含原始x和計算y的數據幀,所以我認爲這就是你必須處理的。即stat_ecdf只能一次計算單個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

謝謝Troy;當我意識到情節展現的情況時,你的最終想法與@ joran的想法相似,即可以使用'ecdf()'計算適當的'y'數據。綠色的絲帶本質上是我想描繪的。 –