【系列】主成分分析(3)案例(R语言)

Python020

【系列】主成分分析(3)案例(R语言),第1张

数据内容为1990年加州人口普查中所收集的信息。具体内容包括:各个区域内的收入的中位数,人口数量,房龄中位数,家庭数,总共房间数,总共卧室数,经纬度。

这里的分析任务是完成房屋价值预测的多元回归分析,但不考虑数据集中的多重共线性将会使得回归非常不稳定,预测值较小的变化则会导致结果极大的变化。此时正是主成分分析发挥作用的时候。因而主成分分析可以作为回归分析或者分类等分析内容的基础步骤。

---------

#读取数据

>houses<- read.csv(file="C:....\houses.txt",header=FALSE,sep="")

#查看数据

>head(houses)

V1    V2 V3  V4  V5  V6  V7    V8      V9

1 452600 8.3252 41  880  129  322  126 37.88 -122.23

2 358500 8.3014 21 7099 1106 2401 1138 37.86 -122.22

3 352100 7.2574 52 1467  190  496  177 37.85 -122.24

4 341300 5.6431 52 1274  235  558  219 37.85 -122.25

5 342200 3.8462 52 1627  280  565  259 37.85 -122.25

6 269700 4.0368 52  919  213  413  193 37.85 -122.25

#命名

>names(houses)<-c("MVAL","MINC","HAGE","ROOMS","BEDRMS","POPN","HHLDS","LAT","LONG")

#数据描述

>summary(houses)

##从数据描述中看到变量中有很大的差异,故需要对数据进行规则化处理。

#数据规则化

>houses$MINC_Z<-(houses$MINC-mean(houses$MINC))/sd(houses$MINC)

#其他数据同样方式处理

>houses$LONG_Z<-(houses$LONG-mean(houses$LONG))/sd(houses$LONG)

#取出规则化的数据,命名为数据集houses_z

>houses_z<- subset(houses,select = c(10:17))

#通过相关性矩阵,探索变量之间的相关性,

>cor(houses_z)

#随机选择90%的数据用于训练集,剩下10%的数据用作训练集

>choose<-runif(dim(houses_z)[1],0,1)

>train.house<-houses_z[which(choose>=.1),]

#加载库psych

>library(psych)

#训练集数据进行主成分分析

>pcal<-principal(train.house,nfactors = 8,rotate="none",scores = TRUE)

#特征值,负载矩阵和解释变异

>pcal$loadings

##从解释变异中可以看到第一主成分解释了48.8%的数据变异。那么应该提取多少个主成分?特征值为1表示该成分解释至少一个变量价值的变异性,因而只有特征值大于1的主成分应该保留,这样我们有三个主成分应当保存,然而我们看到主成分4的特征变量为0.823,非常接近1, 那么是否应该保留这个主成分?这里可以去参考其他的标准。第一个标准就是解释变异标准,及分析人员定义他认为的主成分应该具有多大的变异程度,是85%,90%还是更高,如果要求高于95%,那么应该保存第四个主成分,因为累计到第四个主成分解释了96.3%的变异。除此之外,还有一种标准就是坡度图标准,坡度图标准就是曲线开始变得平缓时候的那一点就是最多主成分的取值。如下图展示,按照坡度图标准,提取不超过4个主成分。

#坡度图

>plot(pcal$values,type="b")

##结果解读:

主成分一:按照权重成分的相关系数,我们选取房间数,卧室数,人口数,家庭数。可以将其归类为大小主成分

主成分二:由地理位置信息组成的经纬度信息

主成分三:平均收入构成收入因素

主城分四:平均房龄构成房龄因素、

#针对测试数据集进行主成分分析

##该步骤即通过样本分裂来进行主成分的验证,来看训练数据集的结果是否对整体数据内容具有概括性。从如下结果能够看到,虽然测试集结果中的权重和解释变异与训练集中并非完全一致。但主成分的提取和权重的解释是与训练集一致的。

>pca2<-principal(test.house,nfactors=4,rotate = "none",scores = TRUE)

>pca2$loadings

1. 列出包所在库的路径

.libPaths()

[1] "C:/Program Files/R/R-3.0.2/library"

2. 安装包,括号里面包的名称要加英文引号,在列出的CRAN镜像站点列表中选择一个进行下载,我一般选的是China(Hefei)

install.packages()

例如,install.packages("ggplot2")

3. 包的载入library()或require(),安装完包后,需要加载才能使用其中的函数,此时括号中不使用引号。两者的不同之处在于library()载入之后不返回任何信息,而require()载入后则会返回TRUE,因此require()适合用于程序的书写。

