Esistono funzioni predefinite per distribuzioni uniformi discrete in R?


28

La maggior parte delle distribuzioni standard in R ha una famiglia di comandi: pdf / pmf, cdf / cmf, quantile, deviate casuali (ad esempio dnorm, pnorm, qnorm, rnorm).

So che è abbastanza facile utilizzare alcuni comandi standard per riprodurre queste funzioni per le distribuzioni uniformi discrete, ma esiste già una famiglia di funzioni incorporate preferita per modellare distribuzioni uniformi discrete in R di cui non sono a conoscenza?


Per coloro che ancora cercano una risposta, ho trovato questo: purrr :: rdunif, vedi: rdrr.io/cran/purrr/man/rdunif.html
Nnie

1
@Nnie, questo non risponde realmente all'intera domanda che ha richiesto l'intera famiglia di funzioni, mentre quella a cui ti colleghi fa solo disegni casuali.
mdewey,

La famiglia completa è disponibile su rdocumentation.org/packages/extraDistr/versions/1.8.10/topics/… nel pacchetto extraDistr, a quanto pare.
Kcrisman,

Risposte:


32

Come ha scritto nico, non sono implementati in R. Supponendo che lavoriamo in 1..k, quelle funzioni dovrebbero apparire come:

Per generazione casuale:

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

4
Grazie. Penso che sarebbe utile avere funzioni integrate (con parametri min e max nella famiglia unif). È un po 'brutto dover aggiungere definizioni di funzioni negli script solo per usare le distribuzioni uniformi discrete nel modo in cui useresti altre distribuzioni standard. Le funzioni integrate gestiscono anche la gestione degli errori (ad esempio, se i parametri non sono numeri interi) e sono ottimizzati per la velocità.

2
Bella risposta. E per i quantili possiamo fare qualcosa come qdu <- function (p, k) ifelse (p <= 0 | p> 1, return ("undefined"), ceiling (p * k))

15

Ecco il codice per la distribuzione uniforme discreta nell'intervallo [min, max], adattato dal post di 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)

11

La visualizzazione attività CRAN: pagina Distribuzioni probabilità dice:

La distribuzione uniforme e discreta può essere facilmente ottenuta con le funzioni di base.

Immagino che qualcosa del genere dovrebbe fare:

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

MODIFICARE

Come ha sottolineato csgillespie, questo non è corretto ...

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

funzionerà comunque (si noti che l'esempio genererà valori compresi tra 1 e 100, non 0 e 100)


2
Questo non è corretto per i casi limite. Per vedere questo, prova a eseguire il comando seguente: table(round(runif(10000, min=0, max=2)))Non è chiaramente uniforme discreta.
csgillespie,

@csgillespie: ben individuato, ho aggiornato la mia risposta :)
nico,

Non potresti usare ceiling(runif(1000, min=-1, max=100))?
gung - Ripristina Monica
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.