正在加载
请稍等

菜单

Home 码农菜园 数据分析 R学习笔记-7 基本统计分析
Home 码农菜园 数据分析 R学习笔记-7 基本统计分析

R学习笔记-7 基本统计分析

数据分析 by   阅读量 5,940

数据分析中很重要的一部分,便是两两探索变量之间的关系,其目的是回答类似如下问题:

  • 各车型的油耗如何?特别是,在对车型的调查中,每加仑汽油行驶英里数的分布是怎样的(均值、标准差、中位数、值域等)?
  • 在进行新药实验后,用药组和安慰剂组的治疗效果(无改善、一定程度改善、显著改善)相比如何?实验参与者的性别是否对结果有影响?
  • 收入和预期寿命的相关性如何?它是否明显不为零?
  • 美国的某些地区是否更有可能因为犯罪而将你监禁?不同地区的差别是否在统计上显著?

在以下的内容中,将主要涉及用于生成基本的描述性统计量和推断统计量的R函数。

7.1 描述性统计分析

首先关注的是分析连续型变量的中心趋势、变化性和分布形状的方法。仍使用之前的mtcars数据集,关注对象为每加仑汽油行驶英里数(mpg)、马力(hp)和车重(wt)。

方法云集

可以使用summary()函数获取基本描述性统计量,提供了最小值、最大值、四分位数和数值型变量的均值,以及因子向量和逻辑型向量的频数统计。

可以使用apply()函数或saaply()函数计算所选择的任意描述性统计变量,例如对于sapply()函数:

x为数据框或矩阵,FUN为任意函数,可以是mean、sd、var、min、max、median、length、range和quantile。

虽然R中没有内置计算偏度和峰度的计算函数,但是仍可以用以下代码实现。

对于样本中的车型,每加仑汽油行驶英里数的平均值为20.1,标准差为6.0,分布呈现右偏(偏度+0.61),并且较正态分布稍平(峰度-0.37)。

除此之外,Hmisc、pastecs和psych等包也提供了计算描述性统计量的函数。

Hmisc包中的describe()函数可以返回变量和观测的数量、缺失值和唯一值的数目、平均值、分位数以及五个最大的值和最小的值。

pastecs包中有一个名为stat.desc()的函数,可以计算种类繁多的描述性统计量,使用格式为:

stat.desc(x, basic=TRUE, desc=TRUE, norm=FALSE, p=0.95)

其中x是一个数据框或时间序列。若basic=TRUE,则计算其中所有值、空值、缺失值的数量,以及最小值、最大值、值域、总和;若desc=TRUE,则计算中位数、平均数、平均数的标准误、平均数置信度为95%的置信区间、方差、标准差以及变异系数;若norm=TRUE,则返回正态分布统计量,包括偏度和峰度(以及它们的统计显著程度)和Shapiro-Wilk正太检验结果。

psych包也有一个describe()函数,可以计算非缺失值的数量、平均数、标准差、中位数、截尾均值、绝对中位差、最小值、最大值、值域、偏度、峰度和平均值的标准误。

分组计算描述性统计量

在比较多组个体或观测时,关注的焦点经常是各组的描述性统计信息,而不是样本整体的描述性统计信息。

之前提到的aggregate()函数可以用来计算平均值、标准差等单返回值的函数。

doBy包和psych包也提供了分组计算描述性统计量的函数。doBy包中的summaryBy()函数的使用格式为:

其中formula接受形如var1+var2+…+varN~groupvar1+groupvar2+…+groupvarN的格式,左侧为需要分析的数值型变量,后侧为类别型的分组变量。以下代码给出了summaryBy()函数的一个示例,使用到了之前定义的函数mystats。

psych包中的describeBy()函数可计算和describe()函数相同的描述性统计量,只是按照一个或多个分组变量分层。

与前面提及的其他函数不同,describe.by()函数不允许指定任意函数,故灵活性和普适性较低。若存在一个以上的分组变量,可以使用list(groupvar1, groupvar2, …, groupvarN)来表示它们。

之前接触到的,reshape包中的melt函数和cast函数也可以实现类似的分组统计功能。以下代码使用数据重塑的方法来计算变速箱类型和汽缸数组合的每个亚组对应的描述性统计量,包括样本大小、平均数和标准差。

7.2 频数表和列联表

以上讨论了如何统计数值型变量的描述性特征,接下来将关注类别型变量的频数和列联表,以及相应的独立性检验、相关性的度量、图形化展示结果的方法。

生成频数表

R中提供了用于创建频数表和列联表的若干方法,列举如下:

  • table(var1, var2, …, varN):使用N个类别型变量(因子)创建一个N维列联表;
  • xtabs(formula, data):根据一个公式和一个矩阵或者数据框创建一个N维列联表;
  • prop.table(table, margins):依margins定义的边际列表将表中条目表示为分数形式;
  • margin.table(table, margins):依margins定义的边际列表计算表中条目的和;
  • addmargins(table, margins):将概述边margins(默认是求和结果)放入表中;
  • ftable(table):创建一个紧凑的“平铺”式列联表

