《R语言实战笔记》第七章:基本统计分析

第七章:基本统计分析

7.1描述性统计分析

7.1.1方法云集

vars <- c('mpg', 'hp', 'wt')

# 通过summary()计算描述性统计量:最小值、最大值、四分位数、数值型变量的均值以及因子向量和逻辑型向量的频数统计
summary(mtcars[vars])

# apply()或sapply()计算描述性统计量,这里以sapply()函数为例
sapply(x, FUN, options) # 调用sapply()函数的一般格式:x是数据框(或矩阵),FUN为函数,如果指定options,它们将被传递给FUN
# 示例
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(n=n, mean=m, stdev=s, skew=skew, kurtosis=kurt))
            }
sapply(mtcars[vars], mystats)

# 关于利用Hmisc包中的describe()函数、pastecs包的stat.desc()函数和psych包的describe()函数计算描述性统计量,见书P131

# 注意:函数fivenum()可以返回图基五数(包括最小值、下四分位数、中位数、上四分位数和最大值)

7.1.2分组计算描述性统计量

# 使用aggregate()函数分组获得描述性统计量
aggregate(mtcars[vars], by=list(am=mtcars$am), mean) # 按照am分组,组内分别对vars的各变量下的元素求均值
# 注意:aggregate()仅允许在每次调用中使用平均数、标准差这样的单返回值的函数

# 使用by()函数分组计算描述性统计量
by(data, INDICES, FUN) # 调用by()函数的一般格式,data是数据框(或矩阵),INDICES是一个因子或因子组成的列表,定义了分组,FUN是任意函数
# 示例
dstats <- function(x)(c(mean=mean(x), sd=sd(x)))
by(mtcars$mpg, mtcars$am, dstats)
# 注意:by中,或者data是单列(),或者FUN是单返回值的函数(如summary)

# 使用doBy包中的summaryBy()函数计算描述性统计量
library(doBy)
summaryBy(mpg+hp+wt~am, data=mtcars, FUN=mystats)

# 使用psych包中的describeBy()分组计算概述统计量
library(psych)
describeBy(mtcars[vars], mtcars$am)
# 注意:describeBy()不允许指定任何函数

# 
library(reshape)
dstats <- function(x)(c(n=length(x), mean=mean(x), sd=sd(x)))
dfm <- melt(mtcars, measure.vars=c('mpg', 'hp', 'wt'), id.vars=c('am', 'cyl')) # 融合数据框,标识符变量用id.vars(或id)指定,观测变量用measure.vars指定。
cast(dfm, am + cyl + variable ~ ., dstats) # 按照am、cyl、variable分组,组内的值根据自定义的dstats得到

7.2.1生成频数表

《R语言实战笔记》第七章:基本统计分析_第1张图片

# 使用table()函数或xtabs()函数创建一维列联表,以table()函数为例
mytable <- with(Arthritis, table(Improved))
prop.table(mytable) # 利用prop.table()函数可将频数转化为比例值
prop.table(mytable)*100 # 转化为百分比

# 使用table(A, B)函数或xtabs(~ A + B, data=mydata)函数创建二维列联表
mytable <- xtabs(~ Treatment+Improved, data=Arthritis) # 要进行交叉分类的变量要写在~的右侧
margin.table(mytable, 1) # 关于第一个变量,生成边际频数
prop.table(mytable, 1) # 单元格占第一个变量的边际频数的比例
prop.table(mytable)    # 各单元格占总体的比例
addmargins(mytable)    # 为表中所有变量添加边际和
addmargins(prop.table(mytable, 1), 2) # 为表中所有的行比例按列求边际和(同行逐列求和)
# 注意:table()函数中默认忽略缺失值(NA),如果要视NA有效,需设置参数useNA='ifany'

