列联表是观测数据按两个或更多属性(定性变量)分类时所列出的频数分布表,它是由两个以上的变量进行交叉分类的频数分布表。交互分类的目的是将两变量分组,然后比较各组的分布状况,以寻找变量间的关系。
按两个变量交叉分类的,该列联表称为两维列联表;若按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
2,创建二维列联表
二维列联表是指按照两个分类变量列出的频数表:
with(Arthritis,table(Improved,Sex))
xtabs(~Improved+Sex,data=Arthritis)
Sex和Improved是分类的变量名,两个分类交叉分类,查看两个分类之间的关系:
Sex
Improved Female Male
None
Some
Marked
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,) Improved
None Some Marked
二,自定义区间
按照分类变量来计算频数,有时不能满足需要,例如,按照年龄段来计算频数,每10年为一个年纪段,统计各个年龄段的人数。由于Arthritis数据集中并没有该分类变量,这就需要自定义区间,按照分组的间隔来制作频数分布表。
我从网上找到一个制作频率分布表的步骤,总共4步。
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(,,,,,,)
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)
[] "factor"
查看频数分布表,按照Age(把mytable重命名为Age)因子进行分组,统计各个因子属性值的频数:
> table(Age=mytable)
Age
< - - - - >=
把频数分布表转换为数据框,得到二维表如下图所示:
> df
Age Freq
<
-
-
-
-
>=
step5,列出频率分布表
列出频率分布表,包括累积频数和累计频率
df <- transform(df, cumFreq = cumsum(Freq), FreqRate = prop.table(Freq))
df <- transform(df, cumFreqRate= cumsum(FreqRate))
df <- transform(df,FreqRate=round(FreqRate * ,), cumFreqRate= round(cumFreqRate*,))
查看频率分布表:
Age Freq cumFreq FreqRate cumFreqRate
< 8.33 8.33
- 9.52 17.86
- 14.29 32.14
- 34.52 66.67
- 32.14 98.81
>= 1.19 100.00
参考文档: