2017-02-07 3 views
0

Учитывая набор данных я вычислил эллипс, который подходит к ним с помощью следующей команды:Нахождение части эллипса из моих данных в R

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

Где «х» и «у» являются столбцы моих двумерных данных. Я хотел бы знать, как найти элементы моего эллипса (красный), говорит: фокусы и а»и„“значение б

enter image description here

В попытке найти полуось. расстояние я пытался получить линейную регрессию данных, но я действительно сомневаюсь мой метод

enter image description here

Как я могу найти эти параметры? Или получить уравнение эллипса?

+0

Возможные дубликат: «Получить вершины эллипса на эллипс ковариационной сюжет (созданный' автомобиль :: ellipse')» –

ответ

0

Это код что car:::ellipse функции используется после того, как делают некоторые проверки ошибок и другое «домашнее хозяйство»:

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

Вы заметите, что линия регрессии вы нарисовали было немного «от оси». Если вы нарисовали линию от X, регрессированной на Y, она также будет «вне оси» в другом направлении. Сделайте поиск по «регрессии наименьших квадратов» или «регрессии Деминга» (и вы найдете несколько других имен, которые я не буду поднимать с головы). Линии регрессии, определяемые обычными линиями наименьших квадратов, не пройдите через основную ось эллипса, которую вы вычисляете.

+0

Может downvoter объяснить, что это«не полезно»о ссылаясь на вопрошающего к коду и пытаясь дать некоторый контекст, где они могут найти дальнейшее обсуждение этих вопросов? –

1

С ellipse генерирует 100 баллов, этот подход может быть достаточно точным. Конечно, вы можете установить npoints на более высокое значение, чтобы повысить точность. Я также объяснял сюжеты.

#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) 
+1

Я думаю, он работал нормально, потому что я получил уравнение через скрипты Matlab, и значения были одинаковыми. Благодаря! –

Смежные вопросы