¿Existen funciones predeterminadas para distribuciones uniformes discretas en R?

28

La mayoría de las distribuciones estándar en R tienen una familia de comandos: pdf / pmf, cdf / cmf, cuantil, desviaciones aleatorias (por ejemplo, dnorm, pnorm, qnorm, rnorm).

Sé que es bastante fácil utilizar algunos comandos estándar para reproducir estas funciones para las distribuciones uniformes discretas, pero ¿ya existe una familia incorporada de funciones preferidas para modelar distribuciones uniformes discretas en R que desconozco?


fuente
Para aquellos que todavía buscan una respuesta, encontré esto: purrr :: rdunif, ver: rdrr.io/cran/purrr/man/rdunif.html
Nnie
1
@Nnie, eso realmente no responde a toda la pregunta que pedía la familia completa de funciones, mientras que la que vinculas solo hace sorteos al azar.
mdewey
La familia completa está disponible en rdocumentation.org/packages/extraDistr/versions/1.8.10/topics/… en el paquete extraDistr, aparentemente.
kcrisman

Respuestas:

32

Como escribió Nico, no se implementan en R. Suponiendo que trabajemos en 1..k, esas funciones deberían verse así:

Para generación aleatoria:

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

fuente
44
Gracias. Creo que sería útil tener funciones integradas (con los parámetros mínimos y máximos de la familia unif). Es un poco feo tener que agregar definiciones de funciones a los scripts solo para usar las distribuciones uniformes discretas de la misma manera que usarías otras distribuciones estándar. Las funciones incorporadas también se ocupan del manejo de errores (por ejemplo, si los parámetros no son enteros) y están optimizados para la velocidad.
2
Buena respuesta. Y para los cuantiles podemos hacer algo como qdu <- function (p, k) ifelse (p <= 0 | p> 1, return ("undefined"), ceiling (p * k))
15

Aquí está el código para la distribución uniforme discreta en el rango [min, max], adaptado de la publicación 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)
colmillosamente
fuente
11

La página Vista de tareas CRAN: Distribuciones de probabilidad dice:

La distribución uniforme discreta se puede obtener fácilmente con las funciones básicas.

Supongo que algo en este sentido debería hacer:

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

EDITAR

Como señaló csgillespie, esto no es correcto ...

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

funcionará (tenga en cuenta que el ejemplo generará valores entre 1 y 100, no 0 y 100)

nico
fuente
2
Esto no es correcto para los casos límite. Para ver esto, intente ejecutar el siguiente comando: table(round(runif(10000, min=0, max=2)))claramente no es un uniforme discreto.
csgillespie
@csgillespie: muy bien visto, actualicé mi respuesta :)
nico
¿No podrías usar ceiling(runif(1000, min=-1, max=100))?
gung - Restablece a Monica