Existem funções padrão para distribuições uniformes discretas em R?

28

A maioria das distribuições padrão em R tem uma família de comandos - pdf / pmf, cdf / cmf, quantil, desvios aleatórios (por exemplo: dnorm, pnorm, qnorm, rnorm).

Sei que é fácil o suficiente usar alguns comandos padrão para reproduzir essas funções para distribuições uniformes discretas, mas já existe uma família interna de funções preferida para modelar distribuições uniformes discretas em R das quais não tenho conhecimento?


fonte
Para aqueles que ainda procuram uma resposta, encontrei o seguinte: purrr :: rdunif, consulte: rdrr.io/cran/purrr/man/rdunif.html
Nnie
1
@ Nnie, isso realmente não responde a toda a pergunta que solicitou a família completa de funções, enquanto a que você vincula apenas faz sorteios aleatórios.
mdewey 26/03
A família completa está disponível em rdocumentation.org/packages/extraDistr/versions/1.8.10/topics/… no pacote extraDistr, aparentemente.
kcrisman 12/09

Respostas:

32

Como nico escreveu, eles não são implementados em R. Supondo que trabalhemos em 1..k, essas funções devem ser parecidas com:

Para geração aleatória:

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

fonte
4
Obrigado. Eu acho que seria útil ter funções integradas (com os parâmetros mínimo e máximo da família unif). É um pouco feio ter que adicionar definições de função nos scripts apenas para usar as distribuições uniformes discretas da maneira que você usaria outras distribuições padrão. As funções internas também lidam com o tratamento de erros (por exemplo - se os parâmetros não são números inteiros) e são otimizadas para velocidade.
2
Boa resposta. E para os quantis, podemos fazer algo como qdu <- função (p, k) ifelse (p <= 0 | p> 1, return ("undefined"), teto (p * k))
15

Aqui está o código para a distribuição uniforme e discreta no intervalo [min, max], adaptado do post do 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
fonte
11

A página Exibir Tarefa CRAN: Distribuições de Probabilidades diz:

A distribuição uniforme discreta pode ser facilmente obtida com as funções básicas.

Eu acho que algo nas linhas disso deve fazer:

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

EDITAR

Como csgillespie apontou, isso não está correto ...

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

embora funcione (observe que o exemplo irá gerar valores entre 1 e 100, não 0 e 100)

nico
fonte
2
Isso não está correto para os casos extremos. Para ver isso, tente executar o seguinte comando: table(round(runif(10000, min=0, max=2)))Claramente, não é um uniforme discreto.
Csgillespie 25/10/10
@csgillespie: muito bem visto, eu atualizei a minha resposta :)
nico
Você não poderia usar ceiling(runif(1000, min=-1, max=100))?
gung - Restabelece Monica