R'deki ayrık düzgün dağılımlar için varsayılan fonksiyonlar var mı?


28

R'deki çoğu standart dağılım bir komut ailesine sahiptir - pdf / pmf, cdf / cmf, kuantil, rasgele sapmalar (örneğin; dnorm, pnorm, qnorm, rnorm).

Ayrık tekdüze dağılımlar için bu işlevleri yeniden üretmek için bazı standart komutları kullanmanın yeterince kolay olduğunu biliyorum, ama zaten R'de bilmediğim ayrık tekdüze dağılımları modellemek için tercih edilen yerleşik bir işlev ailesi var mı?


Hala bir cevap arayanlar için şunu buldum: purrr :: rdunif, bakınız: rdrr.io/cran/purrr/man/rdunif.html
Nnie

1
@Nnie, bu işlevler ailesinin tamamı için sorulan tüm soruya gerçekten cevap vermiyor, oysa bağlantı kurduğunuz sadece rastgele çekimler yapıyor.
mdewey

Tam aile görünüşe göre extraDistr paketindeki rdocumentation.org/packages/extraDistr/versions/1.8.10/topics/… adresinde bulunabilir .
kcrisman

Yanıtlar:


32

Nico'un yazdığı gibi, R'ye uygulanmadılar. 1.k'de çalıştığımızı varsayalım, bu işlevler şöyle görünmeli:

Rasgele nesil için:

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))

4
Teşekkürler. Yerleşik işlevlere sahip olmanın kullanışlı olacağını düşünüyorum (unif ailesinde min ve max ile paralellikler). Ayrı dağılımlı tekdüze dağılımları, diğer standart dağıtımları kullandığınız şekilde kullanmak için komut dosyalarına işlev tanımları eklemek zorunda kalmanız biraz çirkin. Yerleşik işlevler ayrıca hata işleme ile de ilgilidir (örneğin, parametreler tamsayı değilse) ve hız için optimize edilmiştir.

2
Güzel cevap Ve miktarlar için, qdu <- işlevi (p, k) ifelse (p <= 0 | p> 1, return ("undefined"), tavan (p * k))

15

Burada mbq's post'undan uyarlanan [min, max] aralığındaki ayrık düzgün dağılım kodu:

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)

11

The CRAN Task View: Olasılık Dağılımları sayfasında diyor ki:

Ayrık üniform dağılım, temel fonksiyonlarla kolayca elde edilebilir.

Sanırım bu konuda yapılması gerekenler:

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

DÜZENLE

Csgillespie'nin işaret ettiği gibi, bu doğru değil ...

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

Ancak çalışacak (örneğin, 0 ile 100 arasında değil, 1 ile 100 arasında değer üreteceğini unutmayın )


2
Bu kenar durumlar için doğru değil. Bunu görmek için, aşağıdaki komutu çalıştırmayı deneyin: table(round(runif(10000, min=0, max=2)))Açıkçası ayrı bir üniforma değil.
csgillespie

@ csgillespie: güzel lekeli, cevabımı güncelledim :)
nico

Kullanamaz mısın ceiling(runif(1000, min=-1, max=100)) ?
gung - Reinstate Monica
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.