列联表是观测数据按两个或更多属性 (定性变量) 分类时所列出的频数分布表, 它是由两个以上的变量进行交叉分类的频数分布表. 交互分类的目的是将两变量分组, 然后比较各组的分布状况, 以寻找变量间的关系.
按两个变量交叉分类的, 该列联表称为两维列联表; 若按 3 个变量交叉分类, 所得的列联表称为 3 维列联表, 依次类推. 一维列联表就是频数分布表. 频数就是各个分组中属性出现的次数.
频数也称 "次数", 对样本数据按某些属性进行分组, 统计出各个组内含个体的个数, 就是频数.
本文使用 vcd 包中的 Arthritis 数据集来演示如何创建列联表.
一, 创建频数表
频数表用于探索类别型变量, 常用 table()和 xtabs()来创建频数表:
- table(var1, var2, ...,varN)
- xtabs(formula, data)
参数注释:
table()函数: 使用 N 个类别变量 (因子) 创建一个 N 维列联表,
xtabs()函数: 根据一个公式 (~var1+var2+...+varN) 创建一个 N 维列联表.
总体来说, 要进行交叉分类的变量应出现在公式的右侧, 即 ~ 符号的右方, 以 + 作为分割符. 本文重点介绍一维列联表和二维列联表, 对于高维列联表, 不做介绍.
函数 prop.table()以列联表作为参数, 以 margins 定义的边际把列联表中的频数表示为比例关系.
prop.table(table,margins)
参数注释: table 是列联表, margins 是边际列表, 1 是第一个分类变量, 2 是第二个分类变量
函数 margin.table()以列联表作为参数, 以 margins 定义的边际列表来计算频数的和.
margin.table(table,margins)
参数注释: table 是列联表, margins 是边际列表, 1 是第一个分类变量, 2 是第二个分类变量
1, 创建一维列联表
一维列联表是根据一个分类变量列出变量各个值得频数:
- with(Arthritis,table(Improved))
- xtabs(~Improved,data=Arthritis)
Improved 是分类得变量名, None,Some 和 Marked 是变量的值, 数值是各个变量值出现的次数(频数).
- Improved
- None Some Marked
- 42 14 28
2, 创建二维列联表
二维列联表是指按照两个分类变量列出的频数表:
- with(Arthritis,table(Improved,Sex))
- xtabs(~Improved+Sex,data=Arthritis)
Sex 和 Improved 是分类的变量名, 两个分类交叉分类, 查看两个分类之间的关系:
- Sex
- Improved Female Male
- None 25 17
- Some 12 2
- Marked 22 6
3, 把列联表的频数转换为比例值
使用 prop.table(), 把列联表的频数转换为比例值
- mytable <- xtabs(~Improved+Sex,data=Arthritis)
- prop.table(mytable)
- Sex
- Improved Female Male
- None 0.29761905 0.20238095
- Some 0.14285714 0.02380952
- Marked 0.26190476 0.07142857
4, 计算列联表的边际列表的和
使用 margin.table(), 按照边际列表计算列联表的频数之和
- mytable <- xtabs(~Improved+Sex,data=Arthritis)
- margin.table(mytable,1)
- Improved
- None Some Marked
- 42 14 28
二, 自定义区间
按照分类变量来计算频数, 有时不能满足需要, 例如, 按照年龄段来计算频数, 每 10 年为一个年纪段, 统计各个年龄段的人数. 由于 Arthritis 数据集中并没有该分类变量, 这就需要自定义区间, 按照分组的间隔来制作频数分布表.
我从网上找到一个制作频率分布表的步骤, 总共 4 步.
制作频率分布表的步骤如下:
1. 求全距(全距亦称极差): 从数据中找出最大值 Max 和最小值 Min, 并求出它们的差, 本例中最大值 Max=100, 最小值 Min=42, 故全距为 Max-Min=100-42=58, 从全距可以初步了解数据的差异幅度, 同时亦为决定组距与组数提供了依据.
2. 决定组距与组数: 组数 D 和组距 K 之间有关系式 D>=(Max- Min)/K, 本例中取 K=5, 则 D= (Max-Min)/K=58/5, 向上取整为 12, 故分为 12 组.
3. 决定组限: 组限就是表明每组两端的数值, 其中每组的起点数值称为下限 RL, 终点数值称为上限 RU, 上限和下限也是数据的分点, 通常区间是左闭右开型的:[RL , RU)
4. 制作频率分布表: 其中落在各个小组内的数据个数即为频数(或称次数), 常用 f 表示, 每一小组的频数与样本容量的比值即为频率.
step1, 求极差
最大值是 74, 最小值是 23, 极差是 51
age_range <- max(Arthritis$Age)-min(Arthritis$Age)
step2, 决定组距和组数
把组距定为 10, 那么组数是 6(不小于 51/10 的最小整数)
step3, 决定分点
使用 cut()函数来分割 Age 数据, 设置断点向量 breaks, 以及每个区间的名称 lables:
- labels <- c("<30", "30 - 40", "40 - 50", "50 - 60", "60 - 70", ">= 70")
- breaks <- c(1,30,40,50,60,70,100)
step4, 制作频数分布表
使用 cut()函数按照指定的断点来分割数据, 得到各个分组, 使用 table()函数得到频数表:
- mytable <- cut(Arthritis$Age, breaks = breaks, labels = labels, right = TRUE )
- df <- as.data.frame(table(Age=mytable))
- #names(df)[1] <- c('Age')
cut()函数返回的是 mytable 的类型是因子, 也就是说, cut()函数返回的结果是因子向量:
- class(mytable)
- [1] "factor"
查看频数分布表, 按照 Age(把 mytable 重命名为 Age)因子进行分组, 统计各个因子属性值的频数:
- > table(Age=mytable)
- Age
- <30 30 - 40 40 - 50 50 - 60 60 - 70>= 70
- 7 8 12 29 27 1
把频数分布表转换为数据框, 得到二维表如下图所示:
- > df
- Age Freq
- 1 <30 7
- 2 30 - 40 8
- 3 40 - 50 12
- 4 50 - 60 29
- 5 60 - 70 27
- 6>= 70 1
step5, 列出频率分布表
列出频率分布表, 包括累积频数和累计频率
- df <- transform(df, cumFreq = cumsum(Freq), FreqRate = prop.table(Freq))
- df <- transform(df, cumFreqRate= cumsum(FreqRate))
- df <- transform(df,FreqRate=round(FreqRate * 100,2), cumFreqRate= round(cumFreqRate*100,2))
查看频率分布表:
- Age Freq cumFreq FreqRate cumFreqRate
- 1 <30 7 7 8.33 8.33
- 2 30 - 40 8 15 9.52 17.86
- 3 40 - 50 12 27 14.29 32.14
- 4 50 - 60 29 56 34.52 66.67
- 5 60 - 70 27 83 32.14 98.81
- 6>= 70 1 84 1.19 100.00
参考文档:
SPSS-- 描述性统计分析 -- 列联表
频数分布表
来源: https://www.cnblogs.com/ljhdo/p/4484246.html