用stata循环填充输出向量

当你在Stata中取一个variables的百分数时,例如。

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

有什么方法来logging产生的百分表performance出色? 百分位值存储在r(c_#)中,其中#表示您希望数据的百分位数。 但是我需要一个在所有百分位数上的值的向量,或多或less出现在输出窗口中。

我试图使用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的第一行,然后我将随后删除。 2)在这种情况下,我有21个百分点,但是如果我想改变这个百分数,自动化百分数会很好,例如:

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

但是“i = 1 / r(n_cent)”是无效的语法。 任何意见,如何我可以克服这两个不便之处,将不胜感激。

谢谢

您可以使用以下语法。

加载一些数据并计算百分位数。

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

应该包含结果的matrix必须被初始化。 这个matrix被称为X 它具有与通过百分比命令请求的百分比一样多的行。 它有两列。 在这个阶段,matrix填充零。

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

以下循环逐步通过centile命令的结果,并用适当的结果replacematrixX的零。 matrix的第一列包含百分位数(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 

如果你使用round() ,你很可能做错了什么。 故意丢失数据的精确度有几个原因; 您可以随时使用这种或那种format显示任意数量的数字(应用于数据,或作为listmatrix list的选项)。

  1. 我写了epctile命令返回百分比作为估计命令,即在e(b)向量中。 这可以立即使用; findit epctile下载。

  2. 您可以修改您的build议,如下所示:

     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)