## 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 を計算する手順