數學建模常用模型14 :因子分析
因子分析可以看作是主成分分析的一個擴充,因子分析在數學建模中使用的沒有主成分分析那麼多。關於因子分析和主成分分析的區別可以看一下司守奎老師的“因子分析”那個章節。一開始就有介紹區別。
因子分析
1)主成分分析法:
例5 研究紐約股票市場上五種股票的週迴升率。這裡,週迴升率=(本星期五市場收盤價-上星期五市場收盤價)/上星期五市場收盤價。從1975年1月到1976年12月,對這五種股票作了100組獨立觀測。因為隨著一般經濟狀況的變化,股票有集聚的趨勢,因此,不同股票週末回升率是彼此相關的。
相關係數矩陣:
對m=1和m=2,因子分析主成分解見下表。
變數 |
一個因子 |
兩個因子 |
|||
因子載荷估計 |
特殊方差 |
因子載荷估計 |
特殊方差 |
||
1 |
0.7836 |
0.3860 |
0.7836 |
-0.2162 |
0.3393 |
2 |
0.7726 |
0.4031 |
0.7726 |
-0.4581 |
0.1932 |
3 |
0.7947 |
0.3685 |
0.7947 |
-0.2343 |
0.3136 |
4 |
0.7123 |
0.4926 |
0.7123 |
0.4729 |
0.2690 |
5 |
0.7119 |
0.4931 |
0.7119 |
0.5235 |
0.2191 |
累積貢獻 |
0.571342 |
0.571342 |
0.733175 |
對m=2,殘差矩陣為
第一個因子F1代表了一般經濟條件,稱為市場因子,所有股票在這個因子上的載
荷都比較大,且大致相等,第二個因子是化學股和石油股的一個對照,兩者分別有比較大的負、正載荷。可見F2使不同的工業部門的股票產生差異,通常稱之為工業因子。歸納起來,我們有如下結論:股票回升率由一般經濟條件、工業部門活動和各公司本身特殊活動三部分決定。
MATLAB原始碼:
clc,clear
r=[1.000 0.577 0.509 0.387 0.462
0.577 1.000 0.599 0.389 0.322
0.509 0.599 1.000 0.436 0.426
0.387 0.389 0.436 1.000 0.523
0.462 0.322 0.426 0.523 1.000];
%下面利用相關係數矩陣求主成分解,val的列為r的特徵向量,即主成分的係數
[vec,val,con]=pcacov(r);%val為r的特徵值,con為各個主成分的貢獻率
f1=repmat(sign(sum(vec)),size(vec,1),1); %構造與vec同維數的元素為±1的矩陣
vec=vec.*f1; %修改特徵向量的正負號,每個特徵向量乘以所有分量和的符號函式值
f2=repmat(sqrt(val)',size(vec,1),1);
a=vec.*f2 %構造全部因子的載荷矩陣
a1=a(:,1) %提出一個因子的載荷矩陣
tcha1=diag(r-a1*a1') %計算一個因子的特殊方差
a2=a(:,[1,2]) %提出兩個因子的載荷矩陣
tcha2=diag(r-a2*a2') %計算兩個因子的特殊方差
ccha2=r-a2*a2'-diag(tcha2) %求兩個因子時的殘差矩陣
gong=cumsum(con) %求累積貢獻率
該MATLAB原始碼執行結果中的a為載荷矩陣。主因子方法是對主成分方法的修正。
2)主因子分析法:
例 我國上市公司贏利能力與資本結構的實證分析
已知上市公司的資料見表1。
表1 上市公司資料
公司 |
銷售淨利率X1 |
資產淨利率X2 |
淨資產收益率X3 |
銷售毛利率X4 |
資產負利率X5 |
歌華有線 |
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 |
MATLAB原始碼:
clc,clear
load data.txt; %把原始資料儲存在純文字檔案data.txt中
n=size(data,1);
x=data(:,1:4); y=data(:,5); %分別提出自變數x和因變數y的值
——————————————————————————————————
如果不需要檢驗,則不需要把y列入原始資料中,把矩陣x的大小改變一下,以及下文中的m,m為原始資料中變數的個數。
——————————————————————————————————
m=4;%m為變數的個數
x=zscore(x); %資料標準化
r=cov(x); %求標準化資料的協方差陣,即求相關係數矩陣
[vec,val,con]=pcacov(r); %進行主成分分析的相關計算
c=cumsum(con);
i=1;
while ((c(i)<90)&(con(i+1)>10))
i=i+1;
end
num=i;
f1=repmat(sign(sum(vec)),size(vec,1),1);
vec=vec.*f1; %特徵向量正負號轉換
f2=repmat(sqrt(val)',size(vec,1),1);
a=vec.*f2; %求初等載荷矩陣
am=a(:,1:num); %提出num個主因子的載荷矩陣
[b,t]=rotatefactors(am,'method', 'varimax'); %旋轉變換,b為旋轉後的載荷陣
bt=[b,a(:,num+1:end)]; %旋轉後全部因子的載荷矩陣
contr=sum(bt.^2); %計算因子貢獻
rate=contr(1:num)/sum(contr); %計算因子貢獻率
fprintf('綜合因子得分公式:F=');
for i=1:num
fprintf('+%f*F%d',rate(i),i);
end
fprintf('\n');
coef=inv(r)*b; %計算得分函式的係數
coef=coef';
for i=1:num
fprintf('各個因子得分函式為F%d=',i);
for j=1:m
fprintf('+(%f)*x_%d',coef(i,j),j);
end
fprintf('\n');
end
%如果僅僅因子分析,程式到此為止
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
score=x*coef';%計算各個因子的得分
weight=rate/sum(rate); %計算得分的權重
Tscore=score*weight'; %對各因子的得分進行加權求和,即求各企業綜合得分
[STscore,ind]=sort(Tscore,'descend'); %對企業進行排序
display=[score(ind,:)';STscore';ind']; %顯示排序結果
fprintf('排序結果如下:');
for i=1:num
fprintf('第%d行為F%d得分,',i,i);
end
fprintf('第%d行為綜合因子得分,第%d為原序列\n',num+1,num+2);
disp(display);
[ccoef,p]=corrcoef([Tscore,y]); %計算F與資產負債的相關係數
[d,dt,e,et,stats]=regress(Tscore,[ones(n,1),y]);%計算F與資產負債的方程
fprintf('因子分析法的迴歸方程為:F=%f+(%f*y)',d(1),d(2));
if (stats(3)<0.05)%判斷是否通過顯著性檢驗的結果
fprintf('\n在顯著性水平0.05的情況下,通過了假設檢驗。\n');
else
fprintf('\n在顯著性水平0.05的情況下,通不過假設檢驗。\n');
end該MATLAB原始碼的displsy為最終排序結果。
本題用SPSS求解(因子分析中的主成分分析法):
1.把原始資料輸入SPSS中,如圖:
2.依次點選“分析”→“降維”→“因子”,如圖:
3.在“因子分析”對話方塊中,把X1、X2、X3、X4移入“變數”中,如圖:
4.單擊“描述”,出現“因子分析:描述”對話方塊;在“統計”欄中,勾選“初始解”;在“相關性矩陣”欄中,勾選“顯著性水平”,如圖,單擊“繼續”。
5.單擊“提取”,出現“因子分析:提取”對話方塊,在“方法”中,選擇“主成分”;在“分析”中,選擇“相關性矩陣”;在“輸出”中,勾選“未旋轉因子解”;在“提取”中,選擇“基於特徵值”,並設定特徵值大於“1”,如圖,單擊“繼續”。
6.單擊“選擇”,在“因子分析:旋轉”對話方塊中的選項預設即可,如圖,單擊“繼續”。
7.單擊“得分”,在“因子分析:因子得分”對話方塊中,勾選“儲存為變數”;在“方法”中,選擇“迴歸”;並勾選“顯示因子得分系數矩陣”,如圖,單擊“繼續”。
8.單擊“選項”,在“因子分析:選項”對話方塊中的選項預設即可,如圖,單擊“繼續”。
9.在“因子分析”對話方塊中,單擊“確定”,如圖。
相關性矩陣 |
|||||
X1 |
X2 |
X3 |
X4 |
||
顯著性 (單尾) |
X1 |
.114 |
.263 |
.006 |
|
X2 |
.114 |
.002 |
.096 |
||
X3 |
.263 |
.002 |
.304 |
||
X4 |
.006 |
.096 |
.304 |
總方差解釋 |
||||||
成分 |
初始特徵值 |
提取載荷平方和 |
||||
總計 |
方差百分比 |
累積 % |
總計 |
方差百分比 |
累積 % |
|
1 |
1.897 |
47.429 |
47.429 |
1.897 |
47.429 |
47.429 |
2 |
1.550 |
38.740 |
86.169 |
1.550 |
38.740 |
86.169 |
3 |
.393 |
9.826 |
95.995 |
|||
4 |
.160 |
4.005 |
100.000 |
|||
提取方法:主成分分析法。 |
綜合因子分析得分公式為:
成分矩陣a |
||
成分 |
||
1 |
2 |
|
X1 |
.731 |
-.513 |
X2 |
.818 |
.503 |
X3 |
.359 |
.897 |
X4 |
.752 |
-.477 |
提取方法:主成分分析法。 |
||
a. 提取了 2 個成分。 |
成分得分系數矩陣 |
||
成分 |
||
1 |
2 |
|
X1 |
.385 |
-.331 |
X2 |
.431 |
.325 |
X3 |
.189 |
.579 |
X4 |
.396 |
-.308 |
提取方法:主成分分析法。 元件得分。 |
各個因子得分函式:
成分得分協方差矩陣 |
||
成分 |
1 |
2 |
1 |
1.000 |
.000 |
2 |
.000 |
1.000 |
提取方法:主成分分析法。 元件得分。 |