2011-08-14 28 views
3

私はellipsoidhull()関数を使用して、x、y座標のすべての点を囲む楕円を導き出しています。次に、point.in.polygon()関数を使用して、X、Y座標の新しいセットが楕円の内側/外側にあるかどうかを予測します。plot楕円の点の割合を囲む

(x、y)のすべての点を囲む楕円をプロットする代わりに、点の80%を使用することはできますか?ポイントの80%は、最もコンパクトまたは最小の楕円形の領域を形成するように選択することができる。

> xy 

x  y 
3.076 5.208 
3.046 5.123 
2.993 5.108 
3.062 5.134 
3.168 5.223 
3.138 5.284 
3.166 5.319 
3.226 5.411 
3.262 5.417 
3.215 5.234 
3.086 5.019 
3.199 5.167 
3.274 5.596 
3.293 5.608 
3.195 5.396 
3.294 5.374 
2.974 5.539 
3.268 5.377 
3.192 5.298 
3.08 4.916 
3.117 4.985 
3.128 5.118 
3.21 5.373 
3.184 5.282 
3.27 5.291 
3.074 5.175 

> Query 
X  Y 
3.03 5.008 
2.99 5.018 
2.987 4.944 
2.994 4.899 
2.911 4.963 
2.913 4.942 
2.966 4.969 
3.079 5.011 
3.096 5.268 
2.992 5.169 
3.205 5.466 
3.257 5.776 
3.154 5.563 
3.16 5.192 
3.12 5.446 
3.271 5.719 
3.154 5.478 
3.143 5.454 
3.123 5.439 
3.075 5.224 
3.264 5.56 
3.288 5.404 
3.237 5.499 
3.207 5.47 
3.207 5.459 
3.11 5.23 
3.301 5.605 
3.139 4.823 


library(cluster) 
exy <- ellipsoidhull(as.matrix(xy)) 
ellipse <- predict(exy) 
library("sp") 
point.in.polygon(Query$X, Query$Y, ellipse.FAM[,1], ellipse.FAM[,2]) 
+1

を望んではい、それはこの正確な複製で説明したように、次のとおりです。http://stackoverflow.com/q/6655268/602276 – Andrie

+0

@Andrieそれをプロットするのではなく、dataEllipseを使用するときに楕円のxとy座標を取得したいという点を除いて、ほとんど同じですか?これを行う関数はありますか? – user645600

答えて

5

恐らくcluster::ellipsoidhullを使用していました。別のパッケージでは、car::dataEllipse関数は中心、形状、半径の値を計算し、ellipseに渡します。あなたが仮定されるかもしれないようだ「と推測ノーマル」の状況については、関連するコードは次のとおりです。

library(car) 
dataEllipse 
function(x,y, .... 
... 
else { 
     shape <- var(cbind(x, y)) 
     center <- c(mean(x), mean(y)) 
    } 
    for (level in levels) { 
     radius <- sqrt(dfn * qf(level, dfn, dfd) 

次に「楕円は」行に渡されるその個々のポイントを算出します。

getEparams <-function(x,y, level) { dfn <- 2 
     dfd <- length(x) - 1 
     shape <- var(cbind(x, y)) 
     center <- c(mean(x), mean(y)) 
     radius <- sqrt(dfn * qf(level, dfn, dfd)) 
     return(list(center=center, shape=shape, radius=radius)) } 

ellcalc <- function (center, shape, radius, segments=51){segments=segments 
    angles <- (0:segments) * 2 * pi/segments 
    unit.circle <- cbind(cos(angles), sin(angles)) 
    ellipse <- t(center + radius * t(unit.circle %*% chol(shape))) 
    colnames(ellipse) <- c("x", "y") 
    return(ellipse)} 

evals <- getEparams(Query$X, Query$Y, 0.80) 
plot(ellcalc(evals[["center"]], evals[["shape"]], evals[["radius"]])) 
title(main='Output of plot(ellcalc(evals[["center"]], evals[["shape"]], 
          evals[["radius"]]))\nStackOverflow Demonstration') 
points(Query$X, Query$Y, cex=0.3, col="red") 

あなたは明らかに任意のオブジェクトあなたにellcalc呼び出しの結果を保存するか、渡すことができます。最終的な計算は

ellipse <- 
function (center, shape, radius, ....) 
.... 
angles <- (0:segments) * 2 * pi/segments 
    unit.circle <- cbind(cos(angles), sin(angles)) 
    ellipse <- t(center + radius * t(unit.circle %*% chol(shape))) 
    colnames(ellipse) <- c("x", "y") 

したがって、これら2つの関数の組み合わせは、あなたのデータで動作であることを行うためのコード

enter image description here

+0

...それは本当に便利です。ありがとうございました。レベル= 80%がどのようにポイントを選ぶか教えていただけますか?つまり、楕円の面積を最小化するか、または互いに近い点を選択しますか?私は数学的に何が起こっているのか理解していない。また、segment = 51はどのように結果の楕円点に影響を与えますか?私は近いとより多くのポイントがあると仮定している、より正確に1つのポイントのセットをバインドすることができます。 – user645600

+0

データがmv-normal distirbutionを持ち、データが示す平均と分散共分散行列を持つ場合は、囲むことになる理論領域を計算しています。あなたは、 "堅牢な"方法を見たい場合は、dataEllipseのコードを見ることができます。あなたはセグメントについて正しいです。計算される点の数を決定するだけです。プロットコールでtype = "l"を使用した場合、ほぼ滑らかな楕円が得られます。 –