因子分析——matlab
目錄
一、起源
二、基本思想
三、算法用途
四、實例詳解
1.讀取數據
2.數據標準化
3.兩種不同的做法
3.1 不用函數
3.2 factoran()法
4.對因子得分進行排序
5.對因子得分進行畫圖
一、起源
????????因子分析的起源是這樣的:1904年英國的一個心理學家發現學生的英語、法語和古典語成績非常有相關性,他認為這三門課程背后有一個共同的因素驅動,最后將這個因素定義為“語言能力”。
????????基于這個想法,發現很多相關性很高的因素背后有共同的因子驅動,從而定義了因子分析,這便是因子分析的由來。
二、基本思想
????????我們再通過一個更加實際的例子來理解因子分析的基本思想:
????????現在假設一個同學的數學、物理、化學、生物都考了滿分,那么我們可以認為這個學生的理性思維比較強,在這里理性思維就是我們所說的一個因子。在這個因子的作用下,偏理科的成績才會那么高。
????????到底什么是因子分析?就是假設現有全部自變量x的出現是因為某個潛在變量的作用,這個潛在的變量就是我們說的因子。在這個因子的作用下,x能夠被觀察到。
????????因子分析就是將存在某些相關性的變量提煉為較少的幾個因子,用這幾個因子去表示原本的變量,也可以根據因子對變量進行分類。
????????因子分子本質上也是降維的過程,和主成分分析(PCA)算法比較類似。
三、算法用途
????????因子分析法和主成分分析法有很多類似之處。因子分析的主要目的是用來描述隱藏在一組測量到的變量中的一些更基本的,但又無法直接測量到的隱性變量。因子分析法也可以用來綜合評價。
????????其主要思路是利用研究指標的之間存在一定的相關性,從而推想是否存在某些潛在的共性因子,而這些不同的潛在的共性因子不同程度地共同影響著研究指標。因子分析可以在許多變量中找出隱藏的具有代表性的因子,將共同本質的變量歸入一個因子,可以減少變量的數目。
四、實例詳解
?數據來源于中國統計年鑒。
1.讀取數據
[data,textdata] = xlsread('D:\桌面\aa.xls')%讀取數據讓我們來看一下,讀取的 data 和 textdata
?然后我們在讀取一下變量名
varname = textdata(1,2:end)%提取textdata的第1行,第2至最后一列,即變量名?運行結果:
?最后我們再看一下它的每行的首項,在這突然不知道叫啥了。。。。
obsname = textdata(2:end,1)%提取textdata的第1列,第2行至最后一行,即地區名運行結果為:
2.數據標準化
標準化的數據均值為0,標準差為1;就是原數據減去均值,再除以標準差(無偏估計)
?
data=zscore(data) %數據標準化運行結果:
3.兩種不同的做法
3.1 不用函數
3.1.1? 求相關系數矩陣
r=corrcoef(data) %相關系數矩陣?運行結果:
3.1.2 帶入主成分分析進行計算
%進行主成分分析的相關計算 %vec是r的特征向量,val為r的特征值,con為各個主成分的貢獻率 [vec,val,con]=pcacov(r); %進行主成分分析的相關計算3.1.3 求載荷矩陣
f1=repmat(sign(sum(vec)),size(vec,1),1); vec=vec.*f1; %特征向量正負號轉換 f2=repmat(sqrt(val)',size(vec,1),1); a=vec.*f2 %求初等載荷矩陣?運行結果:
3.1.4? 因子旋轉(最大方差法)
num=input('請選擇主因子的個數:'); %選擇主因子的個數 %其中b為旋轉后的載荷矩陣,t為變換的正交矩陣 [b,t]=rotatefactors(a(:,1:num),'method', 'varimax'); %對載荷矩陣進行旋轉 bz=[b,a(:,num+1:end)] %旋轉后的載荷矩陣?選擇兩個因子并輸出:
3.1.5 貢獻率
gx=sum(bz.^2); %計算因子貢獻 gxv=gx/sum(gx); %計算因子貢獻率3.1.6 因子得分
dfxsh=inv(r)*b; %計算得分函數的系數 F=data*dfxsh ;%計算各個因子的得分3.2 factoran()法
這個函數具有一定的 bug 所以不太建議使用!!!
3.2.1因子旋轉
%調用factoran函數根據原始觀測數據作因子分析4 % 進行因子旋轉(最大方差旋轉法) %在這里選擇2個主因子進行輸出 num=input('請選擇主因子的個數:'); %選擇主因子的個數 [lambda,psi,T,stats,F] = factoran(data,num)?運行結果:
?
3.2.2 貢獻率
%計算貢獻率,因子載荷矩陣的列元素的平方和除以維數 gx = 100*sum(lambda.^2)/8 gxv = cumsum(Contribut) %計算累積貢獻率3.2.3? 因子得分
在上面?factoran() 函數的輸出結果中就已經有了
4.對因子得分進行排序
%將因子得分F分別按因子得分1和因子得分2進行排序 obsF = [obsname, num2cell(F)] ;%將國家和地區名與因子得分剛在一個元胞數組中顯示 F1 = sortrows(obsF, 2) ; % 按因子得分1排序 F2 = sortrows(obsF, 3); % 按因子得分2排序 head = {'地區','因子1','因子2'}; result1 = [head; F1] result2 = [head; F2]?輸出:
5.對因子得分進行畫圖
在這里就表示一個的哦!!表示函數法那個吧,另一種自己試試吧,結果不太一樣!!!
gname()? 函數 ,你鼠標選中哪個點,進行擊右鍵就會顯示地區名
%繪制因子得分負值的散點圖 plot(F(:,1),F(:,2),'k.');%作因子 xlabel('因子得分1'); ylabel('因子得分2'); gname(obsname);%交互式添加各散點的標注輸出:?
?
因子分析就到這里了,如果有不足之處,請大家及時指出,感謝!!
總結
以上是生活随笔為你收集整理的因子分析——matlab的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年五一杯数学建模A题(疫苗生产调
- 下一篇: zabbix配置mysql监控_【zab