見せかけの回帰を実測: 無関係なランダムウォーク1万ペアの偽有意率は、n=50の67%からn=5000の97%まで上がり続けた
約14分で読めます

見せかけの回帰を実測: 無関係なランダムウォーク1万ペアの偽有意率は、n=50の67%からn=5000の97%まで上がり続けた


「互いに何の関係もない2つの時系列を持ってきて相関を取ると、しばしばr=0.9のような強烈な相関が出る」——時系列分析の教科書に必ず載っている見せかけの回帰(spurious regression)の話だ。ナイジェリアの海賊の数と地球の平均気温、みたいなネタ画像は誰でも見たことがあると思う。

ただ、私はこの話をずっと「たまたま変な標本を引いたときの笑い話」くらいに受け取っていた。統計の基本感覚として「データを増やせば偶然の相関は消えていく」はずで、実際iidなデータならその通りになる。ところが単位根を持つ系列——ランダムウォーク——同士では、データを増やすほど誤判定が増えるらしい。大数の法則への信頼を逆撫でするこの主張、言葉で読んでも腹落ちしなかったので、Simpsonのパラドックスの記事と同じ流儀で、自分で大量にシミュレーションして偽有意率を実測してみることにした。

実験に使ったコードの全文はGitHubに置いています

実験設計: 完全に独立なペアを1万組作って相関を測る

やることは単純で、完全に独立に生成した2系列のペアを大量に作り、それぞれのペアでPearsonの相関係数rと、通常のt検定(scipy.stats.pearsonrと同じ式)のp値を計算する。系列は本当に独立なのだから、p<0.05になったらそれは全部誤判定だ。この「p<0.05になってしまった割合」を偽有意率と呼ぶことにする。正しく機能していれば5%になるはずの数字だ。

系列は3種類用意した。

  • iidガウスノイズ: 各時点が独立な標準正規乱数。教科書の前提そのもの
  • AR(1) φ=0.8: 前の値を80%引きずる自己相関のある系列。ただし定常
  • ランダムウォーク: ノイズの累積和。単位根を持ち、定常ではない
def gen_series(kind, npairs, T, rng, phi=0.8):
    e = rng.standard_normal((npairs, T))
    if kind == "iid":
        return e
    if kind == "rw":
        return np.cumsum(e, axis=1)   # ランダムウォーク
    if kind == "ar1":
        x0 = rng.standard_normal(npairs) * np.sqrt(1 / (1 - phi**2))
        y, _ = signal.lfilter([1.0], [1.0, -phi], e, axis=1,
                              zi=(phi * x0)[:, None])
        return y

ペア数は各条件1万組。系列長Tは50から5,000まで振る。自作のr/p計算はscipy.stats.pearsonrと一致することを最初に確認してある。

まず見てほしい: 独立な2本がこれだけ「連動」する

系列長300のランダムウォークのペアを40,000組生成して、rが高かった順に上位を並べてみた。次のGIFに出てくる2本の線は、すべて完全に独立に生成した乱数だ。

完全に独立に生成した2本のランダムウォーク(青とオレンジの折れ線)のペアを、実測した相関係数r付きで8組順番に表示するアニメーション。どのペアも2本の線が序盤から終盤まで同じタイミングで上下し、一緒に上昇トレンドを描いているように見える。右下に大きく表示されるrの値はどのペアも0.96〜0.98で、まるで強く連動しているかのような見た目になっている

トップのペアはr=0.977、p値は1.7e-201。「p値が小さいから本物の関係だ」という理屈がいかに無力かがよく分かる。もちろんこれは4万組から選んだ上澄みだが、|r|>0.9のペアは4万組中465組(1.16%)もある。100回に1回以上の頻度で、無関係な2系列からr=0.9級の相関が出てくるということだ。

T=200でのr分布: ランダムウォークはほぼ一様に broken

チェリーピックした例ではなく分布全体を見る。系列長200で、3種それぞれ1万ペアのrのヒストグラムがこれだ。

系列長200で1万ペアずつ計算した相関係数rのヒストグラムを縦に3段並べた図。横軸はrで-1から1。上段のiidガウスノイズ(青)は0を中心とした幅の狭い釣鐘型で、最大でも|r|=0.29。中段のAR(1) φ=0.8(緑)は同じ釣鐘型だが幅が2倍ほどに広がる。下段のランダムウォーク(オレンジ)は-1から1までほぼ平坦に広がり、r=0.9超のペアも珍しくない。各段には赤い破線でp<0.05となる境界|r|>0.139が示され、偽有意率はiid 4.8%、AR(1) 35.5%、ランダムウォーク83.1%と表示されている

数字にするとこうなる。

iid          : 偽有意率  4.8%   |r|中央値 0.048   max|r| 0.289
AR(1) φ=0.8  : 偽有意率 35.5%   |r|中央値 0.102   max|r| 0.523
ランダムウォーク : 偽有意率 83.1%   |r|中央値 0.418   max|r| 0.964

