目的描述
出于模型的需要,我们的团队选择做一次主成分分析,通常这部分在队伍中是会有同学专门负责这块的,至于为什么笔者就不在这里多说了。
解决思路
在MATLAB中封装了有关因子分析的方法--PCA
,读者可以通过help
命令来查看如何调用这个方法。
需要读者注意的是,在进行主成分分析的时候可能会出现海伍德现象(heywood),可惜的是,笔者并没有找到关于解决这个问题的文献,如果有读者知道怎样解决,劳驾告诉我一声,谢谢。
function [FData_M,LOCATION,Lab]=Split_PCA_Data(title,F_title,DataSet,index)
%index 表示要提取的Lab有多少个
LOCATION=[];
Lab={};
NUM=1;
for i=1:index
OBJECT=F_title{i,1};
for j=1:584
MSN=title{1,j};
if j~=1
if MSN==OBJECT
LOCATION(:,NUM)=j;
Lab(i,1)={MSN};
Lab(i,2)={OBJECT};
NUM=NUM+1;
end
end
end
FData_M=DataSet(:,LOCATION);
end
function [FData_M,LOCATION,Lab]=Split_Factor_Data(title,F_title,DataSet,index)
%index 表示要提取的Lab有多少个
LOCATION=[];
Lab={};
NUM=1;
for i=1:index
OBJECT=F_title{i,1};
for j=1:584
MSN=title{1,j};
if j~=1
if MSN==OBJECT
LOCATION(:,NUM)=j;
Lab(i,1)={MSN};
Lab(i,2)={OBJECT};
NUM=NUM+1;
end
end
end
FData_M=DataSet(:,LOCATION);
end
%更新FactorMatrix
%提取数据
[TX_PCA_D,Loc,Lab]=Split_PCA_Data(title,Factormatrix,DataSet{1,1},index);
%使用拟合函数
TX_D=FitData_Cubicinterp(TX_D,index);
%保存X数据Y数据
TX_PCA_x=TX_PCA_D(:,1:index-3);
TX_PCA_y=TX_PCA_D(:,index-2:end);
%求相关系数矩阵
TX_PCA_r=corrcoef(TX_PCA_x)
%数据标准化
TX_PCA_x=zscore(TX_PCA_x);
TX_PCA_y=zscore(TX_PCA_y);
%分析
[TX_vec,TX_lambda,TX_rate]=pcacov(TX_PCA_r);
TX_f=repmat(sign(sum(TX_vec)),size(TX_vec,1),1)*TX_vec;
%累计贡献
TX_contri=cumsum(TX_rate)
%求取所有主成分的分数
TX_score=TX_PCA_x*TX_f
%选取主成分个数 我们默认设置为num=4
%对E进行主成分分析
%要求输出X的特征矩阵,保存多项式回归的系数
%选取前四个做主成分,提取数据,
TX_Param_E=TX_score(:,[1:num])\TX_PCA_EDP;
%标准化变量的回归方程系数
TX_Param_E=TX_f(:,[1:num])*TX_Param_E;
TX_Param_E=[mean(TX_PCA_EDP)-std(TX_PCA_EDP)*mean(TX_PCA_x)./std(TX_PCA_x)*TX_Param_E,std(TX_PCA_EDP)*(TX_Param_E')./std(TX_PCA_x)]
%对D进行主成分分析
%要求输出X的特征矩阵,保存多项式回归的系数
TX_Param_D=TX_score(:,[1:num])\TX_PCA_GDP;
%标准化变量的回归方程系数
TX_Param_D=TX_f(:,[1:num])*TX_Param_D;
TX_Param_D=[mean(TX_PCA_GDP)-std(TX_PCA_GDP)*mean(TX_PCA_x)./std(TX_PCA_x)*TX_Param_D,std(TX_PCA_GDP)*(TX_Param_D')./std(TX_PCA_x)]
%量化排序
[TX_sort,TX_ind]=sort((TX_PCA_x*TX_vec(:,1:num)*TX_rate(1:num))/100);
结果展示
由于结果有多种多样的,直接给出MATLAB的工作空间,有兴趣的读者可以自行下载。
链接: 密码:0389