2014-12-09 2 views
5

나는 95 % "정확한"신뢰 타원으로 이변 량 정규 분포의 산점도를 만들고 싶습니다. ggplot2에서 stat_ellipse() 미세 조정

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 

나는 우리가 stat_ellipse를 사용하여 쉽게 생성 된 데이터의 산점도의 상단에 95 % 신뢰 타원을 그릴 수 평균 제로 분산이 이변 량 정상에서 1000 명 관찰 = Sigma

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

를 생성합니다. 결과 숫자는 빨간색 포인트 중 몇 개가 신뢰 타원 안에 있다는 것을 알기 전까지는 완전히 만족 스럽습니다. 이 불일치는 일부 매개 변수의 추정에서 비롯된 것으로 추측되며 샘플 크기가 커짐에 따라 사라집니다. "손으로 만든"ellips 기능을 사용하여 생성 된 아래의 그림과 같이

data <- data.frame(x, z, p95) 
p <- ggplot(data, aes(X1, X2)) + geom_point(aes(colour = p95)) 
p + stat_ellipse(type = "norm") 

Fig.1

미세 조정는 "정확한"신뢰 타원을 묘사 그래서 stat_ellipse() 수있는 방법이 있습니까? enter image description here

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') 
+0

랜덤 샘플에 생성 할 때 사용 된 것과 동일한 매개 변수를 사용한다고 기대하지 않습니까? –

+0

아니요, 아니요, 이변 량 일반 생성에 대한 깁스 샘플링의 정확도를 평가하기 위해 정확한 신뢰도가 필요했습니다. – Khashaa

+0

"x"와 "y"값에 중심을 너무 일찍 추가했다고 생각합니다. 그들은 0이 아닌 경우 고유 벡터와 함께 곱해집니다. –

답변

2

이 진짜 대답은 아니지만 도움이 될 수 있습니다. 이 cov.wt는 시뮬레이션 된 데이터로부터 공분산 행렬을 추정 것 같다

stat_ellipse 
ls(ggplot2:::StatEllipse) 
ggplot2:::StatEllipse$calculate 
ggplot2:::calculate_ellipse 
?cov.wt 

다음 명령을 stat_ellipse을 탐구함으로써

:

cov.wt(data[, c(1, 2)])$cov 
#   X1  X2 
# X1 1.1120267 0.8593946 
# X2 0.8593946 1.0372208 

# True covariance matrix: 
Sigma 
#  [,1] [,2] 
# [1,] 1.0 0.8 
# [2,] 0.8 1.0 
당신은 추정을 사용하여 p95 값을 계산 고려할 수

공분산 행렬. 또는 잘 수행 된 타원 그리기 코드 만 사용하면됩니다.