《R语言入门》的读书笔记
本书的重点内容及感悟:
第一章 导言
1、R是一个有着统计分析功能及强大作图功能的软件系统。R内含了许多实用的统计分析及作图参数。作图参数能将产生的展示在一个独立的窗口中。并能将之保存为各种形式的文件(jpg,png,bmp,ps,pdf,emf,pictex,xfig),具体形式取决于操作系统。统计分析的结果也能被直接显示出来,一些中间(如P-值,回归系统,残差等)既可保存到专门的文件中,也可以直接用作进一步的分析。
2、在R语言中,使用者可以使用循环语句来连续分析多个数据集,也可将多个不同的统计函数结合在一个语句中执行更复杂的分析。R使用者还可以借鉴网上提供的用S编写的大量程序,而且大多数都能被R直接调用。
3、非专业人员起初可能觉得R相对比较复杂,其实,R的一个非常突出的优点正是它的灵活性。一般的软件往往会直接展示分析的结果,而R则将这些结果都存在一个对象object里面,所以常常在分析执行结束后并不显示任何结果。使用者可能会对此感到困惑,其实这样的特点是非常有用的,因为我们可以选择的从结果中只抽出我们感兴趣的部分。例如,我们要运行20个回归分析而只想比较其回归系统,在R中就可以选择只显示所有分析得出的回归系统,这样结果仅仅占了一排,而用有些软件可能会一下打开20个窗口。
第二章 基本原理与概念
1、基本原理
因为R是一种编程语言,一些对编程不太熟悉的人可能会望而却步,这种障碍其实是完全没有必要的。首先R是一种解释型语言,而不是编译语言,也就意味着输入的命令能够执行,而不需要像一些语言要首先构成一个完整的程序形式。第二、R的语法非常简单和直观。例如,线性回归的命令lm(y~x)表示以x为自变量,y为因变量来拟合一个线性模型。合法的R函数总是带有圆括号的形式,即使括号内没有内容(如,ls())。如果直接输入函数名而不输入括号,R则会自动显示该函数的一些具体内容。
在R中进行的所有操作都是针对存储在活动内存中的对象的。对数据,结果或图表的输入与输出都是通过在对计算机硬盘中的文件读写而实现。用户通过输入一些命令调用函数,分析得出的结果可以被直接显示在屏幕上,也可以被存入某个对象对被写入硬盘。因为产生的结果本身就是一种对象,所以它们也能被视为数据并能像一般数据那样被处理分析。数据文件即可从本地磁盘读取也可通过网络传输从远程服务器端获得。
所有能使用的R函数都被包含在一个库(library)中,该库存放在磁盘的/library目录下,这个目录下含有具有各种功能的包,各个包也是按照目录的方式组织起来的。其中名为base包含可以算是R的核心,因为它内嵌了R语言中所有像数据读写与操作这些最基本的函数。在上述目录中的每一个包内,都有一个目录R,这个目录里又都含有一个与此包同名的文件(如/library/base/r/base)。该文件正是存放所有函数的地方。
R语言中最简单的命令莫过于通过输入一个对象的名字来显示其内容了。例如,一个名为n的对象,其内容是数值10;
>n
[1] 10
该命令的功能在这里于函数print相似,输出结果与print(n)相同。对象的名字必须是以一个字母开头,中间可以包含字母,数字,点,及下划线。因为R对对旬的名字区分大小写。所以x和X就可以代表两个完全不同的对象。
2、对象的产生,排列及删除
一个对象可以通过赋值操作来产生。
>n<-15 //该符号可以是从左到右的方向,也可以相反。>5->n是一样的。如果该对象存在,那么它以胶的值将会自动被新值冲掉(这种修改只会影响内存中的数据,操作结果暂时不会被保存到硬盘中)。在R中给对象赋值有多种形式,可以是直接赋一个数值,也可以是一个算式或一个函数的结果。>n<-15+2或>n<-15+rnom(1)。运行rnom(1)将产生一个服从平均数为0,标准差为1的标准正态分布的随机变量。
>n<-15;name<-15+5;m<-1
函数ls的功能是显示所有在内存中的对象:只会列出对象。注意在R中应该用分号来隔开同一行中的不同命令语句。如果只要显示出在名称中带有某个指定字符的对象。>ls(pat="m")。如果进一步限为显示在名称中以某个字母开关的对象,则可:>ls(pat="^m")。运行函数ls.str()将会展示内存中所有对象的详细信息。
在ls.str()将会列出关于对象的所有信息,包括数据框、矩阵、数据列表的列数信息,因此展示结果可能会很长。ls.str(pat="^m",max.level=-1)就可以避免这种情况了。
要在内存中删除某个对象,可利用函数rm:运行rm(x)将会删除对象x,运行rm(x,y)将会删除对象x和y。而运行rm(list=ls())则会删除内存中的所有对象。
3、在线帮助
R中给予的在线帮助能提供关于如何使用函数的非常有用的信息。关于某个特定函数的帮助能够直接被调出来。如运行>?lm会立即显示关于函数lm()的帮助页面。
第三章 R的数据操作
1、对象
R通过一些对象来运行,当然首先这些对象是用它们的名称和内容来刻画的,其次也通过对象的数据类型即属性来刻画。对象的类型和长度可以分别通过函数mode和length得到.
对象的类型:向量是一个变量,其意思也即人们通常认为的那样;因子是一个分类变量;数组是一个k维的数据表;矩阵是数组的一个特例,其维数k=2。注意,数组或者矩阵中的所有元素都必须是同一种类型的;数据框是由一个或几个向量或因子构成。它们必须是等长的。但可以是不同的数据类型。ts是时间序列数据,它包含一些额外的属性,例如频率和时间;列表可以包含任何类型的对象,包括列表。对于一个向量,用它的类型和长度足够描述数据;而对其它的对象则另需一些额外信息。
2、在文件中读写数据
函数read.table用来创建一个数据框,所以它是读取表格形式的数据的主要方法。>mydata<-read.table("data.dat")。将创建一个数据框名为mydata,数据框中每个变量也都将命令。
函数scan比read.table要更加灵活,它们的区别之一是前者可以指定变量的类型。区别之二是scan()可以用来创建不同的对象,向量、矩阵、数据框,列表....
3、存储数据
函数write.table可以在文件中写入一个对象,一般是写一个数据框,也可以是其它类型的对象(向量,矩阵)。若想用更简单的方法将一个对象写入文件,可以使用命令write(x,file="data.txt"),其中x是对象的名字。
4、生成数据
1)规则序列
函数seq可以生成实数序列。如:>seq(1,5,0.5)。其中第一个数字表示序列的起点,第二个表示终点,第三个是生成序列的步长。还可以用函数c直接输入数值。如:>c(1,1.5,2.0,2.5,6,5)。如果想用键盘输入一些数据也是可以以,只需要直接使用默认选项的scan函数。如:>z<-scan()。函数req用来创建一个所有元素都相同的向量。如:>req(1,30)。函数sequence创建一系列连接的整数序列。每个序列都以给定参数的数值结尾。>sequence(4:5)。函数gl(生成不同的水平/层次数据)十分有用。因为它能产生规则的因子序列。如:>gl(3,5)
2)随机序列
在统计学中,产生随机数据是很有用的,R可以产生多种不同分布下的随机数序列。
5、使用对象
1)创建对象
在创建一个对象时有可能指定它的数据类型,长度、类别等等的。从处理对象的角度时是很有趣的。举例来说,我们可以创建一个空的对象并逐步修改其中的元素。
向量(vector):函数vector有两个参数。类型和长度。创建的向量中元素值取决于参数所指定的数据类型。数值型向量则元素值都为0,逻辑型都为FALSE,字符型都为""。
因子(factor):一个因子不仅包括分类变量本身还包括变量不同的可能水平(因为他们在数据中不出现)。
矩阵(Matrix):一个矩阵实际上是有一个附加属性(维数dim)的向量,维数即为一个长度为2的向量,用来指定矩阵的行数和列数。一个矩阵可以用函数matrix来创建。
数据框(Data frame):用函数data.frame来创建。数据框中的向量必须有相同的长度,如果其中有一个比其它的短,它将“循环”整数次(以使得其长度与其它向量相同)。
最后:注意数据框和矩阵一样有维数这个属性。
列表(List):列表可以用list函数来创建,方法与创建数据框类似。它对其中包含的对象没有什么限制。
时间序列(Time-series):函数ts可以由向量(一元时间序列)或者矩阵(多元时间序列)创建一个ts型对象。并且有一些表明序列特征的选项(带有缺省值)。
表达式(Espression):表达式类型的对象在R中有着很基础的地位,是R能够解释的字符序列。随后用eval()对创建的表达式进行求值。
2)对象的类型转换
as.something这种形式的函数可以完成转换。as.numeric将转换为数值型。as.logical将转换为逻辑型。as.character将转换为字符型。对于一个字符型因子来说是很有意义的。要想将一个数值型向量并且保持最初指定的水平值,就必须先转换成字符型然后再转换成数值型。如:as.numeric(as.character(fac))
3)运算符
运算符分为数学运算、比较运算、逻辑运算。identical比较数据的内在关系,如果对象是严格相同的返回TRUE,否则返回FALSE。all.equal用来判断两个对象是否“近似相等”,返回结果为TRUE或者对二者差异的描述。后一个函数在比较数值型变量时考虑到了计算过程中的近似。在计算机中数据变量的比较有时很令人惊奇。
4)访问一个对象的数值:下标系统
下标系统可以用来有效、灵活且有选择性地访问一个对象中的元素;下标可以是数值型的或逻辑型的。下标本身也可以是一个数值型向量。
如果x是一个矩阵或者数据框,第i行第j列的值可以通过x[i,j]来访问。要访问一个给定的行或列所有的值,只要忽略适当的下标(不要忘记逗号!)
对于列表,访问不同的元素(可以是任何类型的对象)可以通过单一的或者双重的方括号来实现;它们的区别是:单个括号返回一个列表,而双重括号将提取列表中的对象。如:my.list[1:2]将返回一个列表,包含原始列表的第1个和第2个元素。而my.list[[1:2]]不会给出期望的结果。
5)访问对象的名称
names是一个和对象有同样长度的向量并且可以通过函数names来访问。如果一个对象的元素有名称,它们可以通过名称被提取,和使用一样。实际上,因为原始对象的属性将被保留,所以这里的“提取”应该叫作“取子集”更合适。如果列表中的对象有名称,这种方法也将在列表中起作用。
6)数据编辑器
我们可以使用一个类似于电子表格的图形编辑器去编辑一个“数据”对象。例如,如果X是一个矩阵,命令data.entry(X)将打开一个图形编辑器并且可以通过点击适当的单元格修改数值或者添加新的行或列。
7)数学运算和一些简单的函数
在R中有很多用来处理数据的函数,前面我们已经看到了最简单的一个函数c,它用来连接列在圆括号中的对象。
8)矩阵运算
R中有矩阵计算和处理的工具,函数rbind()和cbind()分别用上下或左右的方式合并向量或矩阵。
两矩阵乘积的运算符是“%*%”。矩阵的转置由函数t完成,这个函数也可以作用于数据框。函数diag可以用来提取或修正一个矩阵的对象元,或者创建一个对象矩阵。R中也有一些用于矩阵计算的专门的函数。我们可以使用solve来矩阵的逆,用qr来分解矩阵,用eigen来计算特征值和特征向量,用svd来做奇异值分解。
第四章 R绘图
绘图函数的工作方式与文本前面描述的工作方式为不同,不能把绘图函数的结果赋给一个对象,其结果直接输出到一个绘图设备上。绘图设备是一个绘图的窗口或是一个文件。
1、管理绘图
1)打开多个绘图设备:当绘图函数开始执行,如果没有打开绘图设备,那么R将打开一个绘图窗口来展示这个图形。绘图设备可以用适当的函数打开。可用的绘图设备种类取决于操作系统。在Unix/Linux下,绘图窗口称为xl1,而在windows下称为windows。在所有情况下,都可以用命令xl1()来打开一个绘图窗口。最后打开的设备将成为当前的绘图设备,随后的所有图形都在这上面显示。
显示的数字是设备的编号,要改变当前设备必须使用这些编号,为了解当前设备用。dev.list()显示所有设备;dev.cur()显示当前设备;dev.set()改变当前设备;dev.off()关闭一个设备。
2)图形的分割
函数split.screen()分割当前的绘图设备。erase.screen()删除最后绘制的图形。函数layout把当前的图形窗口分割为多个部分,图形将一次显示在各部分中,它主要的自变量是一个元素都是整数值的矩阵,元素指示子窗口的编号。
2、绘图函数/绘图函数
第五章 R的统计分析
包stats包括一系列基本的统计分析函数;经典的假设检验,线性模型(包括最小二乘法回归,广义线性模型,和方差分析),统计分布,汇总统计,层次聚类,时间序列分析,非线性最小二乘法和多元分析。其他的R包还提供了一些上述统计方法以外的统计方法。
1、关于方差的一个简单例子
在包stats里面的方差分析函数是aov。通过函数data把数据导入内存后,首先对数据进行平方根转换。然后再进行分析。前面脚本运行的结果不会在屏幕上显示,因为它们都被赋给对象aov.spray。函数plot()和termplot()展示分析结果的统计图。
2、泛型函数
和许多统计编程语言不同的是,R函数将输入对象的属性作为输入参数。类是最应该注意关注的一个属性。R统计函数常常返回一个类名与函数名相同的对象。我们用来解析结果的函数对特定的类对象有特定的行为。这些函数被称为泛型。泛型函数很少对对象进行任何操作:它们调用自变量所属类的对应函数。
3、包
随R基本安装环境发布的标准包。其中一些包在R启动时就直接调入内存;这些可用通过函数search显示。其他包需要载入后才能使用。
第六章 R编程实践
1、相比下拉菜单式的程序,R的一个优势在于它可以把一系列连接的操作简单的程序化。这一点上和所有其他计算机编程语言是一致的,但R有一些特性使得非专业人士也可以很简单的编程程序。
2、用R写和程序
一般情况下,一个R程序以ASCII格式保存,扩展名为‘.R’。如果一个工作要重复好多次,用R程序是一个不错的选择。
3、编写你自己的函数
大多数R的工作是通过函数来实现,而且这些函数的输入参数都放在一个括弧里。用户可以编写他们自己的函数,并且这些函数和R里面的其他函数有一样的特性。编写自己的函数可以让你有效的,灵活的与合理的使用R。