3

我可以使用以下MyFun(用户定义的)函数来模拟观察。replicate但是当函数返回输出列表时,无法弄清楚如何用函数重复这个函数。

MyFun <- function(nSim, Size, Prob) {
  M1 <- t(mapply(rbinom, prob = Prob, n = nSim, size = Size))
  dimnames(M1) <- list(Prob, paste0("V", 1:nSim))
  MeanM1 <- M1/Size
  Results1 <- list(M1, MeanM1)
  return(Results1)
}

MyFun(nSim=5, Size=4, Prob=c(0.2, 0.4))

[[1]]
    V1 V2 V3 V4 V5
0.2  2  2  1  2  1
0.4  2  3  0  3  1

[[2]]
     V1   V2   V3   V4   V5
0.2 0.5 0.50 0.25 0.50 0.25
0.4 0.5 0.75 0.00 0.75 0.25

但没有给出想要的结果与replicate功能。

replicate(
    n=2
  , MyFun(nSim=5, Size=2, Prob=c(0.2, 0.4))
  , simplify = "array"
  )

    [,1]       [,2]      
[1,] Integer,10 Integer,10
[2,] Numeric,10 Numeric,10
4

2 回答 2

3

您的功能确实有效,它只有一个“奇怪”的输出。尝试将结果存储到一个名为aa.

 aa <- replicate(
+     n=2
+     , MyFun(nSim=5, Size=2, Prob=c(0.2, 0.4))
+     , simplify = T
+ )
 aa
     [,1]       [,2]      
[1,] Integer,10 Integer,10
[2,] Numeric,10 Numeric,10

但是那个 2 x 2 矩阵的每个元素本身就是一个矩阵。尝试这个:

 class(aa)
[1] "matrix"
 sapply(aa, class)
[1] "matrix" "matrix" "matrix" "matrix"

事实上,如果您提取前一个矩阵的第一个“单元格”,您会看到这是一个包含以下输出的矩阵MyFun

 aa[1,1]
[[1]]
    V1 V2 V3 V4 V5
0.2  0  1  0  0  1
0.4  1  2  0  2  0
于 2015-08-02T17:52:15.040 回答
3

尝试向您的函数添加一个简化参数,并将其传递给mapply().

MyFun <- function(nSim, Size, Prob, simplify = "array") {
    M1 <- t(
        mapply(rbinom, prob = Prob, n = nSim, size = Size, SIMPLIFY = simplify)
    )
    dimnames(M1) <- list(Prob, paste0("V", 1:nSim))
    MeanM1 <- M1/Size
    Results1 <- list(M1, MeanM1)
    return(Results1)
}

然后像这样调用它,使用simplify = FALSEin replicate()。这将生成一个长度为 2 的列表,其中每个元素包含两个数组。

replicate(2, MyFun(nSim=5, Size=2, Prob=c(0.2, 0.4)), simplify = FALSE)

[[1]]
[[1]][[1]]
    V1 V2 V3 V4 V5
0.2  1  0  2  0  0
0.4  2  0  1  1  0

[[1]][[2]]
     V1 V2  V3  V4 V5
0.2 0.5  0 1.0 0.0  0
0.4 1.0  0 0.5 0.5  0


[[2]]
[[2]][[1]]
    V1 V2 V3 V4 V5
0.2  0  0  0  0  1
0.4  2  1  1  1  0

[[2]][[2]]
    V1  V2  V3  V4  V5
0.2  0 0.0 0.0 0.0 0.5
0.4  1 0.5 0.5 0.5 0.0
于 2015-08-02T17:53:43.317 回答