2次元データの相関係数とPCA(分散分解)

  • こちらで多次元データの尺度を2群に分けて、2群間の関係を定量化することをやっている
  • 2つのものの関係には相関係数がある
  • 多次元のものを見やすくするにはPCAがある
  • 相関係数とPCAとをつなぐことを念頭に、まず、2次元データで考える
  • 2次元データをPCAすると、2つの直交する軸ベクトルと、2つの拡縮因子が得られる
  • 2つの拡縮因子をa \le bとする
  • 今、元のデータを適当に変換しておけば、a^2+b^2=2のようにしておけるから、a\le bという2つの値の自由度は1になる
  • a,bの状況を表す1変数と、相関係数との間をつなぐ関係がわかればよい
  • t=\frac{a}{b}とする
  • t=1のときは、2尺度の分布が円状になっていることを意味するから、無相関(相関係数は0)
  • t=0のときは、相関係数が1
  • a,bは相互に直交するベクトルの方向への拡縮因子だから、\tan(\theta)=tとなるような\thetaを考えるのは適当に思える
  • t=1 \to \theta = \frac{\pi}{4} \to 0,t=0 \to \theta = 0 \to 1という関係である
  • \cos(2\times \theta)と置くと、これは、この条件を満たす
  • 実際、この\cos(2\times \theta)は、2次元正規分布データの場合に、相関係数とよく一致する
rmvn.Choleski <-
    function(n, mu, Sigma) {
        # generate n random vectors from MVN(mu, Sigma)
        # dimension is inferred from mu and Sigma
        d <- length(mu)
        Q <- chol(Sigma) # Choleski factorization of Sigma
        Z <- matrix(rnorm(n*d), nrow=n, ncol=d)
        X <- Z %*% Q + matrix(mu, n, d, byrow=TRUE)
        X
    }

t<-seq(from=0,to=1,length=100)/2*pi

S<-matrix(0,length(t)-1,2)
K<-H<-rep(0,length(t)-1)
A<-J<-K

for(i in 2:length(t)){
	Sigma<-matrix(c(1,cos(t[i]),cos(t[i]),1),2,2)
	X <- rmvn.Choleski(200, rep(0,2), Sigma)
	pairs(X)
	#Sys.sleep(0.1)
	S[i-1,]<-prcomp(X)[[1]]
	K[i-1]<-cos(t[i])
	H[i-1]<-cor(X)[1,2]
	A[i-1]<-atan(S[i-1,2]/S[i-1,1])*2
	J[i-1]<-cos(A[i-1])
	#print(prcomp(X)[[1]])
	#print(cos(t[i]))
	#print(cor(X)[1,2])
}
pairs(cbind(S,K,H,A,J))
plot(H,J)