2012-04-10 222 views
2

當您在Stata中獲取一個變量的百分位數時,例如。用stata循環填充輸出向量

*set directory 
    cd"C:\Etc\Etc Etc\" 
    *open data file 
    use "dataset.dta",clear 
    *get centiles 
    centile var1, centile(1,5(5)95,99) 

是否有某種方法可以記錄生成的百分表,從而實現卓越?百分位數值存儲在r(c_#)中,其中#表示您希望數據的百分位數。但是我需要一個所有百分位數值的向量,或多或少出現在輸出窗口中。

我試圖使用foreach循環來獲得百分位數爲載體,具體如下:

*Create column of centiles 
    foreach i in r(centiles) { 
    xx[1,`i']=r(c_`i') 
    } 

沒有成功。

感謝

編輯:

因爲我已經發現這個工作:

matrix X = 0,0 
    forvalues i=1/21 { 
    matrix X = `i',round(r(c_`i'),.001)\ X 
    } 

只有不便是:1)我必須包括0,0輸出AA第一行,然後我將隨後下降。 2)在這種情況下,我有21個百分位數,但它會是不錯的自動化我想改變它的情況下,百分位數的數字,例如像這樣:

forvalues i=1/r(n_cent) { 
    matrix X = `i',round(r(c_`i'),.001)\ X 
    } 

但是「I = 1/R (n_cent)「是無效的語法。任何有關我如何克服這兩種不便的建議都將不勝感激。

謝謝

回答

1

您可以使用以下語法。

加載一些數據並計算百分位數。

sysuse auto, clear 
centile price, centile(1,5(5)95,99) 

應該包含結果的矩陣需要初始化。這個矩陣被稱爲X。它具有與通過centile命令請求的百分位數一樣多的行。它有兩列。在這個階段,矩陣填充零。

matrix X = J(`=wordcount("`r(centiles)'")', 2, 0) 

下面的循環,通過centile命令的結果步進,並與相應的結果替換矩陣X的零。矩陣的第一列包含百分位數(1,5,10,...)和第二列的數量包含結果

forvalues i = 1/`=wordcount("`r(centiles)'")' { 
    local cent: word `i' of `r(centiles)' 
    matrix X[`i', 1] = `cent' 
    matrix X[`i', 2] = r(c_`i') 
} 

打印結果:

matrix list X 
0

如果正在使用round(),您可能會做錯事。故意失去數據精確度的原因很少;您可以隨時使用format這種或那種方式顯示任意數量的數字(應用於數據,或作爲listmatrix list的選項)。

  1. 我寫epctile命令,它返回百分位數作爲估計命令,即,在e(b)載體中。這可以立即使用; findit epctile可供下載。

  2. 您可以修改你的建議如下:

    local thenumlist 1, 5(5)95, 99 
    centile variable, centile(`thenumlist') 
    forvalues i=1/`=r(n_cent)' { 
        matrix X = nullmat(X) \ r(c_`i') 
    } 
    numlist "`thenumlist'" 
    matrix rownames X = `r(numlist)' 
    matrix list X, format(%9.3f)