iidは教科書通り。偽有意率4.8%はほぼ設計通りの5%で、1万ペアの中の最大の|r|ですら0.289にしかならない。ところがランダムウォーク同士では、|r|の中央値が0.418。「典型的なペア」がすでにr=±0.4クラスの相関を持ち、|r|>0.5が40.1%、|r|>0.9も1.32%ある。分布の形も釣鐘型ではなく、-1から1までほぼ平坦に潰れている。t検定は83.1%のペアで「有意な相関」と答えた。20回中17回、存在しない関係を検出したことになる。

本題: データを増やすと、直るどころか悪化した

ここからが一番確かめたかったところだ。系列長nを50から5,000まで振って、偽有意率がどう動くかを測った。

横軸を系列長n(50〜5000、対数軸)、縦軸を偽有意率(%)とした折れ線グラフ。青のiidノイズとオレンジ破線のランダムウォークの差分はどちらもn全域で5%の水平線に張り付いている。緑のAR(1) φ=0.8は33〜36%でほぼ水平。オレンジ実線のランダムウォークだけはn=50の67%から始まり、nが増えるごとに上昇を続けてn=5000で96.9%に達する

n         50     100    200    500    1000   2000   5000
iid       4.9%   5.1%   4.7%   4.7%   4.9%   5.1%   5.2%
AR(1)     33.2%  35.4%  35.5%  35.6%  35.7%  36.0%  36.5%
ランダムウォーク 66.8%  75.7%  83.7%  89.7%  92.7%  94.8%  96.9%
RWの差分   5.1%   5.0%   4.8%   5.4%   4.9%   5.0%   4.6%

3つの系列で、3つのまったく違う運命が観測できた。

  • iid: nによらず5%前後。「データを増やせば偶然の相関は消える」が成立している世界
  • AR(1): 36%前後で頭打ち。5%よりずっと悪いが、nを増やしても際限なく悪化はしない
  • ランダムウォーク: n=50の66.8%から単調に上がり続け、n=5000で96.9%。外挿すればさらに100%に近づいていく

面白いのは|r|の中央値の動きだ。iidでは中央値がn=50の0.097からn=5000の0.009へと、理論通り1/√nで縮んでいく。ところがランダムウォークの|r|の中央値はn=50でもn=5000でも0.41前後から動かない。相関係数が0に収束してくれない(理論的には、rが0ではなくある確率分布に収束することがPhillips (1986)で示されている)一方で、t検定の有意判定の閾値の方は√nでどんどん緩くなっていくので、「rは縮まないのに閾値だけ下がる」という挟み撃ちで偽有意率が100%へ向かう。nを増やすほど、間違った結論への確信だけが強まっていく構図だ。

自己相関の強さ×系列長のヒートマップ: 崖はφ=1にある

AR(1)のφを0から1まで動かすと、定常(φ<1)と単位根(φ=1)の間のどこで挙動が変わるのかが見える。φ×系列長の全組み合わせで偽有意率を測った。

縦軸に自己相関の強さφ(0、0.3、0.6、0.9、0.95、0.99、1.0=ランダムウォーク)、横軸に系列長n(50〜5000)を取り、各セルの偽有意率を白から濃い青への色と%表記で示したヒートマップ。φ=0の行は全列5%前後で白っぽく、φ=0.6で18%前後、φ=0.9で50%前後、φ=0.99では85%付近で頭打ちになる。最上段のφ=1.0だけは右に行くほど色が濃くなり続け、n=5000で96%に達する

どの行(φ固定)も、nを増やしたときの挙動は「ある水準で頭打ち」になっている。φ=0.6なら18%前後、φ=0.9なら50%強、φ=0.99ですら85%付近で止まる。右に行くほど色が濃くなり続けるのは、最上段のφ=1.0(ランダムウォーク)だけだ。

これを見るまで、私はφ=0.99とφ=1.0は「ほぼ同じもの」だと思っていた。数値としては1%しか違わない。しかしn=5000まで引き延ばすと、φ=0.99は85%で止まり、φ=1.0は96%を超えてなお上昇中——定常性の有無は、パラメータの連続的な違いではなく挙動の質を分ける崖なのだと、色の付き方で納得できた。ついでに言うと、φ=0.3という「軽い自己相関」でも偽有意率はすでに7%前後あり、5%を素朴に信じてよい範囲は思ったより狭い。

差分を取ると、偽相関はきれいに消えた

ランダムウォークの偽相関への古典的な処方箋は「差分を取れ」だ。ランダムウォークの1階差分はただのiidノイズなので、水準ではなく変化量同士で相関を取れば理屈の上では正常に戻る。実測でも、差分を取ったランダムウォークの偽有意率は全ての系列長で4.6〜5.4%と、iidと見分けがつかない水準まで戻った(上の折れ線グラフのオレンジ破線)。

