R语言基础入门(全)

R语言基础入门(全)R 是门语言 也是个环境

大家好,欢迎来到IT知识分享网。

R 是门语言,也是个环境。个人认为R有点像matlab。

R自带多种统计学及数字分析功能。R的功能也可以通过安装包(Packages,用户撰写的功能)增强,个人感觉这个就是插件。因为S的血缘,R比其他统计学或数学专用的编程语言有更强的面向对象(面向对象程序设计)功能。R的另一强项是绘图功能,制图具有印刷的质素,也可加入数学符号。虽然R主要用于统计分析或者开发统计相关的软件,但也有人用作矩阵计算。其分析速度可媲美专用于矩阵计算的自由软件GNU Octave和商业软件MATLAB。

R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。

R 是统计领域广泛使用的诞生于 1980年左右的 S 语言的一个分支。R是S语言的一种实现。S语言是由 AT&T贝尔实验室开发的一种用来进行数据探索、统计分析、作图的解释型语言。最初S语言的实现版本主要是S-PLUS。S-PLUS是一个商业软件,它基于S语言,并由MathSoft公司的统计科学部进一步完善。后来Auckland大学的Robert Gentleman 和 Ross Ihaka 及其他志愿人员开发了一个R系统。R的使用与S-PLUS有很多类似之处,两个软件有一定的兼容性。S-PLUS的使用手册,只要经过不多的修改就能成为 R的使用手册。所以有人说:R,是S-PLUS的一个“克隆”。但是请不要忘了:R is free。

R是一套完整的数据处理、计算和制图软件系统。其功能包括:数据存储和处理系统;数组运算工具(其向量、矩阵运算方面功能尤其强大);完整连贯的统计分析工具;优秀的统计制图功能;简便而强大的编程语言:可操纵数据的输入和输入,可实现分支、循环,用户可自定义功能。

与其说R是一种统计软件,还不如说R是一种数学计算的环境,因为R并不是仅仅提供若干统计程序、使用者只需指定数据库和若干参数便可进行一个统计分析。R的思想是:它可以提供一些集成的统计工具,但更大量的是它提供各种数学计算、统计计算的函数,从而使使用者能灵活机动的进行数据分析,甚至创造出符合需要的新的统计计算方法。

该语言的语法表面上类似 C,但在语义上是函数设计语言的(functional programming language)的变种并且和Lisp 以及 APL有很强的兼容性。特别的是,它允许在“语言上计算”(computing on the language)。这使得它可以把表达式作为函数的输入参数,而这种做法对统计模拟和绘图非常有用。

R是一个免费的自由软件,它有UNIX、LINUX、MacOS和WINDOWS版本,都是可以免费下载和使用的,在那儿可以下载到R的安装程序、各种外挂程序和文档。在R的安装程序中只包含了8个基础模块,其他外在模块可以通过CRAN获得。

CRAN为Comprehensive R Archive Network(R综合典藏网)的简称。它除了收藏了R的可执行文件下载版、源代码和说明文件,也收录了各种用户撰写的软件包。现时,全球有超过一百个CRAN镜像站。

以下转自 http://www.cnblogs.com/wentingtu/archive/2012/03/03/2377969.html

R语言基础入门之一:引言

 
1 什么是R语言

R语言是一个开源的数据分析环境,起初是由数位统计学家建立起来,以更好的进行统计计算和绘图,这篇 wiki中包含了一些基本情况的介绍。由于R可以通过安装扩展包(Packages)而得到增强,所以其功能已经远远不限于统计分析,如果感兴趣的话可以到 官方网站了解关于其功能的更多信息。

至于R语言名称的由来则是根据两位主要作者的首字母(Robert Gentleman and Ross Ihaka),但过于简短的关键词也造成在搜索引擎中很不容易找到相关的资料。不过这个专门的 搜索网站可以帮到你。


2 为什么要学习R语言

