我使用以下函数根据一些均衡/相关矩阵Sigma
创建一堆正态分布的数据。
fun <- function(.sample_size, .Sigma, .ndraws = 1, ...) {
replicate(.ndraws,
scale(MASS::mvrnorm(.sample_size, mu = rep(0, ncol(.Sigma)), Sigma = .Sigma)),
simplify = FALSE)
}
Sigma <- matrix(c(1, 0.3, 0.3, 1), nrow = 2)
函数mvrnorm
有一个额外的参数empirical
,可以设置为TRUE
或FALSE
。我在我的函数...
中添加了fun
agrument,以便在我使用empirical = T
时根据需要将参数mvrnorm
传递给fun
函数。所以我做了:
dat <- fun(.sample_size = 100, .Sigma = Sigma, empirical =TRUE)
lapply(dat, cor)
#> [[1]]
#> [,1] [,2]
#> [1,] 1.0000000 0.3164037
#> [2,] 0.3164037 1.0000000
但这似乎不起作用,因为empirical = T
会更改生成的数据,以便可以恢复原始的Sigma
矩阵。
如果我执行我的函数体,这项工作:
dd <- replicate(1, scale(MASS::mvrnorm(100, mu = rep(0, 2), Sigma = Sigma, empirical = TRUE)), simplify = FALSE)
lapply(dd, cor)
#> [[1]]
#> [,1] [,2]
#> [1,] 1.0 0.3
#> [2,] 0.3 1.0
问题:我做错了什么?
答案 0 :(得分:2)
您需要将省略号传递给函数内的函数调用。否则,传递给它的参数将被忽略(有时需要)。
但是,我认为这仍然无法正常工作,因为replicate
似乎不支持传递省略号。原因可能是它处理的是表达式而不是函数。我建议您直接使用lapply
:
fun <- function(.sample_size, .Sigma, .ndraws = 1, ...) {
lapply(seq_len(.ndraws),
function(.sample_size, .Sigma, .ndraws, ...)
scale(MASS::mvrnorm(.sample_size, mu = rep(0, ncol(.Sigma)), Sigma = .Sigma, ...)),
.sample_size = .sample_size, .Sigma = .Sigma, .ndraws = .ndraws, ...)
}
Sigma <- matrix(c(1, 0.3, 0.3, 1), nrow = 2)
set.seed(42)
dat <- fun(.sample_size = 100, .Sigma = Sigma, empirical = FALSE)
dat[[1]][1:3,]
# [,1] [,2]
#[1,] 0.3228743 1.8240016
#[2,] -1.1732884 0.1865766
#[3,] 0.8237171 -0.2726090
set.seed(42)
dat <- fun(.sample_size = 100, .Sigma = Sigma, empirical = TRUE)
dat[[1]][1:3,]
# [,1] [,2]
#[1,] -0.3919629 -1.8811836
#[2,] 1.1444412 -0.4162717
#[3,] -0.7976478 0.4429600