例如

library(ggplto2)

>require(foreign)

Loading required package: foreign

>is.logical(require(foreign))

[1] TRUE

4. 包的更新

update.packages()

5. 包的帮助信息 格式如下,可以查看包中的函数以及说明

help(package="ggplot2")

6. 查看本地的包

6.1 查看默认加载的包,忽略基本的包

getOption("defaultPackages")

>getOption("defaultPackages")

[1] "datasets" "utils" "grDevices" "graphics" "stats" "methods"

[7] "ggplot2"

6.2 查看当前已经加载过的包

(.packages())

[1] "ggplot2" "stats" "graphics" "grDevices" "utils" "datasets" "methods" "base"

6.3 要显示所有可用的包

(.packages(all.available=TRUE))

>(.packages(all.available=TRUE))

[1] "abind" "agricolae" "aplpack" "base" "bitops"

[6] "boot" "car" "caTools" "class" "cluster"

[11] "codetools" "colorRamps" "colorspace" "compiler" "datasets"

[16] "Defaults" "devtools" "dichromat" "digest" "doBy"

[21] "e1071" "effects" "ellipse" "evaluate" "foreign"

[26] "formatR" "Formula" "gdata" "ggplot2" "ggthemes"

[31] "gmodels" "gplots" "graphics" "grDevices" "grid"

[36] "gtable" "gtools" "highr" "Hmisc" "httr"

[41] "KernSmooth" "knitr" "labeling" "lattice" "latticeExtra"

[46] "leaps" "lme4" "lmtest" "LSD" "manipulate"

[51] "markdown" "MASS" "Matrix" "matrixcalc" "memoise"

[56] "methods" "mgcv" "minqa" "multcomp" "munsell"

[61] "mvtnorm" "nlme" "nnet" "nortest" "parallel"

[66] "pixmap" "plyr" "proto" "psych" "quantmod"

[71] "Rcmdr" "RColorBrewer" "Rcpp" "RcppEigen" "RCurl"

[76] "relimp" "reshape2" "rgl" "rJava" "RODBC"

[81] "rpart" "rstudio" "samplesize" "sandwich" "scales"

[86] "schoolmath" "sciplot" "sem" "spatial" "splines"

[91] "stats" "stats4" "stringr" "survival" "tcltk"

[96] "tcltk2" "TH.data" "tools" "TTR" "utils"

[101] "VennDiagram" "whisker" "XLConnect" "xts" "zoo"

7. 卸载包detach(),这是library()的反向操作,此操作主要是为了避免某些包中的函数名称相同,造成冲突,注意与library()的参数不同,detach()参数为detach(package:包的名称),library(包的名称)。

例如

>library(ggplot2) #加载包

>(.packages()) #列出当前已经加载的包

[1] "ggplot2" "stats" "graphics" "grDevices" "utils" "datasets"

[7] "methods" "base"

>detach(package:ggplot2) # 卸载ggplot2包

>(.packages()) #列出当前已经加载的包

[1] "stats" "graphics" "grDevices" "utils" "datasets" "methods"

[7] "base"

8. 自定义启动时候的加载包

如果需要长期使用某个包的话,每次开启都需要输入library(),比较麻烦,因此可以让R启动时自动加载某些包。在R的安装目录/etc/Rprofile.site加入下载语句:

例如让R启动时自动加载ggplot2包

local({old <- getOption("defaultPackages")

options(defaultPackages = c(old, "ggplot2"))})

9. 在文章中引用R软件包,例如引用ggplot2包:

citation(package="ggplot2")

To cite ggplot2 in publications, please use:

H. Wickham. ggplot2: elegant graphics for data analysis. Springer New

York, 2009.

A BibTeX entry for LaTeX users is

@Book{,

author = {Hadley Wickham},

title = {ggplot2: elegant graphics for data analysis},

publisher = {Springer New York},

year = {2009},

isbn = {978-0-387-98140-6},

url = {http://had.co.nz/ggplot2/book},

}

一、执行方式不同

1、library:在一个函数中,如果一个包不存在,执行到library将会停止执行。

2、require:在一个函数中,如果一个包不存在,执行到require将会继续执行。

二、返回机制不同

1、library:library并不会返回包存在与否的消息。

2、require:require将会根据包的存在与否返回true或者false。

三、语法不同

1、library:library(cluster)。

2、require:调用包方法if(!require("cluster")) install.packages("cluster")

参考资料来源:百度百科-R语言编程

参考资料来源:百度百科-R语言