迭代地定义用户定义的离散分布

时间:2014-07-12 15:34:08

标签: 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))。

1 个答案:

答案 0 :(得分:1)

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