Principal Component Analysis:当有多个相似变量,希望提取出“最大公约数”,是重要的降维手法
数据:IQ.FULL.csv
美国ASVAB的数据,用来评估参军人员的智力水平。
举例:四项技能:Word,Math,Parag,Arith
```
iqdata = read.csv ("IQ.Full.csv", sep = ',', header = T, stringsAsFactors = F)
pairs (iqdata [, c('Word', 'Parag', 'Math', 'Arith')])
```
做出散点图:
如果我们希望使用一个指标(分数)来衡量某人的智力水平,先从两个变量开始:Word和Parag,为了方便运算,随机选取50个人的数据作为分析样本
```
set.seed(1)
iqsample <- iqdata[sample(nrow(iqdata), 50, replace=FALSE), c("Word","Parag", "Math", "Arith")]
plot(iqsample$Word, iqsample$Parag, pch = 16)
```
找到一条线,举例这些点最近,每个点的投影即是新变量
假设这条线已经找到:
将这条线看做是数轴,找到线上所有这些点的平均值点处,其他所有点用其投影在这条线上相距平均值点的n倍标准差来表示,类似于对两个成绩进行加权平均
```
pc.1 = prcomp(iqsample[, c("Word","Parag")])
pc.1$rotation #将每一个主成分占到各自变量的比例抽取出来
```
PC1第一个主成分说明word占据了0.93的权重,parag占据了0.35的权重;pc2捕捉的是parag的成绩比word成绩好多少(两门课之间偏颇的水平)
一般还会对主成分进行标准化
```
pc.1 <- prcomp(iqsample[, c("Word","Parag")], scale = TRUE)
pc.1$rotation # weights
```
标准化之后二者对于第一个主成分的贡献成分是一样的。标准化即是对可能存在的不同分值进行标准化,统一为一个衡量比例。
对于第二个主成分的贡献表明了两个主成分的偏颇大小
利用
```
pc.1$x
``
语句可以把每一个信息点的主成分都显示出来
最左边这列显示数据的标号,主成分二负的越多表示word水平比parag要好的多
通过前面的主成分1相等可以得出结论,word和parag水平相等,对学生成绩的偏差贡献相等
一些有趣的结果:
```
# pca of all subjects
pca.all <- prcomp(iqdata[, c(11:20)], scale.=TRUE)
pca.all$rotation
```
从主成分2当中看出,偏理论类型的学科和偏实际应用的学科之间存在一些偏差
再看性别之间的偏差
```
# gender role
prop.table(table(iqdata$Gender)) # almost 50/50 among gender
plot(pca.all$x[, 1], pca.all$x[, 2], col=as.factor(iqdata$Gender),
xlim=c(-10, 10), ylim=c(-10, 10),
xlab="PC1", ylab="PC2")
abline(v=0, h=0)
```
可以看出,男女差距的最大不同是男性主要集中在横轴下方,女性则集中在横轴上方,这是主成分2的差距,意味着男女在偏理论和偏实操的学科之间存在着偏差