Существуют ли функции по умолчанию для дискретных равномерных распределений в R?

28

Большинство стандартных дистрибутивов в R имеют семейство команд - pdf / pmf, cdf / cmf, квантиль, случайные отклонения (например, dnorm, pnorm, qnorm, rnorm).

Я знаю, что достаточно просто использовать некоторые стандартные команды для воспроизведения этих функций для дискретных равномерных распределений, но есть ли уже предпочтительное встроенное семейство функций для моделирования дискретных равномерных распределений в R, о которых я не знаю?


источник
Для тех, кто все еще ищет ответ, я нашел это: purrr :: rdunif, см .: rdrr.io/cran/purrr/man/rdunif.html
Нни
1
@Nnie, это на самом деле не отвечает на весь вопрос, который требовал полного семейства функций, в то время как тот, на который вы ссылаетесь, только случайным образом рисует.
Мдевей
Полное семейство доступно по адресу rdocumentation.org/packages/extraDistr/versions/1.8.10/topics/… в пакете extraDistr, по-видимому.
Крисман

Ответы:

32

Как писал Нико, они не реализованы в R. Предполагая, что мы работаем в 1..k, эти функции должны выглядеть следующим образом:

Для случайного поколения:

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) 

КОР:

pdu<-function(x,k) ifelse(x<1,0,ifelse(x<=k,floor(x)/k,1))

источник
4
Спасибо. Я думаю, что было бы удобно иметь встроенные функции (с минимальными и максимальными параметрами, как в семействе unif). Немного некрасиво добавлять определения функций в сценарии только для того, чтобы использовать дискретные равномерные распределения так же, как вы использовали бы другие стандартные распределения. Встроенные функции также имеют дело с обработкой ошибок (например, если параметры не являются целыми числами) и оптимизированы по скорости.
2
Хороший ответ. А для квантилей мы можем сделать что-то вроде qdu <- function (p, k) ifelse (p <= 0 | p> 1, return ("undefined"), потолок (p * k))
15

Вот код для дискретного равномерного распределения в диапазоне [min, max], адаптированный из поста 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
источник
11

На странице CRAN Task View: Распределение вероятностей написано:

Дискретное равномерное распределение легко получить с помощью основных функций.

Я думаю, что-то вроде этого должно сделать:

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

РЕДАКТИРОВАТЬ

Как указал csgillespie, это не правильно ...

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

будет работать, хотя (обратите внимание, что пример будет генерировать значения от 1 до 100, а не от 0 до 100)

Nico
источник
2
Это не правильно для крайних случаев. Чтобы увидеть это, попробуйте выполнить следующую команду: table(round(runif(10000, min=0, max=2)))Это явно не дискретная форма.
csgillespie
@csgillespie: замечательно, я обновил свой ответ :)
Нико
Не могли бы вы использовать ceiling(runif(1000, min=-1, max=100))?
gung - Восстановить Монику