1. 何谓相关系数?
此处只列出相关系数的公式:
更多内容请百度或者看概率论与数理统计方面的书。
文章的目的是测试一下如何使用这个公式计算相关系数,并阐述一些在实际操作时遇到的一些问题。
2. matlab自带函数
2.1 corrcoef
功能:求相关系数
用法:
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 1.2
2 1.9
3 3.1
4 4
5 5.6
6 6.2
7 6.8
code:
data = load('data1.txt');
x = data(:,1);
y = data(:,2);
R = corrcoef(x, y)
结果:
R =
1.0000 0.9927
0.9927 1.0000
可以看到,自相关系数为1,因为自身与自身完全一样,x与y的相关系数为0.9927,非常接近1,表示两序列有很强的正相关性。
3. 自己写一个计算相关系数的函数
也不是完全自己写,目的是通过测试,了解自相关系数计算的一些细节。
3.1 总体与样本
在这之前得说一说总体与样本,计算方差的时候我们有如下公式:
这里取平均的时候有两种方式:
- 除以
n ,此为二阶中心矩,把数据看作总体,如果数据并不是总体(对于测量来说一般是样本,因为不可能无限次测量),得到的估计是有偏的。 - 除以
n−1 ,其实是把数据看作样本,这样做是为了得到无偏估计。
matlab中的var
,std
,cov
等函数默认的都是除以
3.2 var
,std
,cov
函数的测试
3.2.1 var
在matlab中,函数var
可以用来计算方差,但要注意:
V = var(X) % 样本方差,分母除的是n-1(当n>1时),当n=1时,除n
V = var(X,1) % 二阶矩,也就是总体方差,分母除的是n
其余用法未列出,使用help var
查看。
可以进行如下验证,数据还是用的上面的x:
% 总体方差
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)
结果:
sigxn = 4
sigxn_test = 4
sigxn1 = 4.6667
sigxn1_test = 4.6667
3.2.2 cov
协方差计算函数cov
也分总体和样本两种情况。
cov的用法:
C = cov(x,y) % 总体,n
C = cov(x,y,1) % 样本,n-1
3.2.3 std
std用法:
s = std(X) % 总体,n
s = std(X,flag) % flag=0是总体,flag=1是样本(n-1)
其余用法未列出,使用help var
查看。
3.3 相关系数的计算
完整的代码:
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)
结果:
R0 =
1.0000 0.9927
0.9927 1.0000
R =
0.9927
上面自己计算的时候,协方差和标准差的分母用的是