查回归诊断的时候,无意发现一个帖子,从《R语言实战》第二版里搬过来的。这本书躺在我硬盘里很久了,包括第一版,汗颜。捡起来翻了一下,才发现这本书是多么的有意思,也许是到我现在这个境况,对R的认知程度,才发现这本书的有趣之处。
随手记录下一些碎碎念,主要是我以前没有注意,又老是犯错误的地方吧,就不讲究格式了,希望能早点把“之一”这个尾巴了结掉。
1、R语言编程中的常见错误:大小写错误、必要的引号、函数调用加括号,在win下,路径名中使用了\,R将反斜杠视为转义字符。Setwd("c:\mydata")会报错,正确的写法是: Setwd("c:\mydata") 或者 Setwd("c:/mydata")
2、文本输出:函数sink(“filename”)将输出重定向到文件filename中。默认情况下,如果文件已经存在,直接覆盖。使用参数append=TRUE将追加文本在文件后。参数split=TRUE可将输出同时发送到屏幕和文件中。不加参数调用sink()将仅向屏幕输出结果。
3、图形输出:sink()只能重定向文本输出,对图像没有影响。用于保存图像输出的函数有bmp、jpeg、pdf、png、svg、win.metafile等,最后使用dev.off()将输出返回到终端。
pdf("mygraph.pdf")
attach(mtcars)
plot(wt,mpg)
abline(lm(mpg~wt))
title("Regression of MPG on Weight")
dev.off()
要创建次要刻度线,需要使用Hmisc包中的minor.tick()函数。
可以使用类似TeX的写法为图形添加数学符号和公式。Help(plotmath)。 函数plotmath()可以为图形主体或边界上的标题、坐标轴或文本添加数学符号。
使用函数par()或layout()可以组合图形
mfrow=c(nrows,ncols)
mfcol=c(nrows,ncols)
函数layout()调用形式为layout(mat),其中mat是一个矩阵,指定了要组合的多个图形的所在位置:layout(matrix(c1,1,2,3),2,2,byrow=TRUE),意思是第一幅图在第一行,另两幅图在第二行。为了更精确的控制,可以有选择的在layout()函数中使用widths=或heights=两个参数:Widths=各列宽度值组成的一个向量,Heights=各行高度值组成的一个向量
图形布局的精细控制fig:
opar<-par(no.readonly=TRUE)
par(fig=c(0,0.8,0,0.8),mtcars$mpg)
par(fig=c(0,0.8,0.55,1),new=TRUE)
boxplot(mtcars$wt)
par(fig=c(0.65,1,0,0.8),new=TRUE)
boxplot(mtcars$mpg)
fig=默认会新建一幅图形,如果要添加一幅图到现有的图上,需要设定参数new=TRUE
4、包的使用:库所在的位置,使用函数“.libPaths()”,search()可以知道哪些包已经加载并可使用。update.packages()可以更新已经安装的包。 要了解某个函数的返回值,查阅这个函数在线帮助文档中的Value部分即可。
5、数据集。 不同的行业对于数据集的行和列的叫法不同。统计学家称为观察(observation)和变量(variable),数据库分析师称为记录(record)和字段(field),数据挖掘和机器学习学科的学者称为示例(example)和属性(attribute)。 R将实例标识符称为rownames(行名),将类别型(包括名义型和有序型)变量称为因子(factors)。 名义型变量是没有顺序之分的类别变量,如病的类型Diabetes(Type1、Type2)是名义型变量。有序型变量表示一种顺序关系,而非数量关系,如病情status(poor、improved、excellent)。 类别(名义型)变量和有序类别(有序型)变量在R中称为因子(factor)。 要表示有序型变量,需要为函数factor()指定参数ordered=TRUE。 可以通过指定levels选项来覆盖默认排序:
status<-factor(status,order=TRUE,levels=c("poor","Improved","excellent"))
6、加载数据可用attach()、detach()和with(). Attach()可将数据框添加到R中,detach()将数据框从R中移除。 attach和detach最好在变量名较少的情况下使用,不能存在多个同名的对象。任何情况下,都要当心那些告知某个对象已经被屏蔽(masked)的警告。 除此之外,另一种形式是使用with(),函数with()的局限在于,赋值仅在此函数的括号内生效,如果需要创建with()结构以外存在的对象,使用特殊赋值符号<<-代替标准赋值符<-,可将对象保存到with()之外的全局环境中。
with(mtcars,{
Stats<-summary(mpg)
Stats_keep<<-summary(mpg)
}
stats和stats_keep不同。
within和with类似,within允许修改数据框。
7、读取数据 函数read.table(),读取大型文本文件时,加上colClasses选项可以可观的提升处理的速度。默认情况下,read.table()把字符变量转换为因子,如不需要,可以加上参数stringAsFactors=FALSE,此外还可以使用colClasses选项对每一列指定一个类。
读取压缩文件:gzfile(),bzfile(),xzfile(),unz()等。
8、访问数据库。 ODBC接口,install.packages("RODBC")
RODBC中的函数:
odbcConnect(dsn,uid="",pwd="") 建立一个到ODBC数据库的连接
sqlFetch(channel,sqltable) 读取ODBC数据库中的某个表到一个数据框中
sqlQuery(channel,query) 向ODBC数据库提交一个查询并返回结果
sqlSave(channel,mydf,tablename=sqltable,append=FALSE) 将数据框写入或更新(appedn=TRUE)到ODBC数据库中的某个表中
sqlDrop(channel,sqltable) 删除ODBC数据库中的某个表
Close(channel)关闭连接
假如想将某个数据库中两个表分别导入R中的数据框:
library(RODBC)
myconn<-odbcConnect("Mydsn",uid="username",pwd="password")
df1<-sqlFetch(myconn,Mydsn_sheets1)
df2<-sqlQuery(myconn,"select * from sheets2")
colse(myconn)
函数sqlQuery()可以插入任意sql语句。
可以安装sqldf包,使用sqldf()函数在数据框上使用sql中的select语句。
9、创建新变量.transform()函数:mydata<-transform(mydata,sumx=x1+x2,meanx=(x1+x2)/2)
10、缺失值:缺失值被认为是不可比较的,即便是与缺失值自身的比较。因此无法使用比较运算符来检测缺失值是否存在,例如,逻辑测试myvar==NA的结果永远不会为TRUE。作为替代,只能使用处理缺失值的函数来识别出R数据对象中的缺失值。 同时R不把无限或者不可能出现的数值标记为缺失值。正无穷和负无穷分别用Inf和-Inf标记,因此5/0返回Inf,不可能的值(比如sin(Inf))用NaN符号标记(not a number),如要识别这些数值,需要用is.infinite()或is.nan() 多数数值函数都有一个na.rm=TRUE选项,计算之前移除缺失值,也可以用函数na.omit()移除所有含有缺失值的观测(删除含有缺失数据的行).
11、排序 order(),默认升序,在变量前加减号得到降序的排序结果
Df[order(gender,age),]
Df[order(gender,-age),]
12、合并
merge(df1,df2,by="ID")
Rbind
cbind
13、丢弃变量
Myvars<-names(df) %in% c("ID1","ID2")
Newdf<-df[!myvars]
14、数据管理. trim截尾:Mean(x,trim=0.05,na.rm=TRUE),丢弃最大5%和最小5%的数据后的算术平均数。
数据标准化scale():对数据框或矩阵的指定列进行均值为0,标准差为1的标准化 newdf<-scale(df) 要对每一列进行任意均值和标准差的标准化:newdf<-sacle(df)SD+M,M是想要的均值,SD是想要的标准差。要对指定列而不是整个矩阵或数据框标准化:newdf<-transform(df,myvar=scale(myvar)SD+M)
概率函数:[dpqr] distribution_abbreviation(), 第一个字母表示所指分布的某一个方面:
d=密度函数(desity)
p=分布函数(distribution function)
q=分位数函数(quantile,function)
r=生成随机数(随机偏差)
Seq(from,to,by)
Rep(x,n)
Pretty(x,n) 创建美观的分割点。
Apply(x,MARGIN,FUN,…):x是数据对象,MARGIN是维度的下标,MARGIN=1表示行,MARGIN=2表示列。
Sapply()中的"["是一个可以提取某个对象的一部分的函数:
Firstname<-sapply(name,"[",1)
Lastname<-sapply(name,"[",2)
15、整合与重构
t()转置(反转行和列)
R中使用一个或多个by变量和一个预先定义好的函数来折叠(collapse)数据:aggregate(x,by,FUN),其中x是待折叠的数据对象,by是一个变量名组成的列表,这些变量将被去掉以形成新的观测,FUN是用来计算描述性统计量的标量函数。
Reshape2包可以实现数据融合(melt)和数据重铸(cast)。数据融合melt(mydata,id=c("ID1",ID2"),实际是重构,让每个观测变量独占一行,行中带有唯一确定这个观测所需的标识符变量。数据重铸dcast(mydata,formula,fun.aggregate),mydata为已经融合的数据,formula描述了想要的最后结果,fun.aggregate(可选)数据整合函数,其接受的公式形如:rowvar1+rowvar2+…~colvar1+corvar2+…这个公式中,rowvar1+rowvar2+…定义了要划掉的变量集合,以确定各行的内容,而colvar1+colvar2+…定义了要划掉的、确定各列内容的变量集合。
16、描述性统计
除了基础函数summary()以外,psych包和Hmisc包均提供了describe()函数,最后载入的包优先,如果先载入Hmisc,再载入psych,使用describe(),默认为后载入的psych包里的describe,如果要使用Hmisc包,需要采用 Hmisc::describe(mydata)
by(data,INDICES,FUN),data是数据框或矩阵,INDICES是一个因子或因子组成的列表,定义了分组,FUN是任意函数。
table()函数默认忽略缺失值(NA),要在统计频率时将NA视为有效的类别,设定参数useNA="ifany"
cor()相关系数:cor(x,use=,method=)。use指定缺失数据的处理方式,method指定相关系数的类型,可选pearson,spearman或kendall。
cov()协方差
偏相关,在控制一个或多个定量变量时,另外两个定量变量之间的相互关系。在ggm包中的pcor()函数。pcor(u,s)。u是一个数值变量,前两个数值表示要计算相关系数的变量下标,其余的数值为条件变量(即要排除影响的变量)的下标。s为变量的协方差阵。
library(ggm)
colnames(states)
[1] "population","income","illiteracy","life exp","murder","HS Grad"
pcor(c(1,5,2,3,6),cov(states))
[1] 0.346
在控制了收入、文盲率和高中毕业率的影响时,人口和murder之间的相关系数为0.346
相关性检查,psych包中提供的corr.test()函数
library(psych)
corr.test(states,use="complete")
得到相关系数矩阵。use取值可为"pairwise"或“complete"(分别表示对缺失值执行成对删除或行删除),method=的取值为”pearson“(默认值)、spearman或kendall。
ggm包中的pcor.test()用来检验在控制一个或多个额外变量时,两个变量之间的条件独立性。使用格式为pcor.test(r,q,n),其中r是由pcor()函数计算得到的偏相关系数,q为要控制的变量数(以数值表示位置),n为样本大小。
17、中级绘图
在散点图上lines(lowess(a,b),col=,lwd=,lty=),添加一条平滑曲线,该平滑曲线拟合是一种基于局部加权多项式回归的非参数方法。另外还有loess()是基于lowess()表达式版本的更新和更强大的拟合函数,但两个函数的默认值不同。
car包中的scatterplot()增强了散点图功能,scatterplot(y~x1|x2,data=),可以按x2的水平分别绘制y与x1的关系图。
散点图矩阵,pairs(~a+b+c+d,data=),如果加上upper.panel=NULL,则只生成下三角的图形。car包中的scatterplotMatrix()函数功能更强大。smoothScatter()函数可利用核密度估计生成用颜色密度来表示点分布的散点图。
scatterplot3d包中的scatterplot3d(x,y,z)函数可以绘制三维散点图,x水平轴,y竖直轴,z透视轴,增加参数type="h",增强纵深感,添加连接点与水平面的垂直线。
rgl包中的plot3d()函数可以创建可交互的三维散点图,通过鼠标可以旋转坐标轴。
气泡图:symbols(x,y,circle=radius),如果想用面积而不是半径,改为symbols(x,y,circle=sqrt(z/pi))
相关图:corrgram包中的corrgram()函数。下面代码实现下三角区域使用平滑拟合曲线和置信椭圆,上三角区域使用散点图
library(corrgram)
corrgram(df,order=TRUE,lower.panel=panel.ellipe,upper.panel=panel.pts,text.panel=panel.txt,diag.panel=panel.minmax,main="title")