R与数据分析旧笔记(十八完结) 因子分析
因子分析
因子分析
- 降维的一种方法,是主成分分析的推广和发展
- 是用于分析隐藏在表面现象背后的因子作用的统计模型。试图用最少的个数的不可测的公共因子的线性函数与特殊因子之和来描述原来观测的每一分量
因子分析的主要用途
- 减少分析变量的个数
- 通过对变量间相关关系的探测,将原始变量分组,即将相关性高的变量分为一组,用共性因子来代替该变量
- 使问题背后的业务因素的意义更加清晰呈现
与主成分分析的区别
- 主成分分析侧重“变异量”,通过转换原始变量为新的组合变量使到数据的“变异量”最大,从而能把样本个体之间的差异最大化,但得出来的主成分往往从业务场景的角度难以解释
- 因子分析更重视相关变量的“共变异量”,组合的是相关性较强的原始变量,目的是找到在背后起作用的少量关键因子,因子分析的结果往往更容易用业务知识去加以解释
因子分析使用了复杂的数学手段
- 比主成分分析更加复杂的数学模型
- 求解模型的方法:主成分法、主因子法、极大似然法
- 结果还可以通过因子旋转,使到业务意义更加明显
数学模型
1.数学模型
设是可观测的随机向量,且
因子分析的一般模型为
化简可表示为:
2.因子模型的性质
(1)的分解
(2)模型不受单位的影响,若,则有
其中
(3)因子载荷不是唯一的,设是一
阶正交矩阵,令
,则模型可表示为
证明:
3.因子载荷矩阵的统计意义
(1)
即因子载荷是第
个变量与第
个公共因子的相关系数,由于
是
的线性组合,所以系数
是用来度量
可由
线性组合表示的程度
(2)令,则有
反映了公共因子对原始变量
的影响,可以看成是公共因子对
的方差贡献,称为变量
的共同度(communality)或共性方差(common variance);而
是特殊因子
对
的方差贡献,称为变量
特殊方差(specifie variance),当
为各分量已标准化的随机变量
,此时有
(3)令,则有
反映了公共因子
对
的影响,是衡量公共因子
重要性的一个尺度,可视为公共因子
对
的总方差贡献。
因子载荷矩阵和特殊方差矩阵的估计
- 主成分法
- 主因子法(略)
- 极大似然法(略)
主成分法
设样本的协方差阵S的特征值为,相应单位正交特征向量为
,则S有谱分解式
当最后一个个特征值较小时,
可近似地分解成
其中
和
就是因子模型的一个解。载荷矩阵A中的第
列和
的第
个成分的系数相差一个倍数
。固由上式给出的这个解称为因子模型的主成分解。
当相关变量所取单位不同时,常常先对变量标准化,标准化变量的样本协方差阵是原始变量的样本相关阵,再用
代替
,与上类似,即可得主成分解。
下面是R程序(文件名:factor.analy1.R):
factor.analy1<-function(S, m){
p<-nrow(S); diag_S<-diag(S); sum_rank<-sum(diag_S)
rowname<-paste("X", 1:p, sep="")
colname<-paste("Factor", 1:m, sep="")
A<-matrix(0, nrow=p, ncol=m,
dimnames=list(rowname, colname))
eig<-eigen(S)
for (i in 1:m)
A[,i]<-sqrt(eig$values[i])*eig$vectors[,i]
h<-diag(A%*%t(A))
rowname<-c("SS loadings", "Proportion Var", "Cumulative Var")
B<-matrix(0, nrow=3, ncol=m,
dimnames=list(rowname, colname))
for (i in 1:m){
B[1,i]<-sum(A[,i]^2)
B[2,i]<-B[1,i]/sum_rank
B[3,i]<-sum(B[1,1:i])/sum_rank
}
method<-c("Principal Component Method")
list(method=method, loadings=A,
var=cbind(common=h, spcific=diag_S-h), B=B)
}
函数输入值是样本方差阵或相关矩阵,
是主因子的个数。函数的输出值是列表形式,其内容有估计参数的方法(主成分法),因子载荷(loadings),共性方差和特殊方差,以及因子
对变量
的共献、贡献率和累计贡献率。
方差最大的正交旋转
因子分析的目的不仅是求出公共因子,更主要的是应该知道每个公因子的实际意义,但由于前面的估计方法所求出的公因子解,其初始因子载荷矩阵并不满足“简单结构准则”,即各个公因子的典型代表变量很不突出,因而更容易使公因子的实际意义含糊不清,不利用对因子的解释。为此,必须对因子载荷矩阵施行旋转变换,使得因子载荷的每一列各元素的平方按列向0或1两极转化,达到其结构简化的目的。
varimax(x,normalize=T,eps=1e-5)
其中x是因子载荷矩阵,normalize是逻辑变量,即是否对变量进行Kaiser正则化,eps是迭代终止精度。
例子
对55个国家和地区的男子径赛记录作统计,每位运动员记录8项指标:100米跑()、200米跑(
)、400米跑(
)、800米跑(
)、1500米跑(
)、5000米跑(
)、10000米跑(
)、马拉松(
).八项指标的相关矩阵
如下表,取
,用主成分法估计因子载荷和共性方差等指标
解:
输入相关矩阵,用上面的函数factor.analy1()主成分法估计载荷和相关指标
> x<-c(1.000,
+ 0.923, 1.000,
+ 0.841, 0.851, 1.000,
+ 0.756, 0.807, 0.870, 1.000,
+ 0.700, 0.775, 0.835, 0.918, 1.000,
+ 0.619, 0.695, 0.779, 0.864, 0.928, 1.000,
+ 0.633, 0.697, 0.787, 0.869, 0.935, 0.975, 1.000,
+ 0.520, 0.596, 0.705, 0.806, 0.866, 0.932, 0.943, 1.000)
> names<-c("X1", "X2", "X3", "X4", "X5", "X6", "X7", "X8")
> R<-matrix(0, nrow=8, ncol=8, dimnames=list(names, names))
> for (i in 1:8){
+ for (j in 1:i){
+ R[i,j]<-x[(i-1)*i/2+j]; R[j,i]<-R[i,j]
+ }
+ }
> source("factor.analy1.R")
> fa<-factor.analy1(R, m=2); fa
$method
[1] "Principal Component Method"
$loadings
Factor1 Factor2
X1 -0.8171700 -0.53109531
X2 -0.8672869 -0.43271347
X3 -0.9151671 -0.23251311
X4 -0.9487413 -0.01184826
X5 -0.9593762 0.13147503
X6 -0.9376630 0.29267677
X7 -0.9439737 0.28707618
X8 -0.8798085 0.41117192
$var
common spcific
X1 0.9498290 0.05017099
X2 0.9394274 0.06057257
X3 0.8915931 0.10840689
X4 0.9002505 0.09974954
X5 0.9376883 0.06231171
X6 0.9648716 0.03512837
X7 0.9734990 0.02650100
X8 0.9431254 0.05687460
$B
Factor1 Factor2
SS loadings 6.6223580 0.8779264
Proportion Var 0.8277947 0.1097408
Cumulative Var 0.8277947 0.9375355
若记
可以证明,
当选择适当,则近似公式的误差平方和
很小
> E<-R-fa$loadings%*%t(fa$loadings)-diag(fa$var[,2])
> sum(E^2)
[1] 0.01740023
公因子个数的确定方法一般有两种,一是根据实际问题的意义或专业理论知识来确定;二是用确定主成分个数的原则,选
为满足:
的最小个数(比如取且
)
下面做旋转变换,使其方差达最大:
> vm1<-varimax(fa$loadings,normalize=F);vm1
$loadings
Loadings:
Factor1 Factor2
X1 -0.278 -0.934
X2 -0.380 -0.891
X3 -0.547 -0.770
X4 -0.715 -0.624
X5 -0.816 -0.521
X6 -0.904 -0.385
X7 -0.905 -0.393
X8 -0.937 -0.257
Factor1 Factor2
SS loadings 4.211 3.289
Proportion Var 0.526 0.411
Cumulative Var 0.526 0.938
$rotmat
[,1] [,2]
[1,] 0.7617765 0.6478399
[2,] -0.6478399 0.7617765
R与数据分析旧笔记(十八完结) 因子分析的更多相关文章
- R与数据分析旧笔记(八)多重共线性
多重共线性(线性代数叫线性相关) 多重共线性(线性代数叫线性相关) 1.什么是多重共线性 2.多重共线性对回归模型的影响 3.利用计算特征根发现多重共线性 4.Kappa()函数 例题1 考虑一个有六 ...
- R与数据分析旧笔记(十六) 基于密度的方法:DBSCAN
基于密度的方法:DBSCAN 基于密度的方法:DBSCAN DBSCAN=Density-Based Spatial Clustering of Applications with Noise 本算法 ...
- R与数据分析旧笔记(十五) 基于有代表性的点的技术:K中心聚类法
基于有代表性的点的技术:K中心聚类法 基于有代表性的点的技术:K中心聚类法 算法步骤 随机选择k个点作为"中心点" 计算剩余的点到这个k中心点的距离,每个点被分配到最近的中心点组成 ...
- R与数据分析旧笔记(十四) 动态聚类:K-means
动态聚类:K-means方法 动态聚类:K-means方法 算法 选择K个点作为初始质心 将每个点指派到最近的质心,形成K个簇(聚类) 重新计算每个簇的质心 重复2-3直至质心不发生变化 kmeans ...
- R与数据分析旧笔记(十二)分类 (支持向量机)
支持向量机(SVM) 支持向量机(SVM) 问题的提出:最优分离平面(决策边界) 优化目标 决策边界边缘距离最远 数学模型 问题转化为凸优化 拉格朗日乘子法--未知数太多 KKT变换和对偶公式 问题的 ...
- R与数据分析旧笔记(十)非线性模型
非线性模型 非线性模型 例子:销售额x与流通费率y > x=c(1.5,2.8,4.5,7.5,10.5,13.5,15.1,16.5,19.5,22.5,24.5,26.5)> y=c( ...
- R与数据分析旧笔记(⑦)回归诊断
回归诊断 回归诊断 1.样本是否符合正态分布假设? 2.是否存在离群值导致模型发生较大误差? 3.线性模型是否合理? 4.误差是否满足独立性.等方差.正态分布等假设条件? 5.是否存在多重共线性 正态 ...
- R与数据分析旧笔记(五)数学分析基本
R语言的各种分布函数 rnorm(n,mean=0,sd=1)#高斯(正态) rexp(n,rate=1)#指数 rgamma(n,shape,scale=1)#γ分布 rpois(n,lambda) ...
- R与数据分析旧笔记(三)不知道取什么题目
连线图 > a=c(2,3,4,5,6) > b=c(4,7,8,9,12) > plot(a,b,type="l") 多条曲线效果 plot(rain$Toky ...
随机推荐
- gcc中-pthread和-lpthread的区别
最近在使用linux mint15,里面自带的gcc时4.7的,当我编译多线程程序时,使用-lpthread居然说没有找到线程库函数!!!然后man了一下,才发现在gcc 4.7中链接线程库使用-pt ...
- 关于cocos2dx 3.0升级崩溃报错(unable to load native library) 和(Fatal signal 11 (SIGSEGV) at 0x00000000)
近期一直在Windows平台开发cocos-2dx游戏,期间做了一次引擎升级,升级到了3.0正式版本号.Windows平台上表现非常正常,没有出现什么问题. 上周五准备公布一个安卓包,编译非常轻松的就 ...
- this.parentMenu.dataRecord.data.testID的作用
在JS里,有个this.parentMenu.dataRecord.data.XXID的方法,这个方法一般都是用来加载某个控件到一个面板或控件上的.如: loaddata(this.parentMen ...
- 解析word中的表格
由于word表格的特殊性,其本身中的数据本来就不够完善,不能够很好的知道其具体的合并.跨行的相关属性,表格的单位可能是PT或者是百分比,并且是共存的,为处理带来了一定的负担,本代码实现了一个将Word ...
- UTL_FILE 的用法
UTL_FILE 的用法 UTL_FILE 是用来进行文件IO处理的专用包,使用这外包的注意事项如下: 1. 生成的文件好象只能放置在DATABASE所在的服务器路径中. 2. 生成的文件如何DO ...
- IOS 获取手机各种信息
/手机序列号 NSString* identifierNumber = [[UIDevice currentDevice] uniqueIdentifier]; NSLog(@&qu ...
- phpcms-v9 --- 如何通过{pc}标签获取全站文章内容?
1.phpcms-v9默认情况下只能根据catid获取当前栏目及子栏目下的文章,但是有时候我们需要如何通过{pc}标签来获取全站文章内容的需求,应该怎么做呢? 第一步:在content_tag.cla ...
- ie6,ie7,ie8 css bug汇总以及兼容解决方法
1:li边距“无故”增加 任何事情都是有原因的,li边距也不例外. 先描述一下具体状况:有些时候li边距会突然增 加很多,值也不固定(只在IE6/IE7有这种现象),让人摸不着头脑,仔细“研究”发现是 ...
- Lucky Sum
Description Lucky Sum time limit per test: 2 seconds memory limit per test: 256 megabytes input: sta ...
- OSG中的几何体
osg::Shape类 继承自osg::Object类: osg::Shape类是各种内嵌几何体的基类,不但可以用于剔除和碰撞检测,还可用于生成预定义的几何体对象: 常见的内嵌几何体包括: osg:: ...