スポンサーリンク
スポンサーリンク

偏相関係数の話

統計学 時系列分析

見せかけの相関に注意しましょう。
データを弄ると必ず聞く言葉です。
偏相関係数を見ましょう。
時々聞く言葉です。というわけで偏相関係数の説明をします。
偏相関係数は、共通の特徴量を持つと思われる量の相関を測るものです。
相関係数が高いのに偏相関係数が低い状態の事を、見せかけの相関がある状態という訳です。
相関係数の復習から始めて、偏相関係数の定義を学んで、時系列分析での応用を説明します。
最後に、pythonで計算させてみます。
参考文献は2冊です。

https://amzn.to/2vhViH3
Amazon.co.jp

記事で使っているソースコードはgithub に置いてあります。
https://github.com/msamunetogetoge

スポンサーリンク

相関係数

相関係数の定義を復習します。
期待値を取る操作をE[]で表すとき1x,yの相関係数rx,yは,色々な量を定義して、以下のように計算されます。
Cov(x,y)=E[(xE[x])(yE[y])]Var(x)=Cov(x,x)=E[x2](E[x])2rx,y=Cov(x,y)Var(x)Var(y)
xy=Cov(x,y)を内積だと思うと、相関係数はxyのなす角度を測っていると解釈できます。そうすると、rx,yが1に近いという事は、x,yが似ていると解釈できます。
耳にタコが出来るほど聞く話ですが、相関係数が高いからと言って、x,yの間に因果関係があるとは限らない事に注意が必要です。
例えば、体重と年収が相関があったとしましょう。体重が重い程、年収が高いようなデータがあったとします。意味不明だなと思って調べてみると、何故かデータ収集の対象年齢が12歳からとなっていることが分かりました。12歳の子供は体重が軽く、年収がほぼ0なので、そんなデータになっていたと分かってめでたしめでたしです。
未知の事象に挑戦している時に、同じような事が起きたときに冷静に行動するための量として、偏相関係数があります。

偏相関係数

偏相関係数は、x,y,z,z1,,znというデータがあるとき、x,yから、zたちの影響を除いた相関係数です。この意味を説明します。
x,yから、zたちの影響を除いた 偏相関係数rx,y,zは以下のように定義されます。
x,yzたちから回帰した量を x^,y^とします。
y=yy^z=zz^rx,y,z=Cov(x,y)Var(x)Var(y)
変数が大量にある場合でも同じ定義です。y^yを行う事で、yからx の影響を排除していると考えます。
実際、y,xは無相関である事が示せます。単回帰の場合に計算してみます。
単回帰の時、回帰式は以下のようになっていました。
2
y^=ay^x+by^ay^=Cov(x,y)Var(x)=rx,yby^=E[y]ay^E[x]
これらの式を元に共分散を計算します。
Cov(x,y)=E[(xE[x])(y0)]=E[(xE[x]){(yE[y])rx,y(xE[x])}]=Cov(x,y)rx,yE[(xE[x])2]=Cov(x,y)Cov(x,y)=0
rx,y,zを計算してみます。
まずはx,yzだけに依っていると仮定した場合3です。
rx,y,z=Cov(x,y)Var(x)Var(y)=E[xy]E[x2]E[y2]
E[xy],E[x2]を計算すると以下のようになります。
E[xy]=(rx,yrx,zry,z)Var(x)Var(y)E[x]=Var(x)2(1rx,z2)
偏相関係数の式に代入すると、
rx,y,z=rx,yrx,zry,z1rx,z21ry,z2
です。
x,yz1,,znに依る場合も少しだけ計算しておきます4 。回帰式をy^=β0+i=1nβizi
と書く時、βたちは、
β=(zTz)1(zTy)
と書けます。ただし、z(1,z1,,zn)1ziたちを横に並べて得られる (データ数)×(n+1) 行列です。また、以下のようにも書けます。
zの分散共分散行列Sと、yziたちの共分散Syは、以下のように計算出来ます。
Si,j=Cov(zi,zj)Syi=Cov(y,zi)
この行列と、 β0=E[y]+βiE[zi]で、 β1,,βnは、
β=S1Sy
となります。行列とベクトルで書くと、回帰式は
y^=zS1Sy
となります。偏相関係数は、この回帰式を使って
rx,y,z1,,zn=Cov(x,y)Var(x)Var(y)
と書かれます。手計算するのは大変ですが、データがある場合にパソコンに計算させるのは簡単です。

時系列分析での応用

偏相関係数は時系列分析で重要な役割を果たします。具体的には、定常なAR過程か否かを見極めるのに使う事が出来ます。つまり、定常なAR(p)過程 なら、 ある次数からp+1から偏相関係数が0 となります。5
簡単の為に、AR(1)過程の2次の偏相関係数を計算してみます。{yt}を定常な AR(1)過程とします。
yt=ϕyt1+ϵt
ただし、{ϵt}は分散0のホワイトノイズとします。
2次の偏相関係数を計算するために、yt1によるyt,yt2 の回帰式を考えます。6
y^t2=βyt1
最小二乗法から、β=ϕが分かります。ytについても同様です。このことから、
r2=Cov(yt2y^t2,yty^t)=Cov(yt2ϕyt1,ϕyt1+ϵtϕyt1)=Cov(yt2ϕyt1,ϵt)=0
同じような計算で、3次以上でも0になることが分かります。

