1

我正在尝试将income2012 年的值分配给当地人。这样本地val_AK的值将income在状态“AK”中,val_ALincome在状态“AL”中的值......这是.dta的Stata 11版本

以下代码生成AK not found r(111);但是AK确实存在于state_nsw,这是一个字符串变量:

foreach i in "AK" "AL" "AR" "AZ" {
     if (state_nsw=="`i'" & year==2012) { local val_`i'=income}
     }

我也尝试过使用这种方法和这个:

if (state_nsw=="`i'" ...
...
// and got invalid name r(198)

我的错误在哪里?

4

2 回答 2

4

作为state_nsw字符串变量,它只能与文字字符串或另一个字符串变量进行比较。

简化为循环中的第一个值

foreach i in "AK" {
    if (state_nsw == `i' & year == 2012) { local val_`i'=income }
}

内部语句被解释为

    if (state_nsw == AK & year == 2012) { local val_AK = income } 

现在就Stata而言AK不是文字字符串,所以它只能是字符串变量的名称。但是你没有这样的变量,这就是你得到错误的原因。更合适的应该是

    if (state_nsw == "AK" & year == 2012) { local val_AK = income } 

或者,更一般地说,

   if (state_nsw == "`i'" & year == 2012) { local val_`i'=income }

那么,您为什么会收到错误消息invalid name r(198):

 foreach i in "AK" "AL" "AR" "AZ" {
         if (state_nsw=="`i'" & year==2012) { local val_`i'=income}
         }

我无法通过查看您的代码来回答这个问题,但请参见下文。

你的烦恼还没有结束。你的代码很混乱。

将始终被解释为

    local val_`i' = income[1] 

不管if命令如何。

  • 自版本 8 以来,放置{ }在同一行之后if已经过时,可能无法按您的意愿工作。

应该工作的是

  foreach i in AK AL AR AZ { 
      su income if year == 2012 & state_nsw == "`i'", meanonly 
      local val_`i' = r(mean) 
  }

虽然你为什么要这样做是一个谜。

于 2013-06-23T22:54:25.087 回答
2

我仍然无法打开数据。尝试以下操作:

foreach i in "AK" "AL" "AR" "AZ"{
    gen val_`i'=income if state_nsw=="`i'" & year==2012
    local val `val' val_`i'
    }

Sample data and output: 
state   val year
AK  13  2010
AL  112 2010
AR  12  2010
AZ  14  2010


    val_AK  val_AL  val_AR  val_AZ  
    13              
            112         
                    12      
                             14 
于 2013-06-23T22:51:07.387 回答