2013-10-12 8 views
9

私の最初の目標は、個々の点の個体群をプロットし、その個体群の質量を中心にその個体群の80%を囲む凸包を描画することでした。ggplotのstat_density2dを正しく解釈する方法

多くのアイデアを試した後、私が思いついた最善の解決策は、ggplotstat_density2dを使用することでした。これは定性分析には効果的ですが、まだ80%の境界を示す必要があります。私は第80パーセンタイル母集団の境界を概説する方法を探し始めましたが、代わりに80%確率濃度境界で作業することができます。

ここで私は助けを求めています。 kde2dstat_density2dによって使用される)のbinパラメータは明確に文書化されていません。下の例でbin = 4と設定した場合、中央の(緑色)領域を25%の確率の質量とし、黄色、赤色、緑色の領域を75%の確率で表すと解釈しますか?そうであれば、ビンを= 5に変更すると、刻まれた面積は80%の確率の質量に等しくなりますか?

set.seed(1) 
n=100 

df <- data.frame(x=rnorm(n, 0, 1), y=rnorm(n, 0, 1)) 

TestData <- ggplot (data = df) + 
    stat_density2d(aes(x = x, y = y, fill = as.factor(..level..)), 
    bins=4, geom = "polygon",) + 
    geom_point(aes(x = x, y = y)) + 
    scale_fill_manual(values = c("yellow","red","green","royalblue", "black")) 

TestData 

enter image description here

私は[彼らは内に含まれた。..何..levelに基づいてそれらをカウントする方法を見つけるのが大好きだ]が、与えられたテストケースの数を繰り返し、手動で除外したポイントを数えデータのランダムな性質(私の実際のデータとテストデータの両方)、stat_density2dエリア外のポイント数は、助けを求めることを保証するのに十分に変化しました。

要約すると、データフレーム内のポイントの母集団の中央80%の周囲にポリゴンを描画する実践的な手段がありますか?あるいは、私はstat_density2dを使用し、ビンを5に設定して80%確率の質量を生成するのは安全ですか?ブライアン・ハンソンから


優秀な答えは、私がstat_density2dに文書化されていないbinパラメータを渡すことができ、ファジィ概念を払拭します。結果はbinの値が4から6くらいに近づいていたが、彼が述べたように、実際の機能は不明であり、したがって使用できない。

私は、問題を解決するためにDWinの受け入れられた回答で提供されているHDRegionplotを使用しました。そのために、解析を完了するために、SDMToolsパッケージから重心(COGravity)とポリゴン(pnt.in.poly)を追加しました。パッケージ内

library(MASS) 
library(coda) 
library(SDMTools) 
library(emdbook) 
library(ggplot2) 


theme_set(theme_bw(16)) 
set.seed(1) 
n=100 

df <- data.frame(x=rnorm(n, 0, 1), y=rnorm(n, 0, 1)) 

HPDregionplot(mcmc(data.matrix(df)), prob=0.8) 
with(df, points(x,y)) 
ContourLines <- as.data.frame(HPDregionplot(mcmc(data.matrix(df)), prob=0.8)) 
df$inpoly <- pnt.in.poly(df, ContourLines[, c("x", "y")])$pip 

dp <- df[df$inpoly == 1,] 
COG100 <- as.data.frame(t(COGravity(df$x, df$y))) 
COG80 <- as.data.frame(t(COGravity(dp$x, dp$y))) 

TestData <- ggplot (data = df) + 
    stat_density2d(aes(x = x, y = y, fill = as.factor(..level..)), 
    bins=5, geom = "polygon",) + 
    geom_point(aes(x = x, y = y, colour = as.factor(inpoly)), alpha = 1) + 
    geom_point(data=COG100, aes(COGx, COGy),colour="white",size=2, shape = 4) + 
    geom_point(data=COG80, aes(COGx, COGy),colour="green",size=4, shape = 3) + 
    geom_polygon(data = ContourLines, aes(x = x, y = y), color = "blue", fill = NA) + 
    scale_fill_manual(values = c("yellow","red","green","royalblue", "brown", "black", "white", "black", "white","black")) + 
    scale_colour_manual(values = c("red", "black")) 
TestData 
nrow(dp)/nrow(df) # actual number of population members inscribed within the 80% probability polgyon 

enter image description here

答えて

2

HPDregionplot:emdbookはそれを行うことになっています。それはMASS :: kde2dを使用しますが、結果を正規化します。 mcmcオブジェクトが必要であるという私の心には欠点があります。

library(MASS) 
library(coda) 
HPDregionplot(mcmc(data.matrix(df)), prob=0.8) 
with(df, points(x,y)) 

enter image description here

2

さてさて、私はこの回答の完全わからないんだけど、それは部分的にしか答えだと言ってみましょう! stat_density2dが使用する関数であるMASS::kde2dのパラメータはbinではありません。kde2dのヘルプページとそのコード(コンソールに関数名を入力するだけで表示)を見ると、binのパラメータはh(これらの関数がbinhに渡す方法を知っていることはわかりません)だと思います。ヘルプページに続いて、hが指定されていない場合は、MASS:bandwidth.nrdで計算されます。

# The function is currently defined as 
function(x) 
{ 
    r <- quantile(x, c(0.25, 0.75)) 
    h <- (r[2] - r[1])/1.34 
    4 * 1.06 * min(sqrt(var(x)), h) * length(x)^(-1/5) 
} 

これに基づき、私はあなたの最後の質問に対する答えを考える(「私は安全アム...」)間違いなくNO:その関数のヘルプページには、これは言います。上記の関数のは、あなたの前提が安全であるために必要なものですが、明らかに変更されているため、安全ではありません。 HTH。

その他の考え:コードでbins引数を使用しているという証拠はありますか?私はそれが無視されているのだろうかと思っています。その場合は、binsの代わりにhを渡して聞いてみてください。

関連する問題