Чи існують функції за замовчуванням для дискретних рівномірних розподілів у R?


28

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

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


Для тих, хто ще шукає відповіді, я знайшов це: purrr :: rdunif, див .: rdrr.io/cran/purrr/man/rdunif.html
Nnie

1
@Nnie, це насправді не відповідає на все запитання, яке вимагало повного сімейства функцій, тоді як той, на який ви посилаєтесь, робить лише випадкові.
mdewey

Повне сімейство доступне на сайті rdocumentation.org/packages/extraDistr/versions/1.8.10/topics/… у пакеті extraDistr, мабуть.
kcrisman

Відповіді:


32

Як писав nico, вони не реалізовані в 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) 

CDF:

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

4
Спасибі. Я думаю, було б корисно мати вбудовані функції (з min та max paraemters ala the unif family). Дещо некрасиво потрібно додавати визначення функцій у скрипти лише для того, щоб використовувати дискретні рівномірні розподіли так, як ви б використовували інші стандартні дистрибутиви. Вбудовані функції також стосуються обробки помилок (наприклад, якщо параметри не цілі числа) та оптимізовані для швидкості.

2
Гарна відповідь. А для квантових ми можемо зробити щось на кшталт qdu <- функція (p, k) ifelse (p <= 0 | p> 1, return ("невизначений"), стеля (p * k))

15

Ось код дискретного рівномірного розподілу в діапазоні [хв, макс], адаптованому з повідомлення 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

CRAN Перегляд завдань: Імовірність Розподіл сторінка говорить:

Дискретний рівномірний розподіл можна легко отримати за допомогою основних функцій.

Я думаю, що щось у цьому напрямі має зробити:

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

EDIT

Як зазначав csgillespie, це невірно ...

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

буде працювати, хоча (зауважте, що приклад буде генерувати значення між 1 і 100, а не 0 і 100)


2
Це не вірно для крайових випадків. Щоб побачити це, спробуйте виконати таку команду: table(round(runif(10000, min=0, max=2)))Однозначно це не дискретна уніформа.
csgillespie

@csgillespie: чудово помічений, я оновив свою відповідь :)
nico

Ви не можете використовувати ceiling(runif(1000, min=-1, max=100))?
gung - Відновити Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.