Stata can';t使用变量计算if语句

Stata can';t使用变量计算if语句,stata,Stata,我有很多其他编程语言的经验,但是我在Stata语法方面有很多困难。我有一个语句,如果我输入值,它的求值是没有问题的,但是我不明白为什么它不能像我期望的那样计算变量 gen j=5 forvalues i = 1(1)5 { replace TrustBusiness_local=`i' if TrustBusiness_local2==`j' replace j=`j'-1 } 如果我将I和j分别替换为1和5,就像我期望从上面的代码中发生的那样,那么它工作正常,但是如果

我有很多其他编程语言的经验,但是我在Stata语法方面有很多困难。我有一个语句,如果我输入值,它的求值是没有问题的,但是我不明白为什么它不能像我期望的那样计算变量

 gen j=5

 forvalues i = 1(1)5 {
    replace TrustBusiness_local=`i' if TrustBusiness_local2==`j'
    replace j=`j'-1
 }

如果我将
I
j
分别替换为1和5,就像我期望从上面的代码中发生的那样,那么它工作正常,但是如果没有找到
则会出现
错误,否则在谷歌搜索时不会产生有意义的结果。有人看到我没有看到的吗?我讨厌粗暴地使用循环就可以完成的事情。

只要你用正确的方法来处理,就很容易理解

问题1。您从未定义过本地宏
j
。这本身不是一个错误,但它常常导致错误。不存在的宏相当于空字符串,因此Stata在本例中看到了代码

    if TrustBusiness_local2==`j'
作为

这是违法的;因此出现了错误消息

问题2。在被称为
j
的变量和被称为
j
但使用单引号引用的本地宏之间,没有原则上的联系。Stata中的变量是数据集中的变量(即列);这并不意味着任何编程语言意义上的变量。表示单个值的变量可以保存在标量或宏中的Stata中。将常量放入变量(Stata sense)是合法的,但通常是糟糕的风格。例如,如果您有数百万个观察值,则现在有一列
j
,其中有数百万个值为5

问题3。你可以合法地去

local j "j" 
因此,现在本地宏
j
包含文本
“j”
,这取决于您如何将其解释为变量名。很难理解你为什么要在这里这么做,但这是合法的

问题4。您的整个示例甚至不需要一个循环

replace TrustBusiness_local= 6 - TrustBusiness_local2 if inlist(TrustBusiness_local2, 1,2,3,4,5) 
而且,根据您的数据,
if
限定符可能是多余的。将5(1)1翻转到1(1)5只需从6中减去

问题5。您以Stata样式编写的循环示例可以是

local j = 5

forvalues i = 1/5 {
    replace TrustBusiness_local=`i' if TrustBusiness_local2==`j'
    local j=`j'-1
}
它可以变得更简洁,但考虑到问题4不需要循环,我将把它留在那里

问题6。顺便说一句,就Stata而言,您所说的不是
if
语句,因为示例中使用的
if
限定符与
if
命令不同

将一种语言的行话翻译成另一种语言的问题可能是具有挑战性的。看到我在其他语言的体验后的评论,Stata的宏操作起初对我来说似乎也很陌生;它们最好理解为等同于shell编程


我不会试图通过谷歌搜索来学习Stata。从头到尾读[U]。(在上一个问题的回答中也提出了类似的观点,但你不想相信!)

一旦你以正确的方式处理它,就很容易理解

问题1。您从未定义过本地宏
j
。这本身不是一个错误,但它常常导致错误。不存在的宏相当于空字符串,因此Stata在本例中看到了代码

    if TrustBusiness_local2==`j'
作为

这是违法的;因此出现了错误消息

问题2。在被称为
j
的变量和被称为
j
但使用单引号引用的本地宏之间,没有原则上的联系。Stata中的变量是数据集中的变量(即列);这并不意味着任何编程语言意义上的变量。表示单个值的变量可以保存在标量或宏中的Stata中。将常量放入变量(Stata sense)是合法的,但通常是糟糕的风格。例如,如果您有数百万个观察值,则现在有一列
j
,其中有数百万个值为5

问题3。你可以合法地去

local j "j" 
因此,现在本地宏
j
包含文本
“j”
,这取决于您如何将其解释为变量名。很难理解你为什么要在这里这么做,但这是合法的

问题4。您的整个示例甚至不需要一个循环

replace TrustBusiness_local= 6 - TrustBusiness_local2 if inlist(TrustBusiness_local2, 1,2,3,4,5) 
而且,根据您的数据,
if
限定符可能是多余的。将5(1)1翻转到1(1)5只需从6中减去

问题5。您以Stata样式编写的循环示例可以是

local j = 5

forvalues i = 1/5 {
    replace TrustBusiness_local=`i' if TrustBusiness_local2==`j'
    local j=`j'-1
}
它可以变得更简洁,但考虑到问题4不需要循环,我将把它留在那里

问题6。顺便说一句,就Stata而言,您所说的不是
if
语句,因为示例中使用的
if
限定符与
if
命令不同

将一种语言的行话翻译成另一种语言的问题可能是具有挑战性的。看到我在其他语言的体验后的评论,Stata的宏操作起初对我来说似乎也很陌生;它们最好理解为等同于shell编程


我不会试图通过谷歌搜索来学习Stata。从头到尾读[U]。(在上一个问题的回答中也提出了类似的观点,但你不想相信!)

哇,谢谢你。我一直想坐下来看看用户手册,但我的教授对Stata的知识已经足够让我度过这学期的大部分时间了。我当然计划在我自己的时间里更多地追求它。然而,我尝试用“本地j=0”替换“gen j=0”,并用local而不是replace来递减j,但仍然得到相同的错误。我几乎开始发布“derp it not work what do”,但我尝试复制/粘贴您的代码,效果非常好。我能看到的唯一区别是你把我的I=1(1)5改成了I=1/5,