2011-08-14 41 views
3

我使用ellipsoidhull()函數來派生一個橢圓,它將x,y座標中的所有點綁定在一起。然後,我使用point.in.polygon()函數來預測一組新的X,Y座標是否落入橢圓的內部/外部。plot Ellipse bounding points的百分比

而不是繪製一個限制(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) 

然後「橢圓形」計算其獲得通過,以行其個人分。要做到這一點最終計算的代碼是

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") 

所以這兩個功能的組合與您的數據:

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調用的結果傳遞給任何對象,你想

enter image description here

+0

......這真的很有用。謝謝。你能告訴我水平= 80%是如何選擇積分的嗎?即,它是最小化橢圓面積還是選擇彼此接近的點?我不明白數學是怎麼回事。段又如何影響所得到的橢圓點?我假設越接近和越多,越能準確地限定一組點。 – user645600

+0

它正在計算將被包圍的理論區域,如果數據具有mv正態分佈和數據展示的均值和方差協方差矩陣。如果您想查看「健壯」方法,您可以查看dataEllipse的代碼。你是對的段。它只是確定計算點數。如果您在圖表調用中使用了type =「l」,則會獲得幾乎平滑的橢圓。 –