《统计建模与R语言mathth.ppt》由会员分享,可在线阅读,更多相关《统计建模与R语言mathth.ppt(23页珍藏版)》请在三一办公上搜索。
1、R的语法与数据结构,语法符号 命令或运算提示符+续行符基本算术运算+加号-减号*乘号/除号 乘方赋值符=或-,求助符?help()例子:3+53-53/535x=5?plothelp(plot),向量向量是R中最为基本的类型一个向量中元素的类型必须相同,包括数值型整型单精度实型双精度实型逻辑型复值型字符型,建立向量的方法(函数)seq()或:若向量(序列)具有较为简单的规律rep()若向量(序列)具有较为复杂的规律c()若向量(序列)没有什么规律例子:1:10seq(1,10,by=0.5)seq(1,10,length=21)rep(2:5,2)rep(2:5,rep(2,4)x=c(42,
2、7,64,9)length(x),向量运算中的循环法则(recycling rule)1:2+1:41:4+1:7,向量的下标(index)与向量子集(元素)的提取正的下标 提取向量中对应的元素负的下标 去掉向量中对应的元素逻辑运算 提出向量中元素的值满足条件的元素注:R中向量的下标从1开始,这与通常的统计或数学软件一致而象C语言等计算机高级语言的向量下标则从0开始!例子:x=c(42,7,64,9)x1x-2xc(1,4),x10#值大于10的元素逻辑值 1 TRUE FALSE TRUE FALSExx10#值大于10的元素 1 42 64xx10#产生(0,1)上100个均匀分布随机数y
3、=runif(100,min=0,max=1)sum(ysum(yy0.5)#值小于0.5的元素的值的和 1 10.84767,数据框架(data frame)许多数据集是数据框架的形式出现一个数据框架就是将许多向量组合起来的一个对象,它是二维的,通常其列表示变量,其行表示观测。建立数据框架的方法(函数)若你的数据本身保存在一个文件中,则可以使用read.table()仅接受带有分界符的ASCII数据 如果数据是电子报表的形式,则采用下面的两种变型read.csv()先将数据另存为带逗号的数据(Comma Seperated values)read.delim()先将数据另存为用tab作为分界
4、符的数据 注:若数据集很大(如1,000,000观测x200变量),则可由 ODBC联接由数据库读入.,若你在R中建立了一些向量并试图想由它们生成框架,则可以使用data.frame(),但需要同时cbind().例子:x=c(42,7,64,9)y=1:4z.df=data.frame(cbind(INDEX=y,VALUE=x)z.dfINDEX VALUE1 1422 2 73 3644 4 9注.df 只是为了提醒自己z.df是一个数据框架 INDEX和VALUE是重新命名的向量名字,数据框架子集的提出取格式 foorow,column其中 foo 数据框架的名称 row 需要提出取的
5、行号 column 需要提出取的行号例子(续上一例),z.df1,#提取第一个观测(第一行)INDEX VALUE 1 1 42 z.df,1#提取第一列(第一个变量的值)1 1 2 3 4 z.df2,1#提取第二行第一列的元素1 2,列表(list)复杂的数据分析时,仅有向量与数据框架还不够有时需要生成包含不同类型的对象R的列表(list)就是包含任何类型的对象例子:foo=list(x=1:6,y=matrix(1:4,nrow=2)foo$x 1 1 2 3 4 5 6$y,1,2 1,1 3 2,2 4,列表子集的提出取提取一个子对象如foo的x,下面三种方式等价 foo$xfoo1
6、foo1 例子foo$yfoo2foo2foo12foo$y2foo$y4,条件语句 作用:避免除零或负数的对数等数学问题形式1:if(条件)表达式1 else 表达式2形式2 常优于形式1!ifelse(条件,yes,no)试比较下面的三个结果:x=c(6:-4)sqrt(ifelse(x=0,x,NA)ifelse(x=0,sqrt(x),NA)if(x=0)sqrt(x)else NA,循环(loops)for()#若知道终止条件for(变量 in 向量)表达式while()#若无法知道运行次数while(条件)表达式两者通常可以转换例1试比较两种方法for(i in 1:5)print
7、(1:i)i=1while(i=5)+print(1:i)+i=i+1+,例2 见Ko-Kang Wangs“R Programming Workshop”,pp6-8Suppose we generate a pseudo DNA microarray and we want to do an ANOVA on it.First we generate some factors for Array(a),Treatments(t)and Genes(g).Then generate some normal random numbers for the logged foreground in
8、tensity.Then we put into an aov()function for each gene this is where the loop is good for.Note that you will get different answer when you try it,because of the random numbers generated.程序如下(使用for循环,也可改用while循环):DNA_anova.R注:R控制面板中显示符号和+,而源程序中是不需要的!,n=3044 a=c(rep(1,2*n),rep(2,2*n)t=c(rep(1,n),rep(
9、2,n),rep(2,n),rep(1,n)g=rep(rep(1:1522,rep(2,1522),4)y=rnorm(4*n,mean=4.13,sd=0.75)ybar=data.frame(A=factor(a),G=factor(g),+T=factor(t),Intensity=y)attach(ybar)ybar1:10,#查看ybar的前10行 res.mat=matrix(0,1522,8,byrow=TRUE)coef.mat=matrix(0,1522,4,byrow=TRUE)for(i in 1:1522)+gene.aov=aov(Intensity A+T+A*T
10、,+sub=G=i)+res.mati,=residuals(gene.aov)#保存ANOVA分析的残差+coef.mati,=coef(gene.aov)#保存ANOVA分析的方差系数+res.mat1:10,#查看残差的前10行 coef.mat1:10,#查看方差系数的前10行,向量化(vectorization)循环(loops)很有用,但如果能将一组命令向量化,则应尽量避免循环,原因在于C是一种编译语言,其效率是很高的;R则是一种解释语言。在计算时,通常C要比R快100倍。在R中充分使用向量化,因为R会立即调用C进行运算,因而大大提高计算的效率!例子-见Ko-Kang Wangs“
11、R Programming Workshop”,pp9-11(Gamma函数作图)Vector_1.R 没有使用向量和循环的源程序Vector_2.R 使用for循环改进后的源程序Vector_3.R 使用向量化后源程序,函数函数是一系列语句的组合,在R中可以写出自己的函数形式:变量名=function(变量列表)函数体函数引用:变量名(变量的值)函数可以递归引用,但不提倡!例子 使用gamma函数求n!factorial=function(n)+if(n=0)gamma(n+1)+else print(“Please input a positive integer!)+factorial(
12、6)factorial(-6),用于处理错误的函数 用于处理用户输入不正确的类型而可能出现的错误warning()若错误不严重以至影响整个计算stop()若错误可能导致计算中止print()显示必要的信息formatC()数值作为字符串输出cat()字符串联,可以插入n(换行)及t(tab键)paste()字符粘贴(非字符型自动转换)例子:cat(R,is,a good,software.n)formatC(1/3,format=f,digits=4)formatC(1/3,format=e,digits=4)paste(1:12)#与as.character(1:12)等价paste(A,1
13、:6,sep=)paste(today is,date(),R中的编程,编程的重要性一个统计软件(包)应该包罗万象所有统计方法或技术,可以完成所有的任务?这是一种错误的观点!太贵!费时!SAS是一个世界上最为优秀的统计分析软件之一,但!当然SAS具体编程能力,而SPSS更糟!通过编程可以实现(开发)满足自己需要的函数或宏包,好的编程习惯为了他人,更为你本人!你的程序应该具有可读性(readability)可理解性(understandability)习惯之一:行前缩进(Indentation),在此推荐使用软件WinEdt=已开发了基于WinEdt的R使用平台(X)Emacs=已开发了基于(X
14、)Emacs的R使用平台UltraEdit习惯之二:增加注释(Commenting),它是你的帮助 R中使用#作为注释语句的开始.习惯之三:变量的命名,使用意义明确的名字,切忌使用人或宠物的名字,例子 缩进 for(i in 1:1522)+gene.aov for(i in 1:1522)+gene.aov-aov(Intensity A+T+A*T,+sub=G=i)+res.mati,-residuals(gene.aov)+coef.mati,-coef(gene.aov)+,实例演示1Julian Faraway提供的一个简短的入门Introduction to R 使用 R GUI使用 R Commander使用 R_XEmacs Further reference:Moores The Basic Practice of Statistics,Second Edition(Freeman,2000),2.John Verzani 提供的统计学入门SimpleR-Using R for Introductory Statistics 使用R_WinEdt,