如何編輯變量的每個第二個值?Stata:變量的元素
我的代碼是:
set obs 100
gen u = invnorm(uniform())
forvalues d = 1/50 {
gen u[2*d] = u[2*d] + 1
}
這有什麼錯我的代碼?
如何編輯變量的每個第二個值?Stata:變量的元素
我的代碼是:
set obs 100
gen u = invnorm(uniform())
forvalues d = 1/50 {
gen u[2*d] = u[2*d] + 1
}
這有什麼錯我的代碼?
generate
的語法不允許除generate
之後和=
之前的存儲類型和變量名稱(以及此處不相關的標籤名稱)之外的任何語法。幫助文件清楚地表明瞭這一點。
這裏你不需要循環。如果你想觀測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
是
!mod(_n, 2)
因爲在劃分整數模量(嚴格地講,餘數)乘以2只能是1或0,所以否定零(邏輯假)給你一個(邏輯真)。
P.S.
invnorm(uniform())
是一種古老的方法來調用均值爲0,方差爲1的隨機偏離正常在現代Statas
rnormal()
將做到這一點。
你的循環的一個行版本是:
gen u = rnormal(!mod(_n,2),1)
的邏輯是,你開始從標準正態分佈平要1添加到所有甚至觀察。加1意味着分佈的均值是1而不是0. rnormal()
函數的第一個參數是平均值。因此,如果我們能夠爲所有奇數觀測值填充0,爲所有偶數觀測值填充1,那麼我們就完成了。作爲@NickCox在他的回答指出這樣的功能是!mod(_n,2)
話雖如此,尼克的雙線解決方案
gen u = rnormal()
replace u = u + 1 if mod(_n, 2) == 0
可能會更容易閱讀。這將是選擇尼克解決方案的一個很好的理由。
'gen u =!mod(_n,2)+ rnormal()'是另一種方法。但是,我懷疑OP的問題比他們的例子更普遍! –
謝謝。有用!!! – user3659692