C++,python,热爱算法和机器学习
全部博文(1214)
分类: Python/Ruby
2012-05-09 18:58:13
上篇讲完了R语言的一些最基本的安装和命令。这篇继续学习对象和数据类型,也会有一些简单的统计内容。
数据对象 引言R把对象分为多种类型,包括向量、因子、清单以及数据框等等。部分R函数会根据不同的对象作出不同的处理。例如,plot会随着输入的数据类型的不 同而得出不同类型的图像:输入数字向量,会得到散点图;输入一组因子,会得到盒形图;输入回归模型的结果,则会得到一系列的图像分析(在R中,大部分比较 复杂的分析功能,比如回归模型,都会得到一系列的结果)。这种弹性被称为“对象导向式程序编写”。
所有对象都包括数值及属性。数值是指当输入对象名称后所显示的数值,而属性则可分为三类:对于对象的长度,对于矩阵的维度以及对于数据框的行和列。
标量和向量标量相对于向量来说比较简单,可以是由数字或者字符串组成。在R的语法中,表达文字时都必须加上引号“”。向量则是由一组一维的标量所构成的,所以 标量可以认为是向量的特殊情况。 除此之外,这些标量必须是同一类型(数值或者是文字)。如果一个向量同时包含了数值和文字,R会把该向量视作文字处理。
> sample=c(1,2,3,"x") > sample [1] "1" "2" "3" "x" 类型检视与转换在不知对象的类型的时候,使用者额可以利用一系列由is.串连的功能区检视,R便会用TRUE或者FALSE以表示正确或者错误。
> is.vector(sample) [1] TRUE > is.character(sample) [1] TRUE > is.numeric(sample) [1] FALSE除此之外,还可以用as.串连功能来变更对象的类型。
> as.numeric(1) [1] 1 > as.numeric(sample) [1] 1 2 3 NA Warning message: NAs introduced by coercion由于sample并不属于数值类型,因此as.numeric(sample)只会显示出NA。
矩阵矩阵和向量比较类似,只不过是二维的而已。输入矩阵如同输入向量,只需要加上二维数据即可。例如:
> matrix(c(1:9),nrow=3,ncol=3,byrow=T) [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 [3,] 7 8 9其中,byrow=T这个系数是指以行的形式来排列矩阵。当矩阵的第一行被填满的时候,余下的数字将填补下一行。这里的nrow和ncol可以简写做nr和nc。当然,我自己还是喜欢直接写3,3,也是没有问题的。
清单清单应该说比向量的作用更大些,因为它能够将多种类型的数据储存在一起。倘若向量是一组标量的排列, 那么清单则可视作一组不同 形态对象的排列。
> list1=list(c("1","two","three","4"),matrix(c(1,2,3,4,5,6),nrow=2,ncol=3),c(1,2,3)) > list1 [[1]] [1] "1" "two" "three" "4" [[2]] [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 [[3]] [1] 1 2 3 数据框到目前为止,其实很多数据类型都是很相似的,或者使我们以前就比较熟知的。数据框应该大部分人以前都是没有接触过的,下面简单介绍一下。数据框可以是多维的,而且它的行和列都是可以被重新命名的。在数据框内,和数值向量一般,空白输入是以NA来表示的。
利用指令data.frame,可以讲矩阵转化为数据框(在R中,没有函数as.frame的)。同样,利用as.matrix,便可以将数据帧转 化为矩阵。但有一点非常重要,矩阵和向量一样,只能拥有一种数据类型,而数据框却能同时拥有多种。若数据框内同时含有文字,当数据框被转化为矩阵时,所有 的元素都会被转化为文字。
统计分布和简单模拟对于统计分析来说,进行模拟实验是非常有必要的。这部分后面应该还有更多更有针对性的文章。记录下R做简单模拟实验及应用相关的统计分布函数。当 然,前提是需要有一些基础的概率统计的理论知识。如果没有也没关系,在实验和动手操作中学习一向是我最推崇的方法。对于一些模糊的概念,我不太推荐去系统 的参考课本,直接用好wiki就可以了。
sample函数 > sample(c(-1,0,1),size=20,prob=c(1/3,1/3,1/3),replace=T) [1] 0 -1 0 0 1 0 -1 1 1 1 -1 0 -1 -1 -1 0 0 0 -1 -1sample函数用来产生随机样本或者排列。上面这个指令产生了20个离散分布的随机样本,抽中-1,0和1的机会是均等的。当然,每次运行这条命 令的时候结果都会不同,因此需要引入随机种子的概念。在R中,随机数产生器是应用随机种子产生伪随机数据。使用者在不同时间执行命令都会有不同的随机种 子。当然,我们可以用set.seed()函数来设定随机种子。当随机种子是一样的时候,所产生的伪随机数据也就是相同的了。例如:
> set.seed(123) > sample(c(-1,0,1),size=20,prob=c(1/3,1/3,1/3),replace=T) [1] 0 -1 1 -1 -1 0 1 -1 1 1 -1 1 -1 1 0 -1 0 0 0 -1 > sample(c(-1,0,1),size=20,prob=c(1/3,1/3,1/3),replace=T) [1] -1 -1 1 -1 1 -1 1 1 0 0 -1 -1 -1 -1 0 1 -1 0 0 0 > sample(c(-1,0,1),size=20,prob=c(1/3,1/3,1/3),replace=T) [1] 0 1 1 1 0 0 0 1 0 -1 0 1 -1 0 1 0 0 -1 -1 1我们开始的时候设定了随机种子为123,然后产生不同的随机排列。原因是当每次执行产生随机数据后,随机种子也会从某个特定的数学公式来改变。现在我们尝试重新将随机种子设定为123,就会产生和刚才一模一样的随机序列:
> set.seed(123) > sample(c(-1,0,1),size=20,prob=c(1/3,1/3,1/3),replace=T) [1] 0 -1 1 -1 -1 0 1 -1 1 1 -1 1 -1 1 0 -1 0 0 0 -1 > sample(c(-1,0,1),size=20,prob=c(1/3,1/3,1/3),replace=T) [1] -1 -1 1 -1 1 -1 1 1 0 0 -1 -1 -1 -1 0 1 -1 0 0 0 > sample(c(-1,0,1),size=20,prob=c(1/3,1/3,1/3),replace=T) [1] 0 1 1 1 0 0 0 1 0 -1 0 1 -1 0 1 0 0 -1 -1 1设定随机种子是非常有用的,每次产生相同的随机数据会对编写程序和除bug都有很大的帮助。下面来举个常见的小例子。假设我们进行掷硬币游戏,每次正面朝上得一分,反面朝上则减一分。这就是一种很简单的随机步行,我们可以用下面的统计模型来表示:
w(t+1)=w(t)+r(t),t=0,1,/dots,n.
r(t)等于1或者-1的概率都是1/2。dw(t)就是在时间t积累的金额。假设最初金额w(0)=0,我们就用一下命令来仿真这随机步行:
> set.seed(12345) > r=sample(c(1,-1),size=100,prob=c(1/2,1/2),replace=T) > r=c(0,r) > r [1] 0 1 1 1 1 -1 -1 -1 1 1 1 -1 -1 1 -1 -1 -1 -1 -1 -1 1 -1 [23] -1 1 1 1 -1 1 1 -1 -1 1 -1 -1 1 -1 -1 1 1 1 -1 1 -1 1 [45] 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 1 1 1 [67] -1 1 -1 1 1 1 1 -1 -1 -1 1 1 1 1 -1 1 1 -1 -1 -1 -1 1 [89] 1 1 -1 1 1 -1 1 1 1 1 1 -1 -1 > w=cumsum(r) > > w [1] 0 1 2 3 4 3 2 1 2 3 4 3 2 3 2 1 0 -1 -2 -3 -2 -3 [23] -4 -3 -2 -1 -2 -1 0 -1 -2 -1 -2 -3 -2 -3 -4 -3 -2 -1 -2 -1 -2 -1 [45] 0 -1 -2 -3 -4 -5 -4 -3 -2 -3 -4 -3 -4 -3 -4 -5 -6 -5 -6 -5 -4 -3 [67] -4 -3 -4 -3 -2 -1 0 -1 -2 -3 -2 -1 0 1 0 1 2 1 0 -1 -2 -1 [89] 0 1 0 1 2 1 2 3 4 5 6 5 4上面的操作中,r=c(0,r)是将w(0)=0加在r前面,而w=cumsum(r)是计算r的累计和。为了能够使数据看起来更加直观,下面绘制一下这个随机步行:
画图的时候首先将w转成时间序列,然后用plot(w, type='l')函数来画图。abline(h=0)是在图中加上y=0的水平线。R的绘图部分后面还会继续学习,此处不再赘述。
统计分布R中内置了很多常用的统计分布函数。我们可以用这些函数来产生各种类型的随机样本。R统计一共有四种基本项目:
首先定义概率向量q,然后计算相应的分位数(这些也都是假设检验常用的分位数)。我们尝试用rnorm()去产生1000个N(10,4)的随机数据,然后绘制直方图。hist(rnorm(1000, mean=10, sd=2))
关于统计的简单绘图就说这么些吧,由于前几天在做MCM,这篇文章也就一直耽搁了好多天。