R
使用 ggplot 或 ellipse 包繪製 95% CI 橢圓時得到不同的結果
我想
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()
實施將對異常點不太敏感,而第一個將更加保守。