2011-02-17 95 views
5

我想繪製數據,使得在y軸上會出現概率(範圍[0,1]),在x軸上我具有數據值。數據是連續的(範圍[0,1]),因此我想使用一些核密度估計函數並對其進行歸一化,使得某個點x處的y值意味着在輸入中看到x值的概率數據。使用ggplot2繪製概率(不是密度)

所以,我想問問:

a)它是否合理?我知道我無法看到數據中沒有的值的概率,但我想插入點之間的內核密度估計函數,然後對其進行歸一化。

b)我可以使用ggplot中的任何內置選項,它會覆蓋geom_density()的默認行爲,例如爲了做到這一點?

由於提前,

蒂莫

編輯: 當我說 「正常化」 之前,我其實是 「規模」。但我得到了答案,所以非常感謝大家澄清我的想法。

+3

我不確定你的繪圖概率是什麼意思,但「不是密度」,但你提到想讓內核平滑數據。內核做的是將經驗分佈(即直方圖)變成平滑密度函數(即PDF)。我認爲你必須放棄內核更流暢的要求,或者不打算密度的願望。雖然你可能會在你說「之後使其正常化」時解決這個問題。 – 2011-02-17 19:02:39

+0

謝謝你澄清我的想法。我認爲在這種情況下,僅使用直方圖更合適。如果我試圖用平滑來繪製概率,我想我會混淆任何試圖解釋這些情節的人。 – Timo 2011-02-17 20:12:52

回答

9

這不是一個ggplot的答案,但如果你想把內核平滑和直方圖的想法結合起來,你可以做一個自引導+平滑的方法。

set.seed(1) 
randomData <- c(rnorm(100, 5, 3), rnorm(100, 20, 3)) 
hist(randomData, freq=FALSE) 
lines(density(randomData), col="red") 

enter image description here

:一些合成數據)

開始,你會得到意想不到對頭部和肩部的統計鄉親做醜陋的事情就是這樣,所以你要自己承擔風險使用密度函數有一個合理的智能帶寬計算器,您可以借用:

bw <- density(randomData)$bw 
resample <- sample(randomData, 10000, replace=TRUE) 

然後使用帶寬計算作爲SD到m AKE一些隨機噪聲

noise <- rnorm(10000, 0, bw) 
hist(resample + noise, freq=FALSE) 
lines(density(randomData), col="red") 

enter image description here

嗨,瞧!內核平滑直方圖!

我知道這個長時間的迴應並不是真的回答你的問題,但也許它會提供一些關於如何濫用你的數據的創意。

7

您可以通過調用stat_density()而不是geom_density()來控制ggplot中密度/內核估計的行爲。

見在線用戶手冊:http://had.co.nz/ggplot2/stat_density.html 您可以指定任何由通過統計數據支持的核估計功能::密度()

library(ggplot2) 
df <- data.frame(x = rnorm(1000)) 
ggplot(df, aes(x=x)) + stat_density(kernel="biweight") 

enter image description here

+0

謝謝,雖然我的主要問題是如何擴展..密度..事後,它將對應的概率,在位置x的值發生。但正如@JDLong在上面評論的那樣,這種方法在大多數情況下沒有多大意義。 – Timo 2011-02-17 20:19:21

9

只是彌補@JD長的和@昨日的答案的快速合併:

ggplot(df, aes(x=x)) + 
    geom_histogram(aes(y = ..density..), binwidth=density(df$x)$bw) + 
    geom_density(fill="red", alpha = 0.2) + 
    theme_bw() + 
    xlab('') + 
    ylab('') 

enter image description here

這樣由density函數計算ggplot2的binwidth,以及後繪製在透明度很好的直方圖頂部。但是您應該仔細查看stat_densitiy,因爲@yesterday建議您進一步定製。