可能你想说,“我已经学会了spss/sas/stata…,为什么还要去学习R呢?”如下几方面可能会吸引到你:

  • R是免费开源软件:现在很多学术期刊都对分析软件有版权要求,而免费的分析工具可以使你在这方面不会有什么担心。另一方面,如果学术界出现一种新的数据分析方法,那么要过很长一段时间才会出现在商业软件中。但开源软件的好处就在于,很快就会有人将这种方法编写成扩展包,或者你自己就可以做这件工作。
  • 命令行工作方式:许多人喜欢类似SPSS菜单式的操作,这对于初学者来说很方便入门,但对于数据分析来说,命令行操作会更加的灵活,更容易进行编程和自动化处理。而且命令行操作会更容易耍酷,不是嘛,一般人看到你在狂敲一推代码后得到一个分析结果,对你投来的目光是会不一样的。
  • 小巧而精悍:R语言的安装包更小,大约不到40M,相比其它几个大家伙它算是非常小巧精悍了。目前R语言非常受到专业人士欢迎,根据对数据挖掘大赛胜出者的调查可以发现,他们用的工具基本上都是R语言。此外,从最近几次R语言大会上可以了解到,咨询业、金融业、医药业都在大量的使用R语言,包括google/facebook的大公司都在用它。因此,学习R语言对你的职业发展一定是有帮助的。


3 R语言的下载和GUI界面

R语言安装包可以在 官方网站下载,windows版可直接点击这个 连接

在ubuntu下面安装R则更容易,在终端里头运行如下命令即可

sudo apt-get update

sudo apt-get install r-base

此外,学习R语言时强烈推荐安装Rstudio做为R的图形界面,关于Rstudio之前的 博文有过简单介绍,点 这里可能转到它的官方网站。


4 R语言的学习方法

学习R并不是一件非常轻松的事情,初学者需要记住的就是:

  • 亲手键入代码并理解其意义
  • 在笔记里记下一些重点或心得(个人推荐Evernote)
  • 坚持练习,对手边的数据进行应用分析
  • 理解背景知识,细节很重要。

R语言基础入门之二:数据导入和描述统计

 
1 数据导入

对初学者来讲,面对一片空白的命令行窗口,第一道真正的难关也许就是数据的导入。数据导入有很多途径,例如从网页抓取、公共数据源获得、文本文件导入。为了快速入门,建议初学者采取R语言协同Excel电子表格的方法。也就是先用较为熟悉的Excel读取和整理你要处理的数据,然后“粘贴”到R中。

例如我们先从 这个地址下载iris.csv演示数据,在Excel中打开,框选所有的样本然后“复制”。在R语言中输入如下命令:

data=read.table(‘clipboard’,T)

这的里read.table是R读取外部数据的常用命令,T表示第一行是表头信息,整个数据存在名为data的变量中。另一种更方便的导入方法是利用Rstudio的功能,在workspace菜单选择“import dataset”也是一样的。


2 Dataframe操作

在数据导入R语言后,会以数据框(dataframe)的形式储存。dataframe是一种R的数据格式,可以将它想象成类似统计表格,每一行都代表一个样本点,而每一列则代表了样本的不同属性或特征。初学者需要掌握的基本操作方法就是dataframe的编辑、抽取和运算。

尽管建议初学者在Excel中就把数据处理好,但有时候还是需要在R中对数据进行编辑,下面的命令可以让你有机会修改数据并存入到新的变量newdata中:

newdata=edit(data)

另一种情况就是我们可能只关注数据的一部分,例如从原数据中抽取第20到30号样本的Sepal.Width变量数据,因为Sepal.Width变量是第2个变量,所以此时键入下面的命令即可:

newdata=data[20:30,2]

如果需要抽取所有数据的Sepal.Width变量,那么下面两个命令是等价的:

newdata=data[,2]

newdata=data$Sepal.Width

第三种情况是需要对数据进行一些运算,例如需要将所有样本的Sepal.Width变量都放大10倍,我们先将原数据进行一个复制,再用$符号来提取运算对象即可:

newdata=data

newdata$Sepal.Width=newdata$Sepal.Width*10

3 描述统计

描述统计是一种从大量数据中压缩提取信息的工具,最常用的就是
summary命令,运行summary(data)得到结果如下:对于数值变量计算了五个分位点和均值,对于分类变量则计算了频数。

