因子分析法(Matlab与SPSS对比)

Matlab代码来源是司守奎书中的案例。

clc;
clear;

%% 1.进行主成分分析
fid = fopen('data.txt');%打开数据文件,返回文件标志符
data1 = textscan(fid,'%s %f %f %f %f %f','CollectOutput',1);
data = data1{2};
data = reshape(data, [16, 5]);
m = size(data, 1);
x = data(:,5);data = data(:,1:4);num = 2;
% 数据标准化
data = zscore(data);
r = cov(data);
% 进行主成分分析的相关计算
[vec, val, con] = pcacov(r);
disp('旋转前特征向量:');
val
disp('旋转前因子贡献率:');
con

f1 = repmat(sign(sum(vec)), size(vec,1), 1);
% 特征向量正负号转换
vec = vec.*f1;
f2 = repmat(sqrt(val)', size(vec,1), 1);
% 载荷矩阵
disp('载荷矩阵');
a = vec.*f2

%% 2.对载荷矩阵进行旋转
% 如果指标变量多,选择的主因子个数少,可以直接使用factoran实现因子分析
% varimax采用最大方差法进行旋转
[b, t] = rotatefactors(a(:,1:num),'method','varimax');
% 旋转后的载荷矩阵
disp('旋转后的载荷矩阵:');
bz = [b,a(:,num+1:end)]
disp('成分转化矩阵');
t
% 计算因子贡献
disp('旋转后的因子贡献:');
gx = sum(bz.^2)
% 计算因子贡献率
disp('旋转后的因子贡献率:');
gxv = gx/sum(gx)
% 计算得分函数的系数
disp('得分函数的系数:');
dfxsh = inv(r)*b
% 计算各个因子的得分
disp('上市公司在各个因子的得分:');
df = data * dfxsh;

% 对各因子的得分进行加权求和
zdf = df*gxv(1:num)'/sum(gxv(1:num));
% 对企业进行排名
[szdf, ind] = sort(zdf, 'descend');
% 显示计算结果
xianshi = [df(ind,:)'; zdf(ind)'; ind'];
for j = 1:m
    i = ind(j);
    disp(['',num2str(j),'名:',data1{1}{i},'=>F1得分为',num2str(df(i,1)),',F2得分为',num2str(df(i,2)),',F得分为',num2str(zdf(i))]);
end
disp('\n');
% 计算相关系数
[x_zdf_coef, p] = corrcoef([zdf, x]);
disp('F与x之间的相关系数为');
x_zdf_coef

%% 回归分析计算
disp('因子分析法回归方程系数为d1');
[d1, d1int,r,rint,stats] = regress(zdf, [ones(m,1), x]);
d1
% 绘制残差及其置信区间
figure(1)
rcoplot(r,rint)
% 绘制回归曲线图
figure(2)
[x,ind] = sort(x);
p = [ones(length(x),1), x]*d1;
plot(x,zdf(ind),'bo');
hold on;
plot(x,p,'rx');

其中data.txt为:

歌华有线	43.31	7.39	8.73	54.89	15.35
五粮液	17.11	12.13	17.29	44.25	29.69
用友软件	21.11	6.03	7	89.37	13.82
太太药业	29.55	8.62	10.13	73	14.88
浙江阳光	11	8.41	11.83	25.22	25.49
烟台万华	17.63	13.86	15.41	36.44	10.03
方正科技	2.73	4.22	17.16	9.96	74.12
红河光明	29.11	5.44	6.09	56.26	9.85
贵州茅台	20.29	9.48	12.97	82.23	26.73
中铁二局	3.99	4.64	9.35	13.04	50.19
红星发展	22.65	11.13	14.3	50.51	21.59
伊利股份	4.43	7.3	14.36	29.04	44.74
青岛海尔	5.4	8.9	12.53	65.5	23.27
湖北宜化	7.06	2.79	5.24	19.79	40.68
雅戈尔	19.82	10.53	18.55	42.04	37.19
福建南纸	7.26	2.99	6.99	22.72	56.58

结果分析将数据导入SPSS,可以得到:

  1. 对比一:SPSS中的初始特征值部分对应Matlab通过[vec, val, con] = pcacov®得到的val和con值,其中vec特征值对应总计,con为对应方差百分比。
    因子分析法(Matlab与SPSS对比)_第1张图片

因为这里手动设置了提取两个公因子,因此提取载荷平方和部分取的是初始特征值的前两行。
因子分析法(Matlab与SPSS对比)_第2张图片

  1. 对比二:SPSS中总方差解释表中的旋转载荷平方和对应Matlab通过对rotatefactors命令载荷矩阵进行旋转后得到的gx值和gxv值。
    因子分析法(Matlab与SPSS对比)_第3张图片
    因子分析法(Matlab与SPSS对比)_第4张图片
  2. 对比三
    SPSS的成分矩阵表对应于Matlab中计算的载荷矩阵a,这里SPSS只取了两个主成分的结果。
    因子分析法(Matlab与SPSS对比)_第5张图片
    因子分析法(Matlab与SPSS对比)_第6张图片
  3. 对比四
    SPSS旋转后的成分矩阵对应与Matlab旋转后计算得到的矩阵bz。
    因子分析法(Matlab与SPSS对比)_第7张图片
    因子分析法(Matlab与SPSS对比)_第8张图片
  4. 对比五
    SPSS中的成分转换矩阵对应于Matlab计算得到的成分转化矩阵。
    因子分析法(Matlab与SPSS对比)_第9张图片
    因子分析法(Matlab与SPSS对比)_第10张图片

其中SPSS对应的一些设置:
因子分析法(Matlab与SPSS对比)_第11张图片
因子分析法(Matlab与SPSS对比)_第12张图片

使用Matlab对最后的结果进行回归计算:
因子分析法(Matlab与SPSS对比)_第13张图片
因子分析法(Matlab与SPSS对比)_第14张图片

你可能感兴趣的:(matlab,matlab,矩阵,线性代数)