r-迭代定义用户定义的离散分布

  • 本文关键字:定义 分布 用户 迭代 apply
  • 更新时间 :
  • 英文 :


我正在编写一个脚本,使用-distr-,根据以下对象定义一些离散分布:

margins <- c("discrete1", "discrete2")
vec1 <- list(support=c(0,1,2), probabilities=c(0.2, 0.2, 0.6))
vec2 <- list(support=c(12,14,20), probabilities=c(0.1, 0.15, 0.75))

下面的代码按预期工作:它创建了两个发行版。

library("distr")
discrete1 <- DiscreteDistribution (supp = vec1[[1]], prob = vec1[[2]])
ddiscrete1 <- d(discrete1)  # Density function
pdiscrete1 <- p(discrete1)  # Distribution function
qdiscrete1 <- q(discrete1)  # Quantile function
rdiscrete1 <- r(discrete1)  
discrete2 <- DiscreteDistribution (supp = vec2[[1]], prob = vec2[[2]])
ddiscrete2 <- d(discrete2) 
pdiscrete2 <- p(discrete2) 
qdiscrete2 <- q(discrete2) 
rdiscrete2 <- r(discrete2)  

一旦定义了两个(或更多)分布,我的最终目标是从中抽取随机数:

rdiscrete1(100)
rdiscrete2(100)

这段代码的问题是发行版的数量可能非常高。我想知道怎样才能以一种更优雅的方式自动创建函数。

此外,我需要两个函数是类DiscreteDistribution,而不是嵌套在列表中(见is(discrete1)在我的例子)。

l <- list(list(support = c(0, 1, 2), probabilities = c(0.2, 0.2, 0.6)),
          list(support = c(12, 14, 20), probabilities = c(0.1, 0.15, 0.75)))
distrs <- lapply(1:length(l), function(n) {
  d <- DiscreteDistribution(supp = l[[n]][[1]], prob = l[[n]][[2]])
  list(d = d, dd = d(d), pd = p(d), qd = q(d), rd = r(d))
})
# First object of class DiscreteDistribution 
is(distrs[[1]][[1]])
# [1] "DiscreteDistribution"        "UnivariateDistribution"      "AcDcLcDistribution"         
# [4] "Distribution"                "UnivDistrListOrDistribution"
# Random numbers
dim(sapply(distrs, function(x) x[[5]](100)))
# [1] 100   2