前言
這部分也許是資料預處理最為關鍵的一個階段。
如何對資料降維是一個很有挑戰,很有深度的話題,很多理論書本均有詳細深入的講解分析。
本文僅介紹主成分分析法(PCA)和探索性因子分析法(EFA),並給出具體的實現步驟。
主成分分析法 - PCA
主成分分析(principal components analysis, PCA)是一種分析、簡化資料集的技術。
它把原始資料變換到一個新的座標系統中,使得任何資料投影的第一大方差在第一個座標(第一主成分)上,第二大方差在第二個座標(第二主成分)上,依次類推。主成分分析經常用減少資料集的維數,同時保持資料集的對方差貢獻最大的特徵。這是通過保留低階主成分,忽略高階主成分做到的。這樣低階成分往往能夠保留住資料的最重要方面。但是在處理觀測數目小於變數數目時無法發揮作用,例如基因資料。
PCA基本步驟
第一步:載入所需包和測試集資料:
測試資料集內容大致如下:
第二步:確定主成分的個數:
在該函式中,fa是指定分析型別為主成分,n.iter是指平行分析中模擬測試的迭代次數為100次。結果如下:
其中,藍線為測試資料集中不同主成分對應的特徵值折線圖;紅線為平行分析中模擬測試矩陣的不同主成分對應的特徵值折線圖。
可採用以下幾個思路來確定主成分的具體個數:
1. 保留特徵值大於1的主成分個數
2. 根據圖形彎曲的情況,選取圖形變化最大處之上的特徵值對應的主成分
3. 特徵值大於模擬矩陣的平均特徵值的主成分保留
根據這幾個經驗法則,可確定主成分的個數為1。
當然,有一個更簡單的確定方法 -- 在你呼叫fa.parallel函式之後,系統shell端會告訴你建議的主成分個數:
第三步:提取主成分
其中,nfactors是指定提取的主成分的個數。
執行完畢後shell端列印如下資訊:
這些資訊中,最重要的是載荷矩陣,也就是上方列為h2,u2的那個矩陣。
我們只看PC1那一列(h2 u2先不去管它),當然如果你指定的主成分個數是2,那麼就會有PC2,以此類推。而行代表的則是每個特徵。矩陣的值,也即載荷矩陣的值是資料集協方差矩陣對應的特徵向量,也即這個主成分在該特徵中所佔的比重。如果你瞭解後面要講的因子分析,那麼也許會對這個表述產生疑惑 - 這不和因子一模一樣嗎?
--- 答曰確實是的。主成分法本來就是選擇因子的一種方法。事實上很多時候你也可以從載荷矩陣裡觀察得出主成分的現實意義。如果對主成分分析的結果不滿意,可以嘗試進行各種旋轉以調整各個主成分所佔的比重,具體請查閱principal函式的rotate引數。
第四步:獲取主成分得分
得到結果如下:
接下來就可以使用該主成分資料集了。
探索性因子分析法 - EFA
EFA的目標是通過發掘隱藏在資料下的一組較少的,更為基本的無法觀測的變數,來解釋一組可觀測變數的相關性。這些虛擬的,無法觀測的變數稱作因子。(每個因子被認為可解釋多個觀測變數間共有的方差,也叫作公共因子)
模型的形式為:
Xi=a1F1+a2F2+……apFp+Ui
- Xi是第i個可觀測變數(i=1,2,……k);
- Fj是公共因子(j=1,2,……p),並且p<k。
EFA基本步驟
第一步:載入所需包和測試集資料:
第二步:確定因子個數
這次分析的輸入是資料集的相關矩陣(當然你也可以像PCA中講的那樣使用原始資料集);n.obs是觀測的樣本數,這個引數只有在輸入為協方差矩陣的時候需要;n.iter是指平行分析中模擬測試的迭代次數為100次,結果如下:
該圖的具體含義參考PCA部分講解,根據同樣方法選擇因子個數為2。
第三步:提取因子
函式中,nfactors為因子個數;fm為提取因子的各種方法,有最大似然法(ml),主軸迭代法(pa),加權最小二乘法(wls),廣義加權最小二乘法(gls)和最小殘差法(minres)等等,本文不細細分析此部分,請自行參閱相關文件。
執行完畢後shell端列印如下資訊:
這些資訊中,最重要的是載荷矩陣,也就是上方列有h2,u2等的那個矩陣。
我們只看PA1和PA2這兩列(h2 u2先不去管它),當然如果你指定的因子個數是3,那麼就會有PA3,以此類推。而行代表的則是每個特徵。矩陣的值,也即載荷矩陣的值是這個因子在該特徵中所佔的比重。
如果對因子分析的結果不滿意,可以嘗試進行各種旋轉以調整各因子所佔的比重,具體請查閱fa函式的rotate引數。
第四步:分析特徵間的潛在關係:
該函式會圖形化的顯示載荷矩陣:
圖中的散點表示各個特徵,而橫縱軸則表示各個特徵中的兩個因子的佔比重。
還可以用下面這個函式,更為直觀形象:
結果顯示如下:
圖中展示了各個因子在各個特徵中的佔比。此圖可以很好地分析出因子的具體意義。
第五步:提取各個樣本的因子得分
注意傳遞的資料必須是原資料集,如果傳遞進的是其協方差矩陣,那麼這個得分值就沒什麼意義。
小結
R語言的確方便的給出了很多演算法的實現。然而,如果想要詳細具體的知道如何調整引數,就必須要多去理解演算法的思想,機制。
這種能力是需要通過不斷地學習演算法,慢慢積累的。