• R in action读书笔记(6)-第七章:基本统计分析(中)


    7.2 频数表和列联表

    > library(vcd)

    > head(Arthritis)

    ID Treatment Sex Age Improved

    1 57 Treated Male 27 Some

    2 46 Treated Male 29 None

    3 77 Treated Male 30 None

    4 17 Treated Male 32 Marked

    5 36 Treated Male 46 Marked

    6 23 Treated Male 58 Marked

    7.2.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) 创建一个紧凑的“平铺”式列联表

    1. 一维列联表

    > mytable<-with(Arthritis,table(Improved))
    > mytable
    Improved
      None   Some Marked 
        42     14     28 

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

    > prop.table(mytable)
    Improved
         None      Some    Marked 
    0.5000000 0.1666667 0.3333333 

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

    2. 二维列联表

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

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

    格式为:mytable<-xtabs(~A+B,data=mydata)

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

    对于Arthritis数据,有:

    > mytable<-xtabs(~Treatment+Improved,data=Arthritis)
    > mytable
             Improved
    Treatment None Some Marked
      Placebo   29    7      7
      Treated   13    7     21

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

    例可以这样计算:

    > margin.table(mytable,1)
    Treatment
    Placebo Treated 
         43      41 
    > prop.table(mytable,1)
                 Improved
    Treatment   None      Some    Marked
      Placebo 0.6744186 0.1627907 0.1627907
      Treated 0.3170732 0.1707317 0.5121951

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

    > margin.table(mytable,2)
    Improved
      None   Some Marked 
        42     14     28 
    > prop.table(mytable,2)
             Improved
    Treatment      None      Some    Marked
      Placebo 0.6904762 0.5000000 0.2500000
      Treated 0.3095238 0.5000000 0.7500000

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

    > prop.table(mytable)
             Improved
    Treatment       None       Some     Marked
      Placebo 0.34523810 0.08333333 0.08333333
      Treated 0.15476190 0.08333333 0.25000000

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

    > addmargins(mytable)
             Improved
    Treatment None Some Marked Sum
      Placebo   29    7      7  43
      Treated   13    7     21  41
      Sum       42   14     28  84
    > addmargins(prop.table(mytable))
             Improved
    Treatment       None       Some     Marked        Sum
      Placebo 0.34523810 0.08333333 0.08333333 0.51190476
      Treated 0.15476190 0.08333333 0.25000000 0.48809524
      Sum     0.50000000 0.16666667 0.33333333 1.00000000

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

    > addmargins(prop.table(mytable,1),2)#仅添加了各行的和
             Improved
    Treatment      None      Some    Marked       Sum
      Placebo 0.6744186 0.1627907 0.1627907 1.0000000
      Treated 0.3170732 0.1707317 0.5121951 1.0000000

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

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

    函数仿照SAS中PROC FREQ或SPSS中CROSSTABS的形式生成二维列联表

    > CrossTable(Arthritis$Treatment,Arthritis$Improved)

    CrossTable()函数有很多选项,可以做许多事情:计算(行、列、单元格)的百分比;指

    定小数位数;进行卡方、Fisher和McNemar独立性检验;计算期望和(皮尔逊、标准化、调整的

    标准化)残差;将缺失值作为一种有效值;进行行和列标题的标注;生成SAS或SPSS风格的输出。

    3.多维列联表

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

    > mytable<-xtabs(~Treatment+Sex+Improved,data=Arthritis)
    , , Improved = None
             Sex
    Treatment Female Male
      Placebo     19   10
      Treated      6    7
    , , Improved = Some
             Sex
    Treatment Female Male
      Placebo      7    0
      Treated      5    2
    , , Improved = Marked
             Sex
    Treatment Female Male
      Placebo      6    1
      Treated     16    5
     
    > ftable(mytable)
                     Improved None Some Marked
    Treatment Sex                             
    Placebo   Female            19    7      6
              Male              10    0      1
    Treated   Female             6    5     16
              Male               7    2      5

    > margin.table(mytable,c(1,3))#治疗情况(Treatment) × 改善情况(Improved)的边际频数

             Improved
    Treatment None Some Marked
      Placebo   29    7      7
      Treated   13    7     21

    7.2.2独立性检验

    1. 卡方独立性检验

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

    > library(vcd)
    > mytable<-xtabs(~Treatment+Improved,data=Arthritis)
    > chisq.test(mytable)
           Pearson's Chi-squared test
    data:  mytable
    X-squared = 13.055, df = 2, p-value = 0.001463#治疗情况和改善情况不独立

    2. Fisher精确检验

    可以使用fisher.test()函数进行Fisher精确检验。Fisher精确检验的原假设是:边界固定

    的列联表中行和列是相互独立的。其调用格式为fisher.test(mytable),其中的mytable是

    一个二维列联表

    > fisher.test(mytable)
           Fisher's Exact Test for Count Data
    data:  mytable
    p-value = 0.001393
    alternative hypothesis: two.sided

    这里的fisher.test()函数可以在任意行列数大于等于2的二维列联表上使用,但不能用于2×2的列联表。

    3.Cochran-Mantel—Haenszel检验

    mantelhaen.test()函数可用来进行Cochran—Mantel—Haenszel卡方检验,其原假设是,两

    个名义变量在第三个变量的每一层中都是条件独立的。

     > mantelhaen.test(mytable)
           Cochran-Mantel-Haenszel test
    data:  mytable
    Cochran-Mantel-Haenszel M^2 = 14.6323, df = 2,
    p-value = 0.0006647

    7.2.3 相关性的度量

    如果可以拒绝原假设,那么你的兴趣就会自然而然地转向用以衡量相关性强弱的相关性度量。vcd包中的assocstats()函数可以用来计算二维列联表的phi系数、列联系数和Cramer’sV系数

    > mytable<-xtabs(~Treatment+Improved,data=Arthritis)
    > assocstats(mytable)
                        X^2 df  P(> X^2)
    Likelihood Ratio 13.530  2 0.0011536
    Pearson          13.055  2 0.0014626
    Phi-Coefficient   : 0.394 
    Contingency Coeff.: 0.367 
    Cramer's V        : 0.394 

    总体来说,较大的值意味着较强的相关性。vcd包也提供了一个kappa()函数,可以计算混

    淆矩阵的Cohen’s kappa值以及加权的kappa值。(举例来说,混淆矩阵可以表示两位评判者对于一系列对象进行分类所得结果的一致程度。)

    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)
    + }

    使用table2flat()函数转换已发表的数据

    > treatment<-rep(c("Placebo","Treated"),times=3)
    > 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)
      treatment inmproved
    1   Placebo      None
    2   Placebo      None
    3   Placebo      None
    4   Placebo      None
    5   Treated      None
    6   Placebo      Some
  • 相关阅读:
    C#注释含义(XML注释)标签及其含义(二)
    Apache开启伪静态[转]
    C#注释含义(XML注释)标签及其含义(一)
    [转]终结PHP中文乱码的问题
    Symfony框架百科/项目实战/指南/教程
    第一次用Office2007写博客
    prototype.js是什么?
    优秀网站源码 集合
    Pager 精简的分页控件
    Validator.js 很好用的客户端表单验证
  • 原文地址:https://www.cnblogs.com/jpld/p/4442869.html
Copyright © 2020-2023  润新知