2017-01-28 29 views
2

重なり合う密度曲線の下の領域をどのようにして取得できますか?重複密度プロットの面積をggplotで計算するR

Rの問題をどのように解決できますか? (pythonのためのソリューションがここにあります: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 = dpb $ data [1])$ ​​x [x1:x2]、 \t y = dpb $ data [[1]] $ x [= 1]] $ x [= 1]] grt + geom_area ] $ y [x1:x2])、aes(x = x、y = y)、fill = "gray") – user5878028

+0

多分this 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

これは1つの交差点でのみ有効です。だから、0.29は、男性と女性の30%が同じ重量を持っていることを意味していますか? – user5878028

+0

私の実際のデータを使った私の密度プロットは振動していることが分かりましたが、見ることができないのは私が見ることができないからです。しかし、両方の密度分布がy = 0.00 ... 1でフラットラインであるように見える場合、実際には顕微鏡スケールの100万の重なりが存在する。くそー。 Intersectを密度>平均(密度)に制限して作業を試行する* 0.01 – user5878028

+0

@ user5878028いいえ、30%が同じ重量を持っているわけではありません。これは、30%が、反対の性別のより典型的な体重を有することを意味する。私。男性の12%が女性より典型的な体重を有し、女性の17%は男性に典型的な体重を有する。 WRTの複数の交差点、あなたは正しいです。この解は単一の交点を仮定した。 – G5W

0

私は経験的データのためにこれを行う方法を探している、とuser5878028で述べたように、複数の交差点の問題を有していました。

インストールし、ライブラリが「オーバーラップ」をロード(計算を実行する)と(結果を表示)「格子」:いくつかの掘削後、私はしても、全Rの私のようなnoobのために、非常に簡単な解決策を見つけた

library(overlapping) 
library(lattice) 

次に、変数 "x"を比較する2つの密度分布を含むリストとして定義します。この例では、2つのデータセット「DATA1」と「DATA2は」「yourfile」と呼ばれるテキストファイルに両方の列は、次のとおりです。

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

それからちょうども推定を表示するグラフとして出力を表示するように指示%オーバーラップ:

これは、このような人が私を助けたと願っています。ここでのエラーは、例えば重複プロット

overlapping plot

関連する問題