在forvalues循环中使用local会报告语法错误

时间:2018-04-22 05:07:49

标签: stata

我使用两级循环来创建一组变量。但Stata报告语法错误。

    forvalues i = 1/5 {
        local to `i'+1
        dis `to'

        forvalues j = `to'/6{
            dis `j'
            gen e_`i'_`j' = .
        }

    }

我无法弄清楚我在哪里犯了语法错误。

还有一个后续问题。我想改变上面例子中循环次数的编码方式。现在,它被硬编码为5和6.但我想根据数据进行编码。例如,我的编码如下:

        sum x
        scalar x_max_1 = `r(max)'-1
        scalar x_max_2 = `r(max)'

        forvalues i = 1/x_max_1 {
        local to = `i'+1
        dis `to'

        forvalues j = `to'/x_max_2{
            dis `j'
            gen e_`i'_`j' = .
        }

    }

但是,在这种情况下,Stata会报告语法错误。我不知道为什么。标量是一个数字变量。为什么上面的代码不起作用?

1 个答案:

答案 0 :(得分:2)

你的代码会更好

forvalues i = 1/5 {
    local to = `i' + 1
    forvalues j = `to'/6 {
        gen e_`i'_`j' = .
    }
}

使用您的代码

local to `i' + 1 

所以第一次循环to成为字符串或文本1 + 1,然后作为forvalues的参数非法。也就是说,没有local符号的=定义将导致文本复制,而不是表达式的评估。

您使用display的方式无法显示此错误,因为display使用该方式将尽可能地评估表达式。如果你坚持认为宏是一个带

的字符串
di "`to'" 
那么你会看到它的内容。

另一种方法是

forvalues i = 1/5 {
    forvalues j = `= `i' + 1'/6 {
        gen e_`i'_`j' = .
    }
}

编辑

您进一步询问了

sum x
scalar x_max_1 = `r(max)'-1
scalar x_max_2 = `r(max)'

forvalues i = 1/x_max_1 {

并且可以说很多。让我们从各种更好的解决方案中倒退:

sum x, meanonly 
forvalues i = 1/`= r(max) - 1' {

或其他,也许更透明一点:

sum x, meanonly 
local max = r(max) - 1 

forvalues i = 1/`max' { 

这里有什么消息:

  1. 如果您只想要最大值,请指定meanonly。同意:单独的选项名称并不意味着这一点。有关详情,请参阅https://www.stata-journal.com/sjpdf.html?articlenum=st0135

  2. 将r级结果r(max)推入scalar有什么意义?您已经在r(max)中拥有了所需的内容。通过以下类比来教育自己。

  3. 我有我想要的东西。现在我把它放进一个盒子里。现在我把它从盒子里取出来。现在我又得到了我想要的东西。想想看,盒子业务可以削减。

    在这种情况下,该框为scalar,两个scalar

    1. forvalues无法评估标量,为您提供所需的数字。这将在许多语言中发生,但不是在这里。

    2. 更巧妙地,forvalues甚至不评估local引用或类似结构。发生的事情是,Stata的通用语法分析器会在您输入的内容传递给forvalues之前为您执行此操作。