2013-08-16 9 views
5

Ich habe diesen Satz von x und y-Koordinaten:Wie erhalten Sie die Längen von Halbachsen einer Ellipse? in R

x<-c(1.798805,2.402390,2.000000,3.000000,1.000000) 
y<-c(0.3130147,0.4739707,0.2000000,0.8000000,0.1000000) 
as.matrix(cbind(x,y))->d 

und ich möchte das Ellipsoid berechnen, das diesen Satz von Punkten enthält, I die Funktion ellipsoidhull() im Paket „Cluster“ zu verwenden, und ich :

> ellipsoidhull(d) 
'ellipsoid' in 2 dimensions:` 
center = (2.00108 0.36696); squared ave.radius d^2 = 2` 
and shape matrix = 
x 0.66590 0.233106 
y 0.23311 0.095482 
    hence, area = 0.60406 

aber es mir nicht klar ist, wie ich aus diesen Ergebnissen zu bekommen, die Längen der großen halb~~POS=TRUNC dieser Ellipse.

Irgendeine Idee?

Vielen Dank im Voraus.

Tina.

+1

könnte durch diese Frage http://stackoverflow.com/questions/3417028/ellipse-around-the-data-in-matlab und die Links dort einige Informationen lesenswert sein, die Eigenwerte der Kovarianzmatrix auf beziehen Matrix zu den Achsen der Ellipse. –

+0

user18441 Ich behandle die Frage als ein geometrisches Problem, also lohnt es sich vielleicht, dass Sie den Link im obigen Kommentar lesen und bessere Werkzeuge (statistische Werkzeuge) verwenden, um damit umzugehen. – agstudy

+1

Noch besser, die Wikipedia-Seite "ellipsoid" definiert die Formmatrix in Bezug auf die Achsen (über die Eigenwerte), so dass Sie in der Lage sein sollten, die Radien explizit zu berechnen. –

Antwort

4

Das Quadrat der Halbachsen sind die Eigenwerte der Formmatrix, mal der mittlere quadratische Radius.

x <- c(1.798805,2.402390,2.000000,3.000000,1.000000) 
y <- c(0.3130147,0.4739707,0.2000000,0.8000000,0.1000000) 
d <- cbind(x, y) 
library(cluster) 
r <- ellipsoidhull(d) 
plot(x, y, asp=1, xlim=c(0,4)) 
lines(predict(r)) 
e <- sqrt(eigen(r$cov)$values) 
a <- sqrt(r$d2) * e[1] # semi-major axis 
b <- sqrt(r$d2) * e[2] # semi-minor axis 
theta <- seq(0, 2*pi, length=200) 
lines(r$loc[1] + a * cos(theta), r$loc[2] + a * sin(theta)) 
lines(r$loc[1] + b * cos(theta), r$loc[2] + b * sin(theta)) 
+0

Danke Vincent. Entschuldige meine Ignoranz."a" und "b" die Längen der Achsen der Ellipse und damit die Halbachsen, die sie durch 2 geteilt werden müssen. Ist das korrekt? – user18441

+0

Yeah yeah, stehlen meine comments-antwort :-). Sehr schöne Details in diesem Code. –

+0

@ user18441: die Kommentare in meinem Code waren falsch, das sind schon die Halbachsen - keine Notwendigkeit, durch 2 zu teilen. –

4

Sie können dies tun:

exy <- predict(ellipsoidhull(d)) ## the ellipsoid boundary 
me <- colMeans((exy))   ## center of the ellipse 

Dann berechnen Sie die minimalen und maximalen Abstand zu bekommen jeweils kleinere und größere Achse:

dist2center <- sqrt(rowSums((t(t(exy)-me))^2)) 
max(dist2center)  ## major axis 
[1] 1.264351 
> min(dist2center) ## minor axis 
[1] 0.1537401 

EDIT Plot der Ellipse mit der Achse:

plot(exy,type='l',asp=1) 
points(d,col='blue') 
points(me,col='red') 
lines(rbind(me,exy[dist2center == min(dist2center),])) 
lines(exy[dist2center == max(dist2center),]) 

enter image description here

+0

Danke agstudy! um sie zu zeichnen, muss ich wohl eine Linie zwischen dem Zentrum der Ellipse und dem Punkt, der am weitesten weg und am nächsten ist, verfolgen. Irgendeine Idee, wie das leicht gemacht werden könnte? – user18441

+0

@ user18441 ja. Sie können meine Bearbeitung sehen. – agstudy

+0

vielen dank! – user18441