R

箱線圖等效於重尾分佈?

  • July 3, 2013

對於近似正態分佈的數據,箱線圖是快速可視化數據的中位數和分佈以及任何異常值的存在的好方法。

然而,對於更多的重尾分佈,很多點都顯示為異常值,因為異常值被定義為超出 IQR 的固定因子,而且這種情況在重尾分佈中當然更頻繁地發生。

那麼人們用什麼來可視化這種數據呢?有更適合的嗎?如果這很重要,我在 R 上使用 ggplot。

OP 似乎存在的核心問題是它們有非常重的尾數據 - 我認為目前的大多數答案實際上根本沒有解決這個問題*,*所以我正在推廣我之前對答案的評論。

如果您確實想保留箱線圖,下面列出了一些選項。我在 R 中創建了一些顯示基本問題的數據:

set.seed(seed=7513870)
x <- rcauchy(80)
boxplot(x,horizontal=TRUE,boxwex=.7)

不滿意的箱線圖

數據的中間一半被縮減為幾毫米寬的小條。同樣的問題困擾著大多數其他建議 - 包括 QQ 圖、條形圖、蜂箱/蜂群圖和小提琴圖。

現在一些潛在的解決方案:

1)轉換

如果對數或倒數產生可讀的箱線圖,它們可能是一個非常好的主意,並且原始比例仍然可以顯示在軸上。

最大的問題是有時沒有“直觀”的轉換。還有一個較小的問題,雖然分位數本身可以很好地進行單調變換,但柵欄卻沒有。如果您只是對轉換後的數據進行箱線圖繪製(就像我在這裡所做的那樣),則晶須的 x 值將與原始圖中的不同。

轉換值的箱線圖

這裡我使用了一個反雙曲sin(asinh);它的尾部有點像對數,類似於接近零的線性,但人們通常不覺得它是一種直觀的轉換,所以一般我不會推薦這個選項,除非像對數這樣的相當直觀的轉換很明顯。代碼:

xlab <- c(-60,-20,-10,-5,-2,-1,0,1,2,5,10,20,40)
boxplot(asinh(x),horizontal=TRUE,boxwex=.7,axes=FALSE,frame.plot=TRUE)
axis(1,at=asinh(xlab),labels=xlab)

  1. 比例中斷 - 採用極端異常值並將它們壓縮到兩端的窄窗口中,其壓縮比例比中心要大得多。如果你這樣做,我強烈建議你在整個規模上完全打破。

帶有比例中斷的箱線圖

opar <- par()
layout(matrix(1:3,nr=1,nc=3),heights=c(1,1,1),widths=c(1,6,1))
par(oma = c(5,4,0,0) + 0.1,mar = c(0,0,1,1) + 0.1)
stripchart(x[x< -4],pch=1,cex=1,xlim=c(-80,-5))
boxplot(x[abs(x)<4],horizontal=TRUE,ylim=c(-4,4),at=0,boxwex=.7,cex=1)
stripchart(x[x> 4],pch=1,cex=1,xlim=c(5,80))
par(opar)

3)修剪極端異常值(如果沒有非常清楚地表明這一點,我通常不會建議這樣做,但它看起來像下一個情節,兩端沒有“<5”和“2>”),以及

4)我稱之為極端異常值的“箭頭” - 類似於修剪,但在每一端指示修剪的值的計數

帶有極值計數和指向極值的箭頭的箱線圖

xout <- boxplot(x,range=3,horizontal=TRUE)$out
xin <- x[!(x %in% xout)]
noutl <- sum(xout<median(x))
nouth <- sum(xout>median(x))
boxplot(xin,horizontal=TRUE,ylim=c(min(xin)*1.15,max(xin)*1.15))
text(x=max(xin)*1.17,y=1,labels=paste0(as.character(nouth)," >"))
text(x=min(xin)*1.17,y=1,labels=paste0("< ",as.character(noutl)))

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

comments powered by Disqus