繁体   English   中英

多个随机变量卷积的R代码

[英]R code for convolution of multiple random variables

我试图通过多次添加简单的均匀分布来经验证明中心极限定理。

我以前主要使用VBA,所以自然而然地使用了for循环,但是我很好奇是否有任何方法可以简化R中的代码,因为我希望能够运行至少50次。 代码如下所示:

A <- seq(1,8,1)
B <- seq(1,8,1)
C <- seq(1,8,1)
D <- seq(1,8,1)


p.Z <- as.integer()

for(a in 1:8){
    for(b in 1:8){
        for(c in 1:8){
            for(d in 1:8){
                Z <- A[a] + B[b] + C[c] + D[d]
                p.Z <- c(p.Z, Z)
            }
        }
    }
}

我不了解其背后的统计信息,但可以肯定地使用expand.gridrowSums简化代码。 expand.grid创建输入向量的所有组合。

p1 <- rowSums(expand.grid(1:8, 1:8, 1:8, 1:8))

与OP的for循环中的pZ进行比较

identical(p1, p.Z)
#[1] TRUE

为了动态地做到这一点,我们可以在replicate使用do.call

n <- 4
rowSums(do.call(expand.grid, replicate(n, 1:8, simplify = FALSE)))

使用tidyr crossing也可以实现相同的行为

rowSums(tidyr::crossing(a = 1:8, b = 1:8, c = 1:8, d = 1:8))

我们可以用

p1 <- Reduce(`+`, expand.grid(rep(list(1:8), 4)))
all.equal(p1, p.Z)
#[1] TRUE

或使用data.table CJ

CJ(a = 1:8, b = 1:8, c = 1:8, d = 1:8)[, Reduce(`+`, .SD)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM