Czy istnieją funkcje domyślne dla dyskretnych równomiernych rozkładów w R?

28

Większość standardowych dystrybucji w R ma rodzinę poleceń - pdf / pmf, cdf / cmf, kwantyl, losowe odchylenia (na przykład - dnorm, pnorm, qnorm, rnorm).

Wiem, że łatwo jest użyć niektórych standardowych poleceń do odtworzenia tych funkcji dla dyskretnych rozkładów jednorodnych, ale czy istnieje już preferowana wbudowana rodzina funkcji do modelowania dyskretnych rozkładów jednorodnych w R, o której nie wiem?


źródło
Dla tych, którzy wciąż szukają odpowiedzi, znalazłem to: purrr :: rdunif, patrz: rdrr.io/cran/purrr/man/rdunif.html
Nnie
1
@Nnie, to tak naprawdę nie odpowiada na całe pytanie, które dotyczyło pełnej rodziny funkcji, podczas gdy ta, do której linkujesz, losuje tylko losowo.
mdewey
Cała rodzina jest dostępna pod adresem rdocumentation.org/packages/extraDistr/versions/1.8.10/topics/… w pakiecie extraDistr.
kcrisman

Odpowiedzi:

32

Jak napisał Nico, nie są one zaimplementowane w R. Zakładając, że pracujemy w wersji 1..k, funkcje te powinny wyglądać następująco:

Do generowania losowego:

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

źródło
4
Dzięki. Myślę, że przydałoby się mieć wbudowane funkcje (z parametrami min i max ala rodzina unif). Trochę brzydko jest dodawać definicje funkcji do skryptów, aby używać dyskretnych rozkładów jednorodnych w taki sam sposób, jak innych standardowych rozkładów. Wbudowane funkcje zajmują się także obsługą błędów (na przykład - jeśli parametry nie są liczbami całkowitymi) i są zoptymalizowane pod kątem szybkości.
2
Niezła odpowiedź. A dla kwantyli możemy zrobić coś takiego jak qdu <- funkcja (p, k) ifelse (p <= 0 | p> 1, return ("undefined"), sufit (p * k))
15

Oto kod dyskretnego rozkładu jednostajnego w zakresie [min, maks.], Zaadaptowany z postu 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)
zaciekle
źródło
11

CRAN Zadanie Widok: Prawdopodobieństwo Dystrybucje strona mówi:

Dyskretny równomierny rozkład można łatwo uzyskać za pomocą podstawowych funkcji.

Chyba coś takiego powinno zrobić:

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

EDYTOWAĆ

Jak zauważył csgillespie, nie jest to poprawne ...

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

będzie jednak działać (zwróć uwagę, że przykład wygeneruje wartości od 1 do 100, a nie od 0 do 100)

Nico
źródło
2
To nie jest poprawne dla przypadków krawędzi. Aby to zobaczyć, spróbuj uruchomić następującą komendę: table(round(runif(10000, min=0, max=2)))Najwyraźniej nie jest to dyskretny jednolity.
csgillespie
@csgillespie: ładnie zauważony, zaktualizowałem swoją odpowiedź :)
nico,
Nie mogłeś użyć ceiling(runif(1000, min=-1, max=100))?
Gung - Przywróć Monikę