【问题标题】:Clarification for a loop to create interaction terms in Stata澄清在 Stata 中创建交互项的循环
【发布时间】:2018-02-25 20:16:41
【问题描述】:

我发现以下问题/答案符合我的意愿:https://www.stata.com/statalist/archive/2009-09/msg00449.html

但是,我不清楚这一切发生了什么,并希望更好地理解。解决方案代码如下:

unab vars : var1-var30
local nvar : word count `vars'
forval i = 1/`nvar' {
  forval j = 1/`=`i'-1' {
    local x : word `i' of `vars'
    local y : word `j' of `vars'
    generate `x'X`y' = `x' * `y'
  }
}

我不明白第 4 行的语句是什么:``=i'-1'

i 指的是集合 {1,...,n} 中的数字,但我不明白 equals 或 -1 在做什么。我的假设是 -1 以某种方式消除了自己的观察,但我不清楚。任何解释将不胜感激。

【问题讨论】:

  • 与观察无关,这里甚至没有提到。外循环在所有变量的集合上,内循环在少一个上。在伪代码j 中,从1 运行到i - 1。语法见help macro
  • 好吧,你想做什么? =i'-1' 语句是 Stata 宏语法。宏引号内的 = 符号告诉 Stata 计算表达式,因此每个循环的计算结果为 'i' - 1。然而,正如尼克所说,这与观察无关,所以也许你还没有找到你的解决方案?这会创建一组变量的所有成对交互(除了自己的交互,即平方)。
  • 感谢 cmets。我以前没有在宏中遇到过 = 符号,这很有帮助。为了确保我理解正在发生的事情,我可以将宏或变量(在本例中为 i)嵌套在带有等号的宏引号内以对其进行评估,这可以在我想要评估包含宏的表达式的任何时候完成.所以以下是等价的: 1/i' or 1/=`i'' 并且两者都会产生包括二次项在内的交互作用。一个相关的问题:是否有类似的方法来引用表达式中的标量?还是我需要将其存储为宏来评估表达式?

标签: loops stata interaction


【解决方案1】:

假设你有一个局部宏 i 在一个范围内变化,你希望它的值减 1。你总是可以这样做

  local j = `i' - 1 

然后参考j。您也可以即时执行此操作:

 `= `i' - 1' 

 `=   ' 

Stata 将在此处评估表达式

`i' - 1 

并在命令行中替换该表达式的结果。

你也可以用标量做到这一点:

scalar foo = 42 

然后参考

`= foo' 

但是,请注意。标量名称和变量名称占用相同的命名空间。

`= scalar(foo)' 

在任何情况下都可以消除歧义并且可以说是一种很好的风格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    相关资源
    最近更新 更多