Bisakah saya menggunakan plot kotak-dan-kumis juga untuk distribusi multimodal atau hanya untuk distribusi unimodal?
Bisakah saya menggunakan plot kotak-dan-kumis juga untuk distribusi multimodal atau hanya untuk distribusi unimodal?
Jawaban:
Masalahnya adalah bahwa boxplot * yang biasa umumnya tidak dapat memberikan indikasi jumlah mode. Meskipun dalam beberapa keadaan (umumnya jarang) dimungkinkan untuk mendapatkan indikasi yang jelas bahwa jumlah mode terkecil melebihi 1, lebih biasanya boxplot yang diberikan konsisten dengan satu atau sejumlah mode yang lebih besar.
* beberapa modifikasi dari jenis boxplot yang biasa telah disarankan yang melakukan lebih banyak untuk menunjukkan perubahan kepadatan dan cam digunakan untuk mengidentifikasi beberapa mode, tapi saya tidak berpikir itu adalah tujuan dari pertanyaan ini.
Misalnya, saat plot ini ini menunjukkan keberadaan setidaknya dua mode (data dihasilkan sehingga memiliki tepat dua) -
sebaliknya, yang ini memiliki dua mode yang sangat jelas dalam distribusinya tetapi Anda tidak bisa mengatakannya dari boxplot sama sekali:
Boxplots tidak serta-merta menyampaikan banyak informasi tentang distribusi. Dengan tidak adanya titik-titik yang ditandai di luar kumis, mereka hanya berisi lima nilai, dan ringkasan lima angka tidak terlalu menentukan distribusi
Memang, gambar 1 di sini (yang saya percaya adalah kertas kerja yang kemudian diterbitkan dalam [1]) menunjukkan empat set data yang berbeda dengan plot kotak yang sama.
Saya tidak memiliki data itu untuk diberikan, tetapi masalah sepele untuk membuat kumpulan data yang serupa - seperti yang ditunjukkan dalam tautan di atas terkait dengan ringkasan lima angka, kita hanya perlu membatasi distribusi kita untuk berada di dalam kotak persegi panjang di mana ringkasan nomor lima membatasi kita untuk.
Inilah kode R yang akan menghasilkan data serupa dengan yang ada di kertas:
x1 = qnorm(ppoints(1:100,a=-.072377))
x1 = x1/diff(range(x1))*18+10
b = fivenum(x1) # all of the data has this five number summary
x2 = qnorm(ppoints(1:48));x2=x2/diff(range(x2))*.6
x2 = c(b[1],x2+b[2],.31+b[2],b[4]-.31,x2+b[4],b[5])
d = .1183675; x3 = ((0:34)-34/2)/34*(9-d)+(5.5-d/2)
x3 = c(x3,rep(9.5,15),rep(10.5,15),20-x3)
x4 = c(1,rep(b[2],24),(0:49)/49*(b[4]-b[2])+b[2],(0:24)/24*(b[5]-b[4])+b[4])
Berikut tampilan yang mirip dengan yang ada di kertas, dari data di atas (kecuali saya tunjukkan keempat boxplot di sini):
Waspadalah, namun - berhati histogram dapat memiliki masalah juga ; memang, kita melihat salah satu masalah di sini, karena distribusi dalam histogram "puncak" ketiga sebenarnya jelas bimodal; lebar bin histogram terlalu lebar untuk ditampilkan. Lebih jauh, seperti yang ditunjukkan oleh Nick Cox dalam komentar, perkiraan kepadatan kernel juga dapat memengaruhi kesan jumlah mode (kadang-kadang merusak mode ... atau terkadang menyarankan mode kecil di mana tidak ada yang ada dalam distribusi asli). Orang harus berhati-hati dengan penafsiran banyak tampilan umum.
Ada modifikasi boxplot yang dapat lebih baik menunjukkan multimodality (plot vas, plot biola dan plot kacang, di antara banyak lainnya). Dalam beberapa situasi mereka mungkin berguna, tetapi jika saya tertarik untuk menemukan mode biasanya saya akan melihat berbagai jenis tampilan.
x4
[1]: Choonpradub, C., & McNeil, D. (2005),
"Bisakah boxplot diperbaiki?"
Songklanakarin J. Sci. Technol. , 27 : 3, hlm. 649-657.
http://www.jourlib.org/paper/2081800
pdf
Ada beberapa opsi untuk mendeteksi multimodality dengan R. Data untuk grafik di bawah ini dihasilkan dengan tiga mode (-3,0,1). Boxplot secara jelas dikalahkan oleh yang lain (plot biola sepertinya memiliki pengaturan kepadatan kernel default yang berbeda), tetapi tidak ada yang benar-benar membedakan antara mode 0 dan 1. Sebenarnya ada beberapa alasan untuk menggunakan boxplots lagi di era komputer. Mengapa membuang informasi?
dat <- c(rnorm(500, -3, 1), rnorm(200, 0, 1), rnorm(300, 1, 1))
par(mfrow=c(2, 2))
boxplot(dat, horizontal=TRUE, main="Boxplot")
require(beanplot)
beanplot(dat, horizontal=TRUE, main="Beanplot")
require(viopoints)
viopoints(dat, horizontal=TRUE, main="Viopoints")
require(vioplot)
vioplot(dat, horizontal=TRUE)
title("Violin Plot")