ggplot 또는 타원 패키지로 95 % CI 타원을 플로팅 할 때 다른 결과 얻기


11

protoclust{protoclust}내 데이터를 분류하고 클래스별로 색상을 지정하고 각 클래스에 대해 95 % 신뢰 구간에 대해 타원을 겹치는 데 사용되는 각 변수 쌍에 대해 스 캐터 플롯을 작성 하여 클러스터링 (으로 생성 ) 결과를 시각화하고 싶습니다 ( elipses-classes는 각 변수 쌍에서 겹칩니다).

타원 그리기를 두 가지 방법으로 구현했으며 결과 타원이 다릅니다! (첫 번째 구현의 경우 큰 타원!) 우선 중심과 축 각도가 크기가 다르기 때문에 크기가 다릅니다 (일부 다른 스케일링?). 나는 그들 중 하나를 사용하거나 (두 가지 모두를 희망하지 마십시오!) 또는 논쟁으로 뭔가 잘못하고 있다고 생각합니다.

아무도 내가 뭘 잘못하고 있는지 말해 줄 수 있습니까?

다음은 두 가지 구현을위한 코드입니다. 둘 다 ggplot2 scatterplot에 데이터 타원어떻게 겹쳐 놓을 수 있습니까?

### 1st implementation 
### using ellipse{ellipse}
library(ellipse)
library(ggplot2) 
library(RColorBrewer)
colorpal <- brewer.pal(10, "Paired")

x <- data$x
y <- data$y
group <- data$group
df <- data.frame(x=x, y=y, group=factor(group))

df_ell <- data.frame() 
for(g in levels(df$group)){df_ell <- rbind(df_ell, cbind(as.data.frame(with(df[df$group==g,], ellipse(cor(x, y),scale=c(sd(x),sd(y)),centre=c(mean(x),mean(y))))),group=g))} 

p1 <- ggplot(data=df, aes(x=x, y=y,colour=group)) + geom_point() + 
  geom_path(data=df_ell, aes(x=x, y=y,colour=group))+scale_colour_manual(values=colorpal)

### 2nd implementation 
###using function ellipse_stat() 
###code by Josef Fruehwald available in: https://github.com/JoFrhwld/FAAV/blob/master/r/stat-ellipse.R

p2 <-qplot(data=df, x=x,y=y,colour=group)+stat_ellipse(level=0.95)+scale_colour_manual(values=colorpal)

다음은 두 플롯을 함께 보여줍니다 (왼쪽 그래프는 p1구현 ( ellipse())).

여기에 이미지 설명을 입력하십시오

데이터는 여기에 있습니다 : https://www.dropbox.com/sh/xa8xrisa4sfxyj0/l5zaGQmXJt


이것은 중요하지 않지만 코드 Warning message: In cov.trob(cbind(data$x, data$y)) : Probable convergence failure를 실행할 때 코드를 실행할 때 경고 메시지 가 표시 됩니까?
atiretoo - 분석 재개 모니카

@atiretoo 예, 코드를 실행할 때도 발생합니다. 왜 그런지 모르겠다. 다른 사람이 알고 있습니까? jose
josetanago

답변:


9

당신은 아무것도 잘못하지 않고 두 함수는 데이터 분포에 대해 다른 기본 가정을 만들고 있습니다. 첫 번째 구현은 다변량 법선을 가정하고 두 번째는 다변량 t- 분포를 가정합니다 (패키지 MASS의? cov.trob 참조). 한 그룹을 꺼내면 효과를 쉽게 확인할 수 있습니다.

#pull out group 1
pick = group ==1
p3 <- qplot(data=df[pick,], x=x, y=y)
tl = with(df[pick,], 
     ellipse(cor(x, y),scale=c(sd(x),sd(y)),
             centre=c(mean(x),mean(y))))
p3 <- p3 + geom_path(data=as.data.frame(tl), aes(x=x, y=y))
p3 <- p3 + stat_ellipse(level=0.95)
p3 # looks off center
p3 <- p3 + geom_point(aes(x=mean(x),y=mean(y),size=2,color="red"))
p3

따라서 동일한 중심과 방향에 가깝지만 동일하지 않습니다. cov.trob()에 전달하기위한 상관 관계 및 스케일을 얻는 데 ellipse()사용하고 t 인수를 사용하여 스케일링을 f- 분포와 동일하게 설정 하여 같은 크기의 타원에 가깝게 접근 할 수 있습니다 stat_ellipse().

tcv = cov.trob(data[pick,2:3],cor=TRUE)
tl = with(df[pick,], 
          ellipse(tcv$cor[2,1],scale=sqrt(diag(tcv$cov)),
                  t=qf(0.95,2,length(x)-1),
                  centre=tcv$center))
p3 <- p3 + geom_path(data=as.data.frame(tl), aes(x=x, y=y,color="red"))
p3

그러나 통신은 여전히 ​​정확하지 않습니다. 공분산 행렬의 콜레 스키 분해를 사용하는 것과 상관 도와 표준 편차로부터 스케일링을 만드는 것 사이에 차이가 발생해야합니다. 그 차이가 어디에 있는지 정확히 알기에는 수학자가 충분하지 않습니다.

어느 것이 맞습니까? 그것은 당신에게 달려 있습니다! stat_ellipse()첫 번째 보수적 반면 구현은 외곽 지점에 덜 민감 할 것이다.


1
시간을내어이 질문을 해결해 주셔서 감사합니다. 지금은 분명합니다. jose
josetanago

1
나는 줄거리에서 타원을 좋아 하므로이 기능이 실제로 작동하는 것을 보는 것이 재미있었습니다.
atiretoo-복원 monica
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.