7 Correlation
度量两个变量的相关性,对于数量型数据,通常使用Pearson correlation coefficient: \[ r = \frac{\sum_{i=1}^n (x_i - \bar{x}) (y_i - \bar{y})}{\sqrt{\sum_{i=1}^n (x_i - \bar{x})^2)}\sqrt{\sum_{i=1}^n (y_i - \bar{y})^2)}}\]
相关系数r接近于1,表明强正相关,接近于-1,表明强负相关,接近于0,表明没有相关性。
7.1 协方差 (Covariance)
要理解相关系数,首先要知道什么是协方差,它被定义为: \[\sigma_{xy} = \frac{\sum(x-\mu_x)(y-\mu_y)}{N}\]
通常情况下,总体是未知的,我们手头上只有样本,相应的样本的计算公式为:
研究两个变量的关系,可以使用相关系数来度量相关性的强度,也可以用简单回归分析把相关性用直线方程表示出来。 \[s_{xy} = \frac{\sum_{i=1}^n (x_i-\bar{x})(y_i-\bar{y})}{n-1}\]
x和y的协方差取值可以是正,负和0,如果协方差是正的,x上升和y上升相关;如果协方差是负的,x上升和y下降相关。
7.2 相关性 (Correlation)
协方差的值受x和y度量单位的影响,为了得到一个无标度(scaleless)的统计量,将它除以x和y的标准误: \[ r_{xy} = \frac{s_{xy}}{s_x s_y} = \frac{\sum_{i=1}^n (x_i - \bar{x}) (y_i - \bar{y})}{\sqrt{\sum_{i=1}^n (x_i - \bar{x})^2)}\sqrt{\sum_{i=1}^n (y_i - \bar{y})^2)}}\]
于是我们得到的,就是Pearson Correlation Coefficient.
协方差和相关系数很容易计算,R提供了cov()和cor()函数分别用于计算协方差和相关系数,输入参数可以是向量,也可以是矩阵,如果是矩阵,将对每个column两两计算:
data(iris)
head(iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
with(iris, cov(Sepal.Length, Petal.Length))
## [1] 1.274315
r <- with(iris, cor(Sepal.Length, Petal.Length))
print(r)
## [1] 0.8717538
plot(iris[,-5], col=rainbow(3)[as.numeric(iris[,5])])
cov(iris[,-5])
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length 0.6856935 -0.0424340 1.2743154 0.5162707
## Sepal.Width -0.0424340 0.1899794 -0.3296564 -0.1216394
## Petal.Length 1.2743154 -0.3296564 3.1162779 1.2956094
## Petal.Width 0.5162707 -0.1216394 1.2956094 0.5810063
cor(iris[,-5])
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length 1.0000000 -0.1175698 0.8717538 0.8179411
## Sepal.Width -0.1175698 1.0000000 -0.4284401 -0.3661259
## Petal.Length 0.8717538 -0.4284401 1.0000000 0.9628654
## Petal.Width 0.8179411 -0.3661259 0.9628654 1.0000000
采集越多的数据,肯定计算出来的相关性越接近了真实值,换一批数据,计算出来的结果肯定也会有一些细微差别。 我们要问两个问题: + r值和0的差别多大,才可以肯定相关性是真实存在的? + 从样本计算的r值,是对总体r值的估计,能否计算出置信区间?
7.3 相关性统计检验
零假设: \[ H_{0}: pr = 0\] \[H_{a}: pr\; is\; non-zero.\] 其中pr代表population r。
这里需要用到Fisher’s z transformation: \[z_r = \frac{1}{2} \log_e(\frac{1+r}{1-r})\] 对相关系数r进行转换,转换后的值,将服从均值为 \(\frac{1}{2} \log_e(\frac{1+pr}{1-pr})\) ,标准误为 \(\frac{1}{\sqrt{n-3}}\) 的正态分布。
这里 $ H_{0}: pr = 0$ 所以均值 \(\frac{1}{2} \log_e(\frac{1+pr}{1-pr})=0\) ,那么就可以使用正态分布来计算p value。
Ztrans <- function(r) 1/2 * log((1+r)/(1-r))
zr <- Ztrans(r)
n <- nrow(iris)
zr.sd <- 1/sqrt(n-3)
## p-value:
pnorm(r, mean=0, sd=zr.sd, lower.tail=FALSE)
## [1] 2.064483e-26
7.4 置信区间
既然转换后的 \(z_r\) 值服从正态分布,很空间可以获得 \(z_r\) 的置信区间,但是我们的目的是相关系数r的置信区间,这需要通过把 \(z_r\) 值反转回r值。
revZ <- function(z) (exp(2*z)-1)/(exp(2*z)+1)
lwzr <- zr - 1.96 * zr.sd
upzr <- zr + 1.96 * zr.sd
lwr <- revZ(lwzr)
upr <- revZ(upzr)
msg <- paste("95% confidence interval [", round(lwr,3), ", ", round(upr,3), "]", sep="")
print(msg)
## [1] "95% confidence interval [0.827, 0.906]"