## tl;dr > [[ICC を直感的に理解する]] の主張を、答えの分かっているデータを作って Stata で確かめます。 > > 1. ICC を 0.7 に決めて作ったデータから、相関・回帰係数・`icc` コマンドの 3 とおりで 0.7 を取り出す > 2. ICC を 0 から 1 まで振ると、回帰係数がその値に追随する > > 同じ内容の R 版は [[ICC を直感的に理解する(シミュレーション編、R版)]] にあります。乱数の種を固定しているので、コピペすれば同じ数字が出ます。 ## ICC 0.7 のデータを作り、3 とおりに取り出す ICC を 0.7 に決めて 100 人分を作り、相関・回帰係数・`icc` コマンドの 3 とおりで取り出します。同じ値が出ます。 ```stata * 600_icc_kakunin.do ICC 0.7 のデータを作り、3 とおりに取り出す capture cls *---------------------------------------- **# 準備 *---------------------------------------- clear all set seed 266 set obs 100 set cformat %9.4f set pformat %5.3f set sformat %8.2f *---------------------------------------- **# 全体の設定 * 平均、全体の SD、ICC を決める *---------------------------------------- gen heikin = 60 gen sd_zentai = 10 gen icc = 0.7 gen icc_igai = 1 - icc *---------------------------------------- **# データを作る * ICC は分散の比として定義されているので、 * SD に配分して使うときにはルートをとる必要がある *---------------------------------------- * 実力は人ごとに一度だけ作る。2 回の測定で共有する gen jitsuryoku = heikin + rnormal(0, sd_zentai*sqrt(icc)) * 運 (un) はテストのたびに作り直す gen un_1 = rnormal(0, sd_zentai*sqrt(icc_igai)) gen un_2 = rnormal(0, sd_zentai*sqrt(icc_igai)) gen test_1 = jitsuryoku + un_1 gen test_2 = jitsuryoku + un_2 format jitsuryoku un_* test_* %6.1f *---------------------------------------- **# 解析 *---------------------------------------- summarize jitsuryoku un_1 un_2 test_1 test_2, format * ICC である 0.7 が相関として示される * ICC は同じ人を 2 回測った値の相関である(正確には、2 回を入れ替え可能として扱った相関) corr test_1 test_2 * 回帰でも同じ値 (0.7) が出る * 係数が 1 を下回るので、平均 (61.4 点) より上の人は下がり、下の人は上がる * これで「もとが高い人ほど下がる!」は間違い。効果も変化も入れていない regress test_2 test_1 * 縮んだと言うなら、比べる相手は 0 ではなく 1 test test_1 = 1 * もともと Stata に入ってる icc コマンドで確かめる。long 形式が必要 gen id = _n reshape long test_, i(id) j(kai) icc test_ id * wide に戻す reshape wide *---------------------------------------- **# 変化量をベースラインに回帰しても、同じことをしている *---------------------------------------- * 係数は 0.6984 - 1 = -0.3016 になる * 検定は上の test test_1 = 1 と完全に一致する。F(1,98) = 16.94、p = 0.0001 gen henka = test_2 - test_1 regress henka test_1 ``` ``` Variable | Obs Mean Std. dev. Min Max -------------+--------------------------------------------------------- jitsuryoku | 100 61.3 7.6 40.9 79.9 un_1 | 100 0.0 5.6 -13.7 18.5 un_2 | 100 0.0 5.9 -15.1 14.5 test_1 | 100 61.4 9.2 39.3 86.0 test_2 | 100 61.4 9.2 43.1 83.9 | test_1 test_2 -------------+------------------ test_1 | 1.0000 test_2 | 0.6935 1.0000 ------------------------------------------------------------------------------ test_2 | Coefficient Std. err. t P>|t| [95% conf. interval] -------------+---------------------------------------------------------------- test_1 | 0.6984 0.0733 9.53 0.000 0.5529 0.8438 _cons | 18.5232 4.5467 4.07 0.000 9.5005 27.5459 ------------------------------------------------------------------------------ . test test_1 = 1 ( 1) test_1 = 1 F( 1, 98) = 16.94 Prob > F = 0.0001 -------------------------------------------------------------- test_ | ICC [95% conf. interval] -----------------------+-------------------------------------- Individual | .696058 .5797531 .7846409 Average | .820795 .7339794 .8793264 -------------------------------------------------------------- ------------------------------------------------------------------------------ henka | Coefficient Std. err. t P>|t| [95% conf. interval] -------------+---------------------------------------------------------------- test_1 | -0.3016 0.0733 -4.12 0.000 -0.4471 -0.1562 _cons | 18.5232 4.5467 4.07 0.000 9.5005 27.5459 ------------------------------------------------------------------------------ ``` 3 とおりの求め方が 0.70 の近くに揃います。 | 求め方 | 値 | |---|---| | `corr test_1 test_2` | 0.6935 | | `regress test_2 test_1` の係数 | 0.6984 | | `icc test_ id` の Individual | 0.6961 | 設定した 0.70 に対して三桁目が揺れるのは、n = 100 だからです。種を引き直せば ±0.1 ほど動きます。回帰係数が相関とほぼ同じ値になるのは、`test_1` と `test_2` の SD がどちらも 9.2 で揃っているためです。 `icc` の出力にある Average の 0.82 は、2 回の平均値を使ったときの再現性です。1 回だけ測って使う指標の再現性を見るときは Individual のほうを読みます。 ### 落とし穴 係数が 1 を下回るので、平均の 61.4 点より上の人は下がり、下の人は上がります。 | test_1 | 予測 test_2 | 差 | |---|---|---| | 40 点 | 46.46 点 | +6.46 | | 61.4 点 | 61.40 点 | 0.00 | | 80 点 | 74.39 点 | −5.61 | **このデータには治療も変化も入っていません。**同じ人を 2 回測っただけで、こうなります。境目がちょうど平均に来るのも偶然ではなく、全体を底上げする効果がないからです。 ただし、回帰表の $p < 0.001$ を根拠にはできません。あれは「係数がゼロでない」の検定で、1 回目が 2 回目をいくらかでも予測すれば通ります。縮んだと言いたいなら比べる相手は 1 で、`test test_1 = 1` を使います。 そしてその検定は、変化量をベースラインに回帰したときの検定と完全に一致します。どちらも F(1, 98) = 16.94、$p = 0.0001$ です。変化量の回帰は別の解析に見えて、$\beta - 1$ を計算しているだけだからです。測定誤差があれば $\beta$ は必ず 1 を下回るので、この検定は何も起きていなくても通ります。詳しくは [[平均への回帰と回帰希釈を直感的に理解する]] を参照してください。 ## ICC を 6 条件で振ってみる 点数全体の SD を 10 に固定したまま、実力と運への配分だけを変えます。回帰係数が設定した ICC に追随します。 ```stata * 302_icc_sim.do ICC を変えながら、同じ人を 2 回測る clear all set seed 153 set obs 600 // 100 人 x 6 条件 * 条件ごとに ICC を割り当てる gen byte joken = ceil(_n/100) gen double icc = . replace icc = 1.0 if joken==1 replace icc = 0.9 if joken==2 replace icc = 0.8 if joken==3 replace icc = 0.6 if joken==4 replace icc = 0.3 if joken==5 replace icc = 0.0 if joken==6 * 点数の SD を 10 に固定し、実力と運に配分する gen double sd_jitsuryoku = 10*sqrt(icc) // 実力の個人差 gen double sd_un = 10*sqrt(1 - icc) // 測るたびに変わる分(運) gen double jitsuryoku = rnormal(50, sd_jitsuryoku) gen double kai1 = jitsuryoku + rnormal(0, sd_un) // 1 回目 gen double kai2 = jitsuryoku + rnormal(0, sd_un) // 2 回目 * 条件ごとに回帰係数と相関を出す display _n " 設定ICC 回帰係数 相関" foreach v in 1.0 0.9 0.8 0.6 0.3 0.0 { quietly regress kai2 kai1 if abs(icc - `v') < 1e-9 local b = _b[kai1] quietly correlate kai1 kai2 if abs(icc - `v') < 1e-9 display " " %4.1f `v' " " %7.3f `b' " " %7.3f r(rho) } ``` ``` 設定ICC 回帰係数 相関 1.0 1.000 1.000 0.9 0.924 0.897 0.8 0.767 0.811 0.6 0.578 0.583 0.3 0.269 0.301 0.0 0.024 0.023 ``` R 版と数字が一致しないのは、乱数生成器が違うためです。どちらも設定値のまわりに出ます。 ## 次に読む - [[ICC を直感的に理解する]] — この記事が確かめている理屈 - [[ICC を直感的に理解する(シミュレーション編、R版)]] — 同じ内容の R 版 - [[平均への回帰と回帰希釈を直感的に理解する]] — 「ベースラインが悪い人ほど改善が大きい」が測定誤差だけで出てしまう話 - [[R - ICC を計算してみよう(評価者間一致研究)]] — 実データから ICC を計算する手順