[R] density ellipses?
Ben Bolker
ben at zoo.ufl.edu
Wed Mar 22 19:04:24 CET 2000
Here are two ellipse() functions I've written in the past, probably very
inefficient but they might give you something to start with. One takes
the center, semiminor and major axes, and rotation, the other takes a
variance-covariance matrix (it was designed for confidence ellipses using
the likelihood ratio test).
Hope they give you a start.
ellipse _ function(x=1,y=1,r1=1,r2=1,ang=0,narc=200,...)
{
rmat <- c(cos(ang),-sin(ang),sin(ang),cos(ang))
calcpt _ function(x,y,r1,r2,ang1) {
r _ rmat %*% c(r1*cos(ang1),r2*sin(ang1))
c(x+r[1],y+r[2])
}
arcs _ matrix(sapply(seq(0,2*pi,len=narc),
function(q)calcpt(x,y,r1,r2,q)),byrow=TRUE,ncol=2)
lines(arcs,...)
}
vcellipse <- function(ctr,varcov,correlation=NULL,
critval=qchisq(0.95,2),nx=200,
fill=FALSE,...) {
# draw the ellipse defined by the center ctr, and either a
# variance vector c(sigma^2(x),sigma^2(y)) and a correlation,
# OR a variance-covariance matrix, plus an optional critical value.
# nx is the number of separate arcs used to draw the ellipse
# plot solution for y of equation: h11*x^2+2*h12*x*y+h22*y^2=critval
#
# reconstruct hessian matrix
if (!is.null(correlation) && (correlation>1 || correlation<(-1)))
stop(paste("Correlation=",correlation," is out of bounds: parameter mixup?"))
if (!is.null(correlation) && is.vector(varcov)) {
v <- matrix(nrow=2,ncol=2)
v[1,1] <- varcov[1]
v[2,2] <- varcov[2]
v[1,2] <- correlation*sqrt(v[1,1]*v[2,2])
v[2,1] <- v[1,2]
} else if (is.matrix(varcov)) {
v <- varcov
}
h <- solve(v)
eps <- 1e-7
## xrad <- sqrt(solve(hess)[1,1]*critval)-eps
xrad <- sqrt(-h[2,2]*critval/(h[1,2]^2-h[1,1]*h[2,2]))-eps # x range
## segments(ctr[1],ctr[2],ctr[1]+xrad,ctr[2],...)
## det >= 0
## (h12^2-h11*h22)*x1^2 > -h22*critval
## x1^2 > -h22*critval/(h12^2-h11*h22)
## x1 > sqrt(-h22*critval/(h12^2-h11*h22)),"\n")
## same as inverting the matrix!
x1 <- seq(-xrad,xrad,length=round(nx/2))
det <- sqrt((h[1,2]^2-h[1,1]*h[2,2])*x1^2+h[2,2]*critval)/h[2,2]
# calculate "top" and "bottom" halves (plus/minus solutions to quadratic)
y1 <- -h[1,2]/h[2,2]*x1 + det
x2 <- rev(x1)
y2 <- -h[1,2]/h[2,2]*x2 - det
# translate ellipse to center
x <- c(x1,x2)+ctr[1]
y <- c(y1,y2)+ctr[2]
x <- c(x,x[1]) # complete ellipse
y <- c(y,y[1])
if (fill)
polygon(x,y,...)
else
lines(x,y,...)
}
On Wed, 22 Mar 2000, Kaspar Pflugshaupt wrote:
> Hello,
>
> has anybody written a function to plot density ellipses (95%, 99% or
> anything) in a scatterplot? I found nothing in any package, nor in the list
> archives.
>
> There does seem to be a contributed package "ellipse" for S-Plus (on
> S-Archive), but it does a lot more than what I would need. Still, if anybody
> ported it to R, I'd be grateful for a link. I'm a bit afraid to try the port
> myself, since the routines do some magic with postscript preambles that I
> don't understand.
>
> Or is there a simple way to implement it myself? The axis directions could
> be extracted from princomp, but how would one plot the ellipses?
>
> Thanks for any tips
>
> Kaspar
>
>
--
Ben Bolker bolker at zoo.ufl.edu
Zoology Department, University of Florida http://www.zoo.ufl.edu/bolker
318 Carr Hall/Box 118525 tel: (352) 392-5697
Gainesville, FL 32611-8525 fax: (352) 392-3704
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
More information about the R-help
mailing list