【问题标题】:Create fully antithetic draws using R使用 R 创建完全对立的绘图
【发布时间】:2025-12-27 04:25:06
【问题描述】:

假设我有矩阵d,它是二维(列)中采样过程的两种不同实现(行)的结果。我想开发一个函数,从这个原始矩阵创建完全对立的绘图。

c1 <- c(0.1, 0.6);c2 <- c(0.3, 0.8);d <- rbind(c1,c2)
#    [,1] [,2]
# c1  0.1  0.6
# c2  0.3  0.8

也就是说,比如第一个实现(c(0.1, 0.6))我想得到这个随机抽奖的二维镜像,生成了(2^2)的4种可能组合如下:

d1_anthi = matrix( 
  c(   d[1,1] ,   d[1,2],
    1 - d[1,1],   d[1,2],
       d[1,1] , 1 - d[1,2],
    1 - d[1,1], 1 - d[1,2]), nrow=2,ncol=4)
t(d1_anthi)
#      [,1] [,2]
# [1,]  0.1  0.6
# [2,]  0.9  0.6
# [3,]  0.1  0.4
# [4,]  0.9  0.4

类似地,对于第二个,实现结果如下:

d2_anthi = matrix( 
  c(   d[2,1] ,   d[2,2],
       1 - d[2,1],   d[2,2],
       d[2,1] , 1 - d[2,2],
       1 - d[2,1], 1 - d[2,2]), nrow=2, ncol=4)
t(d2_anthi)
#       [,1] [,2]
# [1,]  0.3  0.8
# [2,]  0.7  0.8
# [3,]  0.3  0.2
# [4,]  0.7  0.2

因此,我想要的对象将被锁定是这样的:

anthi_draws <- rbind(t(d1_anthi),t(d2_anthi))
     # [,1] [,2]
# [1,]  0.1  0.6  <- original first realization
# [2,]  0.9  0.6
# [3,]  0.1  0.4
# [4,]  0.9  0.4
# [5,]  0.3  0.8  <- original second realization
# [6,]  0.7  0.8
# [7,]  0.3  0.2
# [8,]  0.7  0.2

最后,我想创建一个函数,在给定一个随机数矩阵的情况下,它能够创建这个扩展的对偶抽签矩阵。比如下图中我有一个三个维度的采样,那么每次原始抽奖的总抽奖次数是2^3 = 8。

特别是,我在创建完整组合时遇到了问题,该组合取决于原始采样的维度(矩阵的列)。我计划使用expand.grid(),但我无法使用它创建完整的组合。欢迎任何有关创建此类功能的提示或帮助。提前谢谢你。

【问题讨论】:

    标签: r dataframe loops matrix combinations


    【解决方案1】:

    你可以试试这个

    do.call(
      rbind,
      apply(
        d,
        1,
        function(x) {
          expand.grid(data.frame(rbind(x, 1 - x)))
        }
      )
    )
    

    给了

          X1  X2
    c1.1 0.1 0.6
    c1.2 0.9 0.6
    c1.3 0.1 0.4
    c1.4 0.9 0.4
    c2.1 0.3 0.8
    c2.2 0.7 0.8
    c2.3 0.3 0.2
    c2.4 0.7 0.2
    

    【讨论】:

    • 天哪,多么优雅的解决方案!我对其进行了测试,即使在更高的维度上,它也能像魅力一样发挥作用。您能否在其中添加一些 cmets 以获得更好的可读性?例如,这个1 做了什么?非常感谢。
    • @ÁlvaroA.Gutiérrez-Vargas 1 表示我们逐行运行函数。