Finding the parts of the ellipse from my data in R

妖精的绣舞 提交于 2019-12-13 06:59:54

问题


Given a set of data I have calculated an ellipse that fit to them using the next command:

eli<-ellipse(cor(x,y),scale=c(sd(x),sd(y)), centre=c(mean(x), mean(y)), level = 0.95)

Where "x" and "y" are the columns of my bivariate data. I would like to know how to find the elements of my ellipse (in red), say: the foci and the a" and "b" values.

In an attempt to find the semi-axis distance I tried to get a lineal regression of the data but I truly doubt of my method

How can I find those parameters? Or get the equation of the ellipse?


回答1:


Since ellipse generates 100 points, this approach may be accurate enough. Of course you could set npoints to higher value to increase accuracy. I've also made plots to explain.

#rm(list = ls()) #Remove everything from the environment

#Generate some points
set.seed(42)
x = rnorm(20,5,1)
y = rnorm(20,5,2)

#Fit Ellipse
require(ellipse)
eli = ellipse(cor(x,y),scale=c(sd(x),sd(y)), centre=c(mean(x), mean(y)), level = 0.95, npoints = 250)

#Draw ellipse and points
plot(eli[,1], eli[,2], type = "l", asp = 1) 
points(x,y)

#Calculate the center of ellipse
eli_center = c(mean(eli[,1]), mean(eli[,2]))

#Plot eli_center
points(eli_center[1], eli_center[2], pch = 19, cex = 1.5)

#A function to calculate distance between points 'x1' and 'x2'
dist_2_points <- function(x1, x2) {
    return(sqrt(sum((x1 - x2)^2)))    
}

#Compute distance of each point in ellipse from eli_center
distance = numeric(0)
for (i in 1:nrow(eli)){ 
    distance[i] = dist_2_points(eli_center, eli[i,])
}

#The maximum distance from eli_center is 'a'
a = distance[which.max(distance)]
a_point = eli[ which.max(distance), ]
#Draw 'a'
points(a_point[1],a_point[2], pch = 5)
lines(rbind(eli_center, a_point))

#The minimum distance from eli_center is 'b'
b = distance[which.min(distance)]
b_point = eli[ which.min(distance), ]
#Draw 'b'
points(b_point[1],b_point[2], pch = 5)
lines(rbind(eli_center, b_point))

#find foci
foci = sqrt(a^2 - b^2)



回答2:


This is the code that the car:::ellipse function uses after doing some error checking and other "housekeeping":

    angles <- (0:segments) * 2 * pi/segments
    unit.circle <- cbind(cos(angles), sin(angles))
    Q <- chol(shape, pivot = TRUE)
    order <- order(attr(Q, "pivot"))
    ellipse <- t(center + radius * t(unit.circle %*% Q[, order]))
    colnames(ellipse) <- c("x", "y")

You will notice that the regression line you drew was a bit "off-axis". If you drew in the line from X regressed on Y it would also be "off-axis" in the other direction. Do a search on "total least squares regression" or "Deming regression" (and you'll find some other names that I'm not coming up with off the top of my head.) Regression lines determined by ordinary least squares lines do not go through the major axis of the ellipse that that you are calculating.



来源:https://stackoverflow.com/questions/42101065/finding-the-parts-of-the-ellipse-from-my-data-in-r

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!