首页 > 解决方案 > 生成大向量的所有排列并有效地执行计算

问题描述

我有一个长度为 445 的向量“perm”,其中包括 260 个零和 185 个。我需要生成所有可能排列的矩阵。然后我需要有效地执行几个计算。我已经设法做到了这一点,但并不完全且效率不高(我使用了循环)。我需要帮助来改进我的代码,因为它很有启发性。

首先,由于 R 不允许我创建这个巨大的排列矩阵,我使用 'ri' 包随机抽样 100,000 个排列。

library(ri)    
lalonde <- read.csv('lalonde.csv')
perms <- genperms(lalonde$treat, maxiter=100000)

相反,我希望能够生成完整的排列矩阵(或列表列表,如果效果更好的话)。

然后,我将原始数据集 lalonde 与排列数据集合并。

lalonde1 <- data.frame(perms, lalonde)

我创建了一个空向量,在其中存储了后面的循环的输出

diff_vec <- vector(mode='list', length=100000)

我创建了一个循环,计算每个置换向量的绝对条件差。我将结果存储在空向量中。这远非有效,如果我能得到一些关于如何做得更好的建议,我将不胜感激。

for (i in 1:100000) {
  diff_vec[i] <- abs((mean(lalonde1[lalonde1[[i]]==1,"re78"])-mean(lalonde1[lalonde1[[i]]==0,"re78"])))
}

最后,对于平均值的每个绝对差,检查它是否大于或等于我存储的值,如果是则分配 1,否则分配 0。

p_val<-ifelse(diff_vec>=tau_hat, 1, 0)

对于那些关心的人,这是在一个完全随机的实验中计算一个精确的 p 值。

标签: rperformancepermutationlarge-datap-value

解决方案


推荐阅读