R语言入门--第六节(基本统计分析)

之前学了一些基本图形及数据操作的知识。接下来逐步开始探索数据的规律及分布特征。这一节主要学习了描述、评价数据特征及数据间的关系。

1、常用数学函数统计

注意此时数据对象为连续型变量!

(1)整体描述

  • summary() 函数依次返回 最小值,.25,.5(中位数),平均值,.75,最大值 6个统计量
mt <- mtcars[c("mpg", "hp", "wt", "am")]
summary(mt)
summary
  • 自建返回指定统计量的功能函数
  • 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,详见文章

sapply

补充:其它几个包里的统计函数

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
  • 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 # 显示百分比格式
prop.table(mytable)

(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)    #添加边际和
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,则两变量互不影响;越小说明两类变量关联程度越大
chisq.test

(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)
cor(states)
  • 函数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分别表示缺失值执行成对删除/成行删除
corr.test

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),越有依据拒绝原假设(二者相同)
t.test

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语言的生信小白

你可能感兴趣的:(R语言入门--第六节(基本统计分析))