获取椭圆函数以匹配R中的dataEllipse函数

时间:2013-05-20 23:11:39

标签: r ellipse

所以我从R中的多元正态分布中采样,并试图找出如何使用包汽车中的ellipse()函数计算其95%置信度椭圆。

以下是我正在运行的一些代码:

mu = c(0,0)
sigma = matrix(c(20,0,0,45),nrow=2)

z = rmvnorm(10000,mu,sqrt(sigma))

par(mfrow=c(1,2))
plot(z)
ellipse(mu,sqrt(sigma*qchisq(.05,2)),radius=1)
dataEllipse(z,levels=.95)

所以基本上我希望ellipse命令复制dataEllipse命令。如果有人有任何建议,将不胜感激!

编辑:使用Dwins代码并将其组合在我自己的代码中:

library(car)
library(mvtnorm)

mu = c(0,0)
sigma = matrix(c(20,0,0,45),nrow=2)

z = rmvnorm(10000,mu,sqrt(sigma))

dataEllipse(z,levels=.95)
car::ellipse(mu, sigma*qchisq(.05,2), col="blue", 
                 radius=sqrt(2 * qf(.975, 2, 9998)) )

enter image description here

你可以看到,椭圆仍然不一样......

2 个答案:

答案 0 :(得分:2)

我猜测(虽然你不应该让我这样做)rmvnorm来自'mixtools'而且它是在'car'之后加载的。我认为不需要sqrt()函数,因为ellipse的参数应该是一个协方差矩阵。此刻它正在密谋,但你看不到它,因为你没有把它染成红色(或任何东西)。此外,'mixtools'和'car'都有ellipse个函数,所以如果你想要car-version(它有一个与mixtools版本不同的radius参数),那么你需要用双冒号约定来调用它:< / p>

library(car); library(mixtools)
car::ellipse(mu, sigma*qchisq(.05,2), col="red", 
                 radius=sqrt(2 * qf(.975, 2, 9998)) )

答案 1 :(得分:2)

由于此帖子仍在获取意见,我将提供实际答案。此代码段的最后三行完全复制car::dataEllipse

library(car)
library(mvtnorm)

mu = c(0,0)
sigma = matrix(c(20,0,0,45),nrow=2)
z = rmvnorm(10000,mu,sigma)

dataEllipse(z,levels=.95)

center <- apply(z, 2, mean)
cov_mat <- cov(z)
ellipse(center, cov_mat, col="red", radius=sqrt(2 * qf(.95, 2, 9999)))

请注意,car::dataEllipsecar::ellipse都静默返回这些点的坐标,因此可以确认这些点确实相等。