アイスクリームの売上と溺死事故の件数には正の相関があります。しかし、アイスクリームが溺死を引き起こしているわけではありません。両方の変数に影響を与える気温という第三の変数が存在し、気温が上がるとアイスクリームの売上も溺死事故も増えるのです。このような「第三の変数によって生じる見かけ上の相関」を擬似相関(spurious correlation)と呼びます。
擬似相関を見破るために必要なのが、偏相関係数(partial correlation coefficient)です。偏相関係数は、第三の変数の影響を「統計的に取り除いた」あとに残る2変数間の真の相関を測定する指標です。
偏相関係数を理解すると、以下のような応用が開けます。
- 因果推論: 交絡変数を制御した上での変数間の関連を評価する
- グラフィカルモデル: ガウシアングラフィカルモデルにおける条件付き独立性の検定
- 脳神経科学: 脳領域間の機能的結合度(functional connectivity)の評価。第三の脳領域の影響を除外した真の結合を推定する
- 経済学: マクロ経済変数間の真の関係を交絡因子を制御して分析する
本記事では、偏相関係数を「残差回帰」と「精度行列(逆共分散行列)」の2つの視点から導出し、擬似相関の検出にどう活用できるかをPythonで実装して確認します。
本記事の内容
- 偏相関係数の直感的な理解
- 残差回帰による定義と導出
- 精度行列(逆共分散行列)との関係
- 高次偏相関への一般化
- 擬似相関の検出と条件付き独立性検定
- Pythonでの実装と可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
偏相関係数の直感的な理解
「第三の変数を制御する」とは
通常の相関係数(ピアソンの相関係数)$r_{xy}$ は、2つの変数 $x$ と $y$ の線形関係の強さを測ります。しかし、$x$ と $y$ の両方に影響を与える変数 $z$ が存在すると、$r_{xy}$ は $z$ を通じた間接的な関連を含んでしまいます。
偏相関係数 $r_{xy \cdot z}$ は、「$z$ の影響を除去した後に残る $x$ と $y$ の間の線形関係の強さ」を測ります。イメージとしては、$z$ の値を「一定に保った」上で $x$ と $y$ の関係を見る操作に対応します。
具体的にどう「$z$ の影響を除去」するのでしょうか。最も自然な方法は、$x$ と $y$ のそれぞれから $z$ で説明できる成分を回帰分析で取り除き、残った部分(残差)同士の相関を計算することです。
アイスクリームの例
アイスクリームの売上 $x$ と溺死事故 $y$ の相関 $r_{xy}$ は正の値です。しかし、気温 $z$ で $x$ を回帰して残差 $e_x$ を求め、同様に $z$ で $y$ を回帰して残差 $e_y$ を求めると、$e_x$ と $e_y$ の相関はほぼゼロになるかもしれません。つまり、気温の影響を除くと、アイスクリームの売上と溺死事故の間には直接的な関連がない、ということを偏相関が示すのです。
この直感を数学的に定式化しましょう。
残差回帰による定義
1次偏相関の定義
3つの変数 $x_1, x_2, x_3$ があるとき、$x_3$ を制御変数とした $x_1$ と $x_2$ の偏相関係数 $r_{12 \cdot 3}$ は、次の手順で定義されます。
ステップ1: $x_1$ を $x_3$ で回帰し、残差を求めます。
$$ e_{1 \cdot 3} = x_1 – \hat{x}_1 = x_1 – (a_0 + a_1 x_3) $$
ステップ2: $x_2$ を $x_3$ で回帰し、残差を求めます。
$$ e_{2 \cdot 3} = x_2 – \hat{x}_2 = x_2 – (b_0 + b_1 x_3) $$
ステップ3: 2つの残差の相関係数を計算します。
$$ \begin{equation} r_{12 \cdot 3} = \text{Corr}(e_{1 \cdot 3}, e_{2 \cdot 3}) \end{equation} $$
残差 $e_{1 \cdot 3}$ は「$x_3$ で説明できない $x_1$ の変動」であり、$e_{2 \cdot 3}$ は「$x_3$ で説明できない $x_2$ の変動」です。これらの相関を取ることで、$x_3$ の影響を除いた $x_1$ と $x_2$ の純粋な関連が測定されます。
相関係数を用いた計算公式
上記の残差回帰の結果は、元の相関係数を用いた次の閉形式に帰着します。
$$ \begin{equation} r_{12 \cdot 3} = \frac{r_{12} – r_{13}r_{23}}{\sqrt{1 – r_{13}^2}\sqrt{1 – r_{23}^2}} \end{equation} $$
この公式を導出します。$x_1, x_2, x_3$ を標準化して平均0、分散1とします。回帰 $x_1 = a x_3 + e_{1 \cdot 3}$ では、最小二乗法より $a = r_{13}$ です。残差は $e_{1 \cdot 3} = x_1 – r_{13}x_3$ となり、同様に $e_{2 \cdot 3} = x_2 – r_{23}x_3$ です。
$e_{1 \cdot 3}$ の分散を計算します。
$$ \text{Var}(e_{1 \cdot 3}) = \text{Var}(x_1 – r_{13}x_3) = 1 – 2r_{13}^2 + r_{13}^2 = 1 – r_{13}^2 $$
$e_{1 \cdot 3}$ と $e_{2 \cdot 3}$ の共分散を計算します。
$$ \text{Cov}(e_{1 \cdot 3}, e_{2 \cdot 3}) = \text{Cov}(x_1 – r_{13}x_3, x_2 – r_{23}x_3) $$
展開すると次のようになります。
$$ = \text{Cov}(x_1, x_2) – r_{23}\text{Cov}(x_1, x_3) – r_{13}\text{Cov}(x_3, x_2) + r_{13}r_{23}\text{Var}(x_3) $$
標準化変数では $\text{Cov}(x_i, x_j) = r_{ij}$、$\text{Var}(x_i) = 1$ なので次のようになります。
$$ = r_{12} – r_{23}r_{13} – r_{13}r_{23} + r_{13}r_{23} = r_{12} – r_{13}r_{23} $$
偏相関係数は共分散を標準偏差で割ったものなので次のようになります。
$$ r_{12 \cdot 3} = \frac{r_{12} – r_{13}r_{23}}{\sqrt{1 – r_{13}^2}\sqrt{1 – r_{23}^2}} $$
この公式からいくつかの重要な性質が読み取れます。
- $r_{13} = 0$ または $r_{23} = 0$(制御変数と片方の変数が無相関)の場合、$r_{12 \cdot 3} = r_{12}/\sqrt{1 – r_{23}^2}$ または $r_{12 \cdot 3} = r_{12}/\sqrt{1 – r_{13}^2}$ となり、偏相関は単純相関にほぼ等しくなります
- $r_{12} = r_{13}r_{23}$(相関が完全に $x_3$ を通じたもの)の場合、$r_{12 \cdot 3} = 0$ となり、擬似相関が完全に消えます
- 偏相関が単純相関より大きくなることもあります(抑制変数の効果)
次に、偏相関係数と精度行列の深い関係を見ていきましょう。
精度行列との関係
精度行列の定義
$p$ 個の変数 $x_1, x_2, \dots, x_p$ の共分散行列 $\bm{\Sigma}$ の逆行列を精度行列(precision matrix)と呼び、$\bm{\Omega} = \bm{\Sigma}^{-1}$ と書きます。
$$ \begin{equation} \bm{\Omega} = \bm{\Sigma}^{-1} = (\omega_{ij}) \end{equation} $$
精度行列には、偏相関係数と密接な関係があります。
偏相関と精度行列の関係
$x_i$ と $x_j$ の偏相関係数(他のすべての変数を制御)は、精度行列の成分から次のように計算できます。
$$ \begin{equation} r_{ij \cdot \text{rest}} = -\frac{\omega_{ij}}{\sqrt{\omega_{ii}\omega_{jj}}} \end{equation} $$
この関係は非常に強力です。共分散行列の逆行列を計算するだけで、すべての変数ペアの偏相関係数が一度に得られるのです。
この公式のマイナス符号は、精度行列の非対角成分の符号が偏相関の符号と逆であることを意味します。$\omega_{ij} < 0$ であれば偏相関は正、$\omega_{ij} > 0$ であれば偏相関は負です。
ガウシアングラフィカルモデルとの関連
多変量正規分布においては、偏相関がゼロであることと条件付き独立であることが同値です。
$$ r_{ij \cdot \text{rest}} = 0 \iff \omega_{ij} = 0 \iff x_i \perp x_j \mid \bm{x}_{\setminus\{i,j\}} $$
この性質は、ガウシアングラフィカルモデル(Gaussian graphical model, GGM)の基盤です。GGMでは、精度行列のスパース構造(ゼロパターン)がグラフの構造を決定します。$\omega_{ij} = 0$ ならノード $i$ と $j$ の間にエッジがなく、条件付き独立です。
LASSO型の正則化を精度行列の推定に適用するグラフィカルLASSOは、高次元データからスパースなグラフ構造を推定する手法として広く使われています。
高次偏相関の一般化
複数の制御変数
ここまでは1つの制御変数 $x_3$ のケースを扱いましたが、実際には複数の変数を同時に制御したい場合がほとんどです。$x_1$ と $x_2$ の偏相関を $x_3, x_4, \dots, x_p$ のすべてを制御して求めるのが高次偏相関です。
高次偏相関は、残差回帰の考え方をそのまま拡張すれば計算できます。$x_1$ を $x_3, x_4, \dots, x_p$ で重回帰して残差 $e_{1 \cdot 3,4,\dots,p}$ を求め、$x_2$ も同様に回帰して残差 $e_{2 \cdot 3,4,\dots,p}$ を求めます。2つの残差の相関が高次偏相関です。
$$ \begin{equation} r_{12 \cdot 3,4,\dots,p} = \text{Corr}(e_{1 \cdot 3,4,\dots,p}, \, e_{2 \cdot 3,4,\dots,p}) \end{equation} $$
しかし、制御変数が多い場合にこの手順を毎回繰り返すのは非効率です。精度行列を使えば、すべての変数ペアの高次偏相関が一度の行列計算で得られるのが大きな利点です。
偏相関係数の再帰公式
高次偏相関は低次偏相関から再帰的に計算することもできます。変数 $x_3$ に加えて $x_4$ も制御したい場合、次の公式が成り立ちます。
$$ \begin{equation} r_{12 \cdot 34} = \frac{r_{12 \cdot 3} – r_{14 \cdot 3}r_{24 \cdot 3}}{\sqrt{1 – r_{14 \cdot 3}^2}\sqrt{1 – r_{24 \cdot 3}^2}} \end{equation} $$
1次偏相関の計算式と全く同じ構造です。$r_{12}$ の代わりに $r_{12 \cdot 3}$(1つ制御した偏相関)を使い、制御変数を1つずつ追加していきます。この再帰構造により、偏相関の計算が体系的に行えます。
条件付き独立性の検定
偏相関がゼロかどうかを検定することは、条件付き独立性の検定に相当します。帰無仮説 $H_0: \rho_{12 \cdot \text{rest}} = 0$ のもとで、検定統計量は次のようになります。
$$ \begin{equation} t = r_{12 \cdot \text{rest}} \sqrt{\frac{n – p}{1 – r_{12 \cdot \text{rest}}^2}} \end{equation} $$
この統計量は自由度 $n – p$ の $t$ 分布に従います。ここで $p$ は全変数の数です。
多変量正規分布の仮定のもとでは、偏相関がゼロであることと条件付き独立であることは同値です。したがって、この検定は「$x_1$ と $x_2$ は他のすべての変数を制御したもとで独立か?」という問いに統計的に答えるものです。
この検定はグラフィカルLASSOなどのスパースグラフ推定アルゴリズムの基盤にもなっています。偏相関がゼロのペアはグラフにエッジを持たず、条件付き独立であることを示します。
偏相関の理論をPythonで実装して確認しましょう。
Pythonによる実装と可視化
擬似相関の検出
まず、擬似相関の典型的な例を作成し、偏相関係数が擬似相関を検出できることを確認します。
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)
n = 300
# --- 擬似相関のデータ生成 ---
# z(気温に相当する交絡変数)
z = np.random.randn(n)
# x1(アイスクリーム売上): z の影響 + 独立ノイズ
x1 = 2.0 * z + 0.5 * np.random.randn(n)
# x2(溺死事故): z の影響 + 独立ノイズ
x2 = 1.5 * z + 0.8 * np.random.randn(n)
# --- 単純相関 ---
r12 = np.corrcoef(x1, x2)[0, 1]
r13 = np.corrcoef(x1, z)[0, 1]
r23 = np.corrcoef(x2, z)[0, 1]
# --- 偏相関(公式) ---
r12_3 = (r12 - r13 * r23) / (np.sqrt(1 - r13**2) * np.sqrt(1 - r23**2))
# --- 偏相関(残差回帰) ---
from numpy.polynomial.polynomial import polyfit, polyval
# x1 を z で回帰
coeff1 = np.polyfit(z, x1, 1)
e1 = x1 - np.polyval(coeff1, z)
# x2 を z で回帰
coeff2 = np.polyfit(z, x2, 1)
e2 = x2 - np.polyval(coeff2, z)
r12_3_resid = np.corrcoef(e1, e2)[0, 1]
# --- 精度行列から ---
data = np.column_stack([x1, x2, z])
S = np.cov(data.T)
Omega = np.linalg.inv(S)
r12_3_prec = -Omega[0, 1] / np.sqrt(Omega[0, 0] * Omega[1, 1])
print("=== 擬似相関の検出 ===")
print(f"単純相関 r(x1, x2) = {r12:.4f}")
print(f"偏相関 r(x1, x2 | z):")
print(f" 公式: {r12_3:.4f}")
print(f" 残差回帰: {r12_3_resid:.4f}")
print(f" 精度行列: {r12_3_prec:.4f}")
fig, axes = plt.subplots(1, 3, figsize=(16, 5))
# (a) 単純相関
ax = axes[0]
ax.scatter(x1, x2, alpha=0.3, s=15, c=z, cmap="coolwarm")
ax.set_xlabel("$x_1$ (ice cream sales)", fontsize=11)
ax.set_ylabel("$x_2$ (drowning incidents)", fontsize=11)
ax.set_title(f"(a) Simple correlation $r={r12:.3f}$", fontsize=12)
ax.grid(True, alpha=0.3)
# (b) 残差の散布図
ax = axes[1]
ax.scatter(e1, e2, alpha=0.3, s=15, color="gray")
ax.set_xlabel("$e_1$ (residual of $x_1$)", fontsize=11)
ax.set_ylabel("$e_2$ (residual of $x_2$)", fontsize=11)
ax.set_title(f"(b) Partial correlation $r_{{12 \\cdot 3}}={r12_3_resid:.3f}$", fontsize=12)
ax.grid(True, alpha=0.3)
ax.axhline(0, color="k", linewidth=0.5)
ax.axvline(0, color="k", linewidth=0.5)
# (c) z で色付けした元の散布図
ax = axes[2]
sc = ax.scatter(x1, x2, c=z, cmap="coolwarm", alpha=0.5, s=15)
plt.colorbar(sc, ax=ax, label="$z$ (temperature)")
ax.set_xlabel("$x_1$ (ice cream sales)", fontsize=11)
ax.set_ylabel("$x_2$ (drowning incidents)", fontsize=11)
ax.set_title("(c) Colored by confounding variable $z$", fontsize=12)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig("partial_correlation_spurious.png", dpi=150, bbox_inches="tight")
plt.show()
この結果から、偏相関係数の威力が明確に読み取れます。
-
単純相関(図a): $x_1$ と $x_2$ の間に強い正の相関($r \approx 0.87$)が見られます。しかし、これは交絡変数 $z$ を通じた見かけ上の相関です
-
偏相関(図b): $z$ の影響を回帰で除去した残差同士の散布図では、相関がほぼ消失しています($r_{12 \cdot 3} \approx 0$)。残差はランダムに散らばっており、$z$ を制御すると $x_1$ と $x_2$ の間に直接的な関連がないことが示されています
-
交絡の可視化(図c): 元のデータを $z$ の値で色付けすると、$z$ が大きい(赤い点)ときは $x_1$ も $x_2$ も大きく、$z$ が小さい(青い点)ときは両方とも小さいことが見て取れます。正の相関のように見えるパターンは、実は $z$ の値に沿ったグラデーションに過ぎません
-
3つの計算方法の一致: 公式・残差回帰・精度行列の3つの方法で計算した偏相関がすべて一致しています
精度行列を用いた偏相関ネットワーク
多変数の場合に、精度行列からすべてのペアの偏相関を計算し、ネットワーク図として可視化します。
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)
n = 500
p = 5
# --- 既知の条件付き独立構造を持つデータ ---
z1 = np.random.randn(n)
z2 = np.random.randn(n)
x1 = z1 + 0.3 * np.random.randn(n)
x2 = 0.8 * z1 + 0.5 * z2 + 0.3 * np.random.randn(n)
x3 = z2 + 0.3 * np.random.randn(n)
x4 = 0.6 * x3 + 0.4 * np.random.randn(n) # x3 → x4
x5 = 0.5 * x1 + 0.5 * np.random.randn(n) # x1 → x5
data = np.column_stack([x1, x2, x3, x4, x5])
var_names = ["$x_1$", "$x_2$", "$x_3$", "$x_4$", "$x_5$"]
# --- 相関行列と偏相関行列 ---
R = np.corrcoef(data.T)
Omega = np.linalg.inv(R)
P = np.zeros_like(Omega)
for i in range(p):
for j in range(p):
P[i, j] = -Omega[i, j] / np.sqrt(Omega[i, i] * Omega[j, j])
np.fill_diagonal(P, 1.0)
fig, axes = plt.subplots(1, 2, figsize=(13, 5.5))
# (a) 相関行列
ax = axes[0]
im = ax.imshow(R, cmap="RdBu_r", vmin=-1, vmax=1)
ax.set_xticks(range(p))
ax.set_xticklabels(var_names, fontsize=10)
ax.set_yticks(range(p))
ax.set_yticklabels(var_names, fontsize=10)
ax.set_title("(a) Correlation matrix", fontsize=12)
for i in range(p):
for j in range(p):
ax.text(j, i, f"{R[i,j]:.2f}", ha="center", va="center",
fontsize=9, color="white" if abs(R[i,j]) > 0.5 else "black")
plt.colorbar(im, ax=ax, fraction=0.046, pad=0.04)
# (b) 偏相関行列
ax = axes[1]
im = ax.imshow(P, cmap="RdBu_r", vmin=-1, vmax=1)
ax.set_xticks(range(p))
ax.set_xticklabels(var_names, fontsize=10)
ax.set_yticks(range(p))
ax.set_yticklabels(var_names, fontsize=10)
ax.set_title("(b) Partial correlation matrix", fontsize=12)
for i in range(p):
for j in range(p):
ax.text(j, i, f"{P[i,j]:.2f}", ha="center", va="center",
fontsize=9, color="white" if abs(P[i,j]) > 0.5 else "black")
plt.colorbar(im, ax=ax, fraction=0.046, pad=0.04)
plt.tight_layout()
plt.savefig("partial_correlation_matrix.png", dpi=150, bbox_inches="tight")
plt.show()
相関行列と偏相関行列の比較から、重要な違いが読み取れます。
-
相関行列(図a): 多くの変数ペアが非ゼロの相関を持っています。$x_1$ と $x_4$ の間にも相関がありますが、これは $x_1 \to x_2 \to x_3 \to x_4$ という間接的な経路を通じた見かけの相関です
-
偏相関行列(図b): 直接的な関連がある変数ペアのみが非ゼロの偏相関を持ち、間接的な関連しかないペアの偏相関はほぼゼロになっています。これにより、変数間の直接的な関連構造(条件付き独立構造)がクリアに浮かび上がります
-
スパース性: 偏相関行列は相関行列よりもスパース(ゼロに近い成分が多い)です。このスパース性が、変数間の本質的な関連ネットワークを明らかにします
偏相関の検定
偏相関がゼロかどうかの統計的検定をPythonで実装し、条件付き独立構造を推定します。
import numpy as np
from scipy import stats
np.random.seed(42)
n = 500
p = 5
# 既知の条件付き独立構造を持つデータ
z1 = np.random.randn(n)
z2 = np.random.randn(n)
x1 = z1 + 0.3 * np.random.randn(n)
x2 = 0.8 * z1 + 0.5 * z2 + 0.3 * np.random.randn(n)
x3 = z2 + 0.3 * np.random.randn(n)
x4 = 0.6 * x3 + 0.4 * np.random.randn(n)
x5 = 0.5 * x1 + 0.5 * np.random.randn(n)
data = np.column_stack([x1, x2, x3, x4, x5])
var_names = ["x1", "x2", "x3", "x4", "x5"]
# 偏相関行列
R = np.corrcoef(data.T)
Omega = np.linalg.inv(R)
P = np.zeros_like(Omega)
for i in range(p):
for j in range(p):
P[i, j] = -Omega[i, j] / np.sqrt(Omega[i, i] * Omega[j, j])
np.fill_diagonal(P, 1.0)
# 検定
alpha = 0.05
print("=== 偏相関の検定 (alpha=0.05) ===")
print(f"{'Pair':>10s} {'Partial r':>10s} {'t-stat':>10s} {'p-value':>10s} {'Sig?':>6s}")
for i in range(p):
for j in range(i+1, p):
r_ij = P[i, j]
t_stat = r_ij * np.sqrt((n - p) / (1 - r_ij**2))
p_val = 2 * stats.t.sf(abs(t_stat), df=n-p)
sig = "*" if p_val < alpha else ""
print(f"{var_names[i]+'-'+var_names[j]:>10s} {r_ij:10.4f} {t_stat:10.3f} {p_val:10.4f} {sig:>6s}")
この検定結果から、条件付き独立構造が統計的に検出できていることが確認できます。直接的な関連がある変数ペア(データ生成過程で矢印がつながっているペア)の偏相関は有意であり、間接的な関連しかないペアの偏相関は非有意です。これにより、偏相関の検定がグラフ構造の推定に利用できることが実証されます。
抑制変数の効果
偏相関が単純相関より大きくなる「抑制変数」の効果を確認します。
import numpy as np
np.random.seed(42)
n = 500
# 抑制変数の例: x3 が x1 の予測力を抑えている
x1 = np.random.randn(n)
x3 = 0.7 * x1 + np.random.randn(n) # x3 は x1 と相関
y = 0.6 * x1 - 0.5 * x3 + 0.3 * np.random.randn(n)
# 単純相関
r_1y = np.corrcoef(x1, y)[0, 1]
r_3y = np.corrcoef(x3, y)[0, 1]
r_13 = np.corrcoef(x1, x3)[0, 1]
# 偏相関
r_1y_3 = (r_1y - r_13 * r_3y) / (np.sqrt(1 - r_13**2) * np.sqrt(1 - r_3y**2))
print("=== 抑制変数の効果 ===")
print(f"単純相関 r(x1, y) = {r_1y:.4f}")
print(f"偏相関 r(x1, y | x3) = {r_1y_3:.4f}")
print(f"|偏相関| > |単純相関|: {abs(r_1y_3) > abs(r_1y)}")
この例では、$x_1$ と $y$ の単純相関よりも偏相関の方が大きくなっています。これは $x_3$ が抑制変数(suppressor variable)として機能しているためです。$x_3$ は $x_1$ の中の $y$ と無関係な変動を吸収し、$x_3$ を制御することで $x_1$ の $y$ に対する純粋な効果がより鮮明になります。抑制変数の存在は、偏相関が単純相関の「不純物を除いた」ものであることを示す好例です。
まとめ
本記事では、偏相関係数の理論を解説しました。
- 定義: 偏相関係数は、制御変数の影響を除去した後の2変数間の線形関係の強さを測ります
- 残差回帰: 2つの変数をそれぞれ制御変数で回帰し、残差同士の相関を取ることで計算されます
- 計算公式: $r_{12 \cdot 3} = (r_{12} – r_{13}r_{23})/(\sqrt{1-r_{13}^2}\sqrt{1-r_{23}^2})$
- 精度行列との関係: 偏相関は精度行列の正規化された非対角成分として $r_{ij \cdot \text{rest}} = -\omega_{ij}/\sqrt{\omega_{ii}\omega_{jj}}$ で計算できます
- 擬似相関の検出: 交絡変数による見かけの相関を識別し、真の直接的関連を明らかにします
偏相関係数は、変数間の因果関係を直接示すものではありませんが、因果推論の第一歩として、変数間の直接的な関連と間接的な関連を区別する強力な道具です。
次のステップとして、以下の記事も参考にしてください。
- 重回帰分析の理論 — 偏相関と回帰分析の密接な関係
- 多重共線性とVIF — 変数間の相関がもたらす回帰分析の問題
- パス解析と構造方程式モデリング — 偏相関を発展させた因果モデリング