R语言初步1
第一节 基本知识
一、界面介绍
R语言是一种自由软件编程语言与操作环境,主要用于统计分析、绘图、数据挖掘。R语言最早由新西兰奥克兰大学的Ross Ihaka和Robert Gentleman开发,所以命名为R语言。
R语言是免费下载的,可以在网站Http:\\\\cran.r-project.org/中找到适合自己的镜像网站,下载R语言安装包和其他文件。
R的界面大致如下图所示,包括菜单、快捷键、命令窗口和图形输出窗口。
R主要通过在命令窗口中输入命令来进行操作,菜单能够提供的功能很少,因此学习R需要记住一些常用的命令,更多的命令则需要常备一份命令手册,以便查询。
1
参考薛毅,陈立萍(2014):R语言实用教程,清华大学出版社
1
R的命令窗口中有一个红色的“>”符号,操作命令即写在这个符号的后面,完成一条命令后,用回车结束。
用getwd()可以知道R的工作路径,也就是操作过程中的数据、文件等所存储的目录。一般默认的目录为用户的Document目录。为了避免大量的文件混淆,可以专门为R的操作设定一个工作目录。
假定在C盘上建立一个名叫“R”的目录,用以下命令进行设定:setwd(\"c:\\\\R\"),如图:
在这里注意一下,当引用一个路径时,R中需要用到双斜线来表示路径引用,如上文中的c:\\\\R,这是R的一个特殊情况。
再比如以下操作:
>x1<-c(10,12,14,16,18)
>y1<-c(2.5,2.6,3.1,4.6,3.8)
>plot(x1,y1)
2
注意几点:
(1)式子中的“<-”表示赋值,也就是把右边的数值赋予左边的变量名。
(2)R语言中对于字母的大小写非常敏感,变量名可以用大写也可以用小写,但用大写字母命名的变量如果改用小写来调用,会无法识别。
(3)如果觉得命令窗口上的内容太多,可以用Ctrl-L来清屏幕。
(4)如果要重新调用此前用过的命令,可以用上箭头回溯此前的命令,也可以用history()来查看历史记录。
(5)命令窗口中的命令行如果太长需要分行,回车后前面会出现一个红色的+号,可以在这后面继续写命令。但如果是在脚本程序中分行,则不需要写这个+号。
二、R的工作空间
启动R之后,即开启了一个特定的工作空间。在这个工作空间中创建的变量会保存下来,在后续的操作中可以反复使用。因此,在使用R时,需要知道自己在工作空间中创建
3
了哪些变量,这些变量分别代表了哪些含义。
比如在上一小节的例子中,我们建立了两个向量x1和y1,那么这两个向量会一直存在于工作空间中。在命令行中直接输入向量名,可以显示出其内容。
> x1
[1] 10 12 14 16 18
如果想知道工作空间中有哪些变量存在,可以用ls()函数。如下图2
用rm(x1)可以删除变量x1。用下列命令可以删除所有的变量:
> rm(list=ls(all=TRUE))3
退出R使用q()命令,这时系统会询问是否保存工作空间,可以在对话框中选择“是”或者“否”。也可以在q()命令中进行设定,如:
>q(save=\"yes\")
这里显示出这么多变量的原因是此前做过一个演示操作,遗留下许多过程变量。如果想知道某个变量的内容,可以直接输入这个变量的名称,再回车。
3 请自己分析一下这条命令的结构,借以了解R语言的特色
4
2
如果保存了工作空间,则在指定的工作目录下会出现一个工作空间文件。下一次启动R的时候,可以直接双击这个工作空间文件,这样在启动R的同时,也会载入相应的工作空间,继续此前的工作。
用load(\"C:\\\\R\\\\.RData\")也可以实现同样的功能。
三、加载程序包
R软件安装后,仅包括了基本程序包,能够实现一些常规的统计分析。如果要做一些特殊的分析,则需要加载新的程序包。
比如说,线性判别分析需要用到的lda()函数来自于程序包MASS,用下列方式加载:
>library(\"MASS\")
有些程序包来自于其他的软件库,需要选择软件库,然后再选择“安装程序包”,这个可以通过界面上的“程序包”菜单里的选项来完成。在此前,需要先设定CRAN镜像,可以在连网的前提下选择一个中国的镜像站点。
在联网的条件下,通过help(\"XXXX\")命令可以帮助信息,如果不清楚某个命令的参数该如何设定等等,可以边看帮助文件边操作。
第二节 数据管理
5
一、变量
1. 变量类型
R中的变量包括:
数值型(numeric),其中又包括整型、单精度型、双精度型三类;
逻辑型(logical),取值只能是TRUE或者FLASE,也可以简写为T或者F;
字符型(character),是夹在单引号或者双引号中间的字符串;
复数型(complex),用a+bi的形式来显示;
> sqrt(-1+0i)
[1] 0+1i
原始型(raw),是指用二进制方式保存的数据。
2. 变量形式
(1)单一变量:就是存在单一值的变量。
(2)向量:由若干个相同类型的元素构成的序列,是R中最常用的对象,可以用来反映数据分析中的一个变量。
6
>x1<-c(10,12,14,16,18)
在上例中,生成了一个名叫x1的向量,包括5个元素。c()称为连接函数,用于把各个分量合并成一个向量。
看看下面的操作
(3)矩阵
用matrix()函数可以生成一个指定维度的矩阵,如下例所示:> mdata<-matrix(c(1,2,3,11,12,13),
+ nrow=2,ncol=3,byrow=TRUE,
+ dimnames=list(c(\"a1\
> mdata
var1 var2 var3
a1 1 2 3
7
a2 11 12 13
其他矩阵函数:
dim():和于设置或取对象(包括矩阵、数组等)的维数
nrow():矩阵的行数;
ncol():矩阵的列数;
rbind():矩阵按行合并;
cbind():矩阵按列合并;
矩阵元素的引用,用A[1,2]这样的格式。
(4)数组
向量是一维数组,矩阵是二维数组,数组则是更多维的情况。数组的语法是:
array(data=NA, dim=length(data), dimnames=NULL)
(5)因子、列表、对象
因子是用于数据分组的标签,类似于向量的形式,与向量同时使用时可以对向量中的元素进行分组。
8
列表与向量类似,区别在于列表中的元素不需要是同一种类型的数据,也可以认为是一个多维数组中的一条记录。
对象可以指代R中的一切客体,包括数据,也包括结束。例如,做回归分析后的结果可以输出到一个变量,这个变量就成为一个对象,其中包括了分析后得到的所有文字结果和数据结果。
(6)数据框
相当于一个数据库,包括了需要处理的数据。
> df<-data.frame(Name=c(\"张三\李四\王五\赵六\陆仁贾\"), Sex=c(\"F\
Age=c(13,13,12,13,12),
Height=c(56.5,65.3,57.3,62.5,59.0), Weight=c(84.0,98.0,83.0,84.0,99.5) )
> df
3. 产生特定形式的向量
(1)等差数列
9
> (x1<-1:10)
[1] 1 2 3 4 5 6 7 8 9 10
上述命令中的括号表示在生成向量之后即将其显示出来。
注意:“:”的计算优先级高于四则运算。
(2)等间隔函数
函数语法:
seq(from=1, to=1, by=x, length.out=NULL, along.with=NULL)4
其中,by、length.out、along.with三个参数只能输入一个。
by表示数据间的间隔;length.out表示在间隔中生成的数据的个数;along.with后面必须带一个向量,表示将这个向量按照间隔所设定的区间进行等比例缩放。
试试以下的命令
>seq(0,5,length.out=20)
>seq(1,10,by=2)
后面还有很多语法命令,其中使用A=B这种形式的,表示B是默认值。例如配合中from=1,表示在不设定的情况下,from的默认值为1。
10
4
>seq(10)
>seq(1,5,along.with=rnorm(20))
(3)重复函数
rep()
试试下面的命令(分别反映rep()中可选择的各种参数)
>rep(1:4,times=2)
>rep(1:4,length.out=15)
>rep(1:4,each=3)
>rep(1:4,c(1,4,2,4))
(4)产生默认的向量
vector(mode=\"logical\
其中,mode可以选择各种变量类型,默认为逻辑型;length为生成的向量长度。>vector(mode=\"numeric\
11
二、函数
1. 数学函数
abs(x),sqrt(x),exp(x),log(x),log10(x),log(x,n),sin(x),factorial(x),choose(n,k),gamma(x),floor(x),ceiling(x),trunc(x)
2. 字符串函数
nchar(),substr(),paste(),strsplit(),noquote()
3. 向量函数
min(),max(),which.min(),which.max(),range(),sum(),prod(),length(),median(),mean(),var(),sd(),sort(),order(),sort.list()
三、读写数据
1. 读入表格形式的纯文本文件
read.table()
可以带上各种参数,包括数据的表头等等,在没有设定表头的情况下,默认的变量名为V1、V2等形式。
读入的数据框架可以用edit()函数来进行编辑,也可以直接用edit()函数来生成一个数
12
据框架。
2. 读入数据流文件
例如hw.data的形式为:172 75 169 54 169 64 171 65 166 47……
>scan(\"hw.data\
3. 读取其他格式数据
需要安装foreign程序包,则可使用read.spss(),read.xport(),read.S(),read.dta(),分别对应SPSS,SATA,S-plus,Stata等格式的文件。
4. 读取EXCEL数据
(1)将数据转化为“文本文件(制表符分隔)”,用read.delim()
(2)转换为CSV文件,用read.csv()
(3)直接读取,需要安装RODBC程序包,然后用odbcConnectExcel()函数完成连接,再用sqlTable()建立起查询关系。
5. 数据集的读取
数据集是R软件包中可利用的数据集。用data()可以列出Base程序包中的可用数据集,如果要加载,只需要在括号中加入数据集的名称,如data(infert),可载入对应的数据
13
集。
如果要加载其他软件包中的数据集,可以用
>data(package=\"cluster\")
6. 写数据文件
(1)写为数据流文件
write(x, file=\"data\
ncolumns表示每行写几列,字符型变量默认为1列,数值型默认为5列。
(2)写为表格文件
write.table()
write.csv()
第三节 常规统计分析
一、统计分布
1. 与分布相关的函数
14
(1)正态分布
dnorm(x,mean=0,sd=1,log=FALSE):概率密度函数;
pnorm(q,mean=0,sd=1,lower.tail=TRUE,log.p=FALSE):分布函数;
qnorm(p,mean=0,sd=1,lower.tail=TRUE,log.p=FALSE):分位函数;
上述函数可以用于进行正态分布的各种计算。
(2)均匀分布:dunif(),punif(),qunif()
(3)指数分布:dexp()
(4)二项分布:dbinom()
(5)Poisson分布:dpois()
(6)卡方分布:dchisq()
(7)t分布:dt()
(8)F分布:df()
2. 随机数的生成
15
要生成服从各种分布的随机数,可以在上述分布名称的前面加上r。
例如,要生成服从正态分布的随机数,可以这样做:
x<-rnorm(100,0,1)
如果要生成均匀分布的随机数,用下列命令
runif(n, min=0, max=1)
3. 随机抽样
sample(x,size, replace=TRUE, prob=NULL)
从x中抽出一个容量为size的样本。
二、假设检验
1. t检验
t.test(x,y=NULL, alternative=c(\"two.sided\
mu=0, paired=FALSE, var.equal=FALSE, conf.level=0.95, ...)
例如:
16
> X<-c(159,280,101,212,224,379,179,264,
+ 222,362,168,250,149,260,485,172)
> t.test(X,alternative=\"greater\
One Sample t-test
data: X
t = 0.67423, df = 15, p-value = 0.2552
alternative hypothesis: true mean is greater than 225
95 percent confidence interval:
198.3989 Inf
sample estimates:
mean of x
241.625
2. F检验
17
var.test(x,y, ratio=1, alternative=c(\"two.sided\
conf.level=0.95, ...)
3. 二项分布检验
prop.test(x,n, p=NULL, alternative= c(\"two.sided\
conf.level=0.95, correct=TRUE)
三、非参数统计
1. 列联表分析
列联表分析使用卡方检验函数进行,需要事先把数据转化为矩阵形式,如下例:> x<-c(20,24,80,82, 22,38,104,125,
+ 12,28,81,113, 7,18,54,92)
> X<-matrix(x, nc=4, byrow=TRUE)
> chisq.test(X)
Pearson's Chi-squared test
18
data: X
X-squared = 12.507, df = 9, p-value = 0.1862
因为P值大于0.05,所以不能拒绝原假设,即可以认为行与列之间不存在相关性。
2. 相关性分析
cor.test(x,y, alternative= c(\"two.sided\
method=c(\"pearson\
exact=NULL, conf.level=0.95, continuity=FALSE, ...)
可以看到,这一条命令可以分别执行Pearson相关、Kendall相关和Spearman等级相关等检验。
3. 游程检验
游程检验需要单独安排程序包(tseries),安装完成后,用命令
runs.test(x, alternative= c(\"two.sided\
4. 其他非参数检验
(1) Wilcoxon符号秩检验
19
wilcox.test(x,y=NULL, alternative= c(\"two.sided\
mu=0, paired=FALSE, exact=NULL, correct=TRUE,
conf.int=FALSE, conf.level=0.95, ...)
(2)Friedman检验
friedman.test(y, groups, blocks, ...)
(3)Kruskal-wallis秩和检验
kruskal.test(x,g, ...)
更多的非参数检验方法可自行搜索。
四、回归分析
1. 线性回归函数
lm(formula, data, subset, weights, na.action, method=\"qr\
model=TRUE, x=FALSE, y=FALSE, qr=TRUE,
singular.ok=TRUE, contrasts=NULL, offset, ...)
20
其中:
formula为模型公式,用形如y~1+x1+x2这样的形式;
data为数据框,subset为样本子集,是可选项;
weights为可选项,是一个向量,用于表示对应样本的权重;
na.action为函数,表示当数据中出现缺失时的处理方法;
method为模型的计算方法;
model等参数主要体现输出结果的显现内容。
lm()函数通常与summary()函数共同使用,先把lm()的结果输出给一个对象变量,然后用summary()函数把这个变量显示出来。
2. 残差分析与影响分析
残差分析:resid(object)
影响分析:influence.measures(object)
其中,object是在回归分析中所生成的对象,用一个名称表示,例如可以用
lm.sol<-lm(...)
21
来形成一个回归对象,在后续的分析中将使用这个对象lm.sol来作为回归结果的调用。对象名称可以再圆点,也可以使用其他形式的名称。
观察下列的影响分析结果:
influence.measures(lm.sol)
par(mfrow=c(2,3),mar=0.4+c(4,4,1,1),oma=c(0,0,2,0)
plot(lm.sol,1:6)
3. 岭回归
岭回归需要加载MASS程序包,格式如下:
lm.ridge(formula, data, subset, na.action, lambda=0, model=FALSE,
22
x=FALSE, y=FALSE, contrasts=NULL, ...)
4. 多项式回归
高次方使用I()函数在formula公式中进行指代,交叉项用x1:x2的形式表示,如
lm(y~1+x1+I(x1^2)+I(x1^3)+x1:x2+x2)
5. 非线性回归
使用nls()函数,格式与lm()相同,使用通用的公式表达法表现formula,如
nls(y~a+(0.49-a)*exp(-b*(x-8), data=cl, start=list(a=0.1,b=0.1),model=T)
6. 广义线性回归
基本公式
glm(formula, family=gaussian, data, weights, subset, na.action,
start=NULL, etastart, mustart, offset, control=list(..), model=TRUE,
method=\"glm.fit\
其中,family为误差函数的分布族,通过设定分布族和对应的link函数可以完成不同类型的回归。family中对应的分布族包括:binomial,gaussian,Gamma,
23
inverse.gaussian,poisson,quasi。
例如:
x<-0:5
y<-c(0,9,21,47,60,63)
Y<-cbind(y,70-y)
glm.sol<-glm(Y~x, family=binomial(link=logit))
summary(glm.sol)
输出结果为:
Call:
glm(formula = Y ~ x, family = binomial(link = logit))
Deviance Residuals:
1 2 3 4 5 6
-2.2507 0.3892 -0.1466 1.1080 0.3234 -1.6679
24
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -3.3010 0.3238 -10.20 <2e-16 ***
x 1.2459 0.1119 11.13 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1(Dispersion parameter for binomial family taken to be 1)
Null deviance: 250.4866 on 5 degrees of freedom
Residual deviance: 9.3526 on 4 degrees of freedom
AIC: 34.093
Number of Fisher Scoring iterations: 4
第四节 多元分析
一、结构方程模型
25
结构方程模型需要使用程序包plspm,使用程序包中自带的数据包satisfaction.csv)。
程序如下:
library(plspm)
data(satisfaction)
IMAG<-c(0.0,0,0,0,0)
EXPE<-c(1,0,0,0,0,0)
QUAL<-c(0,1,0,0,0,0)
VAL<-c(0,1,1,0,0,0)
SAT<-c(1,1,1,1,0,0)
LOY<-c(1,0,0,0,1,0)
sat.mat<-rbind(IMAG,EXPE,QUAL,VAL,SAT,LOY)
sat.sets<-list(1:5,6:10,11:15,16:19,20:23,24:27)
sat.mod<-rep(\"A\
26
(
res=plspm(satisfaction,sat.mat,sat.sets,sat.mod,scaled=F)
summary(res)
par(mfrow=c(1,1))
plot(res,what=\"all\")
二、判别分析
线性判别函数与二次判别函数
lda(formula, data, ... , subset, na.action)
qda(formula, data, ... , subset, na.action)
三、聚类分析
(1)距离函数
27
dist(x, method=\"euclidean\
method的参数可以选择euclidean,maximum,manhattan,canberra,binary,minkowski。
(2)数据变换
scale(x, center=TRUE, scale=TRUE)
(3)系统聚类法
hclust(d, method=\"complete\
其中,d为利用距离函数计算出来的距离矩阵,method方法包括single,complete,median,mcquitty,average,centroid,ward。
将计算后的结果用于plot函数,可以画出谱系图。
画谱系图的另一个工具是plclust()函数。
四、主成分分析
可以用下列两种形式的函数来完成:
princomp(formula, data=NULL, subset, na.action, ...)
28
princomp(x, cor=FALSE, scores=TRUE, covmat=NULL,
subset=rep(TRUE, nrow(as.matrix(x))), ...)
结果用于screeplot()函数,可以画出碎石图。
五、因子分析
用以下命令完成因子分析,并将结果载入一个对象
factanal(x, factors, data=NULL, covmat=NULL, n.obs=NA, subset, na.action,
start=NULL, scores=c(\"none\
rotation=\"varimax\
因子载荷阵的正交旋转:varimax()
斜交旋转:promax()
六、典型相关分析
cancor(x,y, xcenter=TRUE, ycenter=TRUE)
第五节 绘图
29
绘图命令可以通过demo(graphics)、demo(image)、demo(persp)进行演示,通过分析演示命令,逐渐掌握绘图技巧。
一、高水平绘图函数
高水平绘图函数指能够自动生成各种新图形的函数,包括坐标轴、坐标刻度、标题等等。
1. plot函数
plot(x, y, type=\"p\
ann=par(\"ann\"),
axes=TRUE, frame.plot=axes, panel.first=\"\
2. 其他
多组图:pairs()
协同图:coplot()
点图:dotchart()
饼图:pie()
条形图:parplot()
30
直方图:hist()
箱线图:boxplot()
QQ图:qqnorm()
三维透视图:persp()
二、图形参数
1. 使用于绘图命令中的图形参数
add=TRUE:表示新绘制的图形与旧的图形叠加;axes=TRUE:表示图形中添加坐标轴;
log=\"x\":对x轴的数据取对数;
xlim=c(x1,x2):描述图形中x轴的取值范围;
main=\"XX\":设置图形的标题;
sub=\"XX\":设置图形的副标题;
xlab=\"XX\":设置x轴的标题。
31
2. 图形参数的永久设置
用函数par()可以对图形参数进行永久设置。直接使用不带参数的par(),可以显示出图形参数的默认值。为了保证在修改图形参数之后可以再恢复到初始值,可以使用以下的操作:
>xx<-par()
>par(...) #表示对图形参数进行修改
>par(xx) #表示恢复原有的图形参数
可设置的参数包括:
(1)点的形状:pch=k,k是0-25中的某个数字,表示25种不同的字符。k也可以用特定字符表示,表示一些特殊的形状。
(2)线的类型:lty=k,k为1-12的某个数字;
(3)线的宽度:lwd=k,影响到lines()函数以及坐标轴的宽度,取值可以为小数;
(4)点、线、文本、区域的颜色:col=k, bg=k
用col.axis、col.lab、col.main、col.sub等可以规定特定元素的颜色。
颜色k的取值可以是数字,也可以是字符串,如\"yellow\"、\"springgreen2\"之类。用
32
colors()函数可以查看颜色和代码的对应关系。
(5)字体类型:font=k,k为1-4,分别代表正体、黑体、斜体、黑斜体。
(6)文本对齐方式:adj=k,k表示的文本对齐的比例。0表示左对齐、1表示右对齐,0.5表示居中。k也可以取其他值,例如-0.1,表示文本出现在给定坐标位置的右边,空出相当于文本10%长度的距离。
(7)字符的放大倍数:cex=k
(8)坐标轴与刻度
坐标轴刻度线的数量:lab=c(5,7,12),三个参数分别对应x轴刻度线的数量、y轴刻度线数量以及坐标轴刻度标签的宽度为多少字符。
坐标轴刻度标准的方向:las=k,其中0表示平行与坐标轴,1表示水平,2表示垂直于坐标轴。
坐标轴各部件的位置:mgp=c(3,1,0),三个参数分别对应坐标轴位置到坐标轴标签的距离,坐标轴位置到坐标轴刻度标签的距离,坐标轴位置到实际画出的坐标轴的距离。
坐标轴刻度线的长度:tak=0.01,数值为占绘图区域的比例。
坐标轴标签的类型:xaxs=r,yaxs=i,取值为\"r\",\"i\",\"e\",\"s\",\"d\"。
(9)图形边空
33
mai或者mar,前者用英寸表示,后者用文本行高度表示。
例如:
>par(mai=c(1,0.5,0.5,0))
>par(mar=c(4,2,2,1))
(10)多图环境
使用mfrow或者mfcol,如:
>par(mfrow=c(4,4))
> for(i in 1:16) hist(rnorm(500),col=sample(c(1:8),1),main=\"正态分布\")
注意,上述图形如果出现边界重叠的情况,要用mai参数把边界修改到0.3左右的水平。
34
用layout()函数设置多图环境,如下
> layout(matrix(c(1:4,2,2),2,2,byrow=T),widths=c(3,1),heights=c(1,3))
> layout.show(4)
三、低水平绘图函数
1. 添加点、线、文本、符号、数学表达式
points(x,y=NULL, type=\"p\
lines(x, y=NULL, type=\"l\
text(x, y=NULL, labels=seq_along(x), adj=NULL, ...)
如果希望在图形中添加数学符号或者公式,需要使用expression()函数,具体应用可参见demo(plotmath)。
2. 添加直线、线段、图例
35
abline(a=NULL, b=NULL, h=NULL, v=NULL, reg=NULL, coef=NULL, untf=FALSE)
segments(x0, y0, x1=x0, y1=y0, col, lty, lwd)
legend(x, y=NULL, legend, fill=NULL, ...)
3. 添加多边形和图形阴影
polygon(x, y=NULL, density=NULL, angle=45, border=NULL, ...)
36
因篇幅问题不能全部显示,请点此查看更多更全内容