R语言箱线图(boxplot)四分位算法

Python014

R语言箱线图(boxplot)四分位算法,第1张

箱线图(Boxplot)也称箱须图(Box-whisker Plot),是利用数据中的五个统计量:最小值、第一四分位数、中位数、第三四分位数与最大值来描述数据的一种方法。它也可以粗略地看出数据是否具有有对称性,分布的离散程度等信息;特别适用于对几个样本的比较。

注:四分位数(Quartile),即统计学中,把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值就是四分位数。

  第一四分位数 (Q1),又称“较小四分位数”,等于该样本中所有数值由小到大排列后第25%的数字。

  第二四分位数 (Q2),又称“中位数”,等于该样本中所有数值由小到大排列后第50%的数字。

  第三四分位数 (Q3),又称“较大四分位数”,等于该样本中所有数值由小到大排列后第75%的数字。

  第三四分位数与第一四分位数的差距又称四分位距(InterQuartile Range,IQR)。

R语言中计算方法:

quantile函数直接计算四分位:

例如:data = c(1,2,3,4,5,6.2,7,8,9,10)

quantile(data)   #其结果如下

0%       25%       50%       75%       100%

1.00      3.25       5.60        7.75      10.00

其中0%:最小值;25%:第一四分位数Q1;50%:中位数;75%:第三四分位数;100%:最大值。

其计算方法为:

1. 排序,从小到大排列data;

2. 计算分位数的位置;pos = 1+ (n-1)*p,n为数据的总个数,p为0-1之间的值

3. 给出分位数

注意:另一种分位数的计算方法为:其他与前面的一致。但是分位数位置的计算采用:pos = (n+1)*p,n为数据的总个数,p为0-1之间的值。

四分位数的计算方法没有一个统计的标准,如果对此计算有要求的,需要注意函数的具体算法。

另外,boxplot中存在异常值,其规定标准如下:

当数据中的值大于或小于箱体的四分位距IQR的1.5倍时,认定为异常值。

就是说当某值大于(Q3+1.5*IQR)或小于(Q1-1.5*IQR)时,处理时会认定为异常值。

一、 安装RODBC库

1、进入R语言的GUI界面(RGUI.EXE),在菜单栏选择“程序包/安装程序包

2、在弹出的窗口里往下拉,选择RODBC如图,点击确定

3、在ODBC数据源管理器里将需要的数据库添加进去,这里笔者使用的是SQL Server2008,驱动程序选择Native Client10.0

3、在R语言窗口输入连接语句

>library(RODBC)

**这里是载入RODBC库

>channel<-odbcConnect("MyTest",uid="ripley",case="tolower")

**连接刚才添加进数据源的“MyTest”数据库

**ch <- odbcConnect("some dsn ", uid = "user ", pwd = "**** ")

**表示用户名为user,密码是****,如果没有设置,可以直接忽略

>data(USArrests)

**将“USArrests”表写进数据库里(这个表是R自带的)

>sqlSave(channel,USArrests,rownames = "state",addPK = TRUE)

**将数据流保存,这时候打开SQL Server就可以看到新建的USArrests表了

>rm(USArrests)

>sqlTables(channel)

**给出数据库中的表

>sqlFetch(channel,"USArrests",rownames = "state")

**输出USArrests表中的内容

>sqlQuery(channel,"select * from USArrests")

**调用SELECT查询语句并返回结果(如图)

>sqlDrop(channel,"USArrests")

**删除表

>odbcClose(channel)

**最后要记得关闭连接

当然,通过这个办法也可以读取Excel、Access表中的内容,具体方法类似,这里不再重复

利用Hmisc包中的rcorr.cens函数 局限: - 只能处理一个预测变量 - 对超过2分类的分类变量处理粗糙

# 加载包及生成数据框,这里生成数据框主要是为了方便大家理解,因为大家通常都是将Excel的数据读进R,存储为数据框格式

library(survival)

library(Hmisc)

age <- rnorm(200, 50, 10)

bp <- rnorm(200,120, 15)

d.time <- rexp(200)

cens <- runif(200,.5,2)

death <- d.time <= cens

os <- pmin(d.time, cens)

sample.data <- data.frame(age = age,bp = bp,os = os,death = death)

#让我们看一下生成的例子数据的前6行

head(sample.data)

##age bp os death

## 1 33.18822 114.6965 1.106501 FALSE

## 2 41.86970 123.2265 1.365944 FALSE

## 3 50.41484 124.9522 0.867119 FALSE

## 4 45.66936 127.3237 1.155765 TRUE

## 5 39.79024 134.8846 1.257501 TRUE

## 6 31.89088 140.9382 1.125504 FALSE

rcorr.cens的代码及结果,第一个值就是C指数,同时也有Dxy的值

rcorr.cens(sample.data$age, Surv(sample.data$os, sample.data$death))

##C IndexDxy S.D. nmissing

## 4.528492e-01 -9.430156e-02 5.565299e-02 2.000000e+02 0.000000e+00

## uncensored Relevant Pairs Concordant Uncertain

## 1.290000e+02 3.172800e+04 1.436800e+04 8.072000e+03

rcorrcens的代码及结果,注意rcorrcens的写法是写成formula(公式)的形式,较为方便;而rcorr.cens的 写法是只能在前面写上一个自变量,并且不支持data = ...的写法,有点繁琐。较为遗憾的是这两种方法得到的C指数的标准误需要通过S.D./2间接得到。

r <- rcorrcens(Surv(os, death) ~ age + bp,data = sample.data)

r

## Somers' Rank Correlation for Censored DataResponse variable:Surv(os, death)

##

## CDxy aDxySDZ P n

## age 0.453 -0.094 0.094 0.056 1.69 0.0902 200

## bp 0.498 -0.003 0.003 0.054 0.06 0.9517 200