循环嵌套循环(在 R 或 Stata 中)

Loop nested loops (in R or Stata)

我有一个 60 维的嵌套循环,即我将 60 个循环相互嵌套。在 Stata 中,MWE 如下所示:

forvalues i = 1/60 {
    forvalues j = 1/60 {
        forvalues k = 1/60 {
            forvalues l = 1/60 {
                ... imagine the 56 remaining loops here
            }
        }
    }
}

R 中的等价物是:

for(i in 1:60) {
    for(j in 1:60) {
        for(k in 1:60) {
            for(l in 1:60) {
                ... imagine the 56 remaining loops here
            }
        }
    }
}

这里的 objective 是为了避免在我的代码中输入所有 60 个级别,而是为循环结构本身创建一个循环。这个问题显得如此微不足道。但出于某种原因,我正在努力想出一个解决方案。

感谢您的任何建议。

附加信息:

我有一个包含 60 个解释变量的数据集,我想 运行 对这些变量的所有可能组合进行回归。更具体地说,我 运行 对因变量分别对所有 60 个解释变量进行单变量回归,并计算某些标准。然后我在估计方程中添加第二个回归量并再次计算标准。 IE。 reg DependentVar ExplVar1 ExplVar2reg DependentVar ExplVar1 ExplVar3、...、reg DependentVar ExplVar60 ExplVar59。根据计算的标准,该回归树的一个分支被推进或终止。例如。第一个分支 reg DependentVar ExplVar1 ExplVar2 要么继续增长为 reg DependentVar ExplVar1 ExplVar2 ExplVar3reg DependentVar ExplVar1 ExplVar2 ExplVar4 等,要么终止为 reg DependentVar ExplVar1 ExplVar2。不止一次包含解释因子的分支也会被删除 - 例如 reg DependentVar ExplVar1 ExplVar1reg DependentVar ExplVar1 ExplVar2 ExplVar1。总的来说,我因此设计了一种模型选择方法。我知道已经存在的模型选择命令,但需要一个针对给定数据集的特定属性定制的命令。

考虑 rapplycombn。下面对 5 个解释变量进行说明。对于实际用例:

  • paste0("ExplVar", 1:5) 替换为您的 60 个变量的名称(可能使用 names(df)
  • 将序列 1:5 替换为 1:60,其中包括简单的单变量回归
  • 用实际因变量
  • 替换DepVar

作为 apply 系列的递归成员,rapply(我做梦也没想到它会因为 SO 答案而被淘汰!)将构建一个来自嵌套列表的线性公式的特征向量,然后可以用 lm:

迭代
expvar_list <- lapply(1:5, function(x) combn(paste0("ExplVar", 1:5), x, simplify=FALSE))

formulas_list <- rapply(expvar_list, function(x) paste("DepVar ~", paste(x, collapse="+")))
formulas_list
#  [1] "DepVar ~ ExplVar1"                                    
#  [2] "DepVar ~ ExplVar2"                                    
#  [3] "DepVar ~ ExplVar3"                                    
#  [4] "DepVar ~ ExplVar4"                                    
#  [5] "DepVar ~ ExplVar5"                                    
#  [6] "DepVar ~ ExplVar1+ExplVar2"                           
#  [7] "DepVar ~ ExplVar1+ExplVar3"                           
#  [8] "DepVar ~ ExplVar1+ExplVar4"                           
#  [9] "DepVar ~ ExplVar1+ExplVar5"                           
# [10] "DepVar ~ ExplVar2+ExplVar3"                           
# [11] "DepVar ~ ExplVar2+ExplVar4"                           
# [12] "DepVar ~ ExplVar2+ExplVar5"                           
# [13] "DepVar ~ ExplVar3+ExplVar4"                           
# [14] "DepVar ~ ExplVar3+ExplVar5"                           
# [15] "DepVar ~ ExplVar4+ExplVar5"                           
# [16] "DepVar ~ ExplVar1+ExplVar2+ExplVar3"                  
# [17] "DepVar ~ ExplVar1+ExplVar2+ExplVar4"                  
# [18] "DepVar ~ ExplVar1+ExplVar2+ExplVar5"                  
# [19] "DepVar ~ ExplVar1+ExplVar3+ExplVar4"                  
# [20] "DepVar ~ ExplVar1+ExplVar3+ExplVar5"                  
# [21] "DepVar ~ ExplVar1+ExplVar4+ExplVar5"                  
# [22] "DepVar ~ ExplVar2+ExplVar3+ExplVar4"                  
# [23] "DepVar ~ ExplVar2+ExplVar3+ExplVar5"                  
# [24] "DepVar ~ ExplVar2+ExplVar4+ExplVar5"                  
# [25] "DepVar ~ ExplVar3+ExplVar4+ExplVar5"                  
# [26] "DepVar ~ ExplVar1+ExplVar2+ExplVar3+ExplVar4"         
# [27] "DepVar ~ ExplVar1+ExplVar2+ExplVar3+ExplVar5"         
# [28] "DepVar ~ ExplVar1+ExplVar2+ExplVar4+ExplVar5"         
# [29] "DepVar ~ ExplVar1+ExplVar3+ExplVar4+ExplVar5"         
# [30] "DepVar ~ ExplVar2+ExplVar3+ExplVar4+ExplVar5"         
# [31] "DepVar ~ ExplVar1+ExplVar2+ExplVar3+ExplVar4+ExplVar5"

models_list <- lapply(formulas_list, function(x) summary(lm(as.formula(x), mydata)))

注意注意不同长度的 60 个变量的组合数量非常多!