典型相关性分析是一种统计技术,用于评估两组变量之间的相关性。它可以用于探索两组变量之间的关系,特别是在多元数据集中。典型相关性分析寻求找到两组变量之间的线性组合,使得这些组合之间的相关性最大化。
在典型相关性分析中,通常有两组变量,每组变量可以包含多个变量。该分析会找到两个最大相关性的线性组合,这些组合称为典型变量。这些典型变量可以帮助我们理解两组变量之间的关系,并且可以用于预测或分类。
典型相关性分析在社会科学、心理学、经济学和其他领域中得到广泛应用,特别是在研究多变量数据集之间的关系时。它提供了一种强大的工具,可以帮助研究人员理解和解释多元数据之间的复杂关系。
MATLAB的代码如下:
clc,clear
r = load('anli10_5_1.txt'); %读入相关系数矩阵
n1=5; n2=7; num=min(n1,n2);
s1=r([1:n1],[1:n1]); %提出X与X的相关系数
s12=r([1:n1],[n1+1:end]); %提出X与Y的相关系数
s21=s12'; %提出Y与X的相关系数
s2=r([n1+1:end],[n1+1:end]); %提出Y与Y的相关系数
m1=inv(s1)*s12*inv(s2)*s21; %计算矩阵M1,式(10.60)
m2=inv(s2)*s21*inv(s1)*s12; %计算矩阵M2,式(10.60)
[vec1,val1]=eig(m1); %求M1的特征向量和特征值
for i=1:n1
vec1(:,i)=vec1(:,i)/sqrt(vec1(:,i)'*s1*vec1(:,i));
%特征向量归一化,满足a's1a=1
vec1(:,i)=vec1(:,i)*sign(sum(vec1(:,i)));
%特征向量乘以1或-1,保证所有分量和为正
end
val1=sqrt(diag(val1)); %计算特征值的平方根
[val1,ind1]=sort(val1,'descend'); %按照从大到小排列
a=vec1(:,ind1(1:num)) %取出X组的系数阵
dcoef1=val1(1:num) %提出典型相关系数
flag=1; %把计算结果写到Excel中的行计数变量
writematrix(a, 'anli10_5_2.xlsx','Sheet',1, 'Range','A1')
flag=n1+2; str=char(['A',int2str(flag)]); %str为Excel中写数据的起始位置
writematrix(dcoef1','anli10_5_2.xlsx','Sheet',1, 'Range', str)
[vec2,val2]=eig(m2);
for i=1:n2
vec2(:,i)=vec2(:,i)/sqrt(vec2(:,i)'*s2*vec2(:,i));
vec2(:,i)=vec2(:,i)*sign(sum(vec2(:,i)));
end
val2=sqrt(diag(val2)); %计算特征值的平方根
[val2,ind2]=sort(val2,'descend'); %按照从大到小排列
b=vec2(:,ind2(1:num)) %取出Y组的系数阵
dcoef2=val2(1:num) %提出典型相关系数
flag=flag+2; str=char(['A',int2str(flag)]);
writematrix(b, 'anli10_5_2.xlsx', 'Sheet', 1, 'Range', str)
flag=flag+n2+1; str=char(['A',int2str(flag)]);
writematrix(dcoef2', 'anli10_5_2.xlsx', 'Sheet', 1, 'Range', str)
x_u_r=s1*a %x,u的相关系数
y_v_r=s2*b %y,v的相关系数
x_v_r=s12*b %x,v的相关系数
y_u_r=s21*a %y,u的相关系数
flag=flag+2; str=char(['A',int2str(flag)]);
writematrix(x_u_r, 'anli10_5_2.xlsx', 'Sheet', 1, 'Range', str)
flag=flag+n1+1; str=char(['A',int2str(flag)]);
writematrix(y_v_r, 'anli10_5_2.xlsx', 'Sheet', 1, 'Range', str)
flag=flag+n2+1; str=char(['A',int2str(flag)]);
writematrix(x_v_r, 'anli10_5_2.xlsx', 'Sheet', 1, 'Range', str)
flag=flag+n1+1; str=char(['A',int2str(flag)]);
writematrix(y_u_r, 'anli10_5_2.xlsx', 'Sheet', 1, 'Range', str)
mu=sum(x_u_r.^2)/n1 %x组原始变量被u_i解释的方差比例
mv=sum(x_v_r.^2)/n1 %x组原始变量被v_i解释的方差比例
nu=sum(y_u_r.^2)/n2 %y组原始变量被u_i解释的方差比例
nv=sum(y_v_r.^2)/n2 %y组原始变量被v_i解释的方差比例
fprintf('X组的原始变量被u1~u%d解释的比例为%f\n',num,sum(mu));
fprintf('Y组的原始变量被v1~v%d解释的比例为%f\n',num,sum(nv));
运行结果如下:
还有一种代码如下:
clc,clear
[x]=xlsread('anli10_6.xlsx'); %读入表单Sheet1中的数据x
[y]=xlsread('anli10_6.xlsx', 2); %读入Sheet2中的数据y
p=size(x,2);q=size(y,2);
x=zscore(x);y=zscore(y); %标准化数据
n=size(x,1); %观测数据的个数
%下面做典型相关分析,a1,b1返回的是典型变量的系数,r返回的是典型相关系数
%u1,v1返回的是典型变量的值,stats返回的是假设检验的一些统计量的值
[a1,b1,r,u1,v1,stats]=canoncorr(x,y)
%下面修正a1,b1每一列的正负号,使得a,b每一列的系数和为正
%对应的,典型变量取值的正负号也要修正
a=a1.*repmat(sign(sum(a1)),size(a1,1),1) %每一列表示典型相关方程u的系数
b=b1.*repmat(sign(sum(b1)),size(b1,1),1)%每一列表示典型相关方程v的系数
u=u1.*repmat(sign(sum(a1)),size(u1,1),1)
v=v1.*repmat(sign(sum(b1)),size(v1,1),1)
x_u_r=x'*u/(n-1) %计算x,u的相关系数
y_v_r=y'*v/(n-1) %计算y,v的相关系数
x_v_r=x'*v/(n-1) %计算x,v的相关系数
y_u_r=y'*u/(n-1) %计算y,u的相关系数
ux=sum(x_u_r.^2)/p %x组原始变量被u_i解释的方差比例
ux_cum=cumsum(ux) %x组原始变量被u_i解释的方差累积比例
vx=sum(x_v_r.^2)/p %x组原始变量被v_i解释的方差比例
vx_cum=cumsum(vx) %x组原始变量被v_i解释的方差累积比例
vy=sum(y_v_r.^2)/q %y组原始变量被v_i解释的方差比例
vy_cum=cumsum(vy) %y组原始变量被v_i解释的方差累积比例
uy=sum(y_u_r.^2)/q %y组原始变量被u_i解释的方差比例
uy_cum=cumsum(uy) %y组原始变量被u_i解释的方差累积比例
val=r.^2 %典型相关系数的平方,M1或M2矩阵的非零特征值
运行结果如下: