浅谈一款进阶软件R的实际运用

2019-05-13 10:29:31 浏览数 (3)

发现这款软件在小样本,常见的临床问题中可以快速的解决我们大部分问题,其简单操作界面以及菜单式操作方式成为很多人选择它的理由。但是,当我们遇到某些大数据,或者复杂统计运算时,如果还拿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语言会很大程度上给统计分析助力。同时,相关的配套网课正在录制,敬请期待

参考资料

  1. 《R软件教程》Emmanuel Paradis, Institut des Sciences de l’Evolution, 2005
  2. 《R语言初步—数据处理、绘图与编程》张金龙 2010年6月

0 人点赞