2015-12-07 54 views
-1

我有133個收入變量(每個變量代表一個組)。我想要所有這些組的基尼係數,所以我在Stata中使用ineqdeco。我無法計算所有這些係數由手工,所以我創建了一個for循環:Stata:用於存儲基尼係數值的循環

gen sgini = . 
foreach var of varlist C07-V14 { 
forvalue i=1/133 { 
ineqdeco `var' 
replace sgini[i] = $S_gini 
} 
} 

還試圖改變順序:

foreach var of varlist C07-V14 { 
ineqdeco `var' 
forvalue i=1/133 { 
replace sgini[i] = $S_gini 
    } 
} 

,並指定i事先:

gen i = 1 
foreach var of varlist C07-V14 { 
    ineqdeco `var' 
    replace sgini[i] = $S_gini 
    replace i = i+1 
    } 
    } 

我不知道這最後的方法是否可行。 在所有情況下,我收到錯誤:weight not allowed r(101)。我不知道這意味着什麼,或者該怎麼做。基本上,我想計算所有133個變量的基尼係數,並將這些值存儲在一個長度爲133的向量中,這樣一個變量的所有係數都存儲在其中。

編輯:我發現這個錯誤與replace命令有關。我替換這一行:

replace sgini = $S_gini in `i' 

但現在不是做「循環」,所以我拿在sgini所有條目的第一個值。

+0

您在哪個示例中使用了修訂的替換命令?我認爲前兩個例子在替換命令之外還有其他問題。 –

+0

我在第一個和第二個例子中都使用了它們。你認爲這些錯誤是什麼?因爲我認爲它在varlist中出錯了,因爲它計算了第一個變量的基尼,這133次,並將其存儲在我的變量中。所以我猜'我'是正確的?但第三個例子在考慮varlist時沒有什麼不同.. –

回答

0

你的內循環沒有明顯的原因。如果你沒有比觀測更多的變量,那麼這可能會奏效:

gen sgini = . 
gen varname = "" 
local i = 1 
foreach var of varlist C07-V14 { 
    ineqdeco `var' 
    replace sgini = $S_gini in `i' 
    replace varname = "`var'" in `i' 
    local i = `i' + 1 
} 

在你的代碼明顯的問題(似乎)包括:

  1. 變量和局部宏之間的混亂。如果你對其他語言有很多經驗,很難打破舊的心理習慣。 (Mata更像此處的其他語言。)

  2. 不知道觀察環路是自動的。或者可能沒有看到這裏只需要一個單一的循環,其變化是循環變量很容易,但是你的伴隨循環觀察需要用你自己的代碼來安排。

  3. 將下標放在replace的LHS上。表示法是爲重量保留的,但在任何情況下都是非法的。要了解重量,請撥打search weightshelp weight

請注意,用這種記錄結果的方式,基尼係數並不與其他任何東西對齊。對此的一個令牌修復就是將相關的變量名稱記錄在旁邊,如上所述。

此解決方案的更高級版本將使用postfile保存到新數據集。

+0

謝謝!它完美的作品。首先,我有比觀察更多的變量的問題,但它解決了! –

+0

好。我添加了一些額外的細節。 –