Apakah ada fungsi default untuk distribusi seragam diskrit di R?

28

Sebagian besar distribusi standar dalam R memiliki keluarga perintah - pdf / pmf, cdf / cmf, quantile, penyimpangan acak (misalnya - dnorm, pnorm, qnorm, rnorm).

Saya tahu itu cukup mudah untuk menggunakan beberapa perintah standar untuk mereproduksi fungsi-fungsi ini untuk distribusi seragam diskrit, tetapi apakah sudah ada keluarga fungsi bawaan untuk memodelkan distribusi seragam diskrit di R yang tidak saya sadari?


sumber
Bagi mereka yang masih mencari jawaban, saya menemukan ini: purrr :: rdunif, lihat: rdrr.io/cran/purrr/man/rdunif.html
Nnie
1
@Nnie, itu tidak benar-benar menjawab seluruh pertanyaan yang meminta keluarga lengkap fungsi sedangkan yang Anda tautkan hanya melakukan penarikan acak.
mdewey
Keluarga lengkap tersedia di rdocumentation.org/packages/extraDistr/versions/1.8.10/topics/… dalam paket extraDistr, tampaknya.
kcrisman

Jawaban:

32

Seperti yang ditulis nico, mereka tidak diimplementasikan dalam R. Dengan asumsi kita bekerja di 1..k, fungsi-fungsi tersebut akan terlihat seperti:

Untuk generasi acak:

rdu<-function(n,k) sample(1:k,n,replace=T)

PDF:

ddu<-function(x,k) ifelse(x>=1 & x<=k & round(x)==x,1/k,0) 

CDF:

pdu<-function(x,k) ifelse(x<1,0,ifelse(x<=k,floor(x)/k,1))

sumber
4
Terima kasih. Saya pikir akan sangat berguna untuk memiliki fungsi bawaan (dengan paraemeter min dan maks ala keluarga unif). Agak jelek harus menambahkan definisi fungsi ke dalam skrip hanya untuk menggunakan distribusi seragam diskrit seperti Anda akan menggunakan distribusi standar lainnya. Fungsi builtin juga menangani penanganan kesalahan (misalnya - jika parameter bukan bilangan bulat) dan dioptimalkan untuk kecepatan.
2
Jawaban bagus. Dan untuk kuantil kita dapat melakukan sesuatu seperti qdu <- function (p, k) ifelse (p <= 0 | p> 1, return ("undefined"), ceiling (p * k))
15

Berikut ini adalah kode untuk distribusi seragam diskrit di kisaran [min, maks], diadaptasi dari pos mbq:

dunifdisc<-function(x, min=0, max=1) ifelse(x>=min & x<=max & round(x)==x, 1/(max-min+1), 0)
punifdisc<-function(q, min=0, max=1) ifelse(q<min, 0, ifelse(q>=max, 1, (floor(q)-min+1)/(max-min+1)))
qunifdisc<-function(p, min=0, max=1) floor(p*(max-min+1))
runifdisc<-function(n, min=0, max=1) sample(min:max, n, replace=T)
fangly
sumber
11

Tampilan Tugas CRAN: Halaman Distribusi Probabilitas mengatakan:

Distribusi seragam diskrit dapat dengan mudah diperoleh dengan fungsi dasar.

Saya kira sesuatu pada baris ini harus dilakukan:

a <- round(runif(1000, min=0, max=100))

EDIT

Seperti yang ditunjukkan csgillespie, ini tidak benar ...

a <- ceiling(runif(1000, min=0, max=100))

akan berfungsi (perhatikan bahwa contoh ini akan menghasilkan nilai antara 1 dan 100, bukan 0 dan 100)

nico
sumber
2
Ini tidak benar untuk kasus tepi. Untuk melihat ini, coba jalankan perintah berikut: table(round(runif(10000, min=0, max=2)))Ini jelas tidak seragam seragam.
csgillespie
@csgillespie: terlihat dengan baik, saya memperbarui jawaban saya :)
nico
Tidak bisa Anda gunakan ceiling(runif(1000, min=-1, max=100))?
gung - Reinstate Monica