题外话——为质数而生的蝉

有些蝉会展现出令人吃惊的特征:它们集体探出土壤的时间通常都跟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

在这里插入图片描述

巴特利特球形检验和KMO检验

巴特利特球形检验

巴特利特球形检验用于检验相关阵是否是单位阵,即各变量是否独立。它是以变量的相关系数矩阵为出发点,零假设:相关系数矩阵是一个单位阵。如果巴特利球形检验的统计计量数值较大,且对应的相伴概率值小于用户给定的显著性水平,则应该拒绝零假设;反之,则不能拒绝零假设,认为相关系数矩阵可能是一个单位阵,不适合做因子分析。一般实证中,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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