用stata循环填充输出向量

时间:2012-04-10 20:52:32

标签: excel loops foreach stata percentile

当您在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)

有什么方法可以将生成的百分表记录到Excel中吗?百分比值存储在r(c_#)中,其中#表示您想要数据的百分位数。但是我需要一个所有百分位数值的向量,或多或少出现在输出窗口中。

我试图使用foreach循环将centile放入向量中,如下所示:

    *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,0,然后我将丢弃。 2)在这种情况下,我有21个百分位,但如果我想要改变它,自动化百分位数会很好,例如:

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

但是“i = 1 / r(n_cent)”是无效的语法。关于如何克服这两个不便之处的任何建议都将不胜感激。

由于

2 个答案:

答案 0 :(得分:1)

您可以使用以下语法。

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

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

必须初始化应该包含结果的矩阵。该矩阵称为X。它具有与通过centile命令请求的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

答案 1 :(得分: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)