法一:采用factor_analyzer模塊方法:
from factor_analyzer import factor_analyzer
# KMO值
print round(factor_analyzer.calculate_kmo(X_basic)[1],5)
# 巴特利特球形度值
print round(factor_analyzer.calculate_bartlett_sphericity(X_basic)[1], 5)
法二:自己實現代碼檢驗:
def kmo():
# 相關系數
corr = X_basic.corr().values
# print corr
# 逆矩陣
corr_inv = np.linalg.inv(corr)
# 對角線取倒數,其他為0
S2 = np.diag(corr_inv)
S2 = np.linalg.inv(np.diag(S2))
# 反映像協方差矩陣
AIS = np.dot(S2, corr_inv)
AIS = np.dot(AIS, S2)
# 是映像協方差矩陣
IS = corr + AIS - 2 * S2
# 將矩陣AIS對角線上的元素開平方,並且將其余元素都變成0
Dai = np.diag(np.sqrt(np.diag(AIS)))
# IR是映像相關矩陣
IR = np.dot(np.linalg.inv(Dai), IS)
IR = np.dot(IR, np.linalg.inv(Dai))
# AIR是反映像相關矩陣
AIR = np.dot(np.linalg.inv(Dai), AIS)
AIR = np.dot(AIR, np.linalg.inv(Dai))
a = np.power((AIR - np.diag(np.diag(AIR))), 2)
a = np.sum(a, axis=1)
AA = np.sum(a)
b = corr - np.identity(15)
b = np.power(b, 2)
b = np.sum(b, axis=1)
BB = np.sum(b)
MSA = b / (b + a)
AIR = AIR - np.identity(15) + np.diag(MSA)
kmo = BB / (AA + BB)
return kmo
def bart():
corr = X_basic.corr().values
# 計算結果有問題
# bart=st.bartlett(*corr)
detCorr = np.linalg.det(corr)
n = len(X_basic)
p = len(X_basic.columns)
statistic = -math.log(detCorr) * (n - 1 - (2 * p + 5) / 6)
df = p * (p - 1) / 2
# 雙側概率
pval = (1.0 - st.chi2.cdf(statistic, df)) * 2
return statistic,pval