之前学了一些基本图形及数据操作的知识。接下来逐步开始探索数据的规律及分布特征。这一节主要学习了描述、评价数据特征及数据间的关系。
1、常用数学函数统计
注意此时数据对象为连续型变量!
(1)整体描述
- summary() 函数依次返回 最小值,.25,.5(中位数),平均值,.75,最大值 6个统计量
mt <- mtcars[c("mpg", "hp", "wt", "am")]
summary(mt)
- 自建返回指定统计量的功能函数
- function&sapply
mystats <- function(x, na.omit=FALSE){ #自建函数
if (na.omit)
x <- x[!is.na(x)] #删除含有缺失值的观测
m <- mean(x) #返回平均值
n <- length(x) #返回观测数量
s <- sd(x) #返回标准差
skew <- sum((x-m)^3/s^3)/n #计算偏度
kurt <- sum((x-m)^4/s^4)/n - 3 #计算峰度
return(c(num=n, mean=m, stdev=s, skew=skew, kurtosis=kurt)) #返回的标签
}
myvars <- c("mpg", "hp", "wt")
sapply(mtcars[myvars], mystats)
#sapply()可以插入的典型函数有mean(),sd(),var()等
偏度与峰度是描述正态分布曲线的两个特征参数。简单来说,偏度是衡量随机变量概率分布的不对称性;峰度是研究数据分布陡峭或平滑的统计量。对于标准正态分布,二者均为0,详见文章
补充:其它几个包里的统计函数
library(Hmisc)
#观测数量、缺失值、唯一值、Info(关于变量的连续性的统计量),Gmd(基尼均差),平均值,分位数以及五个最大的值和五个最小的值
describe(mtcars[, myvars])
install.packages('pastecs') #安装失败了
options()$repos
install.packages('pastecs', repos='http://cran.us.r-project.org')
library(pastecs)
#所有值,空值,缺失值的数量以及最小值,最大值,值域,合计,中位数,均值,平均数的标准误差,平均数置信度为0.95的置信区间,方差,标准差,变异系数。
stat.desc(mtcars[, myvars])
library(psych)
#非缺失值的数量,平均数,标准差中位数,截尾均值,绝对中位差,最小值,最大值,值域,偏度,峰度和平均值的标准误差
describe(mtcars[, myvars])
值得注意的是 Hmisc包与psych包含有同名函数describe()
,二者均加载时,以后者被加载的包优先;或者执行Hmisc::describe()
可指定执行。
(2)分组描述
- aggregate()
myvars <- c("mpg", "hp", "wt")
aggregate(mtcars[myvars], by=list(mtcars$am), mean)
aggregate(mtcars[myvars], by=list(am=mtcars$am), sd)
#注意上述by=list的两种表述差异,第一个会自动添加一个group1
- aggregate() 的不足就是一次只能使用一个函数,而by() 函数弥补了上述的不足
dstats <- function(x)sapply(x, mystats) # 函数套函数
myvars <- c("mpg", "hp", "wt")
by(mtcars[myvars], mtcars$am, dstats)
#注意by() 的三个参数依次:待分析数据-分组因子-统计函数
#可以把上面mystats的写法当做一个模板来用
2、分析类别型变量
2.1生成频数列联表(其实就是分类计数)
- 注意此时的数据对象为类别型变量!
(1)分析单组数据
library(vcd) #用到vcd包里的示例数据
mytable=table(Arthritis$Improved) #显示各因子的频数
#列联表在R中是专门的一种存储格式,table
options("digits"=2) # 这里修改一下小数点位数,默认为7
prop.table(mytable) # 显示比例格式
prop.table(mytable)*100 # 显示百分比格式
(2)分析两组数据
mytable <- xtabs(~ Treatment+Improved, data=Arthritis)
mytable
# 上述参数中,第一个变量Treatment设置为行名,第二个变量Improved设置为列名
margin.table(mytable,1)
#1表示第一个变量,即求每行的和。相当于对Treatment单组数据求列联表。
#2就表示第2个变量(Improved)
addmargins(mytable) #一步到位,添加所有的和
prop.table(mytable, 1) #以第一个变量(行名)总和求比例
addmargins(mytable) #添加边际和
- 如上列联表 表示两组治疗方法下,各自三种治疗程度的病人数
(3)分析三组数据,详见p141
mytable <- xtabs(~ Treatment+Sex+Improved, data=Arthritis)
mytable
2.2类别性变量独立性检验
- 原假设为两类变量相互独立。比如研究治疗方法变量与效果(无效,有效,明显有效)变量是否独立;即治疗方法的不同是否会影响效果的改变。(目的是希望不独立的,即有影响的)
(1)卡方独立性检验
- chisp.test(), 参数为二维列联表
mytable <- xtabs(~Treatment+Improved, data=Arthritis)
chisq.test(mytable)
#p值大于0.05,则两变量互不影响;越小说明两类变量关联程度越大
(2)Fisher精确检验
- fisher.test() 参数为不能为2×2的列联表
fisher.test(mytable)
3、定量变量之间的相关系数
- 我理解的定量变量就是连续型变量
- 还要注意的是为两组不同类型变量的独立性检验与显著性评价,比如收入与犯罪率关系。
3.1 相关系数的计算
- 相关系数(-1~1之间)可以用来描述定量变量之间的关系,正负表示正/负相关,绝对值越大,相关性越大。
- R可计算很多种类型相关系数,常用Pearson积差相关系数,其衡量了两个定量变量之间的线性相关程度。
- 常用函数cor(x, use= , method= ) ,常用的三个参数为:
(1)x 为待分析的矩阵;
(2)use= 指定缺失数据的处理方式。默认设置为everything(遇到缺失数据,相关系数计算结果设为missing);其它类型还有all.obs(遇到缺失数据则报错);complete.obs(遇到则删除行);pairwise.complete.obs(遇到则成对删除)
(3)method= 指定要计算的R相关系数类型。默认设置为Pearson,此外还可以设置为Spearson类型,Kendall类型;
states<- state.x77[,1:6]
cor(states) #结果如下图,对角线结果肯定是1
#指定分析某些变量间的关系
x <- states[,c("Population", "Income", "Illiteracy", "HS Grad")]
y <- states[,c("Life Exp", "Murder")]
cor(x,y)
- 函数cov() 用来计算协方差。协方差与相关系数有一定联系,其为正值时表示两变量正相关;反之,为负相关。详见文章
cov(states)
3.2 相关性的显著性检验
- 即验证上面计算的相关性的可信度
- 常用的原假设为变量间不相关(即总体的相关系数为0)进行假设检验,求p值;
注意p值越小,反映该相关系数越可信;而不是表明相关系数越高。 - 函数为cor.test(x,y, alternative= , method= ),3个参数依次为:
(1)x,y 为待检测的变量;
(2)alternative指定双侧检验/单侧检验,默认为two.side(相关系数不等于0);当假设相关系数小于0时,less;大于0,greater;
(3)method= 指定要计算的相关类型,默认为pearman;
cor.test(states[,3], states[,5])
#cor.test() 只能用于单次计算,psych包的corr.test()可以实现批量计算
library(psych)
corr.test(states, use="complete")
#返回的第一个矩阵是相关性,第二个矩阵是显著性p值;
#同样corr.test可以计算三种相关系数,默认为pearman;
#参数use=pairwise/complete分别表示缺失值执行成对删除/成行删除
4、t 检验
- 第3点是研究变量间是否存在联系(一般主观希望存在联系,也就是不独立)
- 此处目标是评价两组相同类型的变量(如评价药物疗效控制组与对照组的血药浓度),而主观希望越独立,则越有意义(凸显了药的作用)
- 如果实验结果是用类别性变量表示的,就用第二点列联表方法计算(我觉得一般不多吧);若实验结果是连续型变量,则应用 t 检验
- 注意计算时一般是两组连续型变量,有时有的结果用一组二分变量(对照组为0,实验组为1),和一组对应的全部的实验结果的连续型变量。
- 还要注意的是实验结果的连续型变量分布要符合正态分布,以及方差齐性,否则不能用t检验(参见5)。
4.1 独立样本的t检验
- 独立样本定义是两个样本是从两个总体中独立抽取的。即一个样本的元素与另一个样本的元素相互独立的。我的理解就是对照组与实验组的数据分别来自两组独立的小鼠。
t.test(y1, y2) #一般格式
t.test(y~x, data) #x为二分变量
- 例子:利用MASS包的数据,研究美国南方与北方的监禁率Prob是否有显著差异;其中表示南北方的So用二分变量表示。
library(MASS)
t.test(Prob ~ So, data=UScrime)
#一般p值越小(<0.05),越有依据拒绝原假设(二者相同)
4.2 非独立样本的t检验
- 关于非独立样本,我的理解是实验数据来自同一组小鼠。比如给药前测一次小鼠血糖,给药后再测一次该组小鼠的血糖,比较血糖的高低。术语叫做前-后设计(pre-post design)
sapply(data[c("y1","y2")], function(x)(c(mean=mean(x),sd=sd(x))))
#先观察下两组数据的均值差异是否足够大
#注意下function() 函数的用法
with(data, t.test(y1, y2, paired=TRUE))
有时实验设计多于两组,需要使用方差分析(ANOVA),见R语言入门--第八节(方差分析) - 。
5、非参数检验
- 这一小节是针对第4点t检验而补充的。
- 因为 t 检验对变量是有条件的,那就是你的数据要符合正态分布与方差齐性。
- 如果不符合(比如数据存在严重偏倚或呈有序关系),盲目使用t检验是不可取的,此时需要采用非参数检验。
5.1Wilcoxon秩和检验
- 又称为Mann-Whitney U检验。
- 这一点是对比4.1 ,针对独立样本的方法
wilcox.test(y1,y2) #一般格式
wilcox.test(y~x,data) #x为二分变量
例子:还是以上面那个南北方监禁率差异的研究
with(UScrime, by(Prob, So, median))
#首先大致观察下两组数据的中位数差异
wilcox.test(Prob ~ So, data=UScrime)
5.2Wilcoxon符号秩检验
- 这一点是对比4.2,针对非独立样本的方法
with(UScrime, by(Prob, So, median))
sapply(data[c("y1", "y2")], median)
#做到这里,我觉得无论是4.2的求均值,还是这里的求中位数,目的都是先从数据分布上判断是否有差异,然后再进行检验
with(data, wilcox.test(y1, y2, paired=TRUE))
小彩蛋:进行t检验前,如何知道一组数据是否符合正态分布、方差齐性?
- shapiro.test() 若返回p值大于0.05,则数据符合正态分布;
- bartlett.test(y ~ x ) 若返回p值小于0.05,说明数据在不同水平下是等方差的。注意这里的y为所有变量结果,x为分组因子。比如:
a=as.data.frame(state.x77)
a1=c(a$Income,a$Illiteracy) #各有50个数据,总共100个
a2=c(rep(1,50),rep(2,50))
bartlett.test(a1,a2)
关于本文提到的统计检验原理,今后有机会再专门学习一下。部分参考教材《R语言实战(第2版)》,侵删~
--寒假自学R语言的生信小白