使用table()函数生成简单的频数统计表,如下所示:

可以使用prop.table()将这些频数转化为比例值:

或使用prop.table()*100转化为百分比:

对于二维列联表,table()函数的使用格式为:

其中A为行变量,B为列变量。相比之下,xtabs()函数可以使用公式风格的输入创建列联表:

其中mydata为矩阵或数据框,要进行交叉分类的变量放置于公式右侧,以+作为分隔符;若某个变量出现在公式左侧,则其为一个频数向量。

可以使用margin.table()函数生成边际频数:

还可以使用prop.table()函数生成边际比例:

可以使用addmargins()函数为表格添加边际和:

在使用addmargins()时,默认行为是为表中所有的变量创建边际和,以下代码分别只添加各行的和、各列的和。

gmodels包中的CrossTable()函数也可以用来创建二维列联表:

CrossTable()函数可以完成很多功能:计算(行、列、单元格)的百分比;指定小数位数;进行独立性检验;计算期望和残差;将残缺值作为一种有效值;进行行和列标题的标注;生成SAS和SPSS风格的输出等。

对于多维列联表,table()和xtabs()都可以基于三个或更多的类别型变量生成多维列联表,margin.table()、prop.table()和addmargins()函数也可以自然地推广到高维的情况。另外,ftable()还提供了一种紧凑而优雅的方式输出多维列联表。

独立性检验

除了组成表格各种变量组合的频数和比例,有时候我们还会对列联表中的变量是否相关或独立感兴趣。R提供了多种检验类别型变量独立性的方法,如卡方独立性检验、Fisher精确检验和Cochran-Mantel-Haenszel检验。

使用chisq.test()函数对二维表的行变量和列变量进行卡方独立性检验。

p值表示从总体中抽取的样本行变量和列变量相互独立的概率,当p<0.01时,认为两者存在关系,当p>0.05时,认为两者相互独立的可能性较大。

使用fisher.test()进行Fisher精确检验,使用方法类似。

使用mantelhaen.test()函数进行Cochran-Mantel-Haenszel卡方检验,以下代码检验治疗情况和改善情况在性别的每一水平下是否独立。

结果表明,患者接受的治疗和得到的改善在性别的每一水平下并不独立,即分性别来看,用药治疗的患者较接受安慰剂的患者得到了更多改善。

相关性的度量

如果两个变量之间并非相互独立,那么有必要关注用以衡量相关性强弱的相关性度量。vcd包中的assocstats()函数可用来计算二维列联表的phi系数、列联系数和Cramer’s V系数。

7.3 相关

相关系数可以用来描述数值型变量之间的关系,相关系数的符号表明关系的方向,其值的大小表示关系的强弱程度。

相关的类型

R中可以计算多种相关系数,包括Pearson相关系数、Spearman相关系数、Kendall相关系数、偏相关系数、多分格(polychoric)相关系数和多系列(polyserial)相关系数。

相关的计算

cor()函数可以计算Pearson、Spearman和Kendall相关系数,cov()函数可用来计算协方差。cor()函数参数如下:

x为矩阵或数据框,use指定缺失数据时的处理方式(all.obs,假设不存在缺失数据,遇到缺失数据则报错;everything,遇到缺失数据时,相关系数的计算结果将被设为missing;complete.obs,行删除;pairwise.complete.obs,成对删除),默认为everything,method指定相关系数类型(pearson、spearman、kendall),默认pearson。

以下代码使用state.x77数据集中的数据,其提供了美国50个州在1997年的人口、收入、文盲率、预期寿命、谋杀率和高中毕业率数据。

偏相关是指在控制一个或多个数值型变量时,另外两个变量之间的相关关系,可以使用ggm包中的pcor()函数计算偏相关系数。

7.4 t 检验

在分析中最常见的操作就是对两个组进行比较,此处关注的是结果变量为连续型的组间比较,并假设其呈正态分布。

以下分析中将使用MASS包中的UScrime数据集,其包含了1960年美国47个州的刑罚制度对犯罪率影响的信息,包括Prob(监禁的概率)、U1(14~24岁年龄段城市男性失业率)、U2(35~39岁年龄段城市男性失业率),类别型变量So(指示该州是否位于南方)将作为分组变量使用。

独立样本的t检验

以下代码比较了南方(group 1)和非南方(group 0)各州的监禁概率,So和Prob两者没有显著关系,故称为独立样本的t检验。

我们有理由拒绝,南方各州和非南方各州拥有相同监禁概率的假设(p<0.001)。

非独立样本的t检验

再举个例子,也许我们希望知道,较年轻(14~24岁)男性的失业率是否比年长(35~39岁)男性的失业率更高?由于这两组数据并不独立,因此需要处理的是非独立样本的t检验。

差异的均值(61.5)足够大,因此可以保证拒绝年长和年轻男性的平均失业率相同的假设,年轻男性的失业率更高。

20 2015-04

1条评论

  1. 匿名说道:

发表评论