2014-05-21 53 views
0

如何編輯變量的每個第二個值?Stata:變量的元素

我的代碼是:

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

這有什麼錯我的代碼?

回答

6

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() 

將做到這一點。

4

你的循環的一個行版本是:

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 

可能會更容易閱讀。這將是選擇尼克解決方案的一個很好的理由。

+0

'gen u =!mod(_n,2)+ rnormal()'是另一種方法。但是,我懷疑OP的問題比他們的例子更普遍! –

+0

謝謝。有用!!! – user3659692