也可以单独计算Sepal.Width变量的平均值和标准差

mean(data$Sepal.Width)

sd(data$Sepal.Width)

计算分类数据Species变量的频数表和条形图

table(data$Species)

barplot(table(data$Species))

对于一元数值数据,绘制直方图和箱线图观察其分布是常用的方法:

hist(data$Sepal.Width)

boxplot(data$Sepal.Width)

对于二元数值数据,则可以通过散点图来观察规律

plot(data$Sepal.Width,Sepal.Length)

如果需要保存绘图结果,建议使用Rstudio中的plot菜单命令,选择save plot as image

R语言基础入门之三:常用统计函数运算

 
在R语言中经常会用到函数,例如 上节中讲到的求样本统计量就需要均值函数(mean)和标准差函数(sd)。对于二元数值数据还用到协方差(cov),对于二元分类数据则可以用交叉联列表函数(table)。下文讲述在初级统计学中最常用到的三类函数。

一、数据汇总函数

我们还是以R中自带的iris数据为例,输入head(iris)你可以获得数据的前6个样本及对应的5个变量。取出最后两列数据作为讲解的对象:Species表示花的种类,Petal.Width表示花瓣宽度

data=iris[,c(4,5)]

下一步我们想计算不同种类花瓣的平均宽度,可以使用tapply函数,在计算前先用attach命令将data这个数据框解包以方便直接操作其变量,而不需再用$符号。



attach(data)

tapply(X=Petal.Width,INDEX=Species,FUN=mean)

结果如下

setosa versicolor  virginica

0.246      1.326      2.026 

和tapply类似的还有sapply函数,在进一步讲解前初学者还需搞清楚两种数据表现方式,即stack(堆叠数据)和unstack(非堆叠数据),上面的data就是一个堆叠数据,每一行表示一个样本。而非堆叠数据可以根据unstack函数转换而来

data.unstack=unstack(data)

head(data.unstack)

你应该明白这二者之间的区别了,如果要对非堆叠数据计算不同种类花瓣的平均宽度,可以利用如下函数。

sapply(data.unstack,FUN=mean)

结果是一样的,也就是说tapply对应于stack数据,而sapply对应于unstack数据

二、概率计算函数

如果给定一种概率分布,通常会有四类计算问题:

  • 计算其概率密度density (d)
  • 计算其概率分布probability(p)
  • 计算其百分位数quantile (q)
  • 随机数模拟random (r)

记住上面四类计算对应的英文首字母,再对照下表就很容易计算各种概率问题了。

R语言基础入门(全)

举例来讲,我们求标准正态分布曲线下小于1的面积p(x<1),正态分布是norm,而分布函数是p,那么使用pnorm(1)就得出了结果0.84;若计算扔10次硬币实验中有3次正面向上的概率,类似的dbinom(x=3,size=10,prob=0.5)得出0.11

三、抽样函数

我们想从1到10中随机抽取5个数字,那么这样来做:首先产生一个序列,然后用sample函数进行无放回抽取。

x=1:10

sample(x,size=5)

有放回抽取则是

sample(x,size=5,replace=T)

sample函数在建模中经常用来对样本数据进行随机的划分,一部分作为训练数据,另一部分作为检验数据。

R语言基础入门之四:常用的统计推断

 
通常一个研究项目能够获得的数据是有限的,以有限的样本特征来推断总体特征就称为统计推断。推断又可细分为区间估计和假设检验,二者虽有区别,但却是一枚硬币的两面,之间有着紧密的关联。

1 对总体均值进行区间估计

假设我们从总体中抽得一个样本,希望根据样本均值判断总体均值的置信区间,如下例所示:

x=rnorm(50,mean=10,sd=5)  #随机生成50个均值为10,标准差为5的随机数为作为研究对象

mean(x)-qt(0.975,49)*sd(x)/sqrt(50)  #根据统计学区间估计公式,得到95%置信度下的区间下界

mean(x)+qt(0.975,49)*sd(x)/sqrt(50)  #95%置信度下的区间上界


也可以直接利用R语言内置函数
t.test

t.test(x,conf.level=0.95)

