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)

結果の百分位表を記録して優れたものにする方法はありますか? 百分位値は 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)」は無効な構文です。この 2 つの不便さをどのように克服できるかについてのアドバイスをいただければ幸いです。

ありがとう

4

2 に答える 2

2

次の構文を使用できます。

いくつかのデータを読み込み、パーセンタイルを計算します。

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

結果を含むはずの行列を初期化する必要があります。この行列は と呼ばれXます。コマンドで要求されたセンタイルと同じ数の行がありますcentile。2 つの列があります。この段階で、行列には​​ゼロが入力されます。

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

次のループは、centileコマンドの結果をステップ実行し、行列のゼロをX適切な結果に置き換えています。行列の最初の列には百分位数 (1、5、10、...) が含まれ、2 番目の列には結果が含まれます。

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この方法または別の方法 (データに適用するか、 または のオプションとしてlist)を使用して、いつでも好きなだけ桁数を表示できますmatrix 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 に答える