Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4584760
  • 博文数量: 1214
  • 博客积分: 13195
  • 博客等级: 上将
  • 技术积分: 9105
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-19 14:41
个人简介

C++,python,热爱算法和机器学习

文章分类

全部博文(1214)

文章存档

2021年(13)

2020年(49)

2019年(14)

2018年(27)

2017年(69)

2016年(100)

2015年(106)

2014年(240)

2013年(5)

2012年(193)

2011年(155)

2010年(93)

2009年(62)

2008年(51)

2007年(37)

分类: Python/Ruby

2012-05-09 18:58:13

文章来源:%E8%AF%AD%E8%A8%80%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E6%95%B0%E6%8D%AE%E5%AF%B9%E8%B1%A1%E5%92%8C%E7%AE%80%E5%8D%95%E7%BB%9F%E8%AE%A1/
在原文上加了几个没写出的公式。

上篇讲完了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 -1

sample函数用来产生随机样本或者排列。上面这个指令产生了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/2dw(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统计一共有四种基本项目:

  1. 概率密度函数
  2. 累计分布函数
  3. 分位数
  4. 伪随机数
R的命名方法是分别用d,p,q,r去表示这四个项目。例如dnorm、pnorm、qnorm、rnorm分别表正态分布的四个基本项目。下面就画一下正态分布的概率密度函数。在plot函数中参数type=”l“表示用线条来画。
> x=seq(-4,4,0.01) > plot(x,dnorm(x),type="l",main="N(0,1)密度")
qnorm()可以用来计算标准正态分布的分位数:
> q=c(0.025,0.05,0.5,0.95,0.975) > qnorm(q) [1] -1.959964 -1.644854 0.000000 1.644854 1.959964

首先定义概率向量q,然后计算相应的分位数(这些也都是假设检验常用的分位数)。我们尝试用rnorm()去产生1000个N(10,4)的随机数据,然后绘制直方图。hist(rnorm(1000, mean=10, sd=2))

我们又尝试用二项式分布为例。二项式分布的密度函数为:
f(x)=(nx)px(1p)nx,x=0,...,n
以下是用来绘制n=20,p=14的二项式分布密度函数:
dbinom()传回二项式分布的密度,自变量size以及prob分别是指n和p。在plot函数中type="h"代表用杆状图来绘制,比较使用于离散的分布。
x = seq(0,20)
plot(x, dbinom(x, size=20, prob=1/4), type='h')
end

关于统计的简单绘图就说这么些吧,由于前几天在做MCM,这篇文章也就一直耽搁了好多天。


阅读(3732) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~