我正在使用两级循环来创建一组变量。但是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报告语法错误。我不知道为什么。标量是数字变量。为什么上面的代码不起作用?
您的代码会更好
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' {
这里的消息是什么:
如果只需要最大值,请指定meanonly
。同意:仅选项名称并不暗含此意思。有关更多信息,请参见https://www.stata-journal.com/sjpdf.html?articlenum=st0135。
将r类结果推r(max)
入a的意义scalar
何在?您已经有了所需的东西r(max)
。通过以下类比来教育自己。
我有我想要的。现在,我将其放入盒子中。现在,我将其开箱即用。现在我有了我想要的。想到这一点,可以减少票务业务。
在这种情况下scalar
,该框是,两个scalar
。
forvalues
不会评估标量来提供所需的数字。这将以多种语言发生,但不是在这里。
更巧妙地,forvalues
甚至不评估local
引用或类似的构造。发生的事情是,Stata的通用语法解析器会在您键入的内容传递给之前为您完成此操作forvalues
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句