個別のペアで見るとさらに分かりやすい。GIFにも出てきたr=0.965のペアの水準と差分を並べたのがこの図だ。

上下2段の折れ線グラフ。上段は水準のままのランダムウォークのペア(青とオレンジ)で、2本とも右肩上がりに大きくうねりながら並走し、r=0.965と表示されている。下段は同じペアの1階差分で、2本とも0の周りで細かく振動するだけのノイズになり、見た目の連動は完全に消えてr=0.025(p=0.67)と表示されている

水準ではあれほど「連動」して見えた2本が、差分を取った瞬間にただのノイズ2本になり、r=0.025(p=0.67)まで落ちた。見せかけの相関の正体が「どちらも累積和で、たまたま同じ向きに漂っただけ」であることが、この1枚でよく分かる。

正直に書いておくべきこと

  • この現象自体はYule (1926)の”nonsense correlations”以来100年知られていて、Granger & Newbold (1974)とPhillips (1986)で理論的に確立している。この記事の価値は新規性ではなく、教科書の1行を偽有意率のカーブとして実測したことにある
  • 「見せかけの回帰」は本来は回帰係数のt検定について語られることが多い。今回は相関係数のt検定で測ったが、単回帰の傾きの検定と相関の検定は数学的に等価なので、話としては同じものだ
  • 系列は素のガウス増分のみで、ドリフト(一方的なトレンド)は入れていない。ドリフト入り同士なら見かけの相関はもっと激しく出るはずで、今回の数字はむしろ控えめな条件での結果だ
  • AR(1)の偽有意率が36%で頭打ちになるのはφ=0.8という設定に対する数字であって、AR(1)一般の定数ではない(ヒートマップの通りφに強く依存する)
  • 対策として差分を挙げたが、実務では差分で情報が落ちるケース(共和分がある場合など)もある。「機械的に差分を取れば常に正しい」という話ではなく、単位根を持つ系列の水準同士の相関・回帰をナイーブなt検定で評価してはいけない、というのが正確なスコープだ

手を動かして意外だったこと

一番意外だったのは、n=50の時点ですでに偽有意率が66.8%あったことだ。やる前は「漸近的にじわじわ壊れていく話で、短い系列ならそこまでひどくないだろう」と思っていたが、実際には最初から壊れていて、nを増やすとさらに悪化する、という形だった。単位根系列に対する素朴なt検定は「大標本で破綻する」のではなく「最初から破綻していて、大標本がそれを隠すどころか確信に変える」。

もう1つは、上位ペアを選ぶときに踏んだ小さな罠だ。GIF用に「rが最大のペア」を取り出して差分を確認したら、差分にもr=0.123(p=0.033)という弱い相関が残っていた。一瞬「差分しても消えないのか?」と焦ったが、これは4万組から極端なrで選抜したことによる選択効果で、水準のrが極端に高いペアには「増分もたまたま少し相関していた」個体が混ざりやすい。実際、上位10ペアの差分のp値は0.03から0.85までばらけていて、選抜なしの集計では差分の偽有意率はきっちり5%前後だった。極端な例を選んで見せること自体が軽いバイアスを持ち込む、というのを図を作る工程で自分で踏んだのは、記事のテーマとの合わせ技として教訓的だった。

まとめ

  • 完全に独立な2系列のペアを1万組ずつ生成し、Pearson相関のt検定がp<0.05を出す率(偽有意率)を実測した
  • iidノイズでは教科書通り、どの系列長でも4.7〜5.2%に収まった
  • ランダムウォーク同士ではn=50で66.8%、n=200で83.7%、n=5000で96.9%と、データを増やすほど偽有意率が上がり続けた。|r|の中央値は0.41前後からnを増やしても縮まない
  • 40,000ペア中1.16%はr>0.9。最大はr=0.977(p=1.7e-201)で、無関係な2本がここまで「連動」して見える
  • 定常なAR(1)はφ=0.8で36%前後、φ=0.99でも85%付近で頭打ちになる一方、φ=1.0(単位根)だけは上がり続けた。崖は「自己相関が強いこと」ではなく「単位根」にある
  • ランダムウォークも差分を取れば偽有意率は4.6〜5.4%に戻った。r=0.965だったペアも差分後はr=0.025(p=0.67)

「データが多いほど結論は信頼できる」という直感は、データが定常であることに暗黙に依存している。トレンドを持つ2つのKPIをそのまま散布図にしてr=0.9を見つけたとき、それはn=200のランダムウォークのペアの40%が見せるのと同じ模様かもしれない。時系列の水準同士の相関を見せられたら、まず「差分を取っても残るのか」と聞く——今回の実測で、この一言の重みが数字として手に入った。