Existe-t-il des fonctions par défaut pour les distributions uniformes discrètes dans R?

28

La plupart des distributions standard dans R ont une famille de commandes - pdf / pmf, cdf / cmf, quantile, écarts aléatoires (par exemple - dnorm, pnorm, qnorm, rnorm).

Je sais qu'il est assez facile d'utiliser certaines commandes standard pour reproduire ces fonctions pour les distributions uniformes discrètes, mais existe-t-il déjà une famille de fonctions intégrées préférée pour la modélisation de distributions uniformes discrètes dans R que je ne connais pas?


la source
Pour ceux qui cherchent toujours une réponse, j'ai trouvé ceci: purrr :: rdunif, voir: rdrr.io/cran/purrr/man/rdunif.html
Nnie
1
@Nnie, cela ne répond pas vraiment à toute la question qui demandait la famille complète de fonctions alors que celle à laquelle vous liez ne fait que des tirages aléatoires.
mdewey
La famille complète est disponible sur rdocumentation.org/packages/extraDistr/versions/1.8.10/topics/… dans le package extraDistr, apparemment.
kcrisman

Réponses:

32

Comme l'a écrit nico, elles ne sont pas implémentées dans R. En supposant que nous travaillons dans 1..k, ces fonctions devraient ressembler à:

Pour une génération aléatoire:

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

la source
4
Merci. Je pense que ce serait pratique d'avoir des fonctions intégrées (avec les paramètres minimum et maximum ala la famille unif). C'est un peu moche d'avoir à ajouter des définitions de fonctions dans des scripts juste pour utiliser les distributions uniformes discrètes comme vous utiliseriez d'autres distributions standard. Les fonctions intégrées traitent également de la gestion des erreurs (par exemple - si les paramètres ne sont pas des entiers) et sont optimisées pour la vitesse.
2
Bonne réponse. Et pour les quantiles, nous pouvons faire quelque chose comme qdu <- fonction (p, k) ifelse (p <= 0 | p> 1, return ("indéfini"), plafond (p * k))
15

Voici le code pour la distribution uniforme discrète dans la gamme [min, max], adapté du post de 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)
cruellement
la source
11

La page CRAN Task View: Probability Distributions indique:

La distribution uniforme discrète peut être facilement obtenue avec les fonctions de base.

Je suppose que quelque chose du genre devrait faire:

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

MODIFIER

Comme l'a souligné csgillespie, ce n'est pas correct ...

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

fonctionnera cependant (notez que l'exemple générera des valeurs comprises entre 1 et 100, pas 0 et 100)

Nico
la source
2
Ce n'est pas correct pour les cas de bord. Pour voir cela, essayez d'exécuter la commande suivante: table(round(runif(10000, min=0, max=2)))Ce n'est clairement pas uniforme discret.
csgillespie du
@csgillespie: joliment repéré, j'ai mis à jour ma réponse :)
nico
Tu ne pourrais pas utiliser ceiling(runif(1000, min=-1, max=100))?
gung - Réintègre Monica