Ellipse containing percentage of given points in R
Asked Answered
D

1

9

I'm drawing F1/F2 vowel graph (an example is here). Each vowel has several points/values, and I'd like to draw an ellipse around the points, so that:

  • ellipse covers at least 80% of points (ie. in the picture above "i" has several values, but they are contained within the ellipse).
  • is positioned in the direction on min/max values.

I may be complicating the stuff, but trigonometry and maths are Greek to me. Below is what I've tried.

Ellipsoidhull()

Ellipsoidhull() is in the package package "cluster". If I pass to a function a matrix with F1 and F2, it seems to calculate the center of the ellipse, but the directional values are huge. For example:

> olm
      ol.f1 ol.f2 # f1/f2 data
 [1,] 501.3 850.5
 [2,] 488.5 906.5
 [3,] 456.3 857.0
 [4,] 505.8 895.3
 [5,] 499.5 898.0
 [6,] 431.8 891.5
 [7,] 416.3 870.5
 [8,] 506.0 887.8
 [9,] 500.3 985.8
[10,] 513.5 955.3
[11,] 531.5 958.0
[12,] 483.0 847.3
[13,] 533.3 982.8
[14,] 480.8 881.8
[15,] 484.3 884.5

If passed to ellipsoidhull:

> ellipsoidhull(olm)
'ellipsoid' in 2 dimensions:
 center = ( 480.69 904.33 ); squared ave.radius d^2 =  2 
 and shape matrix =
       ol.f1  ol.f2
ol.f1 2115.5 1449.5
ol.f2 1449.5 3558.2
  hence, area  =  14636 

I guess it wouldn't be hard to figure out how to draw an ellipse, but the "shape matrix" (max/min radius values?) is too high. Btw, thanks to #R on Freednode for the tips.

Source code from EMU-R

Then, I've taken a look into the code of EMU-R, R package that works with EMU that can, amongst other things, draw F1/F2 with ellipsoids. The code that seems to do that is here but I don't understand how the ellipse is drawn.

Any help appreciated.

Dari answered 11/7, 2011 at 19:19 Comment(0)
R
13
require(car)
 x=rnorm(100)
 y=1+.3*x+.3*rnorm(100)
 dataEllipse(x,y, levels=0.80)

So with your data:

with(olm ,dataEllipse(ol.f1, ol.f2, levels=0.8) )

Another package, mixtools, has similar capabilities but uses the alpha level rather than the 1-alpha:

 mu <- with(olm, c(mean(ol.f1), mean(ol.f2)) )
 sigma <- var(olm)  # returns a variance-covariance matrix.
 sigma
#          ol.f1     ol.f2
#ol.f1 1077.2098  865.9306
#ol.f2  865.9306 2090.2021

require(mixtools)
#Loading required package: mixtools
#Loading required package: boot
# And you get a warning that ellipse from car is masked.

ellipse(mu, sigma, alpha=0.2, npoints = 200, newplot = FALSE)

Which would overlay the earlier plot with the new estimate (which is slightly narrower in this case.This is the comparison of the two methods

Removal answered 11/7, 2011 at 20:13 Comment(6)
+1 Thank you for this. I have spent a considerable amount of time writing my own function to do exactly this... I'll examine this code with interest.Filberte
Must be a fairly common task. I do not think this exhausts the list of function in CRAN packages that do this service. Pretty sure I have found others in the past when doing "density work".Removal
Thanks for this detailed and illustrated answer! I'm looking forward to implement this ASAP.Dari
Can you "extract" the points within the ellipse in a new vector?Flyspeck
Surely that is a separate question. You should write up an example, show what research you have done and post it if there isn't already a duplicate.Removal
I found the answer here: #18154934 Thanks for your help! (will be useful for future reference :D)Flyspeck

© 2022 - 2024 — McMap. All rights reserved.