Saya mencoba memplot QQ-plot dengan dua set data sekitar 1,2 juta poin, dalam R (menggunakan qqplot, dan memasukkan data ke ggplot2). Perhitungannya cukup mudah, tetapi grafik yang dihasilkan sangat lambat untuk dimuat, karena ada begitu banyak poin. Saya sudah mencoba pendekatan linier untuk mengurangi jumlah poin menjadi 10.000 (ini adalah fungsi qqplot, jika salah satu set data Anda lebih besar dari yang lain), tetapi kemudian Anda kehilangan banyak detail di bagian ekor.
Sebagian besar titik data ke pusat pada dasarnya tidak berguna - mereka tumpang tindih sehingga mungkin ada sekitar 100 per piksel. Apakah ada cara sederhana untuk menghapus data yang terlalu berdekatan, tanpa kehilangan data yang lebih jarang ke arah ekor?
r
data-visualization
qq-plot
tidak ada apa-apa101
sumber
sumber
approx()
fungsinya ikut berperan dalamqqplot()
fungsi tersebut.Jawaban:
Plot QQ sangat berkorelasi otomatis kecuali pada bagian ekor. Dalam mengulasnya, seseorang berfokus pada bentuk keseluruhan plot dan perilaku ekor. Ergo , kamu akan baik-baik saja dengan kasar subsampling di pusat-pusat distribusi dan termasuk jumlah yang cukup dari ekor.
Berikut ini adalah kode yang menggambarkan cara mengambil sampel di seluruh dataset serta cara mengambil nilai ekstrem.
Sebagai ilustrasi, dataset simulasi ini menunjukkan perbedaan struktural antara dua dataset dengan nilai sekitar 1,2 juta serta jumlah "kontaminasi" yang sangat kecil di salah satunya. Juga, untuk membuat pengujian ini ketat, interval nilai dikecualikan dari salah satu dataset secara bersamaan: plot QQ perlu menunjukkan jeda untuk nilai-nilai tersebut.
Kami dapat melakukan subsampel 0,1% dari setiap dataset dan memasukkan 0,1% ekstrem lainnya, memberikan 2.420 poin untuk plot. Total waktu yang berlalu kurang dari 0,5 detik:
Tidak ada informasi yang hilang sama sekali:
sumber
sin
? Apakah saya benar bahwa CDF normal akan menjadi fungsi yang lebih baik, jika Anda berasumsi bahwa x terdistribusi secara normal? Apakah Anda baru saja memilih dosa karena lebih mudah untuk dihitung?Di tempat lain di utas ini saya mengusulkan solusi sederhana namun agak ad hoc untuk mengamplas poin. Ini cepat, tetapi membutuhkan beberapa percobaan untuk menghasilkan plot yang bagus. Solusi yang akan dijelaskan adalah urutan besarnya lebih lambat (mengambil hingga 10 detik untuk 1,2 juta poin) tetapi bersifat adaptif dan otomatis. Untuk kumpulan data besar, itu harus memberikan hasil yang baik pertama kali dan melakukannya dengan cepat.
Ada beberapa detail yang harus diperhatikan, terutama untuk mengatasi dataset dengan panjang yang berbeda. Saya melakukan ini dengan mengganti yang lebih pendek dengan kuantil yang sesuai dengan yang lebih panjang: pada dasarnya, pendekatan linear piecewise dari EDF yang lebih pendek digunakan sebagai pengganti nilai data aktualnya. ("Lebih pendek" dan "lebih lama" dapat dibalik dengan pengaturan
use.shortest=TRUE
.)Berikut ini adalah
R
implementasinya.Sebagai contoh, saya menggunakan data yang disimulasikan seperti pada jawaban saya sebelumnya (dengan pencilan yang sangat tinggi yang dilemparkan ke dalam
y
dan lebih banyak kontaminasix
saat ini):Mari kita plot beberapa versi, menggunakan nilai ambang yang lebih kecil dan lebih kecil. Pada nilai .0005 dan ditampilkan pada monitor dengan tinggi 1000 piksel, kami akan menjamin kesalahan tidak lebih dari setengah piksel vertikal di mana-mana di plot. Ini ditampilkan dalam warna abu-abu (hanya 522 poin, bergabung dengan segmen garis); perkiraan kasar diplot di atasnya: pertama berwarna hitam, kemudian merah (titik merah akan menjadi subset dari yang hitam dan overplot), kemudian biru (yang lagi-lagi merupakan subset dan overplot). Rentang waktu mulai dari 6,5 (biru) hingga 10 detik (abu-abu). Mengingat bahwa mereka skala dengan sangat baik, orang mungkin menggunakan sekitar setengah-pixel sebagai standar universal untuk ambang ( misalnya , 1/2000 untuk monitor tinggi 1000-pixel) dan dilakukan dengan itu.
Edit
Saya telah memodifikasi kode asli untuk
qq
mengembalikan kolom indeks ketiga menjadi yang terpanjang (atau terpendek, sebagaimana ditentukan) dari dua array asli,x
dany
, sesuai dengan poin yang dipilih. Indeks-indeks ini menunjuk ke nilai-nilai "menarik" dari data sehingga dapat berguna untuk analisis lebih lanjut.Saya juga menghapus bug yang terjadi dengan nilai berulang
x
(yang menyebabkanbeta
tidak terdefinisi).sumber
qq
argumen untuk vektor yang diberikan? Juga, bisakah Anda menyarankan untuk menggunakanqq
fungsi Anda denganggplot2
paket? Saya berpikir tentang menggunakanggplot2
'sstat_function
untuk ini.Menghapus beberapa titik data di tengah akan mengubah distribusi empiris dan karenanya qqplot. Ini dikatakan, Anda dapat melakukan hal berikut dan langsung plot kuantil dari distribusi empiris vs kuantil dari distribusi teoritis:
Anda harus menyesuaikan seq tergantung pada seberapa dalam Anda ingin masuk ke dalam ekor. Jika Anda ingin menjadi pintar, Anda juga dapat mengencerkan urutan di tengah untuk mempercepat plot. Misalnya menggunakan
adalah suatu kemungkinan.
sumber
Anda bisa melakukan
hexbin
plot.sumber
Alternatif lain adalah boxplot paralel; Anda mengatakan Anda memiliki dua set data, jadi sesuatu seperti:
dan Anda bisa menyesuaikan berbagai opsi untuk membuatnya lebih baik dengan data Anda.
sumber