您提出的 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']
}
笔记。
这条线local i = 2
显得多余。forvalues
循环初始化宏。
就风格而言,有经验的 Stata 程序员通常会使用局部宏,而不是永久标量来限制瞬态循环。
但是等等:I(4)
它只是一个有 4 行和 4 列的单位矩阵,主对角线上为 1,其他地方为 0。所以
I[`i',`i']
必然是 1 并且
I[`i',`j']
对于矩阵同一行上的较早条目是 0。所以sum1
除了 0 之外什么都不是。所以你不需要单位矩阵用于任何明显的目的,你的代码似乎可以简化为从向量中提取四个标量:
forvalues i = 1/4 {
scalar x`i' = b[`i',1]
}
编辑。双循环像
forvalues i = 2/4 {
local chk = `i' - 1
forvalues j = 1/`chk' {
...
}
...
}
也可以写得更简洁
forvalues i = 2/4 {
forvalues j = 1/`= `i' - 1' {
...
}
...
}