岡本安晴@(日本女子大学定年退職)です。 変量を何段階かに分けて各段階間の回帰モデルを求め、 それらを連結して全体のパス図としているものが卒論などで 見かけました。これが誤りである例を以下のように作成して みました。 3変量A、B、Cよりなるデータが以下のようであるとします。 CaseN A B C 1 51 70 76 2 82 94 74 3 10 25 55 4 40 59 71 5 24 61 65 6 19 59 72 7 28 23 59 8 44 29 46 9 49 38 49 10 63 80 62 11 51 35 42 12 78 65 59 13 30 68 69 14 97 80 53 15 12 45 68 16 77 59 46 17 51 65 66 18 65 79 61 19 24 17 52 20 29 57 72 上のデータにおいて変量Aと変量Bの単回帰モデルを求めると次式を得ます。 (1) B = 30.25 + 0.6644 * A + 残差 変量Cと変量Bの単回帰モデルは次式となります。 (2) C = 46.77 + 0.2542 * B + 残差 式(2)に式(1)を代入すると次式となります。 (誤った式) C = 46.77 + 0.2542 * (30.25 + 0.6644 * A + 残差) + 残差 = 54.46 + 0.1689 * A + 残差 しかし、変量Aと変量Cの単回帰モデルを直接求めると次式となります。 (3) C = 64.81 + (-0.0857) * A + 残差 単回帰モデル(1)と(2)を単純に繋いだ(誤った式)では、変量Aの係数は正の 値0.1689ですが、 単回帰モデルを直接適用した式(3)では、係数は負の値-0.0857です。 上のデータを生成したスクリプトは、以下の通りです。 import numpy as np np.random.seed(1) N = 20 a0 = np.random.random(N) - 0.5 e0 = np.random.random(N) - 0.5 b0 = (a0 + e0) / 2 e1 = np.random.random(N) - 0.5 c0 = (3 * b0 - 2 * a0 + e1) / 6 A = (a0 * 100 + 60).astype(int) B = (b0 * 100 + 60).astype(int) C = (c0 * 100 + 60).astype(int) f = open('temp.txt', 'w') f.write('{0:>5} {1:>5} {2:>5} {3:>5}\n'.format('CaseN', 'A', 'B', 'C')) N = 1 for a, b, c in zip(A, B, C): f.write('{0:5} {1:5} {2:5} {3:>5}\n'.format(N, a, b, c)) N += 1 f.close() なお、拙著 「いまさら聞けないPythonでデータ分析 —多変量解析,ベイズ統計分析(PyStan, PyMC)—」 http://y-okamoto-psy1949.la.coocan.jp/booksetc/pyda/ では、グループ変数を無視した場合と考慮した場合で相関係数がどう変わるかの例を 演習課題として扱っています。 横浜市在住 岡本安晴
ここは心理学研究の基礎メーリングリストに投稿された過去の記事を掲載しているページです。