今天把潜变量和降维分析的方法合起来给大家写写,因为这两个东西之间有诸多共同之处。 潜变量 为啥需要潜变量呢?考虑一个问题,比如你想测测一个人有多幸福,你怎么测? 估计你会看看这个人:
等等,你试图通过这么一些可以测量的指标来反映一个人的所谓的幸福的状况,这个是我们自然而然想得到的,因为我们心里明白幸福是一个抽象概念,不能直接测,所以叫做潜变量。 降维Dimension Reduction/Compression 在机器学习中专门有讲降维的算法,但是在社会科学领域运用较多的还是因子分析和主成分分析。我们一个一个来看: 主成分分析 主成分分析是因子分析中提取因子的一个重要技巧,它要做的事就是从一系列的变量中提取成分,每个成分我们都希望它能解释原始数据尽可能多的变异。 记住一句话:成分是原始变量的线性组合。
在做主成分分析的时候我们会得到和变量一样多的成分,每个成分都会比前一个成分解释的变异少一点,然后所有成分解释原始数据变异的100%。 理论上我们可以从成分中完全复原我们的原始数据,但是我们的目的是要降维嘛,所以我们通常不会保留所有的成分,只会保留主成分。 上图就是一个主成分分析的示意图,4个原始变量,4个成分,很可能我们就只保留前两个成分就行。 主成分分析实例 用到的数据为Harman.5,这个数据集包含5个变量。我们可以用psych包的principal函数进行主成分分析,使用这个函数你只需要给出数据集和你想要保留的主成分个数就行。比如我想2个,我就可以写出如下的代码: library(psych) pc = principal(Harman.5, nfactors=2, rotate='none', covar = F) pc
如果你想要5个成分都出来,只需要把nfactors改成5就行。 解释一下结果的输出: SS loadings,这个是变量在每个成分的载荷平方和sum of the squared loadings,理论上一共有5个成分,这个5个成分的载荷平方和相加为1。 Proportion Var,这个是该成分解释的方差占比。就是用SSloading比上5得到的。 Cumulative Var,这个是累计方法差解释比,可以看到只要2个成分就解释了源数据93%的变异。很棒。 h2,这个是成分解释的变量变异的比例,因为我们只保留了2个主成分,所以不是1,如果保留5个主成分,这个值就应该是1. u2,这个是1-h2 com,这个是complexity,如果这个值为1就说明这个变量只在一个成分上有载荷,为0就是都没有。 但是我们在看loading的结果,这下就尴尬,我们看到成分1真的很强大,所有的变量在成分11上面的载荷都很高,这样的话我们就没法给成分命名了呀。 上面我们做出来的主成分分析的可视化表达如下: 可以看到成分1和所有的变量联系都挺强的,所以这个方法并不是一个可以解释的好的方法。 因子分析 因子分析和主成分分析都是降维的方法,在主成分分析中每个主成分都是所有变量的线性组合。画出图来应该是这个样子的: 但是在因子分析中,上面的关系变了 在因子分析中,我们认为所有的变量都是由因子造成的,当然了这个过程是允许误差存在的,所以在因子分析中会有一个误差项,通过因子并不能完全的复原原始数据,但是主成分是可以的哦。 贴几句原文大家自己体会:
因子分析实操 我们还是用同样的数据进行因子分析: fac = fa(Harman.5, nfactors=2, rotate='none') fac 同样的道理,如果你要做5因子模型,就将nfactors改成5就行,这儿从结果看2因子模型已经解释了原始数据变异的90%,已经非常好了,同时我们注意第一个因子解释原始数据变异的0.55,第二个解释了0.35,其实差别没那么大。 还要强调的是因子分析的时候默认因子之间是可以有相关的,这个与PCA是不同的。所以就有可能出现一个显变量虽然在因子1上没有载荷在其他因子之间有载荷,但是因子之间有相关,所以显变量和因子1的相关也是抹不掉的。 但是,你如果把因子进行正交旋转orthogonal rotations,那么因子分析就和主成分分析一样了。所以你会看到SPSS中把主成分分析归在因子分析中的。 所以记住因子分析就是非正交旋转的主成分分析。 主成分分析就是正交旋转的因子分析,因子之间不存在相关。
实例辨析两者差异 首先我们来做因子分析,并给出载荷: fac2 = fa(Harman.5, nfactors=2) fac2$loadings[] %>% round(2) fac2$Structure[] %>% round(2) 解释一下上面两个结果,两个都是载荷,都差不多,第一个是pattern coefficients,第二个是structure coefficients:
再来做主成分分析给出载荷: pc = principal(Harman.5, nfactors=2, rotate= "none" , covar = T) pc 可以看到两个方法做出来的载荷基本上一样。 小结 |
|
来自: CodewarCodewar > 《待分类》