library(tidyr)

相関係数は2つの変量 x,y の関係を表します。難しく感じますが、具体例で確かめながら進めましょう。

1 復習.

<定義>.

  • 偏差は平均からのズレです。
    あなたがテストの30点を持って帰ったらお家の人に叱られました。ところが平均が20点のテストだったとしたらどうでしょう。テストが難しかったのであって、自分はそんなに悪くないと主張することができるでしょう。平均を基準として、平均からのズレを計算したものが偏差です。

  • 偏差平方和は偏差の二乗の合計.
    平均から離れたデータが多いと大きくなります。分散は偏差平方の平均で、平均からの離れ具合の平均です。二乗しているのでルートにしたものが標準偏差です。

  • 偏差積は2つのデータがどれくらい似通っているかを表します.
    似通っていると (x,y) は直線 y=x に近づきます。
    x+yが一定であれば、xyが大きいほど2つの値x,yは似た値になります。
    (数学的根拠は \((x+y)/2\geq \sqrt{xy}\) ですが立ち入る必要はありません)

  • 偏差積和は偏差積の合計. 2つのデータが直線y=xにどれくらい近いかを表します。偏差積の平均が共分散で、(x,y)がどれくらいy=xに近く分布しているかを表します。

<関数>.

  • 関数covは共分散であるが、n-1で割った値であることに注意.
    (cov( )にデータフレームを代入すると分散共分散行列を出力する).

  • 関数varは分散であるが、n-1で割った値であることに注意.

2 データが2つの点.

2.1

x <- c(-2,2)
y <- c(-2,2)
plot(x,y,asp = 1,xlim=c(-3,3),ylim=c(-3,3))
abline(h=0,v=0,col="lightblue")

(x-mean(x))*(y-mean(y))#偏差積
## [1] 4 4

4,4の平均なので共分散は4です。
関数を使う場合は注意が必要です。

cov(x,y)/2#関数
## [1] 4

関数covは n-1=1 で割っているので修正して計算しています。 共分散はプラスに大きくなります。

2.2

x <- c(-2,2)
y <- c(2,-2)
plot(x,y,asp = 1,xlim=c(-3,3),ylim=c(-3,3))
abline(h=0,v=0,col="lightblue")

(x-mean(x))*(y-mean(y))
## [1] -4 -4

-4,-4 の平均なので共分散は -4 です。

3 データが4つの点.

x <- c(-2,2)
y <- c(-2,2)
data <- crossing(x, y);data
x y
-2 -2
-2 2
2 -2
2 2
X <- data$x
Y <- data$y
plot(X,Y,asp = 1,xlim=c(-3,3),ylim=c(-3,3))
abline(h=0,v=0,col="lightblue")

(X-mean(X))*(Y-mean(Y))
## [1]  4 -4 -4  4

4 -4 -4 4 の平均なので共分散は0です。まんべんなく散らばっていると共分散は0に近くなります。

4 様々なケース.

4.1 値の大きいデータ.

データの値が大きいと、共分散の値も大きくなります.

x <- c(-5,5)
y <- c(-5,5)
plot(x,y,asp = 1,xlim=c(-6,6),ylim=c(-6,6))
abline(h=0,v=0,col="lightblue")

(x-mean(x))*(y-mean(y))
## [1] 25 25

値は大きくなりましたが、x,yの見た目の関係は同じです。
値に左右されず関係だけを知りたい場合は、標準化という操作をします。
標準化は標準偏差で割ることです

4.2 標準化したデータ.

x,y の標準偏差は 2 なので 2 で割ります。

(関数varや関数sdは(n-1)で割った値なので、手計算するときは修正します).

4.2.1 標準化の例.

x <- c(-2,2)
y <- c(-2,2)
X <- (x-mean(x))/2
Y <- (x-mean(y))/2
(X-mean(X))*(Y-mean(Y))#偏差積
## [1] 1 1

4.2.2

x <- c(-5,5)
y <- c(-5,5)
X <- (x-mean(x))/5
Y <- (x-mean(y))/5
(X-mean(X))*(Y-mean(Y))#偏差積
## [1] 1 1

値の大きさに左右されなくなりました。

cor(x,y)
## [1] 1
  • 相関係数は2変量の関係の度合いを表す.

  • 分布を表すものとしてヒストグラムが有用であるが、分布を簡潔に表現する指標として、平均・分散が有効.

  • 2変量の関係を視覚的に捉えるには散布図が有用であるが、 散布図の状況を簡潔に表現する指標が相関係数.

