廿TT

譬如水怙牛過窓櫺 頭角四蹄都過了 因甚麼尾巴過不得

時系列データで相関を出してはいけないのなら空間データでも相関を出してはいけないのではないか

以前に
エクセルで無相関検定:失業率と野菜摂取量の相関 - 廿TT
というエントリを書いた。

めちゃくちゃ批判されるかと思ったけどそうでもなかった。

「時系列データに対して単純な相関を見るのは意味がない」というのはどうやら統計に詳しい人の間では常識なようです。

なぜそうなるのかは正直よくわかっていないのですが、どうも自己相関のある系列どうしで相関係数を見ると、その系列どうしがまったく別々に動いていたとしても(両者がランダム・ウォークしていたとしても)、有意な相関や絶対値の大きい相関係数が得られやすいようです。

だとすると、これは時系列データに限った話ではないはず。

たとえば都道府県のデータだって隣り合う県どうしは影響しあってるだろうから、自己相関みたいなものがある(場合もある)はず。

ちょっと R でシミュレーションしてみましょう。

「StanとRでベイズ統計モデリング」12章で使われていた、日本の都道府県どうしの隣接関係を示すテーブルを使います。このテーブル、地味に便利です。

RStanBook/data-map-neighbor.txt at master · MatsuuraKentaro/RStanBook · GitHub

シミュレーションしたモデルは以下です。隣り合う県どうしは似た値を取るだろうという仮定を反映しています。

yk|ykNormal(i=1Kwkiyii=1Kwki,1i=1Kwki).

ここで wkiik と隣接する都道府県である場合に1、さもなくば0の値をとる変数です。

yk|ykyk 以外の変数を止めてやったときの yk の従う分布を示す記号です。

library("Nippon")
library("RColorBrewer")
neighbor<-read.csv("~/Downloads/data-map-neighbor.txt")
Wmat <- matrix(0,46,46)
Wmat[cbind(neighbor$From,neighbor$To)]<-1
Wmat[cbind(neighbor$To,neighbor$From)]<-1
simpref <- function(i){
  y <- rnorm(46)
  for(i in 1:46){
    y[i] <-rnorm(1,sum(Wmat[i,]*y)/sum(Wmat[i,]),1/sqrt(sum(Wmat[i,])))
  }
  y[47] <- rnorm(1)
  return(y)
}
set.seed(1);datpref <-as.data.frame(sapply(1:2,simpref))
colnames(datpref)<-c("x","y")
r1 <-cut(datpref$x,9,labels = FALSE)
r2 <-cut(datpref$y,9,labels = FALSE)
GREENS <-brewer.pal(n = 9,name = "Greens")
BLUES <-brewer.pal(n = 9,name = "Blues")
oldpar <-par(mfcol=c(1,2),mar=c(0,0,0,0))
JapanPrefecturesMap(col=GREENS[r1])
JapanPrefecturesMap(col=BLUES[r2])
par(oldpar)

シミュレーションで生成したデータを図示したのが以下です。

f:id:abrahamcow:20180223024824p:plain

左の地図は左の地図の中で自己相関(って言っていいのかな)があり、右の地図は右の地図の中で自己相関がありますが、左と右とはまったく別々のシミュレーションで生成されています。

相関係数の検定をやってみました。

> with(datpref,cor.test(x,y))

	Pearson's product-moment correlation

data:  x and y
t = -2.3114, df = 45, p-value = 0.02545
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.56049523 -0.04257784
sample estimates:
       cor 
-0.3257616 

5%水準で有意です。

10000回繰り返してみました。

set.seed(1)
p.v <- numeric(10000)
for(i in 1:10000){
  datpref <-as.data.frame(sapply(1:2,simpref))
  colnames(datpref)<-c("x","y")
  res<-with(datpref,cor.test(x,y))
  p.v[i] <-res$p.value
}
hist(p.v)

p値の分布は以下のようになりました。

f:id:abrahamcow:20180223030106p:plain

小さめの値が出やすくなっています。

5%水準で有意になる割合は約17%でした。

> round(mean(p.v<0.05),2)
[1] 0.17

5%よりはだいぶ大きいです。検定として意味をなしていないといっていいでしょう。

タイトルの問いに戻ります。空間データでは相関を出してはいけないのか? それについてぼくの考えを述べます。

「今回シミュレーションしたのは一つのモデルであって、すべての空間データがこういう構造を持っているというわけではないので、相関係数に意味がないとは必ずしも言い切れないが、意味があるとも言い切れない」という煮え切らない意見がぼくの立場です。

もっというとランダム・ウォークっていうのも一つのモデルであって、時系列だから必ずランダム・ウォークっていうわけではないし、時系列じゃないからランダム・ウォークじゃないっていうわけでもないですよね。

たとえば、「気温が上がるとアイスクリームが売れやすくなる」という分析があったとして、それに対して「気温も売上も時系列データだから、そんな分析は意味がない」といっていいのか。ぼくは気温が上がるとアイスクリームが売れやすくなると思うんだよなあ。

相関係数とか、有意・有意でないとかの少ない情報量にデータを圧縮しすぎずに、定性的な解釈を大切にして統計手法を使うことが大事なんじゃないかなあ。

それはそれとして、こういった「見せかけの回帰」みたいなのをどうすれば避けられるのか、という統計的なテクニックにも興味があります。単位根がなくなるまで差分とるとか、そういうのがあるみたいなんだけど、勉強不足なのでそれについては別の機会に書くことにします。

今日は寝る。