用嵌套循环Stata填充变量

时间:2020-04-29 05:10:10

标签: loops stata

我正试图在Stata中创建一个这样的变量:

date
2012_1
2012_2
2013_1
2013_2

下一个循环:

forval y=2012/2013{
forval m=1/2{
display `m'         
    gen date =  `y'_`m'
}
}   

但是我在第一次迭代中遇到此错误:2012_1 invalid name。抱歉,如果问题很明显,我是Stata的新手。

2 个答案:

答案 0 :(得分:2)

您的代码有很多问题。我会一一讲解。

`y'_`m'的第一个迭代的计算结果为2012_1。由于包含下划线,因此不能将其解释为数字。要解释为字符串值,需要将其包含在“”中。最后,Stata尝试将其解释为变量,但2012_1不是有效名称(必须以字母开头),因此会出现错误。

您可以将值括在引号中以创建字符串变量:"`y'_`m'"。这将适用于第一次迭代,但是由于变量'date'已经存在,因此第二次迭代会出现错误。创建变量后,您只能replace

最后,您的代码没有说明哪个值用于哪个观察值。即使您已经解决了已经提到的问题,您的变量也将包含所有观察值的相同值,即循环中最后一次迭代的值。要仅替换一个观察值,您必须指定in i,其中i是观察值。

总而言之,这将是修改后的代码:

gen date = "."
local obs = 1
forval y=2012/2013{
    forval m=1/2{
        display `m'         
        replace date =  "`y'_`m'" in `obs'
        local ++obs
    }
}   

但是,我不建议创建这种类型的日期变量,因为字符串变量在您可以使用的方式上受到限制。 Stata的内部日期格式是最方便的。如果值1和2代表半年,则可以创建半年日期变量,有关如何执行此操作的信息,请参见help datetime。另一种选择是创建一个包含年份的数字变量,以及另一个包含1和2的数字变量。

答案 1 :(得分:2)

您面临的问题比您在这里意识到的要多,但所有问题都很简单。

  1. 循环的直接问题是,您希望将诸如2012_1之类的值用作变量的值,但如果是这样,则它必须明确地是一个字符串,并被{{1}包围}。原因是下划线""仅作为字符串的一部分可以接受。 Stata显然对您的命令感到困惑。该错误消息不太适合这种情况,尽管_不是可接受的名称是正确的,这意味着变量或标量的名称。

  2. 如果您解决了该问题,那么下一个问题将是循环中第二次存在该变量,因此2012_1是不可接受的。您将需要generate。因此,replace语句应放在循环之外。

  3. 然后,即使解决了这些问题,您的所有循环也会每次都使用相同的值覆盖变量。在循环结束时,所有观察值都将包含常数值generate

  4. 长期而言,仍然存在问题。显然,您需要一个月度日期变量,但是这样的月度日期变量在Stata中几乎没有用。它们按正确的顺序排序,但是对于统计数据或图形它们实际上是没有用的。

这是一个更好的主意:

2013_2

那仍然不是很好的风格。我想您并不是只想要第一个月和第二个月,但是我们不知道您真正想要什么。

在Stata中执行此操作:

generate mdate = . 
local i = 1 

forval y = 2012/2013 {
    forval m = 1/2 {
        replace mdate = ym(`y', `m') in `i' 
        local ++i       
    }
} 

了解更好的方法-完全没有循环。