从如下结果可得95%置信区间为(9.56,12.36)

One Sample t-test

data:  x

t = 15.7301, df = 49, p-value < 2.2e-16

alternative hypothesis: true mean is not equal to 0

95 percent confidence interval:

  9. 12.

sample estimates:

mean of x

 10.96404 

2 对总体均值进行假设检验

还是以上面的X数据作为对象,来检验总体均值是否为10

t.test(x,mu=10,alternative=’two.sided’)  #这里的原假设是总体均值(mu)为10,使用双侧检验,得到P值为0.17,可见P值不够小,不能够拒绝原假设。

T检验是极为常用的检验方法,除了单样本推断之外,t.test命令还可以实现两样本推断和配对样本推断。如果要对总体比率或总体方差进行推断,可以使用
prop.test
var.test

3 正态分布检验

T检验的前提条件是总体服从正态分布,因此我们有必要先检验正态性。而且在评价回归模型时,对残差也需要检验正态性。检验正态性的函数是
shapiro.test

shapiro.test(x)

结果所下:

Shapiro-Wilk normality test

data:  x

W = 0.9863, p-value = 0.8265

该检验的原假设是服从正态分布,由P值为0.82可判断不能拒绝总体服从正态的假设

4 非参数检验

如果总体不服从正态分布,那么T检验就不再适用,此时我们可以利用非参数方法推断中位数。
wilcoxon.test函数可实现符号秩检验。

wilcox.test(x,conf.int=T)   #指定conf.int让函数返回中位数的置信区间

wilcox.test(x,mu=1)  #指定mu让函数返回中位数为10的检验结果

5 独立性检验(联列表检验)

卡方分布有一个重要应用就是根据样本数据来检验两个分类变量的独立性,我们以CO2数据为例来说明
chisq.test函数的使用,help(CO2)可以了解更多信息。

data(CO2)   #读入内置的数据包,其中Type和Treatmen是其中两个分类变量。

chisq.test(table(CO2$Type,CO2$Treatment))   #使用卡方检验函数来检验这两个因子之间是否独立

结果显示P值为0.82,因此可以认为两因子之间独立。在样本较小的情况下,还可以使用fisher精确检验,对应的函数是
fisher.test

R语言基础入门之五:简单线性回归

 
线性回归可能是数据分析中最为常用的工具了,如果你认为手上的数据存在着线性定量关系,不妨先画个散点图观察一下,然后用线性回归加以分析。下面简单介绍一下如何在R中进行线性回归。

1 回归建模

我们利用R语言中内置的trees数据,其中包含了Volume(体积)、Girth(树围)、Height(树高)这三个变量,我们希望以体积为因变量,树围为自变量进行线性回归。



plot(Volume~Girth,data=trees,pch=16,col=’red’)

model=lm(Volume~Girth,data=trees)

abline(model,lty=2)

summary(model)

首先绘制了两变量的散点图,然后用lm函数建立线性回归模型,并将回归直线加在原图上,最后用summary将模型结果进行了展示,从变量P值和F统计量可得回归模型是显著的。但截距项不应该为负数,所以也可以用下面方法将截距强制为0。

model2=lm(Volume~Girth-1,data=trees)

2 模型诊断

在模型建立后会利用各种方式来检验模型的正确性,对残差进行分析是常见的方法,下面我们来生成四种用于模型诊断的图形。

par(mfrow=c(2,2))

plot(model)

par(mfrow=c(1,1)) 
R语言基础入门(全)

这里左上图是残差对拟合值作图,整体呈现出一种先下降后下升的模式,显示残差中可能还存在未提炼出来的影响因素。右上图残差图,用以观察残差是否符合正态分布。左下图是标准化残差对拟合值,用于判断模型残差是否等方差。右下图是标准化残差对杠杆值,虚线表示的cooks距离等高线。我们发现31号样本有较大的影响。

3 变量变换

因为31号样本有着高影响力,为了降低其影响,一种方法就是将变量进行开方变换来改善回归结果,从残差标准误到残差图,各项观察都说明变换是有效的。

plot(sqrt(Volume)~Girth,data=trees,pch=16,col=’red’)

