R语言实战——基本统计分析

栏目:bet356手机版现金 来源:咸宁汽车网 时间:2019-05-21

1 描述性统计分析

1.1 方法云集

方法一

对于基础安装,你可以使用summary( )函数来获取描述性统计量。

summary()函数提供了最小值、最大值、四分位数和数值型变量的均值,以及因子向量和逻辑型向量的频数统计。

方法二

你可以使用第5章中的apply()函数或sapply()函数计算所选择的任意描述性统计量。对于sapply()函数,其使用格式为:

其中的x是你的数据框(或矩阵),FUN为一个任意的函数。如果指定了options,它们将被传递给FUN。你可以在这里插入的典型函数有meansdvarminmaxmedianlengthrangequantile

函数fivenum( )可返回图基五数总括(Tukeys five-numbersummary,即最小值、下四分位数、中位数、上四分位数和最大值)。

扩展

若干用户贡献包都提供了计算描述性统计量的函数,其中包括Hmisc

pastecspsych

方法三

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

方法四

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

方法五

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

1.2 分组计算描述性统计量

方法一

你可以使用aggregate( )函数获取描述性统计量。

注意list(am=mtcars$am)的使用。如果使用的是list(mtcars$am),则am列将被标注为Group.1而不是am。你使用这个赋值指定了一个更有帮助的列标签。如果有多个分组变量,可以使用by=list(name1=groupvar1, name2=groupvar2, ... , groupvarN)这样的语句。

遗憾的是,aggregate( )仅允许在每次调用中使用平均数、标准差这样的单返回值函数。它无法一次返回若干个统计量。要完成这项任务,可以使用by( )函数。

扩展

doBy包和psych包也提供了分组计算描述性统计量的函数。doBy包中

summaryBy( )函数。

方法二

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

describe.by()函数不允许指定任意函数,所以它的普适性较低。若存在一个以上的分组变量,你可以使用list(groupvar1, groupvar2, ... , groupvarN)来表示它们。但这仅在分组变量交叉后不出现空白单元时有效。

方法三

可以使用reshape包灵活地按组导出描述性统计量。首先,使用:

dfm<-melt(dataframe,measure.vars=y,id.vars=g)

融合数据框。其中的dataframe包含着数据,y是一个向量,指明了要进行概述的数值型变量(默认使用所有变量),而g是由一个或多个分组变量组成的向量。然后使用:

cast(dfm,groupvar1+groupvar2+...+variale~.,FUN)

重铸数据。分组变量以+号分隔,这里的variable只取其字面含义①,而FUN是一个任意函数。

2 频数表和列联表

2.1 生成频数表

R中提供了用于创建频数表和列联表的若干种方法。

1 用于创建和处理列联表的函数

函数

描述

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( )xtabs()函数创建一个表,然后使用其他函数处理它。

1. 一维列联表

可以使用table( )函数生成简单的频数统计表。

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

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

2. 二维列联表

方法一

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

mytable<-table(A,B)

其中的A是行变量,B是列变量。

方法二

除此之外,xtabs()函数还可使用公式风格的输入创建列联表,格式为:

mytable<-xtabs(~A+B,data=mydata)

其中的mydata是一个矩阵或数据框。总的来说,要进行交叉分类的变量应出现在公式的右侧(即~符号的右方),以+作为分隔符。若某个变量写在公式的左侧,则其为一个频数向量(在数据已经被表格化时很有用)。

你可以使用margin.table()prop.table()函数分别生成边际频数和比例。行和与行比例可以这样计算:

下标1指代table( )语句中的第一个变量。观察表格可以发现,与接受安慰剂的个体中有显着改善的16%相比,接受治疗的个体中的51%的个体病情有了显着的改善。

列和与列比例可以这样计算:

这里的下标2指代table()语句中的第二个变量。

各单元格所占比例可用如下语句获取:

你可以使用addmargins()函数为这些表格添加边际和。例如,以下代码添加了各行的和与各列的和:

在使用addmargins( )时,默认行为是为表中所有的变量创建边际和。作为对照:

仅添加了各行的和。类似地,

添加了各列的和。

  • 注意,table()函数默认忽略缺失值(NA)。要在频数统计中将NA视为一个有效的类别,请设定参数useNA="ifany"


方法三

使用gmodels包中的CrossTable( )函数是创建二维列联表的第三种方法。

CrossTable()函数有很多选项,可以做许多事情:计算(行、列、单元格)的百分比;指定小数位数;进行卡方、FisherMcNemar独立性检验;计算期望和(皮尔逊、标准化、调整的标准化)残差;将缺失值作为一种有效值;进行行和列标题的标注;生成SASSPSS风格的输出。参阅help(CrossTable)以了解详情。

3. 多维列联表

table()xtabs()都可以基于三个或更多的类别型变量生成多维列联表。margin.table()prop.table()addmargins()函数可以自然地推广到高于二维的情况。另外,ftable()函数可以以一种紧凑而吸引人的方式输出多维列联表。

1部分代码生成了三维分组各单元格的频数。这段代码同时演示了如何使用ftable( )函数输出更为紧凑和吸引人的表格。

