R中是否有用于离散均匀分布的默认函数?


28

R中的大多数标准发行版都有一系列命令-pdf / pmf,cdf / cmf,分位数,随机偏差(例如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

Answers:


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参数设置为unif系列)会很方便。必须将函数定义添加到脚本中只是为了像使用其他标准发行版那样使用离散统一发行版,这有点丑陋。内置函数还处理错误处理(例如-如果参数不是整数),并针对速度进行了优化。

2
好答案。对于分位数,我们可以做类似qdu <-function(p,k)i​​felse(p <= 0 | p> 1,return(“ undefined”),ceiling(p * k))

15

以下是mbq帖子中改编的[min,max]范围内离散均匀分布的代码:

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

编辑

正如csgillespie指出的那样,这是不正确的...

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

虽然可以使用(请注意,示例将生成介于1和100 之间的值,而不是介于0和100 之间的值)


2
对于边缘情况,这是不正确的。为此,请尝试运行以下命令:table(round(runif(10000, min=0, max=2)))显然,它不是离散统一的。
csgillespie 2010年

@csgillespie:发现得很好,我更新了我的答案:)
nico

你不能用ceiling(runif(1000, min=-1, max=100))吗?
gung-恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.