model2=lm(sqrt(Volume)~Girth,data=trees)

abline(model2,lty=2)

summary(model2)


4 模型预测

下面根据上述模型计算预测值以及置信区间,predict函数可以获得模型的预测值,加入参数可以得到预测区间

plot(sqrt(Volume)~Girth,data=trees,pch=16,col=’red’)

model2=lm(sqrt(Volume)~Girth,data=trees)

data.pre=data.frame(predict(model2,interval=’prediction’))

lines(data.pre$lwr~trees$Girth,col=’blue’,lty=2)

lines(data.pre$upr~trees$Girth,col=’blue’,lty=2)

R语言基础入门(全)


我们还可以将树围和树高都加入到模型中去,进行多元回归。如果要考虑的变量很多,可以用step函数进行变量筛选,它是以AIC作为评价指标来判断一个变量是否应该加入模型,建议使用这种自动判断函数时要谨慎。对于嵌套模型,还可以使用anova建立方差分析表来比较模型。对于变量变换的形式,则可以使用MASS扩展包中的boxcox函数来进行COX变换。

R语言基础入门之六(完):Logistic回归

 
让我们用logistic回归来结束本系列的内容吧,本文用例来自于
John Maindonald所著的 《Data Analysis and Graphics Using R》一书,其中所用的数据集是anesthetic,数据集来自于一组医学数据,其中变量conc表示麻醉剂的用量,move则表示手术病人是否有所移动,而我们用nomove做为因变量,因为研究的重点在于conc的增加是否会使nomove的概率增加。

首先载入数据集并读取部分文件,为了观察两个变量之间关系,我们可以利cdplot函数来绘制条件密度图.



library(DAAG)

head(anesthetic)

cdplot(factor(nomove)~conc,data=anesthetic,main=’条件密度图’,ylab=’病人移动’,xlab=’麻醉剂量’)
R语言基础入门(全)

从图中可见,随着麻醉剂量加大,手术病人倾向于静止。下面利用logistic回归进行建模,得到intercept和conc的系数为-6.47和5.57,由此可见麻醉剂量超过1.16(6.47/5.57)时,病人静止概率超过50%。

anes1=glm(nomove~conc,family=binomial(link=’logit’),data=anesthetic)

summary(anes1)

上面的方法是使用原始的0-1数据进行建模,即每一行数据均表示一个个体,另一种是使用汇总数据进行建模,先将原始数据按下面步骤进行汇总

anestot=aggregate(anesthetic[,c(‘move’,’nomove’)],by=list(conc=anesthetic$conc),FUN=sum)

anestot$conc=as.numeric(as.character(anestot$conc))

anestot$total=apply(anestot[,c(‘move’,’nomove’)],1,sum)

anestot$prop=anestot$nomove/anestot$total

得到汇总数据anestot如下所示

  conc move nomove total      prop

1  0.8    6      1     7 0.

2  1.0    4      1     5 0.

3  1.2    2      4     6 0.

4  1.4    2      4     6 0.

5  1.6    0      4     4 1.0000000

6  2.5    0      2     2 1.0000000

对于汇总数据,有两种方法可以得到同样的结果,一种是将两种结果的向量合并做为因变量,如anes2模型。另一种是将比率做为因变量,总量做为权重进行建模,如anes3模型。这两种建模结果是一样的。

anes2=glm(cbind(nomove,move)~conc,family=binomial(link=’logit’),data=anestot)

anes3=glm(prop~conc,family=binomial(link=’logit’),weights=total,data=anestot)

根据logistic模型,我们可以使用predict函数来预测结果,下面根据上述模型来绘图

x=seq(from=0,to=3,length.out=30)

y=predict(anes1,data.frame(conc=x),type=’response’)

plot(prop~conc,pch=16,col=’red’,data=anestot,xlim=c(0.5,3),main=’Logistic回归曲线图’,ylab=’病人静止概率’,xlab=’麻醉剂量’)

lines(y~x,lty=2,col=’blue’)
R语言基础入门(全)

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/143792.html

(0)
上一篇 2025-05-01 13:10
下一篇 2025-05-01 13:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信