5 まとめ.

  • 共分散の定義は、偏差の積の平均.
  • 分散の定義は、偏差の二乗の平均.

6 Advanced.

相関のある2変量乱数は2変量正規分布で出力できる。
回帰と相関の違いについては市原先生の7章に詳しい

回帰 相関
誤 差 y方向のみ x,y両方が確率変数
信頼域 yの信頼区間 x,yの分布の中心からの等確率距離
目 的 どのように直線に関係づけられるか どの程度直線的か
単 位 単位に依存 単位に依存しない

ここでは、相関係数によって散布図がどのようになるかを Rの乱数でシミュレーションする。イメージを掴んでおこう。

6.1 標準偏差 \(s_x=1,s_y=1\).

6.1.1 相関係数 r=0.

sigma.zero <- matrix(c(1,0,0,1), ncol=2)
x <- rmvnorm(n=10000, mean=c(0,0), sigma=sigma.zero)  
par(mfrow = c(1,1))
plot(x,xlim=c(-4,4),ylim=c(-4,4),asp=1,col="grey") 

6.1.2 相関係数 r=0.5.

sigma <- matrix(c(1,0.5,0.5,1), ncol=2)
x <- rmvnorm(n=10000, mean=c(0,0), sigma=sigma)  
data <- data.frame(X=x[,1],Y=x[,2])
model <- lm(Y ~ X, data = data)
plot(x,asp=1,col="grey")
abline(model)
abline(v=1.5,col="blue")

model$coef
## (Intercept)           X 
## 0.001486601 0.498957098

回帰直線は、\(y=0.5x\)
標準化されていれば、回帰係数と相関係数は一致します。
回帰直線はxを固定したときの推定値を与えます。

例えていうと、相関係数はサツマイモの太さのようなもので、右斜めにしてサツマイモを切ったときに、切り口の中点を繋いだ線が回帰直線です。

6.2 標準偏差 \(s_x=1,s_y=2\).

6.2.1 相関係数 r=0.

sigma <- matrix(c(1,0,0,4), ncol=2)
x <- rmvnorm(n=10000, mean=c(0,0), sigma=sigma)  
plot(x,asp=1,col="grey")

var(x)
##             [,1]        [,2]
## [1,]  1.01858254 -0.02285636
## [2,] -0.02285636  4.06587554

分散共分散行列は、matrix(c(1,0,0,4), ncol=2) になっています。

6.2.2 相関係数 r=05.

sigma <- matrix(c(1,1,1,4), ncol=2)
x <- rmvnorm(n=10000, mean=c(0,0), sigma=sigma)  
data <- data.frame(X=x[,1],Y=x[,2])
model <- lm(Y ~ X, data = data)
plot(x,asp=1,col="grey")
abline(model)
abline(v=2,col="blue")

model$coef
## (Intercept)           X 
## -0.01223033  0.99098896

回帰直線は、\(y=1\cdot x\)

一般に回帰係数は、
 標準偏差 \(s_x,s_y\)、相関係数 \(r_{xy}\) とすると  \(\displaystyle b=\dfrac{s_y}{s_x}r_{xy}\)  であるので、

本問では、 \(b=2\cdot 0.5=1\) となっています。

6.2.3 相関係数 r=1.

sigma <- matrix(c(1,2,2,4), ncol=2)
x <- rmvnorm(n=10000, mean=c(0,0), sigma=sigma)  
data <- data.frame(X=x[,1],Y=x[,2])
model <- lm(Y ~ X, data = data)
plot(x,asp=1,col="grey")
abline(model)
abline(v=2,col="blue")

model$coef
##  (Intercept)            X 
## 1.930258e-16 2.000000e+00

回帰直線は、\(y=2\cdot x\)

6.2.4 相関係数 r=0.4.

sigma <- matrix(c(1,0.8,0.8,4), ncol=2)
x <- rmvnorm(n=10000, mean=c(0,0), sigma=sigma)  
data <- data.frame(X=x[,1],Y=x[,2])
model <- lm(Y ~ X, data = data)
plot(x,asp=1,col="grey")
abline(model)
abline(v=2,col="blue")

model$coef
## (Intercept)           X 
## 0.003924729 0.788813296

回帰直線は、\(y=0.8\cdot x\)