# 使用gmodels包中的CrossTable()函数创建二维列联表
library(gmodels)
CrossTable(Arthritis$Treatment, Arthritis$Improved
# CrossTable()函数可:计算(行、列、单元格)的百分比;进行卡方、Fisher和McNemar独立性检验;计算期望和(皮尔逊、标准化、调整的标准化)残差等

# table()函数和xtabs()函数都可以基于三个或更多类别型变量生成多维列联表。margin.table()、prop.table()和addmargins()也可以推广到多维情形。
mytable <- xtabs(~Treatment+Sex+Improved, data=Arthritis) # 生成三维列联表
ftable(mytable) # 输出更紧凑和吸引人的表格

7.2.2独立性检验

# 使用chisq.test()函数进行卡方独立性检验
library(vcd)
mytable <- xtabs(~Treatment+Improved, data=Arthritis) # 以Treatment和Improved构建列联表
chisq.test(mytable) # 对上表做卡方检验,p<0.01,认为患者接受治疗和改善的水平存在某种关系
mytable <- xtabs(~Improved+Sex, data=Arthritis) # 以Improved和Sex构建列联表
chisq.test(mytable) # 对上表做卡方检验,p>0.05,没有足够理由认为患者性别和改善情况存在某种关系
# 注意:当某个单元格的数据小于5(如这里的Male-Some),可能使卡方近似无效

# 使用fisher.test()函数进行Fisher精确检验和mantelhaen.test()函数进行Cochran-Mantel-Haenszel卡方检验详见P143

7.2.3相关性的度量

在拒绝了相互独立的原假设后,可以使用assocstats()函数计算二维列联表的phi系数、列联系数和Cramer’s V系数来衡量相关性强弱。

library(vcd)
mytable <- xtabs(~Treatment+Improved, data=Arthritis)
assocstats(mytable)

7.2.5将表转换为扁平格式

# 构建table2flat()函数将表还原回扁平格式
table2flat <- function(mytable) {
  df <- as.data.frame(mytable) # 转化为数据框
  rows <- dim(df)[1] # 列联表的行数,代表列联表可能的分组数
  cols <- dim(df)[2]  # 列联表的列数
  x <- NULL
  for (i in 1:rows) { # 对于列联表的每一种分组
    for (j in 1:df$Freq[i]) { # 对于组内的每一个示例
      row <- df[i, c(1:(cols-1))] # 记录当前的分组
      x <- rbind(x, row) # 添加行,纵向拼接
    }
  }
  row.names(x) <- c(1:dim(x)[1]) # 添加行号
  return(x)
}
# 构建列联表数据
treatment <- rep(c('Placebo', 'Treated'), times=3) # 重复3次生成treatment
improved <- rep(c('None', 'Some', 'Marked'), each=2)
Freq <- c(29, 13, 7, 17, 7, 21)
mytable <- as.data.frame(cbind(treatment, improved, Freq)) # 添加列,横向拼接
mydata <- table2flat(mytable) # 还原回扁平格式
head(mydata)

7.3相关

Pearson积差相关系数衡量了两个定量变量之间的线性相关程度,Spearman等级相关系数则衡量分级定序变量之间的相关程度,Kendall’s Tau相关系数也是一种非参数的等级相关度量。

《R语言实战笔记》第七章:基本统计分析_第2张图片

cor(x, use= , method= ) # 调用cor()函数的一般格式:默认参数为use='everything'和method='pearson'
# 示例:
states <- state.x77[, 1:6]
cov(states)  # 计算states中各变量之间的协方差(相同变量则为方差)
cor(states)  # 计算states中各变量之间的Pearson相关系数
cor(states, method='spearman')  # 计算states中各变量之间的spearman相关系数

# 计算非方形的相关矩阵
x <- states[, c('Population', 'Income', 'Illiteracy', 'HS Grad')]
y <- states[, c('Life Exp', 'Murder')]
cor(x, y)
# 注意:上述结果并未标明相关系数是否显著不为0(即根据样本数据能否有足够证据得出总体相关系数不为0的结论),因此还需要做显著性检验。
# 偏相关和其他类型相关见书P148

7.3.2相关性的显著性检验

在计算好相关系数后,如何进行统计显著性检验?

常用的原假设为变量之间不相关(总体的相关系数为0),之后可以用cor.test()函数对单个的Pearson、Spearman和Kendall相关系数进行检验。

cor.test(x, y, alternative = , method = ) # 调用cor.test()函数进行统计显著性检验:其中x和y是检验相关性的变量,alternative指定进行双侧检验或单侧检验('two.side', 'less', 'greater')
# method指定要计算的相关类型('pearson'、'kendall'或'spearman')。当原假设为“总体的相关系数小于0时”,alternative使用“less”,当原假设为“总体的相关系数大于0时”,alternative使用“greater”
# 默认情况下(原假设为“总体相关系数为0时“),alternative为“two.side”。
cor.test(states[,3], states[,5]) # 检验“两变量的Pearson相关系数为0”的原假设,由于p<0.01,拒绝原假设,认为相关系数不为0
# 注意:cor.test()每次只能检验一种相关关系

library(psych)
corr.test(states, use='complete') # use可取值为'pairwise'或'complete'(分别表示对缺失值成对删除或行删除),method可取值'pearson'(默认值)、'spearman'或'kendall'。

# 其他显著性检验见书P150

7.4 t检验

7.4.1独立样本的t检验

一个针对两组的独立样本t检验可用于检验两个总体的均值相等的假设。假设两组数据独立,并且从正态总体中抽得。

t.test(y ~ x, data) # 调用t.test()的一般格式(一):其中y是数值型变量,x是二分变量
t.test(y1, y2)      # 调用t.test()的一般格式(二):其中y1和y2都是数值型向量
# 注意:这里的t检验默认假定方差不相等,并使用Welsh的修正自由度。可以添加一个参数var.equal=TRUE假定方差相等,并使用合并方差估计。
# 默认的备择假设是双侧的。可以添加一个参数alternative='less'或alternative=‘greater'来进行有方向的检验。

# 利用t.test()进行方差不相等的双侧t检验,示例:
library(MASS)
t.test(Prob ~ So, data=UScrime)

7.4.2非独立样本的t检验

非独立样本的t检验假定组内的差异呈正态分布。

t.test(y1, y2, paired=TRUE) # 调用t.test()的一般格式:其中y1和y2是两个非独立组的数值向量
library(MASS)
sapply(UScrime[c('U1', 'U2')], function(x)(c(mean=mean(x), sd=sd(x)))) # 获得U1和U2列的均值和标准差
with(UScrime, t.test(U1, U2, paired=TRUE)) # p值<0.01,可以拒绝原假设(平均失业率相同)

7.5组间差异的非参数检验

略,详见书P152

本章细节:

1.多个包中的重名函数,调用时,已最后载入的程序包优先(会提示前一个包的函数被后一个包的同名函数屏蔽masked)。如果想使用前一个(如Hmisc包中的函数),则可以键入Hmisc::describe(mt)。

你可能感兴趣的:(R语言,r语言)