拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 嵌套for回圈:错误变量已定义

嵌套for回圈:错误变量已定义

白鹭 - 2022-03-25 1952 0 0

我在 Stata 中有一个嵌套回圈,有四个级别的foreach陈述句。通过这个回圈,我试图创建一个名为strata1 到 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'
                }
            }
    }
}

我收到一个错误:

即使有错误,回圈也会分配strata= 1,而不是其余的层。所有其他单元格都丢失/为空。

示例资料:

* 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

uj5u.com热心网友回复:

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

显然,您可以而且应该为不同的首选方案改变配方。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *