嵌套 for 循环:错误变量已定义

Nested for-loop: error variable already defined

我在 Stata 中有一个嵌套循环,其中包含四层 foreach 语句。通过这个循环,我试图创建一个名为 strata 的新变量,范围从 1 到 40。

    foreach x in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 {
         foreach r in 1 2 3 4 5 {
             foreach s in 1 2 {
                 foreach a in 1 2 3 4 {
                    gen strata= `x' if race==`r' & sex==`s' & age==`a'
                }
            }
    }
}

我收到一个错误:

"variable strata already defined"

即使有错误,循环也会分配 strata = 1,但不会分配其余的层。所有其他单元格都是 missing/empty.

示例数据:

* Example generated by -dataex-. To install: ssc install dataex
clear
input byte(age sex race)
1 2 2
1 2 1
1 1 1
1 1 1
1 2 1
2 2 1
2 2 1
4 2 1
1 2 1
4 2 1
3 2 1
2 2 1
4 2 1
4 2 2
3 2 1
4 1 3
4 2 1
4 2 1
2 1 2
4 2 1
2 2 1
3 2 1
3 2 1
1 2 3
4 2 1
1 2 5
4 2 1
4 2 1
4 2 2
4 2 1
2 2 1
4 1 1
3 2 1
1 2 1
2 2 1
4 2 1
1 2 2
2 2 3
1 1 3
4 2 1
2 2 3
1 2 1
1 1 1
2 2 3
1 2 1
1 1 3
1 2 1
2 2 1
3 2 1
1 2 1
4 2 1
1 2 2
1 2 1
2 2 1
4 2 1
4 2 1
1 2 1
1 2 1
4 2 1
2 2 1
4 2 1
1 2 1
1 1 3
2 2 1
1 1 1
4 1 1
3 2 1
2 2 1
1 2 1
1 1 1
2 2 3
4 2 2
2 2 1
2 2 1
3 2 1
2 2 2
3 2 1
2 1 1
1 1 1
3 2 1
1 2 3
4 2 1
4 2 1
2 2 1
1 2 1
1 1 1
3 2 1
4 2 1
2 2 3
1 2 3
4 2 1
3 2 1
2 2 1
4 2 1
3 2 1
2 1 1
1 2 1
2 2 1
2 2 3
1 1 1
end
label values sex sex
label def sex 1 "male (1)", modify
label def sex 2 "female (2)", modify
label values race race
label def race 1 "non-Hispanic white (1)", modify
label def race 2 "black (2)", modify
label def race 3 "AAPI/other (3)", modify
label def race 5 "Hispanic (5)", modify

generate 用于生成新变量。您的代码第二次到达 generate 语句时,代码由于给定的原因而失败。

一个答案是您需要 generate 循环外的变量,然后 replace 循环内的变量。

由于其他原因,您的代码可以分阶段重写。

首先,用forvalues可以更方便高效地指定整数序列,可以简写:我倾向于写forval.

gen strata = . 
forval x = 1/40 {
    forval r = 1/5 {
        forval s = 1/2 {
            forval a = 1/4 {
                replace strata = `x' if race==`r' & sex==`s' & age==`a'
            }
        }
    }
}

其次,代码无论如何都存在缺陷。一切都以 40 结束!

第三,你可以更直接地进行分配,比如

gen strata = 8 * (race - 1) + 4 * (sex - 1) + age  

这是一个独立的可复制演示:

clear
set obs 5
gen race = _n
expand 2
bysort race : gen sex = _n
expand 4
bysort race sex : gen age = _n
gen strata  = 8 * (race - 1) + 4 * (sex - 1) + age
isid strata

很明显,您可以而且应该针对不同的首选方案改变配方。