精品文档
.
R语言学习汇总报告
经过接近一个学期的学习,从对R语言的完全陌生,到现在对其有了一些粗浅的认识,其
中经历了遇到困难苦思冥想的艰辛,也有解决问题以后豁然开朗的畅快。在学习的过程中,以
前掌握的数理基础给我带来了不少便利,而认真地态度和踏实的性格也使我获益匪浅。
在这个学期中,我学会了R语言的基本操作和语法,以及针对具体的统计学问题相应的解
决方法。并按时完成老师布置的课后作业,以达到学以致用的目的,也加强了对R语言操作的
熟练度。
一、初识R软件
R软件是一套完整的数据处理、计算和制图软件系统。其功能包括:据存储和处理,数组
运算,完整连贯的统计分析工具,优秀的统计制图功能已及简便而强大编程语言。
接触R语言以后,我的第一感觉就是方便和强大。R语言中有非常多的函数和包,我们几
乎不用自己去编一些复杂的算法,而往往只需要短短几行代码就能解决很复杂的问题,这给我
们的使用带来了极大地方便。于此同时,它又可操纵数据的输入输出,实习分支、循环,使用
者可以自定义功能,这就意味着当找不到合适的函数或包来解决所遇的问题时,我们又可以自
己编程去实现各种具体功能,这也正是R语言的强大之处。
二、学习心得
在学习该书的过程中,我不仅加深了对统计学方法的理解,同时也掌握了R软件的编程方
法和基本技巧,了解了各种函数的意义和用法,并能把两者结合起来,解决实际中的统计问
题。
1、R语言的基本语法及技巧
R语言不仅可以进行基础的数字、字符以及向量的运算,内置了许多与向量运算有关的函
数。而且还提供了十分灵活的访问向量元素和子集的功能。R语言中经常出现数组,它可以看
作是定义了维数(dim属性)的向量。因此数组同样可以进行各种运算,以及访问数组元素和
子集。二维数组(矩阵)是比较重要和特殊的一类数组,R可以对矩阵进行内积、外积、乘
法、求解、奇异值分解及最小二乘拟合等运算,以及进行矩阵的合并、拉直等。apply()函数
可以在对矩阵的一维或若干维进行某种计算,例如apply(A,1,mean)表示对A按行求和。
R语言允许将不同类型的元素放在一个集合中,这个集合叫做一个列表,列表元素总可以
用“列表名[[下标]]”的格式引用。而“列表名[下标]”表示的是一个子列表,这是一个很容
易混淆的地方。R语言中非常重要的一种数据结构是(数据框),它通常是矩阵形
式的数据,但每列可以是不同类型,数据框每列是一个变量,每行是一个观测,要注意的是每
一列必须有相同的长度。数据框元素可以使用下标或者下标向量引用。
用一个非常简单的例子来说明向量、矩阵和数据框的简单运用。
输入:
A<-matrix(c(1:12),2,6,byrow=T)#A为一个2行6列,按行排列的矩阵X<-
(A)#把A转化成数据框形式的X
精品文档
.
X[1:2,q(1,5,2)]#输出X的第1、2行和1、3、5列
输出:
V1V3V5
1135
27911
输入:
attach(X);R<-V1/V5;R#调用数据框X,计算并输出V1和V5的比值
输出:
[1]0.20000000.6363636
与此同时R语言中也提供了其它高级程序语言共有的分支、循环等程序控制结构。比如
if/el语句,for循环等。因此R语言也可以很容易的根据情况编写自己所需要的函数。
例:编写一个R程序,输入一个整数n,如果n小于等于0,中止运算,并输出:“要求输
入一个正整数”。否则,如果n是偶数,则将n除2赋值给n。否则将3n+1赋给n。不断循环,
直到n=1停止,并输出:“运算成功”
解:新建一个程序脚本,名为chapter2.R”,写入代码:
f<-function(n){
if(n<=0)list("要求输入一个正整数")
el{repeat{
if(n==1)break#n=1时终止elif(n/2==r(n/2))n<-n/2#n为偶数时除2
eln<-3*n+1
}
list("运算成功")
}
}
在R窗口中
输入:
Source(“chapter2.R”);f(32)
输出:
[1]"运算成功"
输入:
f(-5)
输出:
[1]"要求输入一个正整数"
2、R在统计描述中的应用
数据框操作(plyr包)
辅助小函数
1splat函数:
作用:把原函数中多个参数打包为一个list作为参数,然后输出新的函数。也就是说本来
某个函数需要输入多个参数,现在套上splat后,只要输入一个参数list就可以了,
不需要单独地输入参数。它的作用结果是把一个函数变成一个新函数。
m*ply(a_matrix,FUN)的作用和a*ply(a_matrix,1,splat(FUN))一样
例:
(1)参数使用
>hp_per_cyl<-function(hp,cyl,...)hp/cyl
精品文档
.
>splat(hp_per_cyl)(mtcars[1,])
1]18.33333
>splat(hp_per_cyl)(mtcars)
[1]18.3333318.3333323.2500018.3333321.8750017.50000
30.6250015.5000023.75000
[10]20.5000020.5000022.5000022.5000022.5000025.62500
26.8750028.7500016.50000
[19]13.0000016.2500024.2500018.7500018.7500030.62500
21.8750016.5000022.75000
[28]28.2500033.0000029.1666741.8750027.25000
等价于:
>hp_per_cyl(mtcars$hp,mtcars$cyl)
splat函数的优点就是可以不用拆分字段,可以一起输入作为参数。
(2)与plyr函数合用:
>f<-function(mpg,wt,...)(mw=mpg/wt)
>ddply(mtcars,.(cyl),splat(f))
2each函数
作用:把多个函数汇聚成一个函数,当使用这个函数时,将分别作用多个函数。它的作用
结果是把一个函数变成一个新函数。
不足:不能给作用的函数指定附加参数,只能使用默认参数。
例:
>fun<-function(x)c(min=min(x),max=max(x),mean=mean(x))
>fun(1:10)
等价于:
>f<-each(min,max,mean)
>f(1:10)
3colwi函数
colwi(.fun,.cols,...)
说明:.fun:要转化的函数。.cols是测试数据框的列是否应包含的判别函数或者
是·要包含的列的名称。
catcolwi(.fun,...)与colwi功能类似,只是对离散型变量有效
numcolwi(.fun,...)与colwi功能类似,只是对数值型变量有效
作用:把作用于数据框行向量的函数(如mean,median等)转化为作用于数据框列向量
的函数。于plyr函数一起使用十分方便。作用结果生成一个新的函数。
例:
>nmissing<-function(x)sum((x))
>colwi(nmissing)(baball)
>colwi(nmissing,.(sb,cs,so))(baball)
>ddply(baball,.(year),colwi(nmissing,.(sb,cs,so)))
>numcolwi(nmissing)(baball)
等价于:colwi(nmissing,c)(baball)
>catcolwi(nmissing)(baball)
等价于:colwi(nmissing,te)(baball)
精品文档
.
4failwith函数
failwith(default=NULL,f,quiet=FALSE)
作用:修正一个函数,使得当该函数出现错误时返回一个设定的默认值,默认为空。作
用结果生成一个新的函数。
>f<-function(x)if(x==1)stop("Error")el1
>f(1)
Errorinf(1):Error
>safef<-failwith(,f)
>safef(1)
Errorinf(...):Error
NULL
>safef<-failwith(12,f,quiet=TRUE)
>safef(1)
[1]12
5summari()函数
summari(.data,...)
作用:对数据框做统计汇总,…为设定的统计方法或函数
例:
>summari(baball,duration=max(year)-
min(year),nteams=length(unique(team)))
durationnteams
1136132
>head(ddply(baball,"id",summari,duration=max(year)-
min(year),nteams=length(unique(team))))
iddurationnteams
1aaronha01223
2abernte02177
3adairje01124
4adamsba01202
5adamsbo03134
6adcocjo01165
数据集变量操作
1变量排序:arrange函数
arrange(df,.(var1),.(var2)…)
作用:按照指定列排序。
注意:使用arrange函数排完序后行名会丢失,需要用cbind补回。
例:
>arrange(mtcars,cyl,disp)
>cars<-cbind(vehicle=(mtcars),mtcars)
>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_df
match_df(x,y,on=NULL)
作用:x为原始的需要提取的数据框,y为条件数据框。on指定用来连接的变量,默认为
两个数据框中所有变量,可以为多个。通过on后面的字段,到x数据框取选取数
据,相当于innerjoin,区别为:前者结果集是x的一个子集。innerjoin包括两个数
据框中所有字段。
例:
基础数据
>a<-c("a","b","c","d")
>b<-c("aa","bb","aa","dd")
>c<-c(1,2,3,4)
>t1<-(a,b,c)
>t2<-(a=c("a","c","e"),b=c("aa","ab","cd"))
>match_df(t1,t2,on=c("a","b"))
abc
1aaa1
2)join
join(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<-(x1=c(1,2,3,4),x2=c(5,6,7,8))
精品文档
.
>tt2<-(y1=c(1,2,3,4)*10,x2=c(6,6,6,6))
>join(tt1,tt2,by="x2",type="inner",match="all")
x1x2y1
12610
22620
32630
42640
>join(tt1,tt2,by="x2",type="inner",match="first")
x2x1y1
26210
2.16210
2.26210
2.36210
注意:merge和join相似,但是效率上join更优。
3)merge
例:
>x<-(a=c(1,2,4,5,6),x=c(9,12,14,21,8))
>y<-(a=c(1,3,4,6),y=c(8,14,19,2),x=c(2,3,4,5))
>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、discareded
a*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,.(x),.fun=amean)
>daply(data,.(age,x),.fun=amean)
>ddply(data,.(x),.fun=amean)
>dlply(data,.(x),.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=(n=c(10,100,50),mean=c(5,5,10),sd=c(1,2,1))
>data
nmeansd
11051
210052
350101
>mlply(data,rnorm)
2观测值出现个数
(1)count函数:
count(df,vars=NULL,wt_var=NULL)
参数:df是要处理的数据框。vars是要进行分组统计的变量。wt_var为权重。
注意:该函数的功能类似于table
例:
基础数据:
>a=(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<-q(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)/s^3;((n*(n+1))/((n-1)*(n-2)*(n-3))*sum((x-
m)^4)/s^4-(3*(n-1)^2)/((n-2)*(n-3)))
[1]0#偏度系数
[1]-1.2#峰度系数
R软件可以检验样本是不是来自某种分布总体,以正态分布为例,我们可以通过
()函数提供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语言同时还能对两组数据
进行相关性检验,()函数提供了Pearson相关性
检验,Spearman秩检验和Kendall秩检验。其原假设为两组数据不相关,通过p值的大小
来判断是否拒绝原假设。我们还能用stars()函数作出星图,来表示多元数据,以上用法都非
常简单易用,这里就不再赘述。
3、R语言在统计推断中的应用
首先,R语言可以用来进行参数估计。
统计学中我们应用矩估计和极大似然估计来进行点估计,矩估计是通过解正规方程组得到
参数估计的值。极大似然估计通过解极大似然函数的极值点得到参数估计的值。在R中我们可
以使用Newton迭代法求解正规方程组,获得矩估计。用optimize()函数求解极大似然函数,
获得最大似然估计。由此可见,R语言能够很方便的解决参数点估计问题。
点估计给出未知参数的近似值以后,并不能知道这种估计的精确性如何,可信程度如何,
为了解决这些问题,就需要用到区间估计,在学习用R语言解决区间估计问题的过程中,我最
大的思想到就是R软件中内置的一些函数极大地方便了我们处理具体问题。比如()函
数。对单个正态总体,向量x包含了来自该总体的一个样本,我们可以直接用(x)指令
得到均值u的点估计和区间估计。对于两个正态总体,向量y包含了来自第二个总体的一个样
本,我们可以用(x,y)来得到均值差u1-u2的点估计和区间估计,其中当两个总体方差
相同时,只需要加上=T(缺省值为F,即默认两个总体的方差是不同的)。同时
()函数不仅可以进行双侧置信区间估计,也能进行单侧置信区间估计,只需要在括号内
加上al=”l”或者al=”g”。当数据不服从正态分布是,可以利用中心极限定理,取较大的
样本量,构造近似服从正态分布的统计量进行估计。
其次,R语言可以用来进行假设检验。
假设检验也是统计推断中的一个重要的内容,在统计学中,我们用搜索到的数据对某个事
先作出的统计假设按照某种设计好的方法进行检验,来判断此假设是否正确。也就是说为了检
验一个假设是否成立,先假定它是成立的,看看由此会导致什么结果。如果导致一个不合理的
现象出现,就认为原假设不正确,如果没有导出不合理的现象,则不能拒绝原假设。
R软件给出了参数假设检验的方法。以正态总体为例,()函数也可以用来进行单个
或者两个正态总体的均值的假设检验。进行单边检验时可以加入指令alternative(备择假
精品文档
.
设),缺省时表示双边检验,less表示备择假设为u
定置信水平。
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)
(X,Y,=T,al=”l”)
输出:TwoSamplet-test
data:XandY
t=-4.2957,df=18,p-value=0.0002176
alternativehypothesis:truedifferenceinmeansislessthan0
95percentconfidenceinterval:
-Inf-1.908255
sampleestimates:
meanofxmeanofy
76.2379.43
结果中我们不仅能得到X和Y的均值的点估计76.23和79.43、左侧区间估计、同时也能通
过p值的大小判断是否接受原假设,该例中p<0.05,认为拒绝原假设,即认为两总体方差不
同。与均值假设检验相类似。
R语言中还可以用()函数进行正态总体的方差假设检验。而且R语言不仅能就正
态总体进行均值和方差检验,也能对其他总体分布进行检验。例如用()进行二项分
布的检验和估计。习题中检验铁剂和饮食两种方法治疗后患者病情表现有无差异:
x<-c(113,120,138,120,100,118,138,123)
y<-c(138,116,125,136,110,132,130,110)
(sum(x
Exactbinomialtest
data:sum(x
numberofsuccess=4,numberoftrials=8,p-value=1
alternativehypothesis:trueprobabilityofsuccessisnotequalto0.5
95percentconfidenceinterval:
0.15701280.8429872
sampleestimates:
probabilityofsuccess0.5
由结果我们可以判断两种诊断方法无显著差异(其中用到的统计学原理见下面的符号检
验)。
参数假设检验假定了总体分布的具体形式,但实际问题中我们往往不知道总体的分布,很
难对总体的分布做出假定,所有要尽量从样本本身获得所需要的信息,即非参数检验方法。
R语言中有很多种非参数的检验方法,这里仅介绍几个较为重要的方法。Pearson拟合优度
的卡方检验:首先假设随机变量有某种分布,将数轴分成m个区间,然后用样本落在每个区间
内的个数和其期望构造K统计量,当n很大是,K依分布收敛于自由度为m-1的卡方分布。然
后进行参数假设检验。在R语言中可以用()函数来实现。符号检验可以用来检验一
个样本是否来自某个总体,或者检验两个总体是否有显著区别。对于前者,如果样本中位数等
于假设的总体的中位数,我们就认为样本来自该假设,此时每个样本中位数和总体中位数的差
额应该正负各一半,所以可以用p=0.5的二项分布来检验。对于后者,如果认为两个总体无显
著差异,则对应的两个样本观测值正负差额的个数应该大体相当,即正负各占一半,像单个样
本一样,检验其是否来自p=0.5的二项分布。这在R语言中只需要用()函数就能实
现。秩统计量检验是一种经常被用来检验分布无关性的非参数检验,R语言提供了Spearman、
Kendall和Wilcoxon三种秩检验方法,前两种可以用()函数实现,最后一种可以用
精品文档
.
()函数实现。
最后,R语言还可以用来处理回归分析问题
对于普通的多元线性回归模型,已知被解释变量y和i个解释变量的样本数据,利用R语
言中的lm()函数可以非常方便的求出各解释变量的回归参数,并做相应的检验。以
y=β0+β1x+β2z+ε为例,
将数据赋给各个变量后,只需要输入lm<-lm(y~1+x+z);summary(lm)就能得到参数估计
值、每个参数估计值的标准差、参数显著性的t检验和总体显著性的F检验,以及模型的拟合
优度等信息。然后我们可以用predict()函数非常方便的求出预测值和预测区间,同样我们还
能用前面介绍过的plot()和abline()等函数做出各种图形来进行回归分析。
当然之前讲的都是比较理想的情况,而现实中往往影响被解释变量y的因素很多,我们希
望找出若干个比较关键的变量建立回归方程,这便涉及变量选择的问题。选择“最优”变量的
方法有很多,比较常用的一种是逐步回归法。
总的来说,R语言归根到底只是我们解决问题的工具,而我们对问题的分析首先是要根据
理论进行的,例如参数估计、假设检验以及线性回归、时间序列方面的知识,我们只有深刻理
解这些理论背后的意义,才能用对R语言中的各个方法,就好比战场上如果R是利刃,理论知
识就是我们的身体和战术素养,只有我们学好了理论知识,才能面对一个个问题迎刃而解。
我深知自己在R语言的道路上还走的太短,仅仅只是体会了些皮毛,我一定要更加努力深入
的学习,在今后的学习实践中获得更多的知识,成长起来,为即将到来的实习及工作打下坚实的
基础。
本文发布于:2022-12-29 16:39:18,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/54244.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |