发现这款软件在小样本,常见的临床问题中可以快速的解决我们大部分问题,其简单操作界面以及菜单式操作方式成为很多人选择它的理由。但是,当我们遇到某些大数据,或者复杂统计运算时,如果还拿SPSS作为自己的救命稻草,那可能就是一出损招了,甚至会一度click到想要剁手。
R是一个非常灵活的平台,是专用于探索、展示和理解数据的语言,与其说它接近统计分析工具,倒不如说它更像是一款定向开化的程序语言。不能否认的是这是一款难学的软件,应用广泛,众多的分析和不断增加的绘图函数(超过50000个)都容易让人望而却步。但是只要有合适的指导,你就可以畅游其中,选择合适的途径,优雅、简洁、高效地完成任务。¹
另外,贝尔实验室的大佬们将R做成一个开源项目,在很多操作系统上都可以免费得到,包括Windows、Mac OS X和Linux。R还在持续发展中,每天都在纳入新的功能。与SPSS和SAS这类GB级别地软件相比,优势明显,容量小,免费入手,还可以自行编码自己需要的固定流程程序。真的是居家必备,杀人越货的……
R以能创建漂亮优雅的图形而闻名,但实际上它可以处理各种统计问题。基本的安装就提供了数以百计的数据管理、统计和图形函数。不过,R很多强大的功能都来自社区开发的数以千计的扩展(包)。
有关于R软件的基本介绍就告一段落,有对其历史背景、公司企业感兴趣的朋友们可以查阅相关书籍。
在R软件中,红色代表代码行,蓝色代表输出结果,绿色代表注释语句。
1
常用的R包有很多比如:stats(R统计学包)、cluster(聚类分析)、Graphics(绘图)、pgirmess(生态学数据分析)等等【注:R软件对字母大小写敏感,不论在调用程序包或者程序编辑过程中都需要注意】。而安装程序包的方法也很简单,只需要在控制台中输入:
>install.packages()
例如:
>install.packages(“foreign”) (foreign是可以调用外部文件的包,但是这个包一般可以直接调用,不需要安装)
当然,也可以到R官网(http://www.r-project.org/)下载需要的包,然后在R的菜单栏中找到Package或者“程序包”(中文界面下)的install packages from local files选项。
安装结束后需要手动的调用:
>library(foreign) 【注:安装需要加“”,而调用不需要加“”】
有的时候调用或者安装一个很大的包的时候需要等待一下R程序,会弹出很多内容……
如果说你想了解一个程序包里都包含了那些函数,那可以直接在控制台中输入:
>?t.test
或者
>help(“t.test”)
或者
>??rms
来查询相关内容。
【在R中最最心痛的事情是在输入一长段代码的时候不小心摁下了↑↓箭头】
2
R的函数,R是一种解释性语言,输入后可以直接得到结果,功能靠函数实现,类似于大多数的编程语言。
函数形式是: 函数(输入数据,参数= )
如果没有指定部分参数,则参数以默认值为准
例如:
>mean(x,trim=0,na.rm=FALSE,…) (求x的均值,参数含义详见>?mean)
>lm(y~x,data=N) (求取线性模型,y=bx a,从N数据中提取x和y)
还有很多函数,比如说:
求和:sum() 绘图:plot() 排序:sort() 求标准差:sd() 等等
而参数的设定是可以影响输出结果的,以boxplot()为例
箱线图绘制函数的调用
>boxplot(day~subject, data=base, col=”red”)
day~subject,以subject为横轴,day为纵轴绘制箱线图。
data=base 数据来源base
col=“red” 箱线图为红色(左侧为没有这条参数,右侧是有这条参数)
Tip: R里的赋值符号是”<-”也可以是”=”,但是如果要判断两个对象是否相等一定要用”==”来表示,结果给出的一般是逻辑性的”T”或”F”。
Tip: R对象的类分为:向量(vector),因子(factor),矩阵(matrix),数组(array),数据框(dataframe)和列表(list).不同的数据类型特点不同,这里不多解释。
Tip: R读取外部数据的方式是:read.格式(文件和地址),例如:
>test<-read.csv(“D:/R/test2.csv”,header=T)
3
几个统计分析的例子:
- t检验
现有6名患者的身高和体重,检验体重除以身高的平方是否等于22.5。
【注:但数据来源于外部,只需要添加read.csv()导入数据data,随后分析时使用data$height和data$weight 来代替下面代码的头两行,右测代码】
> height<-c(1.75,1.8,1.65,1.88,1.73,1.79)
> weight<-c(62,72,57,90,85,76) >data<-read.csv(源文件)
> sq.hei<-height^2 >ratio<-data$weight/data$height^2
> ratio<-weight/sq.hei >t.test(ratio,mu=22.5)
> t.test(ratio,mu=22.5) (t检验分析的函数)
One Sample t-test
data: ratio
t = 0.79971, df = 5, p-value = 0.4602 (结果的P值为0.4602)
alternative hypothesis: true mean is not equal to 22.5
95 percent confidence interval:
20.29007 26.70590
sample estimates:
mean of x
23.49799
- 单因素方差分析
将三种不同菌型的伤寒病毒a,b,c分别接种于10,9,和11只小白鼠上,观察其存活天数,问三种菌型下小白鼠的平均存活天数是否有显著差异。
a菌株:2, 4, 3, 5, 4, 7, 7, 2, 5, 4
b菌株:5, 6, 7, 5, 10, 7, 12, 6, 6
c菌株:7,11,6, 6, 7, 9, 5, 7, 6, 3, 10
可以现在excel中输入数据,day和type 各为一列,保存成csv格式。
>data<-read.csv(“d:/anova.csv”,header=T)
#将data数据框中的type转换为因子(factor),因为这个变量做分类的变量
>data$type<-as.factor(data$type)
>analysis<-aov(lm(day~type, data=data)) ( aov()是方差分析的函数)
>summary(analysis)
>boxplot(day~type,data=data,col=”red”)
分析结果:
Df Sum Sq Mean Sq F value Pr(>F)
type 2 50.48 25.239 5.452 0.0103 * (P<0.05,差异有统计学意义)
Residuals 27 124.99 4.629
—
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
- 线性回归
对一批涂料进行研究,确定搅拌速度对杂质含量的影响,数据如下,试进行回归分析
>x<-c(20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40)
>y <-c(8.4, 9.5, 11.8, 10.4, 13.3, 14.8, 13.2, 14.7, 16.4, 16.5, 18.9)
>plot(y~x)
>reg<-lm(y~x) ( lm() 线性回归函数)
>abline(reg,col=”red”)
>summary(reg)
Call:
lm(formula = y ~ x)
Residuals:
Min 1Q Median 3Q Max
-1.1800 -0.6491 -0.2073 0.7854 1.3545
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.5727 1.3982 -0.41 0.692
x 0.4673 0.0456 10.25 2.92e-06 *** (P<0.001)
—
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.9566 on 9 degrees of freedom
Multiple R-squared: 0.921, Adjusted R-squared: 0.9123
F-statistic: 105 on 1 and 9 DF, p-value: 2.922e-06
- 其他的一些函数还有很多
glm(), friedman.test(), fisher.test(), binom.test(), chisq.test()…
4
R绘图²
绘图是R众所周知的强项,R绘制的图形:
*2.图片来自于参考资料2
R还可以绘制地图:
左图 maps包 map() 右图 PBSmapping包 addBubbles()
fields 包实例 spdep 包实例
以及空间分析绘图: gstat程序包
R的高级绘图函数包括:
plot() | 绘制散点图等多种图形,根据数据的类,调用相应的函数绘图 |
---|---|
hist() | 频率直方图 |
boxplot() | 箱线图 |
stripchart() | 点图 |
barplot() | 柱状图 |
dotplot() | 点图 |
piechart() | 饼图 |
matplot() | 数学图形 |
- 绘图举例:散点图
生成0到2之间的50个随机数,分别命名为x,y
>x <- runif(50,0,2)
>y <- runif(50,0,2)
#绘图:将主标题命名为“散点图”, 横轴命名为”横坐标”, 纵轴命名为“纵坐标”
>plot(x, y, main=”散点图”, xlab=”横坐标”, ylab=”纵坐标”)
>text(0.6,0.6,”text at (0.6,0.6)”)
>abline(h=.6,v=.6)
- 分步绘图
1.打开绘图窗口,不绘制任何对象
>plot(x, y, type=”n”, xlab=””, ylab=””, axes=F)
2.添加坐标点 >points(x,y)
3.添加坐标轴
>axis(1); axis(at=seq(0.2,1.8,0.2), side=2)
4.补齐散点图的边框 >box()
5.添加标题、副标题、横轴说明、纵轴说明
>title(main=”Main title”, sub=”subtitle”, xlab=”x-label”, ylab=”y-label”)
- 一页多图
在作图前需要的代码:
>par()
>par(mfrow=c(2,2)) (将图分成两行两列的四个图形)
……
- 在原有图形上添加元素
>x <- rnorm(100) # 生成随机数
>hist(x,freq=F) # 绘制直方图
>curve(dnorm(x),add=T) # 添加曲线
>h <- hist(x, plot=F) # 绘制直方图
>ylim <- range(0, h$density, dnorm(0)) #设定纵轴的取值范围
>hist(x, freq=F, ylim=ylim) #绘制直方图
>curve(dnorm(x),add=T,col=”red”) #添加曲线
5
R可以灵活的编写程序,用户自己编写的程序可以直接调用。编程时无需声明变量的类型,这与C,C 等语言不同,其实这个过程就是打包的过程。
基本格式
函数名 <- function(数据,参数1= 默认值,…)
{
异常处理;
表达式(循环/判别);
return(返回值);
}
函数内部也可用#添加注释
总结
R是开源的统计绘图软件,也是一种脚本语言,有大量的程序包可以利用。本文仅仅粗略地介绍了有关R软件的部分使用方法,对于R的深层次的运用,三言两语难以总结。
今后的推文中,我们会从
①基础知识与R界面介绍
②R语言环境(脚本,包,作图系统,数据读入,导出,数据外接这些和其他软件和程序交互性操作)
③描述性图(包括发文章经常用到的统计图表,直方图,条图等)
④常用的临床统计检验(t,anova,kw,reg,corr,chisq)
⑤高级统计的几个小方法的汇总(logistic临床最常用的回归,我最近在用的nomogram图,生存分析等)几个方面系统性的阐述R知识。
如果有兴趣的朋友可以持续关注后续推文,多查阅相关资料,掌握R语言会很大程度上给统计分析助力。同时,相关的配套网课正在录制,敬请期待!
参考资料
- 《R软件教程》Emmanuel Paradis, Institut des Sciences de l’Evolution, 2005
- 《R语言初步—数据处理、绘图与编程》张金龙 2010年6月