matlab中样本相关系数的计算与测试

1. 何谓相关系数?

此处只列出相关系数的公式:
$$
r = \frac{ Cov(X,Y) } {\sigma_x \sigma_y}
= \frac{ E(X - \mu_x)(Y - \mu_y) }{\sigma_x \sigma_y}
$$

更多内容请百度或者看概率论与数理统计方面的书。

文章的目的是测试一下如何使用这个公式计算相关系数,并阐述一些在实际操作时遇到的一些问题。

2. matlab自带函数

2.1 corrcoef

功能:求相关系数

用法:

1
R = corrcoef(x,y)

其余用法未列出,使用help corrcoef查看。

corrcoef(x,y)表示序列x和序列y的相关系数,得到的结果是一个2*2矩阵,其中对角线上的元素分别表示x和y的自相关,非对角线上的元素分别表示x与y的相关系数和y与x的相关系数,两个是相等的。

2.2 例子

data1:有两例数据,第一列为x,第二列为y:

1
2
3
4
5
6
7
1 1.2
2 1.9
3 3.1
4 4
5 5.6
6 6.2
7 6.8

code:

1
2
3
4
data = load('data1.txt');
x = data(:,1);
y = data(:,2);
R = corrcoef(x, y)

结果:

1
2
3
R =
1.0000 0.9927
0.9927 1.0000

可以看到,自相关系数为1,因为自身与自身完全一样,x与y的相关系数为0.9927,非常接近1,表示两序列有很强的正相关性。

3. 自己写一个计算相关系数的函数

也不是完全自己写,目的是通过测试,了解自相关系数计算的一些细节。

3.1 总体与样本

在这之前得说一说总体与样本,计算方差的时候我们有如下公式:
$$
Var(X) = E(X - EX)^2
$$
这里取平均的时候有两种方式:

  1. 除以$n$,此为二阶中心矩,把数据看作总体,如果数据并不是总体(对于测量来说一般是样本,因为不可能无限次测量),得到的估计是有偏的。
  2. 除以$n-1$,其实是把数据看作样本,这样做是为了得到无偏估计。

matlab中的var,std,cov等函数默认的都是除以$n-1$,这样可以得到无偏估计。使用时需注意。下面是对$n$和$n-1$的测试。

3.2 var,std,cov函数的测试

3.2.1 var

在matlab中,函数var可以用来计算方差,但要注意:

1
2
V = var(X) % 样本方差,分母除的是n-1(当n>1时),当n=1时,除n
V = var(X,1) % 二阶矩,也就是总体方差,分母除的是n

其余用法未列出,使用help var查看。

可以进行如下验证,数据还是用的上面的x:

1
2
3
4
5
6
% 总体方差
sigxn = var(x,1) % matlab函数
sigxn_test = sum(diffx.^2)/size(diffx,1) % 自己计算
% 样本方差
sigxn1 = var(x,0) % 与var(x)结果一样
sigxn1_test = sum(diffx.^2)/(size(diffx,1)-1)

结果:

1
2
3
4
sigxn = 4
sigxn_test = 4
sigxn1 = 4.6667
sigxn1_test = 4.6667

$n$和$n-1$的用法得证。

3.2.2 cov

协方差计算函数cov也分总体和样本两种情况。

cov的用法:

1
2
C = cov(x,y) % 总体,n
C = cov(x,y,1) % 样本,n-1

3.2.3 std

std用法:

1
2
s = std(X) % 总体,n
s = std(X,flag) % flag=0是总体,flag=1是样本(n-1)

其余用法未列出,使用help var查看。

3.3 相关系数的计算

完整的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
data = load('data1.txt');
x = data(:,1);
y = data(:,2);
R0 = corrcoef(x, y) % 相关系数
% 以下是测试
mu_x = mean(x); % x均值
mu_y = mean(y); % y均值
diffx = x - mu_x; % 行列与x一样
diffy = y - mu_y;
covxy = sum(diffx.*diffy)/(size(diffx,1)-1); % x与y的协方差,用的n-1
sigx = sqrt(var(x,0)); % 标准差,用的n-1
sigy = sqrt(var(y,0));
R = covxy/(sigx*sigy)

结果:

1
2
3
4
5
R0 =
1.0000 0.9927
0.9927 1.0000
R =
0.9927

上面自己计算的时候,协方差和标准差的分母用的是$n-1$,接下来,用$n$,发现得到的结果是一样的。可见,对于相关系数的计算,不管协方差和标准差的分母是$n-1$还是$n$,结果是一样的。