资源描述
精选优质文档-倾情为你奉上R语言学习总结经过接近一个学期的学习,从对R语言的完全陌生,到现在对其有了一些粗浅的认识,其中经历了遇到困难苦思冥想的艰辛,也有解决问题以后豁然开朗的畅快。在学习的过程中,以前掌握的数理基础给我带来了不少便利,而认真地态度和踏实的性格也使我获益匪浅。在这个学期中,我学会了R语言的基本操作和语法,以及针对具体的统计学问题相应的解决方法。并按时完成老师布置的课后作业,以达到学以致用的目的,也加强了对R语言操作的熟练度。一、初识R软件R软件是一套完整的数据处理、计算和制图软件系统。其功能包括:据存储和处理,数组运算,完整连贯的统计分析工具,优秀的统计制图功能已及简便而强大编程语言。接触R语言以后,我的第一感觉就是方便和强大。R语言中有非常多的函数和包,我们几乎不用自己去编一些复杂的算法,而往往只需要短短几行代码就能解决很复杂的问题,这给我们的使用带来了极大地方便;于此同时,它又可操纵数据的输入输出,实习分支、循环,使用者可以自定义功能,这就意味着当找不到合适的函数或包来解决所遇的问题时,我们又可以自己编程去实现各种具体功能,这也正是R语言的强大之处。二、学习心得在学习该书的过程中,我不仅加深了对统计学方法的理解,同时也掌握了R软件的编程方法和基本技巧,了解了各种函数的意义和用法,并能把两者结合起来,解决实际中的统计问题。1、R语言的基本语法及技巧R语言不仅可以进行基础的数字、字符以及向量的运算,内置了许多与向量运算有关的函数。而且还提供了十分灵活的访问向量元素和子集的功能。R语言中经常出现数组,它可以看作是定义了维数(dim属性)的向量。因此数组同样可以进行各种运算,以及访问数组元素和子集。二维数组(矩阵)是比较重要和特殊的一类数组,R可以对矩阵进行内积、外积、乘法、求解、奇异值分解及最小二乘拟合等运算,以及进行矩阵的合并、拉直等。apply()函数可以在对矩阵的一维或若干维进行某种计算,例如apply(A,1,mean)表示对A按行求和。R语言允许将不同类型的元素放在一个集合中,这个集合叫做一个列表,列表元素总可以用“列表名下标”的格式引用。而“列表名下标”表示的是一个子列表,这是一个很容易混淆的地方。R语言中非常重要的一种数据结构是data.frame(数据框),它通常是矩阵形式的数据,但每列可以是不同类型,数据框每列是一个变量,每行是一个观测,要注意的是每一列必须有相同的长度。数据框元素可以使用下标或者下标向量引用。用一个非常简单的例子来说明向量、矩阵和数据框的简单运用。输入:A-matrix(c(1:12),2,6,byrow=T) #A为一个2行6列,按行排列的矩阵 X-as.data.frame(A) #把A转化成数据框形式的XX1:2,seq(1,5,2) #输出X的第1、2行和1、3、5列 输出:V1 V3 V51 1 3 52 7 9 11输入:attach(X);R-V1/V5;R #调用数据框X,计算并输出V1和V5的比值 输出:1 0. 0.与此同时R语言中也提供了其它高级程序语言共有的分支、循环等程序控制结构。比如if/else语句,for循环等。因此R语言也可以很容易的根据情况编写自己所需要的函数。例:编写一个R程序,输入一个整数n,如果n小于等于0,中止运算,并输出:“要求输入一个正整数”;否则,如果n是偶数,则将n除2赋值给n;否则将3n+1赋给n。不断循环,直到n=1停止,并输出:“运算成功”解:新建一个程序脚本,名为chapter2.R”,写入代码:f-function(n)if(n=0) list(要求输入一个正整数)elserepeatif(n=1) break #n=1时终止 else if(n/2=as.integer(n/2) n-n/2 #n为偶数时除2 else n hp_per_cyl splat(hp_per_cyl)(mtcars1,)1 18.33333 splat(hp_per_cyl)(mtcars) 1 18.33333 18.33333 23.25000 18.33333 21.87500 17.50000 30.62500 15.50000 23.7500010 20.50000 20.50000 22.50000 22.50000 22.50000 25.62500 26.87500 28.75000 16.5000019 13.00000 16.25000 24.25000 18.75000 18.75000 30.62500 21.87500 16.50000 22.7500028 28.25000 33.00000 29.16667 41.87500 27.25000等价于: hp_per_cyl(mtcars$hp,mtcars$cyl)splat函数的优点就是可以不用拆分字段,可以一起输入作为参数。(2)与plyr函数合用: f ddply(mtcars,.(cyl),splat(f)2 each函数 作用:把多个函数汇聚成一个函数,当使用这个函数时,将分别作用多个函数。它的作用结果是把一个函数变成一个新函数。 不足:不能给作用的函数指定附加参数,只能使用默认参数。例: fun fun(1:10)等价于: f f(1:10)3 colwise函数colwise(.fun,.cols,.) 说明:.fun:要转化的函数;.cols是测试数据框的列是否应包含的判别函数或者是要包含的列的名称。catcolwise(.fun,.) 与colwise功能类似,只是对离散型变量有效numcolwise(.fun,.) 与colwise功能类似,只是对数值型变量有效作用:把作用于数据框行向量的函数(如mean,median等)转化为作用于数据框列向量的函数。于plyr函数一起使用十分方便。作用结果生成一个新的函数。例: nmissing colwise(nmissing)(baseball) colwise(nmissing,.(sb,cs,so)(baseball) ddply(baseball,.(year),colwise(nmissing,.(sb,cs,so) numcolwise(nmissing)(baseball)等价于:colwise(nmissing,is.numeric)(baseball) catcolwise(nmissing)(baseball)等价于:colwise(nmissing,is.discrete)(baseball)4 failwith函数failwith(default=NULL, f, quiet=FALSE) 作用:修正一个函数,使得当该函数出现错误时返回一个设定的默认值,默认为空。作用结果生成一个新的函数。 f f(1)Error in f(1) : Error safef safef(1)Error in f(.) : ErrorNULL safef safef(1)1 125 summarise()函数summarise(.data, .) 作用:对数据框做统计汇总,为设定的统计方法或函数 例:summarise(baseball,duration=max(year)-min(year),nteams=length(unique(team) duration nteams1 136 132head(ddply(baseball,id,summarise,duration=max(year)-min(year),nteams=length(unique(team) id duration nteams1 aaronha01 22 32 abernte02 17 73 adairje01 12 44 adamsba01 20 25 adamsbo03 13 46 adcocjo01 16 5数据集变量操作1 变量排序:arrange函数arrange(df, .(var1), .(var2)作用:按照指定列排序。注意:使用arrange函数排完序后行名会丢失,需要用cbind补回。例: arrange(mtcars,cyl,disp) cars arrange(cars,cyl,disp)-先把行名作为一个新的列加到数据框再排序2 更改变量名rename(x, replace, warn_missing=TRUE) 作用:通过名字修改变量名字,不是根据它的位置。例:head(rename(tmt,replace=c(mpg=avgpg,”cly”=”new”)3 取行或列的数据take(x, along, indices, drop = FALSE) 作用:在x中,按照某个维度取数。 参数说明:x为取数的源数据,可以是array或者dataframe; along:维度。1表示行,2表示列,3表示数组快等等; indices:具体维度所对应的指; drop:是否整合 例: take(mtcars,2,1) -取第一列 take(mtcars,1,1) -取第一行数据集操作1 数据集链接1) match_dfmatch_df(x, y, on=NULL)作用:x为原始的需要提取的数据框,y为条件数据框;on指定用来连接的变量,默认为两个数据框中所有变量,可以为多个。通过on后面的字段,到x数据框取选取数据,相当于inner join,区别为:前者结果集是x的一个子集;inner join包括两个数据框中所有字段。例:基础数据 a b c t1 t2 match_df(t1,t2,on=c(a,b) a b c1 a aa 12)joinjoin(x, y, by=NULL, type=“left”, match=“all”) 作用:连接两个数据框 参数说明:x,y为数据框;by=为要连接的字段,type为连接类型:left、right、full;match:all(所有匹配上的其他属性值都带上)、first(只带上匹配上的第一个属性值) join(t1,t2,by=x2,type=inner) join(t1,t2,by=x2,type=left) join(t1,t2,by=x2,type=right) tt1 tt2 join(tt1,tt2,by=x2,type=inner,match=all) x1 x2 y11 2 6 102 2 6 203 2 6 304 2 6 40 join(tt1,tt2,by=x2,type=inner,match=first) x2 x1 y12 6 2 102.1 6 2 102.2 6 2 102.3 6 2 10注意:merge和join相似,但是效率上join更优。3)merge例: x y merge(x,y) -根据相同字段默认内连接 merge(x,y,all=TRUE) -根据相同字段全链接 merge(x,y,all.x=TRUE) -左连接 merge(x,y,all.y=TRUE) -右连接 merge(x,y,by=c(a,x) -根据a和x两个字段连接 merge(x,y,by.x=a,by.y=y) -根据x表中a和y表中y连接数据统计1 *ply函数作用:拆分数据,应用函数,再组合函数作用后的数据输入:array、dataframe、list输出:array、dataframe、list、discarededa*ply(.data, .margins, .fun, ., .progress = none)参数说明:.data是要进行处理的数组.margins是用哪种方式去切割数据,取值为1,2,c(1,2).fun是对切割的数据指定一个函数进行处理.progress决定是否显示及用哪种方式显示进度条 aaply(a,1,mean,.progress=none) aaply(a,1,mean,.progress=text) -以文本形式展示进度条 aaply(a,1,mean,.progress=win) -windows窗口展示进度条d*ply(.data, .variables, .fun, ., .progress = none)参数说明:.variables指定要按其分割的变量名称daply(data,.(age),.fun=amean)daply(data,.(sex),.fun=amean)daply(data,.(age,sex),.fun=amean)ddply(data,.(sex),.fun=amean)dlply(data,.(sex),.fun=amean)l*ply(.data, .fun, ., .progress = none)说明:列表类型的数据是最简单的数据,因为它已经被分割成一个个了(也就是列表数据的一个个元素),所以这类函数没有参数用来描述是按什么进行切分的。llply(list,mean)laply(list,mean)ldply(list,mean)m*ply(.data,.fun=NULL,.inform=FALSE,)说明:把参数放到array或dataframe中整体输入作为参数,然后fun后面的函数运用.data中的相应数值作为参数分别作用,得到dataframe(mdply),array(maply)或者list(mlply)。与splat相似:m*ply(a_matrix, FUN)的作用和a*ply(a_matrix,1,splat(FUN)一样。data=data.frame(n=c(10,100,50),mean=c(5,5,10),sd=c(1,2,1) data n mean sd1 10 5 12 100 5 23 50 10 1 mlply(data,rnorm)2 观测值出现个数(1)count函数:count(df,vars=NULL, wt_var=NULL) 参数:df是要处理的数据框;vars是要进行分组统计的变量;wt_var为权重。 注意:该函数的功能类似于table例:基础数据:a=data.frame(names=c(a,b,c,d,a,a,a,b,b,c),wt=c(1,1,1,1,2,2,2,2,2,2) count(a,vars=names) -单变量分组 count(a,vars=names,wt_var=wt) -加上权重 count(a,c(names,wt) -双变量分组使用R软件可以方便直观的对数据进行描述性分析。如使用均值、中位数、顺序统计量等度量位置;用方差、标准差、变异系数等度量分散程度;以及用峰度系数、偏度系数度量分布形状。例如在窗口中输入:x-seq(1,589,3)length(x);mean(x);var(x);sd(x);median(x);100*sd(x)/mean(x)1 197 #长度1 295 #均值1 29254.5 #方差1 171.0395 #标准差1 295 #中位数1 57.97948 #样本标准差n-length(x);m-mean(x);s-sd(x)n/(n-1)*(n-2)*sum(x-m)3)/s3;(n*(n+1)/(n-1)*(n-2)*(n-3)*sum(x-m)4)/s4- (3*(n-1)2)/(n-2)*(n-3)1 0 #偏度系数1 -1.2 #峰度系数R软件可以检验样本是不是来自某种分布总体,以正态分布为例,我们可以通过shapiro.test()函数提供W统计量和相应的p值,并通过p值的大小判断样本是否来自正态分布的总体。经验分布的K-S检验方法的应用范围则更加广泛,不仅可以判断样本是否来自正态总体,也能判断是否来自其它类型的分布总体。除此之外,R语言还有强大的画图功能,例如我们可以通过作直方图、茎叶图和总体分析来描述数据的分布。R中的高水平作图函数有:plot()、pairs()、coplot()、qqnorm()、hist()等等。当高水平作图函数并不能完全达到作图的指标时,需要低水平的作图函数予以补充。低水平作图函数有:points()、lines()、text()、polygon()、legend()、title()和axis()等。需要注意的是低水平作图函数必须是在高水平作图函数所绘图形的基础之上增加新的图形。hist()函数可以做出已知数据的直方图,stem()函数可以作茎叶图,boxplot()函数可用作箱线图,qqline()和qqmorm()可以做出正态QQ图和相应的直线。R语言同时还能对两组数据进行相关性检验,cor.test()函数提供了Pearson相关性检验,Spearman秩检验和Kendall秩检验。其原假设为两组数据不相关,通过p值的大小来判断是否拒绝原假设。我们还能用stars()函数作出星图,来表示多元数据,以上用法都非常简单易用,这里就不再赘述。3、R语言在统计推断中的应用首先,R语言可以用来进行参数估计;统计学中我们应用矩估计和极大似然估计来进行点估计,矩估计是通过解正规方程组得到参数估计的值;极大似然估计通过解极大似然函数的极值点得到参数估计的值。在R中我们可以使用Newton迭代法求解正规方程组,获得矩估计;用optimize()函数求解极大似然函数,获得最大似然估计;由此可见,R语言能够很方便的解决参数点估计问题。点估计给出未知参数的近似值以后,并不能知道这种估计的精确性如何,可信程度如何,为了解决这些问题,就需要用到区间估计,在学习用R语言解决区间估计问题的过程中,我最大的体会就是R软件中内置的一些函数极大地方便了我们处理具体问题。比如t.test()函数。对单个正态总体,向量x包含了来自该总体的一个样本,我们可以直接用t.test(x)指令得到均值u的点估计和区间估计;对于两个正态总体,向量y包含了来自第二个总体的一个样本,我们可以用t.test(x,y)来得到均值差u1-u2的点估计和区间估计,其中当两个总体方差相同时,只需要加上var.equal=T(缺省值为F,即默认两个总体的方差是不同的);同时t.test()函数不仅可以进行双侧置信区间估计,也能进行单侧置信区间估计,只需要在括号内加上al=”l”或者al=”g”。当数据不服从正态分布是,可以利用中心极限定理,取较大的样本量,构造近似服从正态分布的统计量进行估计。其次,R语言可以用来进行假设检验。假设检验也是统计推断中的一个重要的内容,在统计学中,我们用搜索到的数据对某个事先作出的统计假设按照某种设计好的方法进行检验,来判断此假设是否正确。也就是说为了检验一个假设是否成立,先假定它是成立的,看看由此会导致什么结果。如果导致一个不合理的现象出现,就认为原假设不正确,如果没有导出不合理的现象,则不能拒绝原假设。R软件给出了参数假设检验的方法。以正态总体为例,t.test()函数也可以用来进行单个或者两个正态总体的均值的假设检验。进行单边检验时可以加入指令alternative(备择假设),缺省时表示双边检验,less表示备择假设为uu0,greater则相反,用conf.level指定置信水平。X-c(78.1,72.4,76.2,74.3,77.4,78.4,76.0,75.5,76.7,77.3)Y-c(79.1,81.0,77.3,79.1,80.0,79.1,79.1,77.3,80.2,82.1)t.test(X,Y,var.equal=T,al=”l”)输出:Two Sample t-testdata: X and Yt = -4.2957, df = 18, p-value = 0.alternative hypothesis: true difference in means is less than 095 percent confidence interval:-Inf -1.sample estimates:mean of x mean of y76.23 79.43结果中我们不仅能得到X和Y的均值的点估计76.23和79.43、左侧区间估计、同时也能通过p值的大小判断是否接受原假设,该例中p0.05,认为拒绝原假设,即认为两总体方差不同。与均值假设检验相类似。R语言中还可以用var.test()函数进行正态总体的方差假设检验。而且R语言不仅能就正态总体进行均值和方差检验,也能对其他总体分布进行检验。例如用binom.test()进行二项分布的检验和估计。习题中检验铁剂和饮食两种方法治疗后患者病情表现有无差异:x-c(113,120,138,120,100,118,138,123)y-c(138,116,125,136,110,132,130,110)binom.test(sum(xy),8)Exact binomial testdata: sum(x y) and 8number of successes = 4, number of trials = 8, p-value = 1alternative hypothesis: true probability of success is not equal to 0.595 percent confidence interval:0. 0.sample estimates:probability of success 0.5由结果我们可以判断两种诊断方法无显著差异(其中用到的统计学原理见下面的符号检验)。参数假设检验假定了总体分布的具体形式,但实际问题中我们往往不知道总体的分布,很难对总体的分布做出假定,所有要尽量从样本本身获得所需要的信息,即非参数检验方法。R语言中有很多种非参数的检验方法,这里仅介绍几个较为重要的方法。Pearson拟合优度的卡方检验:首先假设随机变量有某种分布,将数轴分成m个区间,然后用样本落在每个区间内的个数和其期望构造K统计量,当n很大是,K依分布收敛于自由度为m-1的卡方分布。然后进行参数假设检验。在R语言中可以用chisq.test()函数来实现。符号检验可以用来检验一个样本是否来自某个总体,或者检验两个总体是否有显著区别。对于前者,如果样本中位数等于假设的总体的中位数,我们就认为样本来自该假设,此时每个样本中位数和总体中位数的差额应该正负各一半,所以可以用p=0.5的二项分布来检验。对于后者,如果认为两个总体无显著差异,则对应的两个样本观测值正负差额的个数应该大体相当,即正负各占一半,像单个样本一样,检验其是否来自p=0.5的二项分布。这在R语言中只需要用binom.test()函数就能实现。秩统计量检验是一种经常被用来检验分布无关性的非参数检验,R语言提供了Spearman、Kendall和Wilcoxon三种秩检验方法,前两种可以用cor.test()函数实现,最后一种可以用wilcox.test()函数实现。最后,R语言还可以用来处理回归分析问题对于普通的多元线性回归模型,已知被解释变量y和i个解释变量的样本数据,利用R语言中的lm()函数可以非常方便的求出各解释变量的回归参数,并做相应的检验。以 y=0+1x+2z+ 为例,将数据赋给各个变量后,只需要输入lm-lm(y1+x+z) ;summary(lm)就能得到参数估计值、每个参数估计值的标准差、参数显著性的t检验和总体显著性的F检验,以及模型的拟合优度等信息。然后我们可以用predict()函数非常方便的求出预测值和预测区间,同样我们还能用前面介绍过的plot()和abline()等函数做出各种图形来进行回归分析。当然之前讲的都是比较理想的情况,而现实中往往影响被解释变量y的因素很多,我们希望找出若干个比较关键的变量建立回归方程,这便涉及变量选择的问题。选择“最优”变量的方法有很多,比较常用的一种是逐步回归法。总的来说,R语言归根到底只是我们解决问题的工具,而我们对问题的分析首先是要根据理论进行的,例如参数估计、假设检验以及线性回归、时间序列方面的知识,我们只有深刻理解这些理论背后的意义,才能用对R语言中的各个方法,就好比战场上如果R是利刃,理论知识就是我们的身体和战术素养,只有我们学好了理论知识,才能面对一个个问题迎刃而解。我深知自己在R语言的道路上还走的太短,仅仅只是学到了些皮毛,我一定要更加努力深入的学习,在今后的学习实践中获得更多的知识,成长起来,为即将到来的实习及工作打下坚实的基础。专心-专注-专业
展开阅读全文