2

例如,当您在 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 循环将百分位数放入向量中,如下所示:

    *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)”是无效的语法。任何关于我如何克服这两个不便的建议将不胜感激。

谢谢

4

2 回答 2

2

您可以使用以下语法。

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

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
于 2012-04-11T07:20:17.143 回答
0

如果您正在使用round(),您可能做错了什么。故意丢失数据精度的原因很少;您始终可以使用format这种或另一种方式显示任意数量的数字(应用于数据,或作为 or 的选项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)
    
于 2012-04-11T09:04:39.997 回答