R语言——列表

Python05

R语言——列表,第1张

前一段工作太忙了,终于又有时间来继续学习了

列表就是一些对象(或成分,component)的有序集合。列表允许整合若干(可能无关)对象到单个对象名下。也就是说,某个列表中,可能是托干个向量、矩阵、数据框,甚至是其他列表的组合。函数list()可创建列表。

下面创建一个列表

上述例子创建了一个列表,其中有四个成分:一个字符串、一个数值型向量、一个矩阵以及一个字符型向量。可以任意组合任意多的对象,并将它们保存为一个列表。

注意:可以通过双重括号知名代表某个成分的数字或者名称来访问列表中的元素。

列表允许以一种简单的方式组织和重新调用不相干的信息。其次,许多R函数的运行结果都是以列表的形式返回的。

一些小tips:

1、对象名称中的句点   .    没有特殊意义,但$ 和其他语言中句点有相似的意义,即指定一个数据框或列表中的某些部分。例如,A$x是指数据框A中的变量x。

2、R不提供多行注释或者是块注释功能。

3、将一个值赋予某个向量、矩阵、数组或者列表中一个不存在的元素时,R将自动扩展这个数据结构以容纳新值。

4、R中没有标量。标量以单元素向量的形式出现。

5、R中的下标不从0开始,而是从1开始。

6、变量无法被生命。他们在首次被赋值时生成。

R语言之创建数据集数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量。R中有许多用于存储数据的结构,包括标量、向量、数组、数据框和列表。在R中,对象(object)是指可以赋值给变量的任何事物,包括常量、数据结构、函数、甚至是图形。因子(factor)是名义型变量或有序型变量,在R中被特殊地存储和处理。R中的数据结构:1.1向量 向量是用于存储数值型、字符型或逻辑型数据的一维数组。创建向量使用函数c(),如下例所示: 数值型向量:a<-c(1,2,5,3,6,-2,4) 字符型向量:b<-c("one","two","three") 逻辑型向量:c<-c(TRUE,TRUE,TRUE,FALSE,TRUE) 注:单个向量中的数据必须拥有相同的类型或模式。 标量是只含一个元素的向量,例如f<-3、g<-"US"和h<-TRUE。它们用于保存常量。 访问向量中的元素,可在方括号中给定元素所处位置的数值,如:a[c(2,4)]用于访问向量a中的第二个和第四个元素。1.2矩阵 矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型),可以通过matrix创建矩阵 一般使用格式为: mymatrix<-matrix(vector,nrow=number_of_rows,ncol=number_of_columns,byrow=logical_value,dimnames=list( char_vector_rownames,char_vector_colnames)) ,其中vector包含了矩阵的元素,nrow和ncol用以指定 行和列的维数,dimnames包含了可选的以字符型向量表示的行名和列名。选项byrow则表明矩阵应当按行 填充(byrow=TRUE)还是按列填充(byrow=FALSE),默认情况下按列填充。代码演示如下:[plain] view plain copy>cells<-c(1,23,56,485) >rnames<-c("R1","R2") >cnames<-c("c1","c2") [plain] view plain copy<pre name="code" class="html">>mymatrix<-matrix(cells ,nrow=2,ncol=2,byrow=TRUE,dimnames=list(rnames,cnames)) >mymatrix c1 c2 R1 1 23 R2 56 485 1.3数组数组与矩阵类似,但是维数可以大于2。数组可通过array函数创建,形式如下:myarray<-array(vector,dimensions,dimnames),其中vector包含了数组中的数据,dimensions是一个数值型向量,给出了各个维度下标的最大值,而dimnames是可选的、各维度名称标签的列表。代码如下:[html] view plain copy>dim<-c("A1","A2") >dim1<-c("A1","A2") >dim2<-c("B1","B2","B3") >dim3<-c("C1","C2","C3","C4") >z<-array(1:24,c(2,3,4),dimnames=list(dim1,dim2,dim3)) >z , , C1 B1 B2 B3 A1 1 3 5 A2 2 4 6, , C2 B1 B2 B3 A1 7 9 11 A2 8 10 12, , C3 B1 B2 B3 A1 13 15 17 A2 14 16 18, , C4 B1 B2 B3 A1 19 21 23 A2 20 22 24 1.4数据框 数据框中不同的列可以包含不同模式(数值型、字符型等)的数据,是R中最常处理的数据结构。数据框可以通过函数data.frame()创建:mydata<-data.frame(col1,col2,col3,...),其中的列向量col1,col2,col3,...可为任何类型(如字符型、数值型或逻辑型)。每一列的名称可由函数names指定。代码如下:[html] view plain copy>age<-c(25,34,28,53) >patientID<-c(1,2,3,4) >diabetes<-c("Type1","Type2","Type1","Type1") >status<-c("Poor","Improved","Excellent","Poor") >patientdata<-data.frame(patientID,age,diabetes,status) >patientdatapatientID age diabetesstatus 1 1 25Type1 Poor 2 2 34Type2 Improved 3 3 28Type1 Excellent 4 4 53Type1 Poor >patientdata$age [1] 25 34 28 53 <pre name="code" class="html">>table(patientdata$diabetes,patientdata$status) Excellent Improved PoorType1 102Type2 010 $被用来选取一个给定数据框中的某个特定变量,上面table(patientdata$diabetes,patientdata$status)生成了 diabetes和status的列联表。函数attach()可将数据框添加到R的搜索路径中。函数detach()将数据框从搜素路径中移除。相对于attach。多数的R书籍更推荐使用函数with()。1.5因子 变量可归结为名义型、有序型或连续型变量。类别(名义型)变量和有序类别(有序型)变量在R中称为因子。因子在R中非常重要,因为它决定了数据的分析方式以及如何进行视觉呈现。 函数factor()以一个整数向量的形式存储类别值,整数的取值范围是[1...k](其中k是名义变量中唯一值得个数),同时一个由字符串(原始值)组成的内部向量将映射到这些整数上。名义型eg:假设有向量:diabetes<-c("Type1","Type2","Type1","Type1")语句diabetes<-factor(diabetes)将此向量存储为(1,2,1,1).有序型eg: 对于给定变量status<-c("Poor","Improved","Excellent","Poor")语句status<-factor(status,ordered=TRUE)会将向量编码为(3,2,1,3)。1.6列表(list) 列表是R的数据类型中最为复杂的一种。列表就是一些对象的(或成分,component)的有序集合。列表允许你整合若干(可能无关)的对象到单个对象名下。例如,某个列表中可能是若干向量、矩阵、数据框,甚至是其他列表的组合。可以使用函数list()创建列表: mylist<-list(object1,object2,...)注:列表成为了R中的重要数据结构。 1.列表允许以一种简单的方式组织和重新调用不相干的信息; 2.许多R函数的运行结果都是以列表的形式返回的。

