本地宏观正在消失"在循环中使用时

时间:2015-02-08 06:32:54

标签: loops stata stata-macros

我有一个小代码片段,我在其中定义了一个在i循环中使用的本地宏forvalues

matrix I=I(4)
scalar x1=b[1,1]
scalar sum1=0

local  i = 2
forvalues i = 2/4 {
    scalar chk=i-1

    forvalues j = 1/`=chk' {
        scalar sum1=I[`i',`j']*x`j'+sum1
    }
    scalar x`i'=(b[`i',1]-sum1)/I[`i',`i']
}

然而,Stata抱怨道:

error 111 
i not found 

请注意,只有在循环中使用宏时才会出现此错误,否则会出现此错误。

1 个答案:

答案 0 :(得分:1)

你提出的Stata问题是行

scalar chk = i - 1

Stata看到i的引用,显然无法将其解释为变量或标量名称,因此会出现错误消息。这就是Stata的观点。

从您的角度来看,错误不是使用单引号来提取本地宏i的值或内容,或者至少看起来是您的意图,因为您无处可解释您的目标。所以,什么都没有消失;你刚才提到了一个不存在的实体。然而,这只是一个细节,这里有一个更大的故事。

这是您的代码的第一次重写。

matrix I = I(4)
scalar x1 = b[1,1]
scalar sum1 = 0

forvalues i = 2/4 {
    local chk = `i' - 1
    forvalues j = 1/`chk' {
        scalar sum1 = I[`i',`j'] * x`j' + sum1
    }
    scalar x`i' = (b[`i',1] - sum1) / I[`i',`i']
}

注记。

  1. local i = 2似乎是多余的。 forvalues循环初始化宏。

  2. 作为一种风格问题,经验丰富的Stata程序员通常会使用本地宏而不是永久标量来实现瞬态循环限制。

  3. 但等待:I(4)只是一个有4行和1列的单位矩阵,主对角线为1,其他地方为0。所以

    I[`i',`i'] 
    

    必然是1和

    I[`i',`j'] 
    

    对于矩阵的同一行的早期条目是0.所以sum1永远不会是0.所以你不需要身份矩阵用于任何明显的目的,你的代码似乎可以简化为提取来自矢量的四个标量:

    forvalues i = 1/4 {
        scalar x`i' = b[`i',1] 
    }
    

    EDIT。像

    这样的双循环
    forvalues i = 2/4 {
        local chk = `i' - 1
        forvalues j = 1/`chk' {
            ...  
        }
        ...
    }
    

    也可以写得更简洁

    forvalues i = 2/4 {
        forvalues j = 1/`= `i' - 1' {
            ...  
        }
        ...
    }