使用ggplot或ellipse软件包绘制95%CI椭圆时获得不同的结果


11

我想protoclust{protoclust}通过为用于对我的数据进行分类的每对变量创建散点图,按类着色以及为每个类的95%置信区间重叠椭圆来可视化聚类的结果(用生成),以对每个类进行重叠(以检查椭圆类在每对变量下重叠)。

我已经以两种不同的方式实现了椭圆的绘制,并且生成的椭圆也不同!(第一个实现使用更大的椭圆!)先验的只是它们的大小不同(有些不同的缩放比例?),因为轴的中心和角度在两者上似乎是相似的。我想我一定是通过使用其中之一(不要同时使用两者!)或参数来做错事。

谁能告诉我我在做什么错?

这里是两个实现的代码;两者均基于“ 如何将数据椭圆叠加到ggplot2散点图上”的答案?

### 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-恢复莫妮卡2012年

@atiretoo是的,当我运行代码时也会发生。我不知道为什么。也许其他人知道吗?何塞
josetanago

Answers:


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

但是对应关系仍然不准确。在使用协方差矩阵的cholesky分解与根据相关性和标准偏差创建缩放之间必须产生差异。我还没有足够的数学家来确切地知道区别在哪里。

哪一个是正确的?由您决定!该stat_ellipse()实施将是边远点不太敏感,而第一会更加保守。


1
非常感谢您抽出宝贵的时间解决此问题!现在很清楚。何塞
josetanago

1
我喜欢图中的椭圆,因此看到这些功能的运行非常有趣。
atiretoo-恢复莫妮卡2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.