问题
I have a nested loop with 60 dimensions, i.e. I nest 60 loops into each other. In Stata the MWE would look like the following:
forvalues i = 1/60 {
forvalues j = 1/60 {
forvalues k = 1/60 {
forvalues l = 1/60 {
... imagine the 56 remaining loops here
}
}
}
}
The equivalent in R is:
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
}
}
}
}
The objective here is to avoid typing all 60 levels into my code and create a loop for the loop structure itself instead. This question appears so trivial. But for some reason I am struggling to come up with a solution.
Thank you for any suggestions.
Additional Information:
I have a dataset with 60 explanatory variables in it and would like to run regressions with every possible combination of these variables. More specifically I run univariate regressions of the dependent variable on all 60 explanatory variables separately and calculate certain criteria. Then I add a second regressor to the estimation equation and calculate criteria again. I.e. reg DependentVar ExplVar1 ExplVar2, reg DependentVar ExplVar1 ExplVar3, ..., reg DependentVar ExplVar60 ExplVar59. Dependent on the calculated criteria a branch of that regression tree is either advanced or terminated. E.g. the first branch reg DependentVar ExplVar1 ExplVar2 either continues to grow as reg DependentVar ExplVar1 ExplVar2 ExplVar3, reg DependentVar ExplVar1 ExplVar2 ExplVar4 etc. or terminated as reg DependentVar ExplVar1 ExplVar2. Branches that contain an explanatory factor more than once are also cut - such as reg DependentVar ExplVar1 ExplVar1 or reg DependentVar ExplVar1 ExplVar2 ExplVar1. Overall, I hence design a model selection approach. I am aware of already existant model selection commands, but need one that is customized to specific properties of the given dataset.
回答1:
Consider rapply with combn. Below demonstrates for 5 explanatory variables. For actual use case:
- replace
paste0("ExplVar", 1:5)with names of your 60 variables (possibly usingnames(df)) - replace sequence
1:5to1:60which includes simple one variable regression - replace DepVar with actual dependent variable
Being the the recursive member of the apply family, rapply (which I never dreamed would be dusted off the shelf for an SO answer!) will build a character vector of linear formulas from nested list which can then be iterated with 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)))
NOTE: Be careful as the number of combinations for 60 variables across varying lengths is very high!
来源:https://stackoverflow.com/questions/51969529/loop-nested-loops-in-r-or-stata