Stata:使用元组本地宏在循环中生成变量

Stata:使用元组本地宏在循环中生成变量,stata,Stata,我需要生成整数1,2,3,4的所有可能元组(每个元组中正好有2个项)。然后,我需要生成一组变量,这些变量将对应于生成的六个元组。每个变量名应包含对元组的引用,每个变量的值应为元组本身的字符串版本,如下所示: +--------+--------+--------+--------+--------+--------+ | var_12 | var_13 | var_14 | var_23 | var_24 | var_34 | +--------+--------+--------+------

我需要生成整数1,2,3,4的所有可能元组(每个元组中正好有2个项)。然后,我需要
生成一组变量,这些变量将对应于生成的六个元组。每个变量名应包含对元组的引用,每个变量的值应为元组本身的字符串版本,如下所示:

+--------+--------+--------+--------+--------+--------+
| var_12 | var_13 | var_14 | var_23 | var_24 | var_34 |
+--------+--------+--------+--------+--------+--------+
|     12 |     13 |     14 |     23 |     24 |     34 |
+--------+--------+--------+--------+--------+--------+
虽然元组是通过使用
tuples
用户编写的命令生成的(有关详细信息,请参见),但我在生成新变量并在循环中为它们赋值时遇到了困难。代码如下所示,并导致语法错误,这可能是由于不正确地使用本地元组宏造成的,如果有人能帮助我解决这个问题,我将不胜感激

tuples 1 2 3 4, display min(2) max(2)

forval i = 1/`ntuples' {
    gen v`i'=`tuple`i''  
    rename v`i' var_`tuple`i''
}

tuples
是来自SSC的用户编写的命令。在这里,你会被要求解释它的来源,这也是一个非常好的主意

在您的例子中,您希望使用诸如12之类的整数来表示诸如“12”之类的元组,但在创建数值变量时,后者在Stata看来格式不正确。即使以其他方式显示的所有字符都是数字,Stata也肯定不会省略空格。所以你需要明确地做到这一点。在同一个名称下,给一个变量一个名称,然后立即重命名,就可以对其进行压缩

forval i = 1/`ntuples' {
    local I : subinstr local tuple`i' " " "", all 
    gen var_`I' = `I' 
}
为包含空格的元组创建一个字符串变量会使其中的一部分变得不必要,但变量名中仍然不允许有空格:

forval i = 1/`ntuples' {
    local I : subinstr local tuple`i' " " "_", all      
    gen var_`I' = "`tuple`i''"  
}
如果这就是你的全部问题,那么写出6条
生成
语句会更快!如果这是一个代表更大问题的玩具问题,请注意,表示“123”和“123”都将映射到“123”,因此,只有使用一位数整数才能清楚地省略空格;因此,拥有这样的条件是很有吸引力的


我仍然很好奇,在变量的每次观察中保持相同的元组是一个好主意;也许使用字符串标量或本地宏本身可以更好地满足更大的目的

tuples
是一个用户从SSC编写的命令。在这里,你会被要求解释它的来源,这也是一个非常好的主意

在您的例子中,您希望使用诸如12之类的整数来表示诸如“12”之类的元组,但在创建数值变量时,后者在Stata看来格式不正确。即使以其他方式显示的所有字符都是数字,Stata也肯定不会省略空格。所以你需要明确地做到这一点。在同一个名称下,给一个变量一个名称,然后立即重命名,就可以对其进行压缩

forval i = 1/`ntuples' {
    local I : subinstr local tuple`i' " " "", all 
    gen var_`I' = `I' 
}
为包含空格的元组创建一个字符串变量会使其中的一部分变得不必要,但变量名中仍然不允许有空格:

forval i = 1/`ntuples' {
    local I : subinstr local tuple`i' " " "_", all      
    gen var_`I' = "`tuple`i''"  
}
如果这就是你的全部问题,那么写出6条
生成
语句会更快!如果这是一个代表更大问题的玩具问题,请注意,表示“123”和“123”都将映射到“123”,因此,只有使用一位数整数才能清楚地省略空格;因此,拥有这样的条件是很有吸引力的


我仍然很好奇,在变量的每次观察中保持相同的元组是一个好主意;也许使用字符串标量或本地宏本身可以更好地满足更大的目的

非常感谢您的解决方案,它非常有效。我同意生成字符串标量会更容易(这里我的示例构成了整个实际问题,接下来我需要验证另一个变量的值是否与六个元组中的任何一个匹配),但我的想法是自动化过程,使用元组似乎是一种解决方法。非常感谢您的解决方案,它工作得非常好。我同意生成字符串标量会更容易(这里我的示例构成了整个实际问题,接下来我需要验证另一个变量的值是否与六个元组中的任何一个匹配),但我的想法是自动化过程,使用元组似乎是一种解决方法。