2012-04-10 80 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)