Loops Stata:变量的元素

Loops Stata:变量的元素,loops,vector,stata,Loops,Vector,Stata,如何编辑变量的每2个值 我的代码是: set obs 100 gen u = invnorm(uniform()) forvalues d = 1/50 { gen u[2*d] = u[2*d] + 1 } 我的代码有什么问题?生成的语法除了在生成之后和=之前的存储类型和变量名(以及标签名,此处不相关)之外,不允许任何内容。帮助文件清楚地指出了这一点 这里不需要循环。如果你想研究观察结果2,4。。。然后 gen new_u = u + 1 if mod(_n, 2) == 0 选择偶数

如何编辑变量的每2个值

我的代码是:

set obs 100
gen u = invnorm(uniform())
forvalues d = 1/50 {
gen u[2*d] = u[2*d] + 1
}

我的代码有什么问题?

生成
的语法除了在
生成
之后和
=
之前的存储类型和变量名(以及标签名,此处不相关)之外,不允许任何内容。帮助文件清楚地指出了这一点

这里不需要循环。如果你想研究观察结果2,4。。。然后

 gen new_u = u + 1 if mod(_n, 2) == 0 
选择偶数观察值。更改现有变量
generate
是非法的,但您可以

 replace u = u + 1 if mod(_n, 2) == 0 
缩写

 mod(_n, 2) == 0 

给定整数除以2的模(严格地说,余数)只能是1或0,因此对零求反(逻辑假)得到1(逻辑真)

附言

是一种称为随机正态偏差的古老方法,平均值为0,方差为1。在现代国家

rnormal()

我会的

您的循环的一行版本是:

genu=r正常(!mod(\n,2),1)

逻辑是从标准正态分布开始绘制,并希望向所有偶数观测值添加1。加1意味着分布的平均值是1而不是0。
rnormal()
函数的第一个参数是平均值。如果我们能为所有奇数观测值提供0,为所有偶数观测值提供1,那么我们就完成了。正如@NickCox在他的回答中指出的那样,这样的函数是
!mod(\n,2)

话虽如此,Nick的双线解决方案

gen u = rnormal()
replace u = u + 1 if mod(_n, 2) == 0
可能更容易阅读。这将是选择Nick的解决方案的一个很好的理由。

gen u=!mod(_n,2)+r normal()
是另一种方法。然而,我怀疑OP的问题比他们的例子更普遍!
rnormal()
gen u = rnormal()
replace u = u + 1 if mod(_n, 2) == 0