R

使用 ggplot 或 ellipse 包繪製 95% CI 橢圓時得到不同的結果

  • September 27, 2012

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

您沒有做錯任何事情,這兩個函數對數據的分佈做出了不同的基本假設。您的第一個實現是假設多元正態分佈,第二個是多元 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()實施將對異常點不太敏感,而第一個將更加保守。

引用自:https://stats.stackexchange.com/questions/38117

comments powered by Disqus