列联表分析基于R语言

来源:互联网 发布:ubuntu windows 比较 编辑:程序博客网 时间:2024/04/27 20:39

本文中的数据为去头数据,是我聚类后的一部分,具体变量是我命名的,没有具体意义,放在这里仅供学习和交流,请不要传播和用于其他用途。数据下载链接:数据云盘链接

一、列联表基本概念

列联表本质上是对数据在一维或多维上的边际分布的概率描述。

如下表

列联表按表中元素的内容可以分为频数列联表和频率列联表,下面会看到。同时根据稀疏阵与否可以分为非稀疏列联表和稀疏列联表。

在通常的数据处理实践中我们常常有要求数据在列联表的一个维度上显示多个特征,如下图:

这里基本概念有空了在写,昨天传了两张图存草稿了,今天全没了,等哪天在写理论部分吧

二、变量组合形式的二维列联表

横列我们所展示的就是两个特征:学历+男女,纵列展示的是地区,碰到这种情况时展示一下三种方法:1.table/xtabs函数;2.运用excel数据透视表;3.reshape包

1)先介绍第一种方法,这种较为麻烦,可是延续了table函数自带的性质,如prop.table,margin.table,卡方值等

由于table、xtabs没有特征组合之间的列联表,因此需要我们自己设置变量名,我的方法是:利用类似hash编码的方式将二维变为一维,要保证不重复。本例中四个变量都是1到2位数,所以我添加两个特征horizon=num*100+$cluster,longitude=pay*100+orient,这样不重不漏,也好辨识。所以pay+orient~num+cluster就变成了horizon~longitude

代码如下:

cross=read.csv("cross.csv")
cross=cross1#这里备份,以后cross变量会改变cross$horizon=cross$num*100+cross$clustercross$longitude=cross$pay*100+cross$orientpoo=xtabs(~horizon+longitude,data=cross,drop.unused.levels=FALSE)#这里其实drop.unused.levels=FALSE不起作用,因为levels是horizon和longitude,没有出现的组合还是没有出现,后面会介绍

由于这里有些根本就木有存在的特征组合,如pay=19,orient=5的组合,但是数据并不能够识别这些不存在的组合。最后我们得到的tale必定没有19,15这一列,依次类推我们,对于大量特征的稀疏阵我们必定会出现大量根本没有出现的特征组合,实际上出现的一般不会超过10%。但是有时候我们在进行报表或者描述性统计时又必须加上这样显得规整和好看(当然如果你仅仅是做探索性分析,这里table全不全没有关系,但是有的描述性分析就要这样一张表,毕竟数据分析是后台,往往是被要求的职位,各种各样的数据要求都可能出现)

方法一,添加行和列的factor,对没有出现的factor加入levels中去,由于没出现的有十几列,十几行,需要匹配寻找漏的哪几条,较为麻烦,不推荐。

方法二,构造一个新数据,在原数据的基础上添加longtitude*honrizon个行,每行添加一条数据(由于是频数统计,添加NA或0都可以),这样xtabs就会有全部特征组合的table了,而table减去一个全1矩阵(行和列元素全为1)就得到了应有的table

代码如下:

longitu=c();m=1for(i in 1:length(unique(cross$num))){for(j in 1:length(unique(cross$cluster))){longitu[m]=100*i+jm=m+1next}}hori=c();m=1for(i in 1:length(unique(cross$area))){for(j in 1:length(unique(cross$orient))){hori[m]=100*i+jm=m+1next}}m=length(cross$longitude)+1for(i in 1:length(coo)){for(j in 1:length(doo)){cross[m,c("horizon","longitude")]=c(longitu[i],hori[j])m=m+1next#这里对所有组合添加一条数据,其他值为NA}}m=length(cross$longitude)+1dataoo=cross[m:(dim(cross)[1]),]poo=xtabs(~horizon+longitude,data=cross,drop.unused.levels=FALSE)qoo=xtabs(~horizon+longitude,data=dataoo,drop.unused.levels=FALSE)#qoo其实全为1,这里可以检验一下前面步骤是否有误roo=poo-qoo#roo即为全部变量都有的table

不过值得我们注意的是卡方检验等检验是建立在出现的特征基础上的(这其实是极大似然的思想,频率为0我们默认概率为0,在独立性假设的基础上,不出现的变量其实已经不在联合分布里面了),所以注意这里假设检验值不是对全变量表而言的。

2)excel数据透视表创建table

这个方法也会出现刚才table中省略没有的特征组合的情形。

创建数据透视薄,在行标签中选择num和cluster,列表签中选择pay和orient,数值选择code,值和字段设置选择计数。结果就直接出来了,优势是简单快捷,缺点自然是对于没有出现的组合只能手动插入,如本数据中pay越高经常有orient根本没有出现该样本,这种方法table越大,手动操作就越费时。不多说了,上结果:

只是结果的一小部分。另外如果需要的是频率列联表,可以选择值字段设置>值显示方式>占总和的百分比,如果想看边际的也可以选择行或者列的百分比。不再赘述

3)reshape2建立列联表

reshape2是在reshape更改的R包,但是如同hardley的其他包一样改的很厉害,所以建议直接学reshape2,reshape原来的版本正在逐步退出舞台,等有时间了,会有R包的相关文章更新。

library(reshape2)#1.首先用reshape2实现数据列联组合cross=read.csv("cross.csv")head(cross)moo<-melt(cross,id.vars=c("num","cluster","orient","pay"),measure.vars=c("code"), variable.name="columnV", value.name="value")str(moo)aoo=acast(moo,num+cluster+pay+orient~columnV,drop=0)boo=acast(moo,num+cluster+pay+orient~columnV,drop=1)c("Laoo"=length(aoo),"Lboo"=length(boo),"diff"=length(aoo)-length(boo))


#2.将数据编程table的形式
#注意到aoo其实拆分成若干段,转置叠在一起放就是tablecolnames(aoo)aoo=as.data.frame(aoo)library(stringr)length(aoo)locate=list(array(t(rep(1,length(aoo))),(rep(1,length(aoo)))))locate1<-function(x){<span style="white-space:pre"></span>y=paste(unlist(strsplit(x,"_"))[c(1,2)],collapse="_")<span style="white-space:pre"></span>return(y)}locate2<-function(x){<span style="white-space:pre"></span>y=paste(unlist(strsplit(x,"_"))[c(3,4)],collapse="_")<span style="white-space:pre"></span>#这里用str_sub/str_extract并不成功,正则表达式不支持r的字符串操作函数,有空再试一下,会出现在字符串操作的文章里面<span style="white-space:pre"></span>return(y)}longitude=sapply(rn,locate1,USE.NAMES=0)horizon=sapply(rn,locate2,USE.NAMES=0)number=length(unique(horizon))head(horizon,n=120)number#114个分成一行#将aoo分行class(aoo)coo=matrix(NA,100,114)colnames(coo)=unique(horizon)rownames(coo)=unique(longitude)coo[1,]=aoo[c(1:114),]for(i in 1:100){<span style="white-space:pre"></span>coo[i,]=aoo[c((114*(i-1)+1):(114*i)),]}head(coo)tail(coo)dim(coo)#coo就是想要的table,如果需要去margin.table和 prop.table进行矩阵运算就可以了#prop除以所有元素和得到频率列联表#频率列联表行和列分别求和得到,边际列联表。

X_X_X_X,中X一次为num+cluster+pay+orient,同时也可以按到drop=0和drop=1的差为10243,可见如果手动进行补全是多么痛苦的一件事情。

####################继续更新,敬请期待!!!


0 0