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

R 迭代定义用户定义的离散分布,r,apply,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)) 这段代码的问题是发行版的数量可能非常高。。我想知道如何能够以更

我正在编写一个脚本,使用
-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))
这段代码的问题是发行版的数量可能非常高。。我想知道如何能够以更优雅的方式自动创建函数


另外,我需要这两个函数属于类
DiscretedDistribution
,而不是嵌套在列表中(请参见我的示例中的
is(discrete1)

l我不清楚您想要的最终结果是什么。似乎您创建的变量太多,无法使用唯一的名称跟踪。看起来你真的应该在这里使用列表来存储所有的发行版,这样你就可以很容易地访问它们。我编辑了这个问题,希望现在问题清楚了。谢谢,S.@Stezzo,这就是你想要达到的目标吗?谢谢你的回答,我想你已经很接近了。我同意部分不一致性,我正在编辑question@Stezzo,这个怎么样?虽然列表中有
DiscretedDistribution
对象,但它们都很好。我尝试了您建议的代码。如果我键入
Distributs[[1]]$rd(100)
它将从第一个分发中采样,但是dd、pd、qd、rd嵌套在列表中,我需要具有类DiscretedDistribution的整体功能。我试图使用unlist,但我无法找出问题所在。谢谢你的帮助!谢谢,这是对当前问题的回答。如果我在
-copula-
包中使用诸如边际分布之类的函数时遇到问题,我将发布一个特别问题。非常感谢你抽出时间!
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)
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