Gibt es Standardfunktionen für diskrete Gleichverteilungen in R?

28

Die meisten Standarddistributionen in R haben eine Befehlsfamilie - pdf / pmf, cdf / cmf, quantile, zufällige Abweichungen (zum Beispiel dnorm, pnorm, qnorm, rnorm).

Ich weiß, es ist einfach genug, einige Standardbefehle zu verwenden, um diese Funktionen für die diskreten Gleichverteilungen zu reproduzieren, aber gibt es bereits eine bevorzugte integrierte Funktionsfamilie für die Modellierung diskreter Gleichverteilungen in R, die mir nicht bekannt ist?


quelle
Für diejenigen, die noch nach einer Antwort suchen, habe ich Folgendes gefunden: purrr :: rdunif, siehe: rdrr.io/cran/purrr/man/rdunif.html
Nnie
1
@Nnie, das beantwortet nicht wirklich die ganze Frage, die nach der gesamten Funktionsfamilie gestellt wurde, während diejenige, auf die Sie verlinken, nur zufällige Ziehungen ausführt.
Mdewey
Die komplette Familie ist anscheinend im extraDistr-Paket unter rdocumentation.org/packages/extraDistr/versions/1.8.10/topics/… verfügbar .
kcrisman

Antworten:

32

Wie Nico schrieb, sind sie in R nicht implementiert. Unter der Annahme, dass wir in 1..k arbeiten, sollten diese Funktionen wie folgt aussehen:

Für zufällige Erzeugung:

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

quelle
4
Vielen Dank. Ich denke, es wäre praktisch, eingebaute Funktionen zu haben (mit Min- und Max-Parametern ua der Unif-Familie). Es ist ein bisschen hässlich, Funktionsdefinitionen in Skripte einfügen zu müssen, um die diskreten gleichmäßigen Verteilungen wie andere Standardverteilungen zu verwenden. Die eingebauten Funktionen behandeln auch die Fehlerbehandlung (z. B. wenn Parameter keine Ganzzahlen sind) und sind auf Geschwindigkeit optimiert.
2
Gute Antwort. Und für die Quantile können wir so etwas tun wie qdu <- Funktion (p, k) ifelse (p <= 0 | p> 1, return ("undefined"), ceiling (p * k))
15

Hier ist der Code für die diskrete Gleichverteilung im Bereich [min, max], angepasst aus dem Post von 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
quelle
11

Auf der Seite CRAN-Task-Ansicht: Wahrscheinlichkeitsverteilungen wird Folgendes angezeigt:

Die diskrete Gleichverteilung kann mit den Grundfunktionen leicht erreicht werden.

Ich denke, etwas in der Art sollte dies tun:

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

BEARBEITEN

Wie Csgillespie betonte, ist dies nicht richtig ...

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

funktioniert aber (beachten Sie, dass das Beispiel Werte zwischen 1 und 100 generiert , nicht 0 und 100)

nico
quelle
2
Dies gilt nicht für die Randfälle. Führen Sie dazu den folgenden Befehl aus: table(round(runif(10000, min=0, max=2)))Es handelt sich eindeutig nicht um eine diskrete Uniform.
Csgillespie
@csgillespie: schön entdeckt, ich habe meine Antwort aktualisiert :)
nico
Könnten Sie nicht verwenden ceiling(runif(1000, min=-1, max=100))?
gung - Wiedereinsetzung von Monica