2017-01-28 216 views
2

如何獲得重疊密度曲線下的面積?使用R計算重疊密度圖的面積ggplot

我該如何解決R問題? (沒有爲蟒蛇這裏的解決方案:Calculate overlap area of two functions

set.seed(1234) 
df <- data.frame(
    sex=factor(rep(c("F", "M"), each=200)), 
    weight=round(c(rnorm(200, mean=55, sd=5), 
       rnorm(200, mean=65, sd=5))) 
) 

(來源:http://www.sthda.com/english/wiki/ggplot2-density-plot-quick-start-guide-r-software-and-data-visualization

ggplot(df, aes(x=weight, color=sex, fill=sex)) + 
geom_density(aes(y=..density..), alpha=0.5) 

「中的情節中所使用的點由ggplot_build(返回),這樣你就可以訪問它們。 「所以,現在,我有點,我可以喂他們約approxfun,但我的問題是,我不知道如何減去密度函數。

任何幫助非常感謝! (而且我相信需求量很高,目前還沒有解決方案。)

+0

產生一個錯誤:'GRT < - ggplot(DF,AES(X =重量,顏色=性,填充=性別))+ geom_density(AES(Y = ..密度..),α= 0。5) DPB < - ggplot_build(GRT) X1 < - 分鐘(其中(DPB $數據[[1]] $ X> = 50)) X2 < - MAX(其中(DPB $數據[[1 ]]> $ x <= 70)) grt + geom_area(data = data.frame(x = dpb $ data [[1]] $ x [x1:x2], \t y = dpb $ data [[1] ] $ Y [X1:X2]),AES(X = X,Y = Y),填充= 「灰色」)' – user5878028

+0

也許這http://stats.stackexchange.com/questions/97596/how-to-calculate重疊經驗概率密度可以幫助 – MLavoie

+0

謝謝,看起來不錯。但是,由於重新縮放,我仍然可以獲得相交的概率嗎?現在就試試。 – user5878028

回答

1

我會做一些基地R地塊,但地塊實際上並不是 解決方案的一部分。他們只是在那裏,以確認我得到正確的 答案。

您可以獲取每個密度函數並求​​解它們相交的位置。

## Create the two density functions and display 
FDensity = approxfun(density(df$weight[df$sex=="F"], from=40, to=80)) 
MDensity = approxfun(density(df$weight[df$sex=="M"], from=40, to=80)) 
plot(FDensity, xlim=c(40,80), ylab="Density") 
curve(MDensity, add=TRUE) 

現在解決了路口

## Solve for the intersection and plot to confirm 
FminusM = function(x) { FDensity(x) - MDensity(x) } 
Intersect = uniroot(FminusM, c(40, 80))$root 
points(Intersect, FDensity(Intersect), pch=20, col="red") 

Intersection of density plots

現在我們可以只整合來獲得重疊區域。

integrate(MDensity, 40,Intersect)$value + 
    integrate(FDensity, Intersect, 80)$value 
[1] 0.2952838 
+0

這隻適用於一個路口,對嗎?所以0.29意味着30%的男人和女人有相同的體重,對嗎? – user5878028

+0

剛剛發現我的密度圖使用我的實際數據是振盪的,雖然我無法看到它,因爲我可以看到的比例和振盪之間的比例是1:10000。然而,如果兩個密度分佈在y = 0.00 ... 1處似乎是平直的,實際上有一百萬個微觀尺度的重疊。該死的。通過限制相交以密度嘗試一種workaorund>平均(密度)* 0.01 – user5878028

+0

@ user5878028沒有,這並不意味着30%的具有相同的重量。這意味着30%的體重比異性更典型。即12%的男性體重更爲典型,17名女性體重正常。 WRT多個交叉點,你是對的。這個解決方案假設一個單一的交叉點 – G5W

0

我正在尋找一種方法來爲經驗數據做到這一點,並有user5878028提到的多個交叉點的問題。一些挖後我發現了一個很簡單的解決方案,即使對於一個總的R小白像我:

安裝並加載庫「重疊的」(其執行的計算)和「格」(其顯示結果):

library(overlapping) 
library(lattice) 

然後定義一個變量「x」作爲包含您要比較的兩個密度分佈的列表。在這個例子中,這兩個數據集「數據1」和「數據2」是所謂的「yourfile」的文本文件都列:

x <- list(X1=yourfile$data1, X2=yourfile$data2) 

然後,只需告訴它顯示輸出作爲劇情也將顯示估計%重疊:

out <- overlap(x, plot=TRUE) 

我希望這可以幫助像它這樣的人幫助我!下面是一個例子重疊情節

overlapping plot