Stataで連番の変数同士の処理を繰り返し行って行列にスカラー値を格納し,その行列の要素の値を条件に従って変換する方法

Stataで,うまいやり方がわからず四苦八苦したので,また後にも役つはずと思うし,参考にすることも多いと思うので,載せておく.

連番となっている変数 x1, x2, …, x10 をループを使って総当たりにして,
たとえば,Wilcoxonの符号検定(signrank)を行って,そのz値を10×10の行列 Z に格納する.

matrix Z = J(10, 10, .)

forvalues i=1/10 {

forvalues j=1/130 {
quietly signrank x`i’ = x`j’
matrix Z[`i’,`j’]= r(z)
}

}

ここでのポイントは,signrankによってz値がスカラー r(z) として吐き出されるので,それを行列 Z の適切な場所に格納することである.

さらに,行列Zの各要素 Zij において,値が1.96より大きい場合に,その要素を1に,1.96以下の場合に,その要素を0に変換する.
(細かいことだが,以下の例では,欠損値は欠損値のままとし,対角要素は0とすることにする.)

matrix Z2 = Z

forvalues i=1/10 {

forvalues j=1/10 {

if Z2[`i’,`j’] <= 1.959963984540054 {
matrix Z[`i’,`j’] = 0 }
if Z2[`i’,`j’] > 1.959963984540054 {
matrix Z[`i’,`j’] = 1 }
if Z2[`i’,`j’] == . {
matrix Z[`i’,`j’] = . }
if `i’ == `j’ {
matrix Z[`i’,`j’] = 0 }

}

}

ここでのポイントは,matrixを変換するときには,変数の値を変換するreplaceのような関数は使えない.
行列の要素を変換するには,上述ようなやり方が有効である.