如何在 Stata 中将“if”与本地宏一起使用?

Быв*_*сор 1 if-statement local stata

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

以下代码生成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}
     }
Run Code Online (Sandbox Code Playgroud)

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

if (state_nsw=="`i'" ...
...
// and got invalid name r(198)
Run Code Online (Sandbox Code Playgroud)

我的错误在哪里?

Nic*_*Cox 5

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

简化为循环中的第一个值

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

内部语句被解释为

    if (state_nsw == AK & year == 2012) { local val_AK = income } 
Run Code Online (Sandbox Code Playgroud)

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

    if (state_nsw == "AK" & year == 2012) { local val_AK = income } 
Run Code Online (Sandbox Code Playgroud)

或者,更一般地说,

   if (state_nsw == "`i'" & year == 2012) { local val_`i'=income }
Run Code Online (Sandbox Code Playgroud)

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

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

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

你的麻烦还没有结束。你的代码非常混乱。

总是会被解释为

    local val_`i' = income[1] 
Run Code Online (Sandbox Code Playgroud)

无论命令如何if

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

应该起作用的是

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

尽管你为什么要这么做还是一个谜。