获取R中汽车包生成的数据椭圆的参数

时间:2015-06-14 02:18:11

标签: r r-car

我正在使用R中汽车包中的dataEllipse函数来获取我的数据的椭圆置信区域。例如:

datapoints_x = c(1,3,5,7,8,6,5,4,9)
datapoints_y = c(3,6,8,9,5,8,7,4,8)
ellipse = dataEllipse(cbind(datapoints_x, datapoints_y), levels=0.95)

输出是两个向量x和y,对应于定义椭圆的点:

head(ellipse)
#             x        y
# [1,] 12.79906 10.27685
# [2,] 12.74248 10.84304
# [3,] 12.57358 11.34255
# [4,] 12.29492 11.76781
# [5,] 11.91073 12.11238
# [6,] 11.42684 12.37102

但不是我对省略轴及其中心的长度感兴趣。有没有办法在没有自己执行PCA的情况下获得这个?

1 个答案:

答案 0 :(得分:3)

?dataEllipse你看到这些函数主要是绘图函数,而不是为你提供拟合椭圆的函数。无论如何阅读dataEllipse的源代码,很明显用于拟合椭圆的函数是来自cov.wt包的stats。此函数应该能够为您提供用于指定椭圆位置和形状的中心和协方差矩阵:

set.seed(144)
x <- rnorm(1000)
y <- 3*x + rnorm(1000)
(ell.info <- cov.wt(cbind(x, y)))
# $cov
#          x         y
# x 1.022985  3.142274
# y 3.142274 10.705215
# 
# $center
#           x           y 
# -0.09479274 -0.23889445 
# 
# $n.obs
# [1] 1000

椭圆的中心现在可以从ell.info$center获得。可以使用轴的方向作为协方差矩阵的特征向量(下面的eigen.info$vectors列)。

(eigen.info <- eigen(ell.info$cov))
# $values
# [1] 11.63560593  0.09259443
# 
# $vectors
#           [,1]       [,2]
# [1,] 0.2839051 -0.9588524
# [2,] 0.9588524  0.2839051

最后你需要知道轴的长度(我将给出从中心到椭圆的长度,也就是那个轴上的半径):

(lengths <- sqrt(eigen.info$values * 2 * qf(.95, 2, length(x)-1)))
# [1] 8.3620448 0.7459512

现在我们可以得到椭圆轴的四个端点:

ell.info$center + lengths[1] * eigen.info$vectors[,1]
#        x        y 
# 2.279234 7.779072 
ell.info$center - lengths[1] * eigen.info$vectors[,1]
#         x         y 
# -2.468820 -8.256861 
ell.info$center + lengths[2] * eigen.info$vectors[,2]
#           x           y 
# -0.81004983 -0.02711513 
ell.info$center - lengths[2] * eigen.info$vectors[,2]
#          x          y 
#  0.6204643 -0.4506738 

我们可以使用dataEllipse确认这些是准确的:

library(car)
dataEllipse(x, y, levels=0.95)

enter image description here