我有以下参数列表和向量:
myList <- list(c(3, 0, 1), c(2, 2, 2))
vPar1 <- c(1, 5, 100)
vPar2 <- c(100, 5, 1)
我正在尝试从3个Beta
分布中提取形状参数为shape1 = vPar1
和shape2 = vPar2
的样本(逐元素)。
预期结果将是一个包含两个元素的列表:第一个元素将包含4个随机数(3个来自Beta(1, 100)
,而1个来自Beta(100, 1)
分布),而第二个列表元素将包含总共6个随机数(每个Beta(1, 100)
,Beta(5, 5)
和Beta(100, 1)
分布的2个随机数)。
我尝试使用mapply
产生所需的结果,即循环遍历3个参数的元素,但是我无法弄清楚应如何正确使用它:
mapply(function(x, shape1, shape2) {unlist(rbeta(x, shape1, shape2))},
myList,
MoreArgs = list(shape1 = vPar1, shape2 = vPar2),
SIMPLIFY = FALSE)
这将产生一个包含两个元素的列表,但每个元素具有3个随机数,分别代表预期的4个和6个数字。如果有任何建议,我将不胜感激!谢谢。
答案 0 :(得分:4)
一种选择是用list
遍历lapply
,然后在Map
内的嵌套lapply
中将'vPar1'和'vPar2'作为参数应用< / p>
lapply(myList, function(x) unlist(Map(rbeta, n = x, shape1 = vPar1, shape2 = vPar2)))
#[[1]]
#[1] 0.031955823 0.001533638 0.012877288 0.998004973
#[[2]]
#[1] 0.021860350 0.002145949 0.514477229 0.479578366 0.996876238 0.992356962
它也可以写为
lapply(Map(Vectorize(rbeta), myList, MoreArgs = list(shape1 = vPar1,
shape2 = vPar2)), unlist)
答案 1 :(得分:1)
出于好奇,我想看看您是否可以在不嵌套lapply
/ Map
的情况下执行此操作。我认为以这种方式没有任何好处,但是确实如此。使用Vectorize
,这样就不必在Map
内使用lapply
(好吧,不必至少键入它),然后使用compose
就可以了不必再进行一次lapply
传递即可取消列出。
set.seed(1)
lapply(myList, purrr::compose(unlist, Vectorize(rbeta, SIMP = F)),
shape1 = vPar1, shape2 = vPar2)
# [[1]]
# [1] 0.0269188825 0.0074012868 0.0005853054 0.9941391825
#
# [[2]]
# [1] 0.037118765 0.004534898 0.631806102 0.602790723 0.983948500 0.999301928