2017-03-27 1 views
0

データフレームには、(x、y、boolean)という形式の各ポイントに対して3つの値があります。私は、(x、y)の値で囲まれた領域を見つけたいと思います。その領域のほぼ半分がTRUEで、半分がFALSEです。ポイントの〜50%が2つの値のうちの1つを持つ散布図領域を見つけようとする

私は、各点の3番目の値に従ってデータと色を散布することができますが、私は一般的な考え方を得ていますが、より良い方法があるかどうかは疑問でした。私はあなたが2つのポイントと1つしかTRUEならもう1つはFALSEである十分小さい面積を取るならあなたは50/50を持っているので、どのサイズのエリアを探すべきかを決定する良い方法がなければならないと思っていた。

視覚的には、散布図上に正方形が描かれ、その領域のTRUEとFALSE点の数を確認するたびにx軸とy軸の周りを動くことがわかりますが、何が良いかを判断する方法があります。エリアのサイズは値に基づいていますか?

おかげ

EDIT:G5W's answerは正しい方向への一歩であるが、その散布図に基づいて、私は〜半分のポイントが緑色であり、半分が赤の正方形/長方形のアイデアを作成していますよ。無限大の領域があるかもしれませんが、領域の最適なサイズを決定する良い方法があるかもしれないと考えています(多少の点または何らかの割合が含まれている必要があります)

+1

助けを求めるときは、ヘルプを簡単にするために[再現可能な例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)を提供する必要があります君は。あなたの説明に基づいて、無限に多くの地域を作る可能性が高いので、どのように "良いサイズ"を定義していますか?ある地域を他の地域よりも「良い」ものにするには?正方形または長方形の領域のみを考慮していますか? – MrFlick

+0

TRUEの密度がFALSEの密度とほぼ等しい領域を探していますか? – G5W

+0

@ G5Wはい、それはそれを置くのに最適です。 TRUEよりも約2倍のFALSEがあります。 – mast

答えて

1

以下の更新はあなたが任意のサンプルデータを提供していないので、私はこのようないくつかの偽のデータを作成しました:

TestData = data.frame(x = c(rnorm(100, -1, 1), rnorm(100, 1,1)), 
y = c(rnorm(100, -1, 1), rnorm(100, 1,1)), 
z = rep(c(TRUE,FALSE), each=100)) 

を私は何がしたいことのそれぞれに取り込まれるどのくらいの面積であると思い真と偽のpoi nts。その作業を解釈する方法は、各グループの凸包を見つけてその領域を取ることです。すなわち、グループを含む最小の凸多角形を見つける。関数chullは、一連の点の凸包を計算します。

plot(TestData[,1:2], pch=20, col=as.numeric(TestData$z)+2) 
CH1 = chull(TestData[TestData$z,1:2]) 
CH2 = chull(TestData[!TestData$z,1:2]) 
polygon(TestData[which(TestData$z)[CH1],1:2], lty=2, col="#00FF0011") 
polygon(TestData[which(!TestData$z)[CH2],1:2], lty=2, col="#FF000011") 

Convex hulls

あなたはポリゴンを持ったら、pracmaパッケージからpolyarea機能は面積を計算します。 「符号付き」領域を計算するので、ポリゴンを横断する方向を注意したり、領域の絶対値を取る必要があります。

library(pracma) 
abs(polyarea(TestData[which(TestData$z)[CH1],1], 
    TestData[which(TestData$z)[CH1],2])) 
[1] 16.48692 
abs(polyarea(TestData[which(!TestData$z)[CH2],1], 
    TestData[which(!TestData$z)[CH2],2])) 
[1] 15.17897 



更新

これは、更新され、質問に基づいて完全に異なる答えです。質問が今それを参照しているので私は古い答えを残しています。

質問にはデータに関する情報(「TRUEよりも約2倍多い」)が表示されるため、更新された偽のデータセットを反映させました。

ここで問題となるのは、真密度と偽の密度がほぼ等しい領域です。質問は長方形の領域を求めましたが、少なくともこのデータの場合は難しくなります。理由を知るためには、適切な視覚化を得ることができます。

MASSパッケージの関数kde2dを使用して、TRUEポイントとFALSEポイントの2次元密度を得ることができます。この2つの密度の差をとると、差がゼロに近い領域しか見つけられません。密度の差があれば、これを等高線プロットで可視化することができます。プロットで

library(MASS) 
Grid1 = kde2d(TestData$x[TestData$z], TestData$y[TestData$z], 
    lims = c(c(-3,3), c(-3,3))) 
Grid2 = kde2d(TestData$x[!TestData$z], TestData$y[!TestData$z], 
    lims = c(c(-3,3), c(-3,3))) 
GridDiff = Grid1 
GridDiff$z = Grid1$z - Grid2$z 
filled.contour(GridDiff, color = terrain.colors) 

Contour plot

はるかにTRUE偽未満(-1,1)に近いがあること場所を簡単に確認することができ、どこで、(1近くTRUEよりFALSEがあります - 1)。密度の差がゼロに近い場所は、線y = xの一般的な領域の狭い帯域にあることも分かります。より多くのTRUEを持つ領域がより偽の領域によってバランスが取られているが、密度が同じ領域が小さいボックスを得ることができるかもしれません。

もちろん、これはあなたの実際のデータとほとんど関係がない私の偽のデータセットです。あなたはあなたのデータについて同じ種類の分析を実行することができます。そして、あなたは、ほぼ等しい密度のより大きな領域で幸運になるでしょう。

+0

これは役に立ちましたが、私が進めていたものではありません。私はあなたの画像(https://i.imgur.com/1C0RaUO.png)を編集し、(この画像には正確ではないが推定値)半分の点が緑色で、半分が赤色である領域を追加しました。私はそこに無限の量の領域があることを理解しています(サイズを変えて移動する場合)。領域の決定に関する提案を探します。 – mast

+0

データの_all_にTRUEとFALSEの数はほぼ同じですか? – G5W

関連する問題