Stata foreach-循环观察特定值以获得特定输出

Stata foreach-循环观察特定值以获得特定输出,stata,Stata,我有一份50个州的名单,从2000年到2004年,历时5年 State year Alaska 2000 Alaska 2001 Alaska 2002 Alaska 2003 Alaska 2004 Alabama 2000 Alabama 2001 Alabama 2002 Alabama 2003 Alabama

我有一份50个州的名单,从2000年到2004年,历时5年

State        year   

Alaska       2000  
Alaska       2001  
Alaska       2002  
Alaska       2003  
Alaska       2004  
Alabama      2000      
Alabama      2001    
Alabama      2002    
Alabama      2003    
Alabama      2004     
Arizona      2000      
Arizona      2001    
Arizona      2002    
Arizona      2003    
Arizona      2004  
Arkansas     2000      
Arkansas     2001    
Arkansas     2002    
Arkansas     2003    
Arkansas     2004  
Colorado     2000      
Colorado     2001    
Colorado     2002    
Colorado     2003    
Colorado     2004
我想使用
local
创建一个
foreach
循环,只包含阿拉巴马州和科罗拉多州。 最终目标是拥有一个名为
dummy
的虚拟变量,在2002-2004年间,所有州的虚拟变量将为
0
,阿拉巴马州和科罗拉多州的虚拟变量将为
1

这将是最终的数据集:

State        year       dummy

Alaska       2000         0
Alaska       2001         0  
Alaska       2002         0  
Alaska       2003         0  
Alaska       2004         0  
Alabama      2000         0     
Alabama      2001         0    
Alabama      2002         1    
Alabama      2003         1    
Alabama      2004         1     
Arizona      2000         0      
Arizona      2001         0    
Arizona      2002         0    
Arizona      2003         0    
Arizona      2004         0  
Arkansas     2000         0      
Arkansas     2001         0    
Arkansas     2002         0    
Arkansas     2003         0    
Arkansas     2004         0  
Colorado     2000         0      
Colorado     2001         0    
Colorado     2002         1    
Colorado     2003         1    
Colorado     2004         1
这就是我迄今为止所尝试的

use "States.dta", replace
gen dummy = 0
local States "Alabama Colorado"
local i=1
foreach ii of local States {
replace dummy_treated = 1 if States == `ii' & year >=2002
local i=`i' + 1
}
当我运行这个程序时,它只为阿拉巴马州生成输出,不包括科罗拉多州。 当我关闭文件并重新运行程序时,错误消息显示

Alabama not found
r(111);

我能做些什么来解决这个问题?

我的答案分为两部分

第一:您的方法可以通过一个命令行来避免

gen wanted = inlist(States, "Alabama", "Colorado")  ///
& inrange(year, 2002, 2004) 
不需要循环。当关节条件为真时,右侧的计算结果为1,当其为假时,右侧的计算结果为0,这正是指示变量(您说的是“dummy”,这是一个更好地避免的术语,但就是这样)所要求的

第二:你的代码有什么问题?您的报告是矛盾的,因为您声明代码只工作了一次,但没有重复。我只能相信,如果你使用的是不同版本的数据。您得到的错误消息很容易解释。你在测试

States == Alabama 
当且仅当您有一个名为
Alabama
的变量,或者一个名为相同的字符串标量时,Stata才有意义。您没有这样的变量或标量,Stata抛出该命令,因为它找不到它认为您要求它使用的内容。出现错误的原因是
状态
显然是一个字符串变量,您需要测试

States == "Alabama" 
双引号对于指定文字字符串值而不是字符串变量或标量的名称至关重要

虽然这是非常不必要的,但是如果字符串变量
States
的值类似于
Alabama
,那么这将是一个合法的循环:

gen dummy = 0 

foreach s in Alabama Colorado { 
    replace dummy = 1 if inlist(States, "`s'") & inrange(year, 2002, 2004) 
} 

year>=2002
对于您的示例来说很好,但我在本文中提到
inrange()
是一个有用的函数

我没有试图纠正你给我们看的东西中的不一致之处。首先列出
状态的值
,但代码中的变量称为
状态
。该清单不明确您是否有字符串变量或显示带有值标签的数值变量。您
生成
一个名为
dummy
的变量,但
替换
一个名为
dummy\u的变量
。此外,初始化
本地i
,然后在循环中增加它是无害的,但毫无意义。有关询问更好的Stata问题的详细建议,请参阅。重点是将Stata数据显示为能够准确无误地再现数据的代码,并向我们显示能够忠实再现报告的问题的代码。我意识到不一致性带来的混乱。我应该现在编辑它并进行更改吗?由您决定,但真正的难题是为什么您声称此代码曾经工作过,即使有小的修改和部分修改。我想使用循环的唯一原因是:我想做的下一件事是在{2003,2004}年内为纽约和俄亥俄设置dummy=1。首先,作为一般性,我们只能解决你告诉我们的问题,而不知道你还有什么想法。第二,关于这些信息,仍然不需要循环。您可以将其构建到同一个命令中,也可以发出另一个命令。即使还有更多的条件,您的代码也将更易于阅读,更易于编写和调试。当循环是正确的工具时,它是美妙的,但当您正在努力将一系列特殊的条件适应到一个包罗万象的循环中时,它就不是了。如果你有问题,一定要问一个更一般或不同的问题。
inlist
限制为10个字符串。要在10个以上的州运行同一个命令,我需要做什么?或者这应该是一个不同的问题吗?我意识到我可以通过使用Or条件来克服这个问题
gen WARNED=inlist(州,“阿拉巴马州”、“科罗拉多州”…“第九州”);inlist(州,“第十州”、“第十二州”…“第十五州”)
这不是字面语法,而是其他语法;这是一个解决方案。