美文网首页程序员
第7章 基本统计分析

第7章 基本统计分析

作者: 一日如十年 | 来源:发表于2019-03-14 21:38 被阅读0次

    《R语言实战》笔记系列


    本章学习大纲

    1.描述性统计分析

    2.频数表和列联表

    3.相关系数和协方差

    4.t检验

    5.非参数统计

    第一部分 描述性统计分析

    描述性分析主要分析连续型变量的中心趋势、变化性和分布形状的方法。有以下几种方法进行描述性统计分析:

    1.通过summary()计算

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

    summary()函数的应用

    2.通过sapply()计算

    apply()或sapply()函数也能计算所选择的任意描述性统计量。sapply()函数一般格式是:sapply(x,FUN,options)其中x是你的数据框(或矩阵),FUN为一个任意的函数。如果指定了cptions,它们将被传递给FUN。可以插入的函数如mean()、sd()、var()、min()、max()、median()、length()、range()和quantile()。函数fivenum()可以返回图基五数包括(Tukey's five-number summary),即最小值、下四分位数、中位数、上四分位数和最大值。

    sapply()函数的应用

    如果想忽略缺失值,则应当用sapply(mtcars[myvars],mystats,na.omit=TRUE)

    3.通过Hmisc包中的describe()函数计算

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

    Hmisc包中的describe()函数的应用

    4.通过pastecs包中的stat.desc()函数

    pastecs包中有一个名为stat.desc()的函数,它可以计算种类繁多的描述性统计量。格式为:stat.desc(x,basic=TRUE,norm=FALSE,p=0.95)其中x是一个数据框或时间序列。若basic=TRUE(默认值),则计算其中所有值、空值、缺失值的数量,以及最小值、最大值、值域,还有总和。若desc=TRUE(同样也是默认值)、则计算中位数、平均数、平均数的标准误、平均数置信度为95%的置信区间、方差、标准差以及变异系数。若norm=TRUE(不是默认值),则返回正态分布统计量,包括偏度和峰度(以及它们的统计显著程度)和Shapiro-Wilk正态检验结果。这里使用了p值来计算平均数的置信区间(默认置信度为0.95)。

    pastecs包中的stat.desc()函数的应用

    5.通过psych包中的describe()函数

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

    psych包中的describe()函数的应用

    psych包和Hmisc包均提供了名为describe()的函数。R如何知道该使用哪个呢?最后载入的程序包优先。如果想改为前一个包,如这里的Hmisc包,可以键入Hmisc:describe(mt)。

    分组计算描述性统计量

    1.使用aggregate()分组获取 描述性统计量

    aggregate()的应用

    list(am=mtcars$am)与list(mtcars$am)的区别

    list(mtcars$am)

    使用list(mtcars$am),则am列将被标注为Group.1而不是am。如果有多个分组变量,可以使用by=list(name1=groupvar1,name2=groupvar2,name3=groupvar3,...)

    2.使用by()分组计算描述性统计量

    aggregate()不足之处在于仅允许在每次调用中使用平均数、标准差这样的单返回值函数,无法一次返回若干个统计量。要完成这样的任务,可以使用by()函数,格式为by(data,INDICES,FUN)其中data是一个数据框或矩阵,INDICES是一个因子或因子组成的列表,定义了分组,FUN是任意函数。

    by()函数的应用

    3.使用doBy包中的summaryBy()分组计算概述统计量

    doBy包和sych包也提供了分组计算描述性统计量的函数。doBy包中summaryBy()函数的使用格式为:summaryBy(formula,data=dataframe,FUN=function)其中的formula接受以下的格式:

    var1+var2+var3+...+varN~groupvar1+groupvar2+...+groupvarN在~左侧的变量是需要分析的数值型变量,而右侧的变量是类别型的分组变量。function可为任何内建或用户自编的R函数。

    doBy包中的summaryBy()的应用

    第二部分 频数表和列联表

    频数表和列联表适用于类别型变量。本章的数据集为一项风湿性关节炎新疗法的双盲临床试验结果。

    数据集均为类别型因子

    生成频数表

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

    往往第一步是使用table()或xtabs()函数创建一个表,然后用其他函数处理它。

    1.一维列联表

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

    table()函数

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

    prop.table()函数

    可以用prop.table()*100转化为百分比

    prop.table()*100的应用

    解读:有50%的参与者获得了一定程度或显著的改善

    2.二维列联表

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

    mytable<-table(A,B)

    其中A是形变量,B是列变量。除此之外,xtabs()函数还可使用公式风格的输入创建列联表,格式为:

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

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

    xtabs()函数的应用

    也可以用margin.table()和prop.table()函数分别生成边际频数和比例。行和与行比例:

    以行变量的margin.table()和prop.table()函数的应用

    下标1指代table()语句中的第一个变量。如上代码所示,接受安慰剂治疗的明显改善的有16%,接受治疗的明显改善的有51%。下标2指代table()语句中的第二个变量。

    以列变量的margin.table()和prop.table()函数的应用

    PS:行变量为1,列变量为2。若设置为行变量的话,则行的数相加为1。

    各单元格所占的比例可以用以下语句获取。

    各单元格所占的比例语句

    也可以使用addmargins()函数为这些表格添加边际和。在使用addmargins()函数默认给表中所有的变量创建边际和。

    addmargins()函数为所有变量创建边际和
    addmargins()函数为行变量和列变量分别创建边际和

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

    使用CrossTable生成二维列联表

    CrossTable()函数的应用

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

    多维列联表

    table()和xtabs()都可以基于三个或更多的类别型变量生成多维列联表。margin.table()、prop.table()和addmargins()函数可以自然推广到高于二维的情况。

    三维列联表ftable()函数的应用

    列联表可以告诉组成表格的各种变量组合的频数和比例。

    独立性检验

    1.卡方独立性检验

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

    chisq.test()函数的应用

    结果显示患者接受的治疗和改善的水平看上去存在某种关系(p<0.01)。而患者性别和改善情况之间却不存在关系。(p>0.05)。产生警告的原因是表中的6个单元格之一有一个小于5的值,这可能使卡方检验无效。

    2.Fisher精确检验

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

    fisher.test()函数的应用

    fisher.test()函数与其他统计软件不同,R中可以在任意行列数大于等于2的二维列联表上使用,但不能用于2*2的列联表。

    3.Cochran-Mantel-Haenszel检验

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

    mantelhaen.test()函数的应用

    结构显示患者接受的治疗与得到的改善在性别的每一水平下均不独立,分性别来看,用药治疗的患者比较接受安慰剂的患者有了更多的改善。

    第三部分 相关性的度量

    上节的显著性检验评估了是否存在充分地证据以拒绝变量间相互独立的原假设。如果拒绝原假设,就需要研究衡量相关性强弱的相关性度量。vcd包中的assocstats()函数可以用来计算二维列联表的phi系数、列联系数和Cramer's系数。

    二维列联表的相关性度量

    相关

    相关系数可以用来描述定量变量之间的关系。相关系数的符号(+-)表明关系的方向(正相关或负相关),其值的大小表示关系的强弱程度(完全不相关为0,相关为1)。R可以计算多种相关系数。

    1.Pearson、Spearman和Kendall相关

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

    cor()函数可以计算这三种相关系数,而cov()函数可用来计算协方差和方差。一般形式为cor(x,use=,method=)

    cor和cov参数

    默认参数为use="everything"和methods="pearson"。


    协方差和相关系数

    当需要找某一组变量与另一组变量之间的关系时,就可用cor()函数。但使用cor()函数未指明相关系数是否显著不为0(即,根据样本数据是否有足够的证据得出总体相关系数不为0的结论)。所以需要对相对系数进行显著性检验。

    cor()函数的应用

    2.偏相关

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

    其中u是一个数值向量,前两个数值表示要计算相关系数的变量下标,其余的数值为条件变量(即要排除影响的变量)的下标。s为变量的协方差阵。下例表示在控制了收入、 文盲率和高中毕业率的影响时,人口和谋杀率之间的相关系数为0.346。


    pcor()函数的应用

    相关性的显著性检验

    计算好相关系数之后,需进行统计显著性检验。常用的原假设为变量间不相关(即总体的相关系数为0)。可以使用cor.test()函数对单个的Pearson、Spearman和Kendall相关系数进行检验。简化后的格式为:cor.test(x,y,alternative=,method=)。

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

    检验某种相关系数的显著性

    上例代码检验了预期寿命和谋杀率的Pearson相关系数为0的原假设。假设总体的相关度为0,则预计在一千万次中只会有少于一次的机会见到0.703这样大的样本相关度。由于这种情况几乎不可能发生,所以可以拒绝原假设,从而支持要研究的猜想,即预期寿命和谋杀率之间的总体相关率不为0。但cor.test()每次只能检验一种相关关系。

    corr.test()计算相关矩阵并进行显著性检验

    也可通过corr.test()函数进行显著性检验。参数use=的取值可为“pairwise"或“complete”(分别表示对缺失值执行成对删除或行删除)。参数method=取值可为“pearson”(默认值)、“spearman”或“kendall”。

    第四部分 t检验

    一个针对两组的独立样本t检验可以用于检验两个总体的均值相等的假设。这里假设两组数独立,并且是从正态总体中抽得。检验的调用格式:t.test(y~x,data)其中y是一个数值型变量,x是一个二分变量。调用格式或为t.test(y1,y2)。其中y1,y2为数值型向量(即各组的结果变量)。可选参数data的取值为一个包含了这些变量的矩阵或数据框。与其他统计软件不同,这里的t检验默认假定方差不相等,并使用Welsh的修正自由度。可以添加一个参数var.equal=TRUE以假定方差相等,并使用合并方差估计。默认的备择假设是双侧的(即均值不相等,但大小的方向不确定)。可以添加一个参数alternative="less"或“greater”进行有方向的检验。

    t.test()函数的应用

    上例为一个假设方差不等的双侧检验,比较了南方(group1)和非南方(group2)各州的监禁概率。因为p<0.001可以拒绝南方各州和非南方各州拥有相同监禁概率的假设。

    非独立样本的t检验

    非独立样本的t检验假定组间的差异呈正态分布。调用的格式为t.test(y1,y2,paired=TRUE)其中y1和y2为两个非独立组的数值向量。

    非独立样本的t检验的例子

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

    第五部分 组间差异的非参数检验

    如果数据无法满足t检验或ANOVA的参数假设,可以使用非参数检验。如果结果变量在本质上出现严重偏倚或呈现有序关系,则需要使用非参数检验。

    两组的比较

    若两组数据独立,可使用Wilcoxon秩和检验(又称Mann-WhitneyU检验)来评估观测是否是从相同的概率分布中抽得的(即,在一个总体中获得更高得分的概率是否比另一个总体更大)。调用格式:wilcox.test(y~x,data)其中y是数值型变量,x是二分变量。调用格式或为:wilcox.test(y1,y2)其中y1和y2为各组的结果变量。可选参数data的取值为一个包含了这些变量的矩阵或数据框。默认进行一个双侧检验。可以添加参数exact来进行精确检验,指定alternative="less"或="greater"进行有方向的检验。

    Wilcoxon符号秩和检验是非独立样本t检验的一种非参数替代方法。适用于两组成对数据和无法保证正态性假设的情境。调用格式与Mann-WhitneyU检验完全相同,但还可以添加参数paired=TRUE。

    当t检验的假设合理时,参数检验的功效更强(更容易发现存在的差异)。而非参数检验在假设非常不合理时(如对于等级有序数据)更适用。

    多于两组的比较

    如果各组独立——Kruskal-Wallis检验;各组不独立(如重复测量设计或随机区组设计)——Friedman检验。Kruskal-Wallis检验的格式:kruskal.test(y~A,data)其中y是一个数值型结果变量,A是一个拥有两个或更多水平的分组变量。而Friedman检验的格式为:friedman.test(y~A|B,data)其中y是一个数值型结果变量,A是分组变量。B是一个用以认定匹配观测的区组变量。data均为可选参数,指定了包含这些变量的矩阵或数据框。

    source()和wmc()函数的应用

    史上花费时间最长的一章笔记。。。

    感觉难度不大,主要是涉及的统计方法比较多。

    相关文章

      网友评论

        本文标题:第7章 基本统计分析

        本文链接:https://www.haomeiwen.com/subject/qlfudqtx.html