在很多研究中,我們需要的變量都不能或者不容易被直接測量迁沫,比如芦瘾,假如我們要研究家庭環(huán)境和學校環(huán)境對學生成績的影響捌蚊,我們要如何測量家庭環(huán)境和學校環(huán)境?
雖然我們不能直接測量家庭環(huán)境和學校環(huán)境近弟,但是我們可以通過一些相關(guān)的可測量變量來反映這些不可測量的變量缅糟,比如我們使用家庭年收入、父母學歷等等指標來反映家庭環(huán)境祷愉;用學校排名窗宦,學校本科率,學生所在班級排名等指標來衡量學校環(huán)境
但是細心的小伙伴會發(fā)現(xiàn)二鳄,家庭收入和父母學歷本身就存在相關(guān)性赴涵;學校排名和學校本科率也有相關(guān)性,因此我們可以推斷肯定存在一個共同影響家庭收入订讼、父母學歷的因子髓窜;也會存在影響學校排名和本科率的因子,那我們?nèi)绾握页鏊杏绊懟蛘咧渌凶兞康墓惨蜃幽兀?/p>
別急欺殿,現(xiàn)在就來給家人們詳細講講因子分析~
(”因子分析分為驗證性因子分析(CFA)和探索性因子分析(EFA)寄纵,本文講的是因子分析皆為EFA“)
2.1 兩類檢驗(KMO & Bartlett)
當我們的變量不獨立或不相關(guān)的時候,其實就不存在上述栗子中的問題了脖苏,那我們也不可能找到影響所有變量的公共因子
因此程拭,在做因子分析前我們需要進行KMO檢驗和Bartlett檢驗
- KMO檢驗
KMO檢驗用于檢驗變量之間的偏相關(guān)性的,其取值為[0,1]棍潘,當KMO統(tǒng)計量越接近于1時恃鞋,變量之間的偏相關(guān)性越強
一般我們要求KMO統(tǒng)計量在0.5以上且越接近于1越好,如果KMO在0.5以下亦歉,那就要重新考慮是否要使用因子分析了
- Bartlett檢驗
Bartlett用于檢驗變量之間是否獨立恤浪,其原假設(shè)是變量之間相互獨立,如果檢驗的P值小于0.05鳍徽,那么我們就可以在95%的置信水平上拒絕原假設(shè)资锰,認為變量間不獨立
只要變量不獨立疹鳄,那我們當然可以進行因子分析
經(jīng)過KMO和Bartlett檢驗后壳繁,我們發(fā)現(xiàn)變量確實相關(guān)而且不獨立,因子分析終于可以大展拳腳了预鬓,那這個因子分析到底是怎么個操作方法呢濒募?
萬丈高樓平地起鞭盟,我們還是要先弄清因子分析的模型
2.2 因子分析模型
2.2.1 數(shù)學模型
既然變量不獨立而且相關(guān),那他們肯定會受到一個或者多個潛在變量的影響瑰剃,我們只要把這個潛在變量找出來齿诉,再用潛在的變量表示原來的變量,那我們對原始變量的研究就可以轉(zhuǎn)化為對這個潛在變量的研究。因子分析模型也是這個道理
簡單來說粤剧,因子分析模型就是用公共因子和特殊因子表示原來的變量
假設(shè)我們現(xiàn)在對n個樣本觀察了p個指標歇竟,即X1,X2...Xp,公共因子用F表示抵恋,特殊因子用epsilon表示焕议,那么因子分析模型就可以用以下數(shù)學模型表示
以上的復雜式子,我們可以用X = AF + e
表示弧关,其模型描述如下:
- X是原始可觀測變量盅安,維度是p【注意:此時的X進行了中心化處理,E(x)=0】
- F代表公共因子世囊,維度是d(d<p)
- 系數(shù)a(loadings)别瞭,又稱“因子載荷”,需要求解株憾;所有的a組成載荷矩陣A蝙寨,載荷矩陣A不唯一
- 公因子F的線性組合反映X
- ?代表特殊因子;特殊因子僅僅與當前變量有關(guān)号胚;例如?1僅與X1有關(guān)籽慢,特殊因子之間相互獨立浸遗,且E(?)=0
【模型假設(shè)】
各特殊因子之間相互獨立
各特殊因子與公共因子相互獨立 Cov(F,?) = 0
各公共因子均值為0猫胁,方差為1且彼此獨立
整個因子分析最重要的一步,就是要求出loadings跛锌,即因子載荷弃秆,圍繞因子載荷,我們還要提一下以下幾個重要的性質(zhì)
2.2.2 重要性質(zhì)
因子載荷矩陣有以下幾個重要統(tǒng)計性質(zhì)
- 因子的統(tǒng)計意義
因子a_ij
是第i個變量與第就髓帽、個公共因子的相關(guān)系數(shù)菠赚,反映了第i個變量與第j個公共因子的相關(guān)重要性
說人話就是,a_ij越大郑藏,Xi與Fj的相關(guān)性越強唄~
- 共同度hi
對第i個變量Xi的共同度是指因子載荷矩陣第i行的因子的平方和衡查,也可以理解成j個共同因子對第i個變量的方差的貢獻度
對其兩邊求方差可以得到
上式可以看出,所有的公共因子和特殊因子對變量Xi的貢獻為1必盖,因子平方和越靠近1拌牲,則特殊因子項的方差就會很小,因子分析的效果越好
- 公共因子方差貢獻
因子載荷矩陣中第j列元素的因子平方和為Fj對所有Xi的方差貢獻和歌粥,記為gj2塌忽,用于衡量Fj的相對重要性
說人話就是,因子載荷矩陣里每一行的因子的平方和代表共同度失驶,每一列的因子的平方和代表方差貢獻
那接下來就要講講這個因子載荷要咋求出來
2.2.3 因子載荷&因子旋轉(zhuǎn)
估計因子載荷的方法很多土居,比如主成分分析,最大似然估計等,由于上一篇文章講了PCA擦耀,我們這就用主成分分析法來求因子載荷
由于PCA再主成分分析一文里說的很詳細棉圈,這里就不再闡述了,大體思路一致眷蜓,關(guān)鍵在于找到相關(guān)系數(shù)矩陣對應(yīng)的特征值和特征向量
假設(shè)v是最終計算出來的特征值和特征向量迄损,λ是特征值,那么因子載荷a可以由以下公式計算
整個計算方法基本和PCA一致账磺,求出特征值芹敌,找出累計方差貢獻大于70%的前幾個λ,然后再計算出對應(yīng)的特征向量v垮抗,然后再計算出因子載荷
得到因子載荷后氏捞,我們需要衡量因子是被哪幾個指標支配【即不同的F是受哪些X影響】,一般因子載荷a>0.5則認為該指標是支配指標
比如冒版,以下表格的數(shù)據(jù)可以看出F1受到x1,x2支配液茎;而F2受到x3,x4支配
F1 | F2 | |
---|---|---|
x1 | 0.7052 | 0.1024 |
x2 | 0.6905 | 0.2049 |
x3 | 0.3515 | 0.7906 |
x4 | 0.2516 | 0.8854 |
做完因子旋轉(zhuǎn)后,因子載荷的平方值會向0和1兩個方向分化辞嗡,原本值大的因子載荷會更大捆等,原本值小的因子載荷會更小,這樣我們就可以把他們區(qū)分開
【栗子??】
說了辣么多续室,來個栗子吧栋烤,不然看的云里霧里的
假設(shè)變量的相關(guān)系數(shù)矩陣是R如下,求其因子挺狰,首先第一步我們求特征值λ
根據(jù)特征值和特征向量公式我們求的λ
計算出特征值后我們要計算累計方差貢獻明郭,計算如下
λ | proportion | cummulative |
---|---|---|
1.7454 | 58.18% | 58.18% |
1 | 33.33% | 91.53% |
0.2546 | 8.48% | 100% |
因為λ1和λ2大于1,而且累計方差占比大于70%丰泊,因此我們只選取2個因子薯定,接下來就要計算其特征向量
將λ代回原矩陣計算
上述例子求出了其中一個特征向量,其他特征向量計算方法也類似瞳购,求出后計算對應(yīng)的因子
由此可得x與公共因子與特殊因子的模型數(shù)學表示如下:
其中F1對x的貢獻度為1.7454学赛,F(xiàn)2對x的貢獻度為1
相信看完案例年堆,大家應(yīng)該能明白因子載荷矩陣是怎么計算出來的 了~
2.2.4 因子得分
因子得分其實就是指模型中因子F的取值,前面也說到罢屈,因子F是不能直接觀察的理論變量嘀韧,因此其取值只能借助于X來測量,一般F都要由X來線性表示
無意中看到有一篇文章寫的是對因子得分的質(zhì)疑缠捌,感覺他說的挺有道理的锄贷,而且因子得分好像用的也不多【可能只有我用的不多h】译蒂,因此這部分也不打算細講
大概知道因子得分就是通過一種數(shù)學運算,將潛在因子F的值用X算出來了
【總結(jié)一下】
其實因子分析也就以下幾步
- 進行統(tǒng)計檢驗谊却,看數(shù)據(jù)是否適合做因子分析
- 標準化柔昼,以及計算相關(guān)系數(shù)矩陣
- 求解特征值和特征向量
- 計算方差貢獻率與累計方差貢獻率
- 確定與計算因子【包括因子旋轉(zhuǎn)】
這咋一看,感覺和PCA那么像呢炎辨,因為我們使用的是主成分分析法求解的因子載荷捕透,所有確實和PCA有點像,但實際上碴萧,EFA與PCA也是有很大區(qū)別的
2.2.5 EFA與PCA區(qū)別
- PCA使用原始數(shù)據(jù)的線性組合來降低數(shù)據(jù)維度乙嘀;而EFA則希望尋找隱藏在數(shù)據(jù)中無法直接觀察的因子
-
PCA旨在找到一種或幾種綜合指標,把每一個指標表示成原始變量的線性組合破喻,而EFA是將原始變量近似表示成公共因子的線性組合虎谢,大概意思如下圖 【靈魂畫手??】
2.3 EFA的python實現(xiàn)
EFA在spss、R曹质、SAS婴噩、python等軟件都能實現(xiàn),由于現(xiàn)在喜歡用python的胖友比較多羽德,那就來寫下python下如何實現(xiàn)EFA吧~
【注意??】這里沒有進行相關(guān)統(tǒng)計檢驗
import pandas as pd
import sklearn.datasets
from factor_analyzer import FactorAnalyzer
import matplotlib.pyplot as plt
df = pd.read("your path")
n = 6 # 選一個盡量大的值
fa = FactorAnalyzer(n_factors=n,rotation="varimax") # 最大方差旋轉(zhuǎn)
fa.fit(df) # df不能有NAN df.dropna()
pd.Dataframe.from_records(fa.loadings_) # 得到因子載荷loadings
ev,v = fa.get_eigenvalues() # 得到特征值和特征向量
# 確定最優(yōu)的n值
# draw scree plot
xvals = range(1,df.shape[1]+1)
plt.scatter(xvals,ev)
plt.plot(xvals, ev)
plt.title("scree plot")
plt.xlabel("factor")
plt.ylabel("eigenvalues")
plt.grid
plt.show()
# 確定最優(yōu)的n后几莽,使用最優(yōu)的n再進行因子分析
碼字不易,喜歡的話給個贊和關(guān)注吧~??
相關(guān)參考
[3] Abdi, Hervé. "Factor rotations in factor analyses." Encyclopedia for Research Methods for the Social Sciences. Sage: Thousand Oaks, CA (2003): 792-795.