大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说因子分析过程_怎么得出公因子stata,希望能够帮助大家进步!!!
题外话——为质数而生的蝉
有些蝉会展现出令人吃惊的特征:它们集体探出土壤的时间通常都跟13和17这样的质数年同步,此时大概会有150万只以上的成蝉在短时间内同时出现在一英亩的土地上。来自-《The Math Book》
这样的特征可能带来两个好处:
1)根据质数的性质它只能被1和自身整除,那么它大概率会被生命周期是1和探出土壤年份的猎食者捕杀(可能不那么严谨哈),例如如果周期是12年的动物,可能被周期是1,2,3,4,6,12年的天敌捕杀。
2)13,17两个质数的最小公倍数是两个数乘积,意味着200多年后可能会有一次大面积的蝉探出土壤事件,根据上一推论他们的天敌最多增加1种即,1,13,17那么只要蝉一次没有被吃光就会继续存活下去。
因子分析法是指从研究指标相关矩阵内部的依赖关系出发,把一些信息重叠、具有错综复杂关系的变量归结为少数几个不相关的综合因子的一种多元统计分析方法。
基本思想是:根据相关性大小把变量分组,使得同组内的变量之间相关性较高,但不同组的变量不相关或相关性较低,每组变量代表一个基本结构一即公共因子。
(1)对数据样本进行标准化处理。
(2)计算样本的相关矩阵R。
(3)求相关矩阵R的特征根和特征向量。
(4)根据系统要求的累积贡献率确定因子个数。
(5)计算因子载荷矩阵A。
(6)确定因子模型。
(7)根据上述计算结果,对系统进行分析。
数据是否适合做因子分析,若变量间不存在相关性,或者相关性不大,就无法归纳,也就无法降维,这里就引入巴特利特球形检验和KMO检验,一下将以糖尿病数据集作为示例进行stata
上的因子分析过程。
该数据集源至美国国家糖尿病、消化及肾脏疾病研究所。 数据集的目的是根据已有诊断信息来预测患者是否患有糖尿病。 但该数据库存在一定局限性,特别是数据集中的患者都是年龄大于等于21岁的皮马印第安女性。
涉及字段如下:其中Outcome标注字段,代表是否是糖尿病人。
数据地址1:https://www.kaggle.com/uciml/pima-indians-diabetes-database
数据地址2:https://github.com/susanli2016/Machine-Learning-with-Python/blob/master/diabetes.csv
巴特利特球形检验
巴特利特球形检验用于检验相关阵是否是单位阵,即各变量是否独立。它是以变量的相关系数矩阵为出发点,零假设:相关系数矩阵是一个单位阵。如果巴特利球形检验的统计计量数值较大,且对应的相伴概率值小于用户给定的显著性水平,则应该拒绝零假设;反之,则不能拒绝零假设,认为相关系数矩阵可能是一个单位阵,不适合做因子分析。一般实证中,p值小于0.05就可以进行下去。
KMO检验
KMO统计值是通过比较各变量间简单相关系数和偏相关系数的大小判断变量间的相关性。相关性强时,偏相关系数远小于简单相关系数,KMO值接近1。
检测类别 | 值的范围 | 因子分析适合情况 |
---|---|---|
KMO值 | 大于0.9 | 非常适合 |
0.8~0.9 | 很适合 | |
0.7~0.8 | 适合 | |
0.6~0.7 | 勉强适合 | |
0.5~0.6 | 不太适合 | |
小于0.5 | 不适合 |
stata检验命令
factortest pregnancies glucose bloodpressure skinthickness insulin bmi diabetespedigreefunction age
只听到从架构师办公室传来架构君的声音: 暮从碧山下,山月随人归。有谁来对上联或下联?
结果如下:
H0假设:变量不相关,但是结果p值是0.000小于0.05,否定原假设,KMO值:0.589勉强适合做因子分析。
stata命令
factor pregnancies glucose bloodpressure skinthickness insulin bmi diabetespedigreefunction age, pcf
结果如下:
根据特征根大于1,共提取3个因子,累计贡献率为0.6069。
通过负荷矩阵可以看出因子1对所有变量都有解释力度,而因子2对pregnancies和age解释力度比较大即年龄与怀孕次数,因子3对glucose和diabetespedigreefunction解释力度大,即血液中葡萄糖浓度和糖尿病谱系功能。
通过负荷矩阵可以发现扰乱变量,若某个变量的uniqueness值过大,可以尝试剔除该变量来提升累计贡献率,此实验不做剔除操作,但是希望能够看清因子对原始变量的解释力度,希望因子走的更极端些。
stata命令
rotate
这下看的更加清晰了,那么可以对因子进行命名,比如因子1对怀孕次数和年龄解释力度大,这种无需测量直接能给出的值比较敏感;因子2对血压、皮厚、体重指标这些需要简单仪器不需要化验就能测量解释力度大,
因子3对葡萄糖浓度,胰岛素浓度,糖尿病谱系功能这些需要抽血化验结果的数据解释力度大。
stata命令
predict f1 f2 f3
有了这个得分,我们就可以计算因子了。例如样例1m
因子1(Factor1) = m.Pregnancies*0.45786+m.Glucose*0.21820+m.BloodPressure*0.17610+m.SkinThickness* -0.17504+m.Insulin* -0.09151+m.BMI* -0.00883+m.DiabetesPedigreeFunction*-0.02236 +m.Age* 0.49379 因子2(Factor1) = m.Pregnancies*-0.00065 ......因子3计算方式略
到目前为止再回到因子分析是做什么的主题,即把一些信息重叠、具有错综复杂关系的变量归结为少数几个不相关的综合因子的一种多元统计分析方法,实验结果已经做到了。
利用因子给每个样本一个综合得分
首先计算各因子的值,使用上面的步骤计算因子1,2,3的得分
其次计算各因子所占的比例,利用旋转后的结果如下:
每个因子所占比例分别是0.2193,0.1998,0.1879,累计贡献率是0.6069
则每个因子所占比例:
因子1权重 = 0.2193 / 0.6069
因子2权重 = 0.1998 / 0.6069
因子3权重 = 0.1879 / 0.6069
最后综合得分 = 因子1权重 * 因子1得分 + 因子2权重 * 因子2得分 + 因子3权重* 因子3得分
最终的综合得分到底如何使用,表达什么,只能仁者见仁智者见智了。
参考
https://wiki.mbalib.com/wiki/%E5%9B%A0%E5%AD%90%E5%88%86%E6%9E%90%E6%B3%95
https://zhuanlan.zhihu.com/p/111446098?from_voters_page=true