pythonでの計算

初めに、irisデータで偏相関係数を計算してみます。
patal length とpatal width の相関が非常に高いので、他の変数の影響を取り除いて偏相関係数を計算してみます。

from sklearn.datasets import load_iris
import pandas as pd
import numpy as np
iris = load_iris()

df = pd.DataFrame(iris.data, columns=iris.feature_names)

X=df.iloc[:,:2]
X["beta_0"]=1
X=X[["beta_0","sepal length (cm)","sepal width (cm)" ]]

#patal length とpatal width の相関が0.96なので、偏相関係数を計算
y=df[["petal length (cm)","petal width (cm)"]]
beta = np.dot(np.dot(np.linalg.inv( np.dot(X.T , X) ) , X.T), y)
#重回帰による予測値
y_hat = np.dot(X, beta)
#patal length とpatal width の相関が0.96
Y = y - y_hat
S_Y =np.zeros((2,2))
for j in [0,1]:
    Y_j =Y.iloc[:,j] - np.mean(Y.iloc[:,j])
    for i in [0,1] :
        Y_i =Y.iloc[:,i] - np.mean(Y.iloc[:,i])  
        S_Y[j,i]=np.dot(Y_i, Y_j)

pac = S_Y[0,1]/np.sqrt(S_Y[0,0]*S_Y[1,1])
print(pac)
#0.870769773836145

偏相関係数は0.87 と大きな値になりました。
次に、適当にAR(1)過程を生成して相関係数と偏相関係数を計算してみます。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

#相関係数計算の関数
def autcor(X, k):
    X_bar = np.mean(X)
    X_bar_k = X_bar * np.ones(k)
    X_k = np.append(X_bar_k ,X)
    k_X = np.append(X, X_bar_k )
    r= np.dot(X_k -X_bar , k_X - X_bar )
    r/= np.linalg.norm(X-X_bar)**2
    
    return r
#偏相関係数計算の関数
def Pac(Y,k):
    Y = pd.DataFrame(Y, columns=["y_t"])
    for i in range(k):
        if i ==0:
            Y["y_t-1"] = Y["y_t"].shift().fillna(0)
        else:    
            Y["y_t-"+str(i+1)]=Y["y_t-"+str(i)].shift().fillna(0)
    X =Y.iloc[:,1:k-1]
    y=Y.iloc[:,[0,k]]
    beta = np.dot(np.dot(np.linalg.inv( np.dot(X.T , X) ) , X.T), y)
    y_hat = np.dot(X, beta)
    y_til = y - y_hat
    S_Y =np.zeros((2,2))
    for j in [0,1]:
        Y_j =y_til.iloc[:,j] - np.mean(y_til.iloc[:,j])
        for i in [0,1] :
            Y_i =y_til.iloc[:,i] - np.mean(y_til.iloc[:,i])  
            S_Y[j,i]=np.dot(Y_i, Y_j)
    pac = S_Y[0,1]/np.sqrt(S_Y[0,0]*S_Y[1,1])
    return pac

 #AR(1)の生成
phi = 0.6
epsilon = np.random.randn(200000)
T=1000
Y=np.zeros(T)
for t in range(T):
    Y[t]=phi*Y[t-1] +epsilon[t]   

#10次まで計算
n=10
pac=[]
ac=[]
for k in range(n):
    pac=np.append(pac,Pac(Y,k+1))
    ac = np.append(ac,autcor(Y,k+1))
AR(1)の相関係数と偏相関係数

AR過程では、指数関数的に相関係数が小さくなっていく様子が見えます。また、偏相関係数は、2次以降でほぼ0となっています。MA過程では次のようなグラフになります。

MA(1)の相関係数と偏相関係数

上の2つの図から分かるように、偏相関係数は、AR過程か否かを判定する材料には出来ますが、MA過程にはあまり効果がありません。

まとめ

  • 相関係数について復習した
  • 偏相関係数の定義を確認した
  • 時系列分析における偏相関係数の役割を解説した
  • python で計算してみた
  1. xが長さnの、 データからなるベクトルだったら、E[x]=i=1nxi/nです。p(x)に従う確率変数ならE[x]=xp(x)dxです
  2. 計算は単回帰分析の記事を読んでください 。
  3. 単回帰の場合です。
  4. 省略されている計算は重回帰分析の記事に書いてます。
  5. 定常なMA(q)過程 なら、 相関係数が次数q+1から0でした。MA過程に関する記事を読んでみて下さい。
  6. 一般にk次の偏相関係数を計算するための回帰係数について、βi=βkiが成り立ちます。
タイトルとURLをコピーしました