2部分代码为治疗情况(Treatment)、性别(Sex)和改善情况(Improved)生成了边际频数。由于使用公式~Treatement+Sex+Improve创建了这个表,所以Treatment需要通过下标1来引用,Sex通过下标2来引用,Improve通过下标3来引用。

3部分代码为治疗情况(Treatment)× 改善情况(Improved)分组的边际频数,由不同性别(Sex)的单元加和而成。每个Treatment× Sex组合中改善情况为NoneSomeMarked患者的比例由 给出。在这里可以看到治疗组的男性中有36%有了显着改善,女性为59%。总而言之,比例将被添加到不在prop.table( )调用中的下标上(本例中是第三个下标,或称Improve)。在最后一个例子中可以看到这一点,你在那里为第三个下标添加了边际和。

如果想得到百分比而不是比例,可以将结果表格乘以100。例如:

2.2 独立性检验

本节中描述的三种检验分别为卡方独立性检验、Fisher精确检验和Cochran-MantelHaenszel检验。

1. 卡方独立性检验

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

患者接受的治疗和改善的水平看上去存在着某种关系(p < 0.01)。而患者性别和改善情况之间却不存在关系(p > 0.05 。这里的p值表示从总体中抽取的样本行变量与列变量是相互独立的概率。由于1的概率值很小,所以你拒绝了治疗类型和治疗结果相互独立的原假设。由于2的概率不够小,故没有足够的理由说明治疗结果和性别之间是不独立的。结论为治疗情况和改善情况不独立,性别和改善情况独立。

2. Fisher精确检验

可以使用fisher.test()函数进行Fisher精确检验。Fisher精确检验的原假设是:边界固定的列联表中行和列是相互独立的。其调用格式为fisher.test(mytable),其中的mytable是一个二维列联表。

3. Cochran-MantelHaenszel检验

mantelhaen.test()函数可用来进行CochranMantelHaenszel卡方检验,其原假设是,两个名义变量在第三个变量的每一层中都是条件独立的。下列代码可以检验治疗情况和改善情况在性别的每一水平下是否独立。此检验假设不存在三阶交互作用(治疗情况×改善情况×性别)。

2.3 相关性的度量

显着性检验评估了是否存在充分的证据以拒绝变量间相互独立的原假设。如果可以拒绝原假设,那么你的兴趣就会自然而然地转向用以衡量相关性强弱的相关性度量。vcd包中的assocstats()函数可以用来计算二维列联表的phi系数、列联系数和Cramers V系数。

总体来说,较大的值意味着较强的相关性。vcd包也提供了一个kappa()函数,可以计算混淆矩阵的Cohens kappa值以及加权的kappa值。(举例来说,混淆矩阵可以表示两位评判者对于一系列对象进行分类所得结果的一致程度。)

2.4 结果的可视化

R中拥有远远超出其他多数统计软件的、可视地探索类别型变量间关系的方法。通常,我们会使用条形图进行一维频数的可视化。vcd包中拥有优秀的、用于可视化多维数据集中类别型变量间关系的函数,可以绘制马赛克图和关联图(。最后,ca包中的对应分析函数允许使用多种几何表示(Nenadic& Greenacre2007)可视地探索列联表中行和列之间的关系。

2.5 将表转换为扁平格式

在你已经拥有一个列联表却需要原始的数据时怎么办?

举例来说,假设你在某期刊上看到了下表,并想以扁平格式将其保存到R中。

?


3 相关

3.1 相关的类型

R可以计算多种相关系数,包括Pearson相关系数、Spearman相关系数、Kendall相关系数、偏相关系数、多分格(polychoric)相关系数和多系列(polyserial)相关系数。下面让我们依次理解这些相关系数。

1. PearsonSpearmanKendall相关

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

cor ( )函数可以计算这三种相关系数,而cov( )函数可用来计算协方差。

2 corcov的参数

参数

描述

x

矩阵或数据框

use

指定缺失数据的处理方式。可选的方式为all.obs(假设不存在缺失数据——遇到缺失数据时将报

错)、everything(遇到缺失数据时,相关系数的计算结果将被设为missing)、complete.obs

(行删除)以及 pairwise.complete.obs(成对删除,pairwise deletion

method

指定相关系数的类型。可选类型为pearsonspearmankendall

请注意,在默认情况下得到的结果是一个方阵(所有变量之间两两计算相关)。你同样可以计算非方形的相关矩阵。

2. 偏相关

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

3. 其他类型的相关

polycor包中的hetcor()函数可以计算一种混合的相关矩阵,其中包括数值型变量的Pearson积差相关系数、数值型变量和有序变量之间的多系列相关系数、有序变量之间的多分格相关系数以及二分变量之间的四分相关系数。多系列、多分格和四分相关系数都假设有序变量或二分变量由潜在的正态分布导出。请参考此程序包所附文档以了解更多。

3.2 相关性的显着性检验

方法一

常用的原假设为变量间不相关(即总体的相关系数为0)。你可以使用cor.test()函数对单个的PearsonSpearmanKendall相关系数进行检验。简化后的使用格式为:

Cor.test(x ,y,alternative= ,method= )

其中的xy为要检验相关性的变量,alternative则用来指定进行双侧检验或单侧检验(取值为"two.side""less""greater"),而method用以指定要计算的相关类型("pearson""kendall""spearman")。当研究的假设为总体的相关系数小于0时,请使用alternative="less"。在研究的假设为总体的相关系数大于0时,应使用alternative="greater"。在默认情况下,假设为alternative="two.side"(总体相关系数不等于0)。

方法二

遗憾的是,cor.test每次只能检验一种相关关系。但幸运的是,psych包中提供的corr.test()函数可以一次做更多事情。corr.test()函数可以为PearsonSpearmanKendall相关计算相关矩阵和显着性水平。

3.3 相关关系的可视化

以相关系数表示的二元关系可以通过散点图和散点图矩阵进行可视化,而相关图(correlogram)则为以一种有意义的方式比较大量的相关系数提供了一种独特而强大的方法。


4 t 检验

4.1 独立样本的t检验

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

t.testy~xdata

其中的y是一个数值型变量,x是一个二分变量。调用格式或为:

t.testy1y2

其中的y1y2为数值型向量(即各组的结果变量)。可选参数data的取值为一个包含了这些变量的矩阵或数据框。这里的t检验默认假定方差不相等,并使用Welsh的修正自由度。你可以添加一个参数var.equal=TRUE以假定方差相等,并使用合并方差估计。默认的备择假设是双侧的(即均值不相等,但大小的方向不确定)。你可以添加一个参数alternative="less"alternative="greater"来进行有方向的检验。

4.2 非独立样本的t检验

在两组的观测之间相关时,你获得的是一个非独立组设计(dependent groups design)。前—后测设计(pre-post design)或重复测量设计(repeated measures design)同样也会产生非独立的组。

非独立样本的t检验假定组间的差异呈正态分布。检验的调用格式为:

t.test(y1,y2,paired=TRUE)

其中的y1y2为两个非独立组的数值向量。

4.3 多于两组的情况

如果想在多于两个的组之间进行比较,应该怎么做?如果能够假设数据是从正态总体中独立抽样而得的,那么你可以使用方差分析(ANOVA)。ANOVA是一套覆盖了许多实验设计和准实验设计的综合方法。


5 组间差异的非参数检验

如果数据无法满足t检验或ANOVA的参数假设,可以转而使用非参数方法

5.1 两组的比较

若两组数据独立,可以使用Wilcoxon秩和检验(更广为人知的名字是MannWhitney U检验)来评估观测是否是从相同的概率分布中抽得的(即,在一个总体中获得更高得分的概率是否比另一个总体要大)。调用格式为:

wilcox.test(y ~ x,data)

其中的y是数值型变量,而想是一个二分变量。调用格式或为:

wilcox.test(y1, y2)

其中的y1y2为各组的结果变量。可选参数data的取值为一个包含了这些变量的矩阵或数据框。默认进行一个双侧检验。你可以添加参数exact来进行精确检验,指定alternative="less"alternative="greater"进行有方向的检验。

Wilcoxon符号秩检验是非独立样本t检验的一种非参数替代方法。它适用于两组成对数据和无法保证正态性假设的情境。调用格式与MannWhitney U检验完全相同,不过还可以添加参数paired=TRUE。让我们用它解答上一节中的失业率问题

5.2 多于两组的比较

在要比较的组数多于两个时,必须转而寻求其他方法。如果无法满足ANOVA设计的假设,那么可以使用非参数方法来评估组间的差异。如果各组独立,则KruskalWallis检验将是一种实用的方法。如果各组不独立(如重复测量设计或随机区组设计),那么Friedman检验会更合适。

KruskalWallis检验的调用格式为:

Kruskal.test(y~A,data)

其中的y是数值型结果变量,A是一个分组变量,而B是一个用以认定匹配观测的区组变量(blocking variable)。在以上两例中,data皆为可选参数,它指定了包含这些变量的矩阵或数据框。

显着性检验的结果意味着美国四个地区的文盲率各不相同(p <0.001)。

虽然你可以拒绝不存在差异的原假设,但这个检验并没有告诉你哪些地区显着地与其他地区不同。要回答这个问题,你可以使用MannWhitney U检验每次比较两组数据。一种更为优雅的方法是在控制犯第一类错误的概率(发现一个事实上并不存在的差异的概率)的前提下,执行可以同步进行的多组比较,这样可以直接完成所有组之间的成对比较。

书中的npmc包不能加载,因此非参数检验的组间比较还没有找到可以在R中实现的方法。

6 组间差异的可视化

使用视觉直观地检查组间差异,同样是全面的数据分析策略中的一个重要组成部分。它允许你评估差异的量级、甄别出任何会影响结果的分布特征(如偏倚、双峰或离群点)并衡量检验假定的合理程度。R中提供了许多比较组间数据的图形方法,其中包括6.5节中讲解的箱线图(简单箱线图、含凹槽的箱线图、小提琴图)、叠加的核密度图以及评估检验假定的图形方法


?



相关文章
评论
新版评论功能开发中
头条推荐
最新资讯