主成分分析
主成分分析,是一種降維的分析方法,其考察多個變量間相關性的一種多元統計方法,研究如何通過少數幾個主成分來揭示多個變量間的内部結構,即從原始變量中導出少數幾個主成分,使它們盡可能多地保留原始變量的資訊,且彼此間互不相關。
為什麼要降維
1)多重共線性--預測變量之間存在一定程度的相關性。多重共線性會導緻解空間的不穩定,進而可能導緻結果的不連貫。
2)高維空間本身具有稀疏性。
3)過多的變量會妨礙查找規律的建立。
4)僅在變量層面上分析可能會忽略變量之間的潛在聯系。例如幾個預測變量的綁定才可以反映資料某一方面特征。
主成分滿足的條件:
1)每個主成分P都是原變量的線性組合,有多少個原變量就有多少個主成分,任意主成分可以表示成:
2)公式中的未知系數aij滿足平方和為1;
3)P1是線性組合中方差最大,依次是P2,P3,...Pm,并且各主成分之間互不相關。
主成分分析過程
1)資料預處理,可以直接使用原始資料也可以使用相關系數矩陣;
2)選擇主成分的個數(可有三種方法參考,1:保留特征值大于1的主成分;2:碎石圖,在圖形變化最大處之上的主成分均可保留;3:平行分析,将真實資料的特征值與模拟資料的特征值進行比較,保留真實資料的特征值大于模拟資料的特征值的主成分)
3)提取主成分
4)主成分旋轉,當提取多個主成分時,對它們進行旋轉可使結果更具解釋性
5)解釋結果
6)計算主成分得分
應用
主成分分析使用psych包中的principal()函數,以下是該函數中參數的解釋:
principal(r, nfactors = 1, residuals = FALSE,
n.obs=NA, covar=FALSE,
scores=TRUE,missing=FALSE,
impute="median",oblique.scores=TRUE,
method="regression",...)
r指定輸入的資料,如果輸入的是原始資料,R将自動計算其相關系數矩陣;
nfactors指定主成分個數;
residuals是否顯示主成分模型的殘差,預設不顯示;
rotate指定模型旋轉的方法,預設為最大方差法;
n.obs如果輸入的資料是相關系數矩陣,則必須指定觀測樣本量
covar為邏輯參數,如果輸入資料為原始資料或方陣(如協方差陣),R将其轉為相關系數矩陣;
scores是否計算主成分得分;
missing缺失值處理方式,如果scores為TRUE,且missing也為TRUE,缺失值将被中位數或均值替代;
impute指定缺失值的替代方式,預設為中位數替代;
method指定主成分得分的計算方法,預設使用回歸方法計算。
#搜集資料,資料來源于吳喜之老師的PPT
x1 <- c(5700,1000,3400,3800,4000,8200,1200,9100,9900,9600,9600,9400)
x2 <- c(12.8,10.9,8.8,13.6,12.8,8.3,11.4,11.5,12.5,13.7,9.6,11.4)
x3 <- c(2500,600,1000,1700,1600,2600,400,3300,3400,3600,3300,4000)
x4 <- c(270,10,10,140,140,60,10,60,180,390,80,100)
x5 <- c(25000,10000,9000,25000,25000,12000,16000,14000,18000,25000,12000,13000)
my.data <- data.frame(x1 = x1, x2 = x2, x3 = x3, x4 = x4, x5 = x5)
其中,x1為總人口數;x2為雇員總數;x3為中等校平均校齡;x4為專業服務項目數;x5為中等房價。
#加載psych包
library(psych)
#選擇主成分數目
fa.parallel(x = my.data, fa="pc")
由上圖的結果可知,這裡選擇2個主成分。
#提取主成分
pc <- principal(r = my.data, nfactors = 2, rotate = 'none')
pc
principal函數預設對原始資料進行相關系數矩陣的轉換,并且這裡指的不進行主成分的旋轉。PC1和PC2為成分載荷,為變量與主成分的相關系數,可以将系數寫成上文中提到的主成分公式。h2為主成分對每個變量的方差解釋度,u2為主成分無法解釋的比例。從上圖可知,第一主成分解釋了5個變量的62%的方差,第一和第二主成分則完全解釋了5個變量的方差。
#旋轉主成分,這裡使用最常用的方差極大正交旋轉法
rc <- principal(r = my.data, nfactors = 2, rotate = 'varimax')
rc
通過最大方差法的旋轉,發現與之前的PC1,PC2值變化很大,而且更容易的找出主成分主要由哪些變量解釋,這裡PC1可由x2、x4和x5變量來解釋,而PC2可由x1和x3變量來解釋。
#計算各主成分的得分
spc <- principal(r = my.data, nfactors = 2, rotate = 'varimax', scores = TRUE)
scores <- spc$scores
scores
一般可以通過各主成分的評分為觀測打上綜合得分,權重的設定可用特征根的值确定。
因子分析
因子分析也是一種降維技術,通過降維來挖掘隐藏在資料中無法觀測的變量,這些變量可以解釋可觀察變量的相關性。因子分析與主成分分析最大的不同在于每個自變量是因子的線性組合,具體數學表達式可表示為:
有關因子分析的過程與主成分基本一緻,這裡不再重複。
應用
因子分析使用psych包中的fa()函數,以下是該函數中參數的解釋:
fa(r,nfactors=1,n.obs = NA,n.iter=1, rotate="oblimin",
scores="regression", residuals=FALSE, SMC=TRUE,
covar=FALSE,missing=FALSE,impute="median",
min.err = 0.001, max.iter = 50,symmetric=TRUE,
warnings=TRUE, fm="minres",alpha=.1,p=.05,
oblique.scores=FALSE,np.obs,use="pairwise",cor="cor",...)
r為輸入資料,可以是原始資料或協方差矩陣或相關系數矩陣,如果是原始資料,R将計算其相關系數矩陣,如果是協方差矩陣,也會将其轉為相關系數矩陣,除非covar為TRUE;
nfactors指定因子個數,預設為1個因子;
n.iter使用自助法進行因子分析,可以指定疊代次數,預設為1次;
rotate指定因子旋轉的方法,預設為最小傾斜法進行旋轉;
scores使用回歸方法計算因子得分;
residuals計算因子模型的殘差,預設不計算;
SMC使用多重相關系數平方或1作為共同度初始值;
n.obs,covar,missing,impute同主成分分析的參數;
min.err指定最低誤內插補點,使變量共同度在疊代過程中小于該值;
max.iter指定收斂時的最大疊代次數;
fm指定提取公因子的方法,預設使用最小二乘法;
這裡需要指出的是:如果得到的資料不是原始資料,而是協方差矩陣,可使用cov2cor()函數将協方差矩陣轉換為相關系數矩陣。
#選擇因子數目
library(psych)
fa.parallel(x = my.data, fa="fa")
在選擇因子數目時,值得引起注意的一點是,将特征值大于0的因子保留下來,而非大于1。上圖結果顯示,這裡選擇2個因子。
#提取因子(最大似然法(ml)更具良好的統計性質,但有時不會收斂,此時可以使用主軸疊代法(pa))
f <- fa(r = my.data, nfactors = 2, n.obs = 112, fm = 'ml', rotate = 'none')
f
結果架構類似于主成分的傳回結果,這裡不再詳述。
#因子旋轉,有助于更好地解釋因子
fr <- fa(r = my.data, nfactors = 2, n.obs = 112, fm = 'ml', rotate = 'varimax')
fr
#因子得分的計算
sf <- fr <- fa(r = my.data, nfactors = 2, n.obs = 112, fm = 'ml', rotate = 'varimax', scores = TRUE)
sf$scores
其他關于主成分或因子分析的R包
FactoMineR包不僅提供了PCA和EFA方法,還包含潛變量模型,它有許多principal()函數和fa()函數沒考慮的參數選項,如數值型變量和分類變量的使用方法。FAiR包使用遺傳算法來估計因子分析模型,它增強了模型參數估計能力,能夠處理不等式的限制條件。GPArotation包提供了許多因子旋轉方法。nFactors包提供了用來判斷因子數目的許多方法。
個人認為主成分和因子分析的結果解釋是最為困難的,需要非常了解所分析的資料,包括資料各個次元之間的關聯、所屬行業的特征等。本文主要是為了使用R語言實作主成分和因子分析,具體相關理論知識可進一步檢視下文中的參考資料。
參考資料
[1]統計模組化與R語言
[2]R語言實戰
[3]http://baike.baidu.com/link?url=bMQWYV3a1MRJou_bXrTYu7W5TnE_2L3-eXPsZOb4Gfr0aEfZjKx-Efcw_CwqLaWYaMeP4_Z0E18twYFSVjaQo_