【发布时间】:2014-12-09 15:07:05
【问题描述】:
我想创建一个具有 95%“精确”置信椭圆的二元正态分布散点图。
library(mvtnorm)
library(ggplot2)
set.seed(1)
n <- 1e3
c95 <- qchisq(.95, df=2)
rho <- 0.8 #correlation
Sigma <- matrix(c(1, rho, rho, 1), 2, 2) # Covariance matrix
我从均值为零且方差 =Sigma 的双变量正态生成了 1000 个观察值
x <- rmvnorm(n, mean=c(0, 0), Sigma)
z <- p95 <- rep(NA, n)
for(i in 1:n){
z[i] <- x[i, ] %*% solve(Sigma, x[i, ])
p95[i] <- (z[i] < c95)
}
我们可以使用stat_ellipse 在生成数据的散点图顶部轻松绘制 95% 置信椭圆。在您注意到几个红点位于置信椭圆内之前,结果图是完全令人满意的。我猜这种差异来自对某些参数的估计,并且随着样本量的增大而消失。
data <- data.frame(x, z, p95)
p <- ggplot(data, aes(X1, X2)) + geom_point(aes(colour = p95))
p + stat_ellipse(type = "norm")
有什么方法可以微调stat_ellipse(),使其描绘出使用“手工”ellips 函数创建的“精确”置信椭圆,如下图所示?
ellips <- function(center = c(0,0), c=c95, rho=-0.8, npoints = 100){
t <- seq(0, 2*pi, len=npoints)
Sigma <- matrix(c(1, rho, rho, 1), 2, 2)
a <- sqrt(c*eigen(Sigma)$values[2])
b <- sqrt(c*eigen(Sigma)$values[1])
x <- center[1] + a*cos(t)
y <- center[2] + b*sin(t)
X <- cbind(x, y)
R <- eigen(Sigma)$vectors
data.frame(X%*%R)
}
dat <- ellips(center=c(0, 0), c=c95, rho, npoints=100)
p + geom_path(data=dat, aes(x=X1, y=X2), colour='blue')
【问题讨论】:
-
您不会真的期望随机样本具有与用于生成它的参数相同的参数,对吗?
-
不,不,我只需要准确的置信区间来评估双变量正态生成的 Gibbs 采样的准确性。
-
我认为您将中心添加到
x和y值中为时过早。当它们不为零时,它们最终会与特征向量相乘。