主成分分析

主成分分析((Principal Component Analysis,PCA)是一种数据降维技巧,它能将大量相关变量转化为一组很少的不相关变量,这些无关变量称为主成分(原来变量的线性组合)。整体思想就是化繁为简,抓住问题关键,也就是降维思想。

主成分分析法是通过恰当的数学变换,使新变量——主成分成为原变量的线性组合,并选取少数几个在变差总信息量中比例较大的主成分来分析事物的一种方法。主成分在变差信息量中的比例越大,它在综合评价中的作用就越大。

因子分析

探索性因子分析法(Exploratory Factor Analysis,EFA)是一系列用来发现一组变量的潜在结构的方法。它通过寻找一组更小的、潜在的或隐藏的结构来解释已观测到的、显式的变量间的关系。

PCA与EFA模型间的区别

参见图14-1。主成分(PC1和PC2)是观测变量(X1到X5)的线性组合。形成线性组合的权重都是通过最大化各主成分所解释的方差来获得,同时还要保证个主成分间不相关。相反,因子(F1和F2)被当做是观测变量的结构基础或“原因”,而不是它们的线性组合。

R的基础安装包提供了PCA和EFA的函数,分别为princomp()和factanal()。

最常见的分析步骤

(1)数据预处理。PCA和EFA都根据观测变量间的相关性来推导结果。用户可以输入原始数据矩阵或者相关系数矩阵到principal()和fa()函数中。若输入初始数据,相关系数矩阵将会被自动计算,在计算前请确保数据中没有缺失值。

(2)选择因子模型。判断是PCA(数据降维)还是EFA(发现潜在结构)更符合你的研究目标。如果选择EFA方法,你还需要选择一种估计因子模型的方法(如最大似然估计)。

(3)判断要选择的主成分/因子数目。

(4)选择主成分/因子。

(5)旋转主成分/因子。

(6)解释结果。

(7)计算主成分或因子得分。

PCA的目标是用一组较少的不相关变量代替大量相关变量,同时尽可能保留初始变量的信息,这些推导所得的变量称为主成分,它们是观测变量的线性组合。如第一主成分为:

它是k个观测变量的加权组合,对初始变量集的方差解释性最大。第二主成分也是初始变量的线性组合,对方差的解释性排第二,同时与第一主成分正交(不相关)。后面每一个主成分都最大化它对方差的解释程度,同时与之前所有的主成分都正交。理论上来说,你可以选取与变量数相同的主成分,但从实用的角度来看,我们都希望能用较少的主成分来近似全变量集。

主成分与原始变量之间的关系

(1)主成分保留了原始变量绝大多数信息。

(2)主成分的个数大大少于原始变量的数目。

(3)各个主成分之间互不相关。

(4)每个主成分都是原始变量的线性组合。

数据集USJudgeRatings包含了律师对美国高等法院法官的评分。数据框包含43个观测,12个变量。

用来判断PCA中需要多少个主成分的准则:

根据先验经验和理论知识判断主成分数;

根据要解释变量方差的积累值的阈值来判断需要的主成分数;

通过检查变量间k × k的相关系数矩阵来判断保留的主成分数。

最常见的是基于特征值的方法。每个主成分都与相关系数矩阵的特征值相关联,第一主成分与最大的特征值相关联,第二主成分与第二大的特征值相关联,依此类推。

Kaiser-Harris准则建议保留特征值大于1的主成分,特征值小于1的成分所解释的方差比包含在单个变量中的方差更少。Cattell碎石检验则绘制了特征值与主成分数的图形。这类图形可以清晰地展示图形弯曲状况,在图形变化最大处之上的主成分都可保留。最后,你还可以进行模拟,依据与初始矩阵相同大小的随机数据矩阵来判断要提取的特征值。若基于真实数据的某个特征值大于一组随机数据矩阵相应的平均特征值,那么该主成分可以保留。该方法称作平行分析。

图形解读:线段和x符号组成的图(蓝色线):特征值曲线;

红色虚线:根据100个随机数据矩阵推导出来的平均特征值曲线;

绿色实线:特征值准则线(即:y=1的水平线)

判别标准:特征值大于平均特征值,且大于y=1的特征值准则线,被认为是可保留的主成分。根据判别标准,保留1个主成分即可。

fa.parallel函数学习

fa.parallel(data,n.obs=,fa=”pc”/”both”,n.iter=100,show.legend=T/F)

data:原始数据数据框;

n.obs:当data是相关系数矩阵时,给出原始数据(非原始变量)个数,data是原始数据矩阵时忽略此参数;

fa:“pc”为仅计算主成分,“fa”为因子分析,“both”为计算主成分及因子;

n.iter:模拟平行分析次数;

show.legend:显示图例。

principal(r, nfactors = , rotate = , scores = )

r:相关系数矩阵或原始数据矩阵;

nfactors:设定主成分数(默认为1);

rotate:指定旋转的方法,默认最大方差旋转(varimax)。

scores:设定是否需要计算主成分得分(默认不需要)。

PC1栏包含了成分载荷,指观测变量与主成分的相关系数。如果提取不止一个主成分,那么还将会有PC2、PC3等栏。成分载荷(component loadings)可用来解释主成分的含义,解释主成分与各变量的相关程度。

h2栏为成分公因子方差,即主成分对每个变量的方差解释度。

u2栏为成分唯一性,即方差无法被主成分解释的部分(1-h2)。

SS loadings包含了与主成分相关联的特征值,其含义是与特定主成分相关联的标准化后的方差值,即可以通过它来看90%的方差可以被多少个成分解释,从而选出主成分(即可使用nfactors=原始变量个数来把所有特征值查出,当然也可以直接通过eigen函数对它的相关矩阵进行查特征值)。

Proportion Var表示每个主成分对整个数据集的解释程度。

Cumulative Var表示各主成分解释程度之和。

Proportion Explained及Cumulative Proportion分别为按现有总解释方差百分比划分主成分及其累积百分比。

结果解读:第一主成分(PC1)与每个变量都高度相关,也就是说,它是一个可用来进行一般性评价的维度。ORAL变量99.1%的方差都可以被PC1来解释,仅仅有0.91%的方差不能被PC1解释。第一主成分解释了11个变量92%的方差。

结果解读:通过碎石图可以判定选择的主成分个数为2个。

结果解读:从结果Proportion Var: 0.58和0.22可以判定,第一主成分解释了身体测量指标58%的方差,而第二主成分解释了22%,两者总共解释了81%的方差。对于高度变量,两者则共解释了其88%的方差。

旋转是一系列将成分载荷阵变得更容易解释的数学方法,它们尽可能地对成分去噪。旋转方法有两种:使选择的成分保持不相关(正交旋转),和让它们变得相关(斜交旋转)。旋转方法也会依据去噪定义的不同而不同。最流行的正交旋转是方差极大旋转,它试图对载荷阵的列进行去噪,使得每个成分只是由一组有限的变量来解释(即载荷阵每列只有少数几个很大的载荷,其他都是很小的载荷)。 结果列表中列的名字都从PC变成了RC,以表示成分被旋转。

当scores = TRUE时,主成分得分存储在principal()函数返回对象的scores元素中。

如果你的目标是寻求可解释观测变量的潜在隐含变量,可使用因子分析。

EFA的目标是通过发掘隐藏在数据下的一组较少的、更为基本的无法观测的变量,来解释一

组可观测变量的相关性。这些虚拟的、无法观测的变量称作因子。(每个因子被认为可解释多个

观测变量间共有的方差,因此准确来说,它们应该称作公共因子。)

其中 是第i个可观测变量(i = 1…k), 是公共因子(j = 1…p),并且p<k。 是 变量独有的部分(无法被公共因子解释)。 可认为是每个因子对复合而成的可观测变量的贡献值。

碎石检验的前两个特征值(三角形)都在拐角处之上,并且大于基于100次模拟数据矩阵的特征值均值。对于EFA,Kaiser-Harris准则的特征值数大于0,而不是1。

结果解读:PCA结果建议提取一个或者两个成分,EFA建议提取两个因子。

fa(r, nfactors=, n.obs=, rotate=, scores=, fm=)

 r是相关系数矩阵或者原始数据矩阵;

 nfactors设定提取的因子数(默认为1);

 n.obs是观测数(输入相关系数矩阵时需要填写);

 rotate设定旋转的方法(默认互变异数最小法);

 scores设定是否计算因子得分(默认不计算);

 fm设定因子化方法(默认极小残差法)。

与PCA不同,提取公共因子的方法很多,包括最大似然法(ml)、主轴迭代法(pa)、加权最小二乘法(wls)、广义加权最小二乘法(gls)和最小残差法(minres)。统计学家青睐使用最大似然法,因为它有良好的统计性质。

结果解读:两个因子的Proportion Var分别为0.46和0.14,两个因子解释了六个心理学测试60%的方差。

结果解读:阅读和词汇在第一因子上载荷较大,画图、积木图案和迷宫在第二因子上载荷较大,非语言的普通智力测量在两个因子上载荷较为平均,这表明存在一个语言智力因子和一个非语言智力因子。

正交旋转和斜交旋转的不同之处。

对于正交旋转,因子分析的重点在于因子结构矩阵(变量与因子的相关系数),而对于斜交旋转,因子分析会考虑三个矩阵:因子结构矩阵、因子模式矩阵和因子关联矩阵。

因子模式矩阵即标准化的回归系数矩阵。它列出了因子预测变量的权重。因子关联矩阵即因子相关系数矩阵。

图形解读:词汇和阅读在第一个因子(PA1)上载荷较大,而积木图案、画图和迷宫在第二个因子(PA2)上载荷较大。普通智力测验在两个因子上较为平均。

与可精确计算的主成分得分不同,因子得分只是估计得到的。它的估计方法有多种,fa()函数使用的是回归方法。

R包含了其他许多对因子分析非常有用的软件包。FactoMineR包不仅提供了PCA和EFA方法,还包含潜变量模型。它有许多此处我们并没考虑的参数选项,比如数值型变量和类别型变量的使用方法。FAiR包使用遗传算法来估计因子分析模型,它增强了模型参数估计能力,能够处理不等式的约束条件,GPArotation包则提供了许多因子旋转方法。最后,还有nFactors包,它提供了用来判断因子数目的许多复杂方法。

主成分分析

1.数据导入

数据结构:对10株玉米进行了生物学性状考察,考察指标有株高,穗位,茎粗,穗长,秃顶,穗粗,穗行数,行粒数。

结果解读:选择2个主成分即可保留样本大量信息。

3.提取主成分

结果解读:主成分1可解释44%的方差,主成分2解释了26%的方差,合计解释了70%的方差。

4.获取主成分得分

5.主成分方程

PC1 = 0.27 株高 - 0.04 穗位 + 0.29 茎粗 - 0.01 穗长 - 0.21 秃顶 - 0.13 穗粗 + 0.16 穗行数 + 0.24 行粒数

PC2 = -0.01 株高 + 0.36 穗位 - 0.10 茎粗 + 0.41 穗长 - 0.08 秃顶 + 0.43 穗粗 - 0.15 穗行数 + 0.01 行粒数

图形解读:此图反映了变量与主成分的关系,三个蓝点对应的RC2值较高,点上的标号2,4,6对应变量名穗位,穗长,穗粗,说明第2主成分主要解释了这些变量,与这些变量相关性强;黑点分别对应株高,茎粗,穗行数,行粒数,说明第一主成分与这些变量相关性强,第一主成分主要解释的也是这些变量,而5号点秃顶对于两个主成分均没有显示好的相关性。

因子分析

图解:可以看到需要提取4个因子。

2.提取因子

结果解读:因子1到4解释了80%的方差。

3.获取因子得分

图解:可以看出,因子1和因子2的相关系数为0.4,行粒数,株高,茎粗,秃顶在因子1的载荷较大,穗长,穗位在因子2上的载荷较大;因子3只有穗行数相关,因子4只有穗粗相关。

参考资料: