Di R, mean()
dan median()
merupakan fungsi standar yang melakukan apa yang Anda harapkan. mode()
memberi tahu Anda mode penyimpanan internal objek, bukan nilai yang paling banyak muncul dalam argumennya. Tetapi apakah ada fungsi perpustakaan standar yang mengimplementasikan mode statistik untuk vektor (atau daftar)?
r
statistics
r-faq
Nick
sumber
sumber
mode
sama dengan fungsinyaclass
?Jawaban:
Satu lagi solusi, yang berfungsi untuk data numerik & karakter / faktor:
Pada mesin mungil mungil saya, yang dapat menghasilkan & menemukan mode vektor 10M-integer dalam waktu sekitar setengah detik.
Jika kumpulan data Anda memiliki beberapa mode, solusi di atas mengambil pendekatan yang sama dengan
which.max
, dan mengembalikan nilai yang muncul pertama dari set mode. Untuk mengembalikan semua mode, gunakan varian ini (dari @digEmAll di komentar):sumber
c(1,1,2,2)
). Anda harus mengubah baris terakhir Anda dengan:tab <- tabulate(match(x, ux)); ux[tab == max(tab)]
ux[which.max(tabulate(match(x, ux)))]
dengan adilmax(tabulate(match(x, ux)))
.Mode(1:3)
memberi1
danMode(3:1)
memberi3
, sehingga Mode mengembalikan elemen paling sering atau yang pertama jika semuanya unik.0
atauNA
dalam kasus itu.Ada paket
modeest
yang menyediakan penduga mode univariat data unimodal (dan kadang-kadang multimodal) dan nilai mode distribusi probabilitas biasa.Untuk informasi lebih lanjut lihat halaman ini
sumber
mfv(mySamples)[1]
,. The1
menjadi penting karena sebenarnya mengembalikan nilai yang paling sering s .mfv(mySamples)
menemukan ini di r mailing list, semoga bermanfaat. Itu juga yang saya pikirkan. Anda ingin membuat tabel () data, mengurutkan dan kemudian memilih nama depan. Ini retas tetapi harus bekerja.
sumber
Saya menemukan posting Ken Williams di atas sangat bagus, saya menambahkan beberapa baris untuk menjelaskan nilai-nilai NA dan membuatnya berfungsi untuk memudahkan.
sumber
Cara cepat dan kotor dalam memperkirakan mode vektor angka yang Anda yakini berasal dari distribusi univariat berkelanjutan (mis. Distribusi normal) adalah mendefinisikan dan menggunakan fungsi berikut:
Kemudian untuk mendapatkan estimasi mode:
sumber
set.seed(1); a<-runif(100); mode<-density(a)$x[which.max(density(a)$y)]; abline(v=mode)
error in density.default(x, from = from, to = to) : need at least 2 points to select a bandwidth automatically
density
. Namun, jika Anda hanya memiliki satu datapoint maka nilai dari datapoint itu mungkin akan menjadi tebakan terbaik Anda untuk mode ini ...estimate_mode <- function(x) { if (length(x)>1){ d <- density(x) d$x[which.max(d$y)] }else{ x } }
Saya sedang menguji metode untuk memperkirakan arah angin dominan, daripada rata-rata arah menggunakan rata-rata vektorial dengan paket melingkar. Saya bekerja dengan poin di atas nilai poligon, jadi, kadang-kadang hanya ada satu titik dengan arah. Terima kasih!Fungsi berikut hadir dalam tiga bentuk:
method = "mode" [default]: menghitung mode untuk vektor unimodal, kalau tidak mengembalikan
metode NA = "nmodes": menghitung jumlah mode dalam
metode vektor = "mode": daftar semua mode untuk unimodal atau polymodal vektor
sumber
method = 'modes'
. Kemudian fungsi mengembalikan semua nilai unik, namun sebenarnya tidak ada mode sehingga harus dikembalikanNA
sebagai gantinya. Saya akan menambahkan jawaban lain yang berisi versi fungsi Anda yang sedikit dioptimalkan, terima kasih atas inspirasi!Di sini, solusi lain:
sumber
Saya belum bisa memilih tetapi jawaban Rasmus Bååth adalah yang saya cari. Namun, saya akan memodifikasinya sedikit memungkinkan untuk membatasi distribusi misalnya hanya nilai antara 0 dan 1.
Kami menyadari bahwa Anda mungkin tidak ingin membatasi sama sekali pada distribusi Anda, lalu mengatur dari = - "NOMOR BESAR", hingga = "NOMOR BESAR"
sumber
error in density.default(x, from = from, to = to) : need at least 2 points to select a bandwidth automatically
Modifikasi kecil untuk jawaban Ken Williams, menambahkan params opsional
na.rm
danreturn_multiple
.Berbeda dengan jawaban yang mengandalkan
names()
, jawaban ini mempertahankan tipe datax
dalam nilai yang dikembalikan.Untuk menunjukkannya berfungsi dengan params opsional dan memelihara tipe data:
Berkat @ Frank untuk penyederhanaan.
sumber
Saya telah menulis kode berikut untuk menghasilkan mode.
Mari kita coba:
sumber
Berdasarkan fungsi @ Chris untuk menghitung mode atau metrik terkait, namun menggunakan metode Ken Williams untuk menghitung frekuensi. Yang satu ini menyediakan perbaikan untuk kasus tidak ada mode sama sekali (semua elemen sama-sama sering), dan beberapa
method
nama yang lebih mudah dibaca .Karena menggunakan metode Ken untuk menghitung frekuensi, kinerjanya juga dioptimalkan, menggunakan postingan AkselA, saya membandingkan beberapa jawaban sebelumnya untuk menunjukkan bagaimana fungsi saya dekat dengan kinerja Ken, dengan persyaratan untuk berbagai opsi ouput yang hanya menyebabkan sedikit overhead:
sumber
Mode
fungsi yang ditemukan dalampracma
paket. Mau jelaskan?pracma
paket yang Anda rujuk? Versi 1.9.3 memiliki implementasi yang sama sekali berbeda sejauh yang saya bisa lihat.Peretasan ini seharusnya bekerja dengan baik. Memberi Anda nilai serta hitungan mode:
sumber
R memiliki begitu banyak paket tambahan yang beberapa di antaranya mungkin menyediakan mode [statistik] dari daftar numerik / seri / vektor.
Namun pustaka standar R itu sendiri tampaknya tidak memiliki metode bawaan! Salah satu cara untuk mengatasi ini adalah dengan menggunakan beberapa konstruksi seperti berikut (dan untuk mengubahnya menjadi fungsi jika Anda sering menggunakan ...):
Untuk daftar sampel yang lebih besar, orang harus mempertimbangkan menggunakan variabel sementara untuk nilai maks (tabSmpl) (saya tidak tahu bahwa R akan secara otomatis mengoptimalkan ini)
Referensi: lihat "Bagaimana dengan median dan mode?" dalam pelajaran KickStarting R
ini Tampaknya mengkonfirmasi bahwa (setidaknya pada saat penulisan pelajaran ini) tidak ada fungsi mode dalam R (well ... mode () seperti yang Anda temukan digunakan untuk menyatakan jenis variabel ).
sumber
Ini bekerja dengan sangat baik
sumber
Berikut adalah fungsi untuk menemukan mode:
sumber
Di bawah ini adalah kode yang dapat digunakan untuk menemukan mode variabel vektor dalam R.
sumber
Ada beberapa solusi yang disediakan untuk yang satu ini. Saya memeriksa yang pertama dan setelah itu menulis sendiri. Posting di sini jika itu membantu siapa pun:
Mari kita mengujinya dengan beberapa contoh. Saya mengambil
iris
kumpulan data. Mari kita uji dengan data numerikyang dapat Anda verifikasi benar.
Sekarang satu-satunya bidang non numerik dalam set data iris (Spesies) tidak memiliki mode. Mari kita coba dengan contoh kita sendiri
EDIT
Seperti disebutkan dalam komentar, pengguna mungkin ingin mempertahankan tipe input. Dalam hal ini fungsi mode dapat dimodifikasi untuk:
Baris terakhir fungsi hanya memaksa nilai mode akhir ke jenis input asli.
sumber
y[,1] <- sort(unique(x))
Saya akan menggunakan fungsi density () untuk mengidentifikasi distribusi maksimum (mungkin berkesinambungan) yang dihaluskan:
di mana x adalah pengumpulan data. Perhatikan paremeter yang menyesuaikan fungsi kepadatan yang mengatur smoothing.
sumber
Sementara saya menyukai fungsi sederhana Ken Williams, saya ingin mengambil beberapa mode jika ada. Dengan mengingat hal itu, saya menggunakan fungsi berikut yang mengembalikan daftar mode jika banyak atau tunggal.
sumber
mode
mengembalikan daftar dengan beberapa nilai, maka r [1] bukan nilai pertama; itu bukan daftar panjang 1 yang berisi nilai pertama dan Anda harus melakukan r [[1]] untuk mendapatkan mode pertama sebagai numerik dan bukan daftar. Sekarang ketika ada satu mode, r Anda bukan daftar jadi r [1] berfungsi, itulah sebabnya saya pikir itu tidak konsisten. Tetapi karena r [[1]] juga berfungsi ketika r adalah vektor sederhana, sebenarnya ada konsistensi yang tidak saya sadari bahwa Anda selalu dapat menggunakan[[
untuk mengakses elemen.Saya melihat-lihat semua opsi ini dan mulai bertanya-tanya tentang fitur dan penampilan relatif mereka, jadi saya melakukan beberapa tes. Jika ada orang yang ingin tahu tentang hal yang sama, saya membagikan hasil saya di sini.
Tidak ingin repot dengan semua fungsi yang diposting di sini, saya memilih untuk fokus pada sampel berdasarkan beberapa kriteria: fungsi tersebut harus bekerja pada kedua karakter, vektor faktor, logis dan numerik, harus berurusan dengan NAS dan nilai bermasalah lainnya dengan tepat, dan output harus 'masuk akal', yaitu tidak ada angka sebagai karakter atau kekonyolan lainnya.
Saya juga menambahkan fungsi saya sendiri, yang didasarkan pada
rle
ide yang sama dengan chrispy, kecuali diadaptasi untuk penggunaan yang lebih umum:Saya akhirnya menjalankan lima fungsi, pada dua set data uji, sampai
microbenchmark
. Nama fungsi merujuk ke penulis masing-masing:Fungsi Chris diatur ke
method="modes"
danna.rm=TRUE
secara default untuk membuatnya lebih sebanding, tetapi selain itu fungsi digunakan seperti yang disajikan di sini oleh penulisnya.Dalam hal kecepatan saja, versi Kens menang dengan mudah, tetapi ini juga satu-satunya yang hanya akan melaporkan satu mode, tidak peduli berapa banyak sebenarnya. Seperti yang sering terjadi, ada pertukaran antara kecepatan dan keserbagunaan. Dalam
method="mode"
, versi Chris akan mengembalikan nilai jika ada satu mode, selain itu NA. Saya pikir itu sentuhan yang bagus. Saya juga berpikir itu menarik bagaimana beberapa fungsi dipengaruhi oleh peningkatan jumlah nilai unik, sementara yang lain tidak sebanyak. Saya belum mempelajari kode secara rinci untuk mencari tahu mengapa itu, selain menghilangkan logis / numerik sebagai penyebabnya.sumber
Mode tidak dapat berguna dalam setiap situasi. Jadi fungsinya harus mengatasi situasi ini. Coba fungsi berikut.
Keluaran,
sumber
Ini dibangun berdasarkan jawaban jprockbelly, dengan menambahkan kecepatan untuk vektor yang sangat singkat. Ini berguna ketika menerapkan mode ke data.frame atau datatable dengan banyak grup kecil:
sumber
Opsi sederhana lain yang memberikan semua nilai yang dipesan berdasarkan frekuensi adalah menggunakan
rle
:sumber
Solusi lain yang mungkin:
Pemakaian:
Keluaran:
sumber
Saya perhatikan pengamatan Anda adalah kelas dari bilangan real dan Anda berharap bahwa mode menjadi 2,5 ketika pengamatan Anda adalah 2, 2, 3, dan 3 maka Anda dapat memperkirakan mode dengan di
mode = l1 + i * (f1-f0) / (2f1 - f0 - f2)
mana l1 .. batas lebih rendah dari kelas paling sering, f1 . Frekuensi kelas paling sering, f0 .. frekuensi kelas sebelum kelas paling sering, f2 .. frekuensi kelas setelah kelas paling sering dan saya .. Interval kelas seperti yang diberikan misalnya dalam 1 , 2 , 3 :Jika Anda menginginkan level yang paling sering dan Anda memiliki lebih dari satu level yang paling sering, Anda bisa mendapatkan semuanya misalnya dengan:
sumber
Menambahkan kemungkinan pendekatan data.table
sumber
Berikut adalah beberapa cara yang dapat Anda lakukan dalam menjalankan waktu Theta (N)
sumber
Bisa mencoba fungsi berikut:
sumber
Mode Menghitung sebagian besar dalam hal variabel faktor maka kita dapat menggunakan
HouseVotes84 adalah dataset yang tersedia dalam paket 'mlbench'.
itu akan memberikan nilai label max. lebih mudah digunakan dengan fungsi inbuilt itu sendiri tanpa fungsi penulisan.
sumber
Menurut saya, jika koleksi memiliki mode, maka elemen-elemennya dapat dipetakan satu-ke-satu dengan bilangan asli. Jadi, masalah menemukan mode berkurang menjadi menghasilkan pemetaan seperti itu, menemukan mode nilai yang dipetakan, lalu memetakan kembali ke beberapa item dalam koleksi. (Berurusan dengan
NA
terjadi pada fase pemetaan).Saya memiliki
histogram
fungsi yang beroperasi pada prinsipal yang serupa. (Fungsi dan operator khusus yang digunakan dalam kode yang disajikan di sini harus didefinisikan dalam Shapiro dan / atau neatOveRse . Bagian-bagian dari Shapiro dan neatOveRse yang diduplikasi di sini sangat digandakan dengan izin; snipet yang digandakan dapat digunakan berdasarkan ketentuan situs ini. ) R pseudocode untukhistogram
is(Operator biner khusus menyelesaikan perpipaan , currying , dan komposisi ) Saya juga punya
maxloc
fungsi, yang mirip denganwhich.max
, tetapi mengembalikan semua maxima absolut vektor. R pseudocode untukmaxloc
isKemudian
dan
akan menghitung mode koleksi apa pun, asalkan sesuai
map
danunmap
fungsi- -ping yang sesuai didefinisikan.sumber