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

机器算法验证 r 置信区间 ggplot2 散点图
2022-03-27 23:49:09

我想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

1个回答

您没有做错任何事情,这两个函数对数据的分布做出了不同的基本假设。您的第一个实现是假设多元正态分布,第二个是多元 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()实施将对异常点不太敏感,而第一个将更加保守