我正试图在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的新手。
答案 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)
您面临的问题比您在这里意识到的要多,但所有问题都很简单。
循环的直接问题是,您希望将诸如2012_1
之类的值用作变量的值,但如果是这样,则它必须明确地是一个字符串,并被{{1}包围}。原因是下划线""
仅作为字符串的一部分可以接受。 Stata显然对您的命令感到困惑。该错误消息不太适合这种情况,尽管_
不是可接受的名称是正确的,这意味着变量或标量的名称。
如果您解决了该问题,那么下一个问题将是循环中第二次存在该变量,因此2012_1
是不可接受的。您将需要generate
。因此,replace
语句应放在循环之外。
然后,即使解决了这些问题,您的所有循环也会每次都使用相同的值覆盖变量。在循环结束时,所有观察值都将包含常数值generate
。
长期而言,仍然存在问题。显然,您需要一个月度日期变量,但是这样的月度日期变量在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
}
}
了解更好的方法-完全没有循环。