使用R语言进行卡方检验

1,.先定义卡方检验的一个方法
(1)读取文件,并根据x,y的参数获取相关的列数
(2)对单选项的处理:直接生成列联表
(3)对多选项的处理:对每个子选项都生成列联表,并将每个列联表的选择人数的那一列的数据取出并进行拼接,生成矩阵A
(4)求出每一行的总和,并生成单列矩阵B
(5)求出每行数据对每行的和的占比,并生成相同维度的矩阵C
(6)将数据统计矩阵A和数据占比矩阵C进行拼接,生成矩阵D
(7)将第四步骤的单例矩阵B和D矩阵拼接,生成E

##卡方检测的函数
#注:函数的参数表示形式诸如"X4","X5"(X为大写)
#x代表匹配方编号,XIsName匹配方名称
#y代表被匹配方编号,yIsName被匹配方名称
chiSquare<-function(x,y,xIsName,yIsName)
{
  #x <- "X1"
  #y <- "X11"
  da<<-read.csv("C:/Users/admin/Desktop/R/问卷数据(编号).csv")  #enconding="utf-8"
  #返回data的列名
  cnames<-colnames(da)
  #开头为y开头
  x2 <- paste(x,"\\.", sep = "")
  y2 <- paste(y,"\\.", sep = "")
  #print(x)
  #print(y)
  #两个选项的各自所有可能
  Xnames<-grep(x2,cnames,value=T)
  Ynames<-grep(y2,cnames,value=T)
  #print(Xnames)
  #print(Ynames)
  
  count<<-0
  ##两层循环
  #da4<<-table(da$X1.您住的城市.,da$X4..高级的.)
  for (Xname in Xnames) {
    for (Yname in Ynames) {
      count<<-count+1
      tempda4<-table(da[[Xname]],da[[Yname]]) 
      if((count == 1) && (length(Xnames)*length(Ynames) == 1))
      {
        da4<<-table(da[[Xname]],da[[Yname]])
      }
      if((count == 1) && length(Xnames)*length(Ynames) > 1)
      {
        da4<<-table(da[[Xname]],da[[Yname]]) 
        da4<<-da4[,2:2]
      }
      if(count>1)
      {
        da4 <<- cbind(da4,tempda4[,2:2])
      }
      
    }
  }##for循环结束

  #显示检测报告的内容
  result<-chisq.test(da4)
  pvalue <- result$p.value
  
  if(pvalue < 0.05)
  {
    print("检测内容:")
    print(paste(paste(xIsName, yIsName, sep = "和"),"进行卡方检测",sep=""))
    print("检测结果:")
    print(result)
    print("检测结论:")
    print(paste(paste(xIsName, yIsName, sep = "和"),"有显著相关性(p<0.05)",sep=""))
    #print("-----分隔符------")
    #print(paste(paste(x, y, sep = "和"),"交叉图表的结果",sep=""))
  }else{
    print("检测内容:")
    print(paste(paste(xIsName, yIsName, sep = "和"),"进行卡方检测",sep=""))
    print("检测结果:")
    print(result)
    print("检测结论:")
    print(paste(paste(xIsName, yIsName, sep = "和"),"无显著相关性(p>0.05)",sep=""))
    #print(paste(paste(x, y, sep = "和"),pvalue,sep="卡方检测结果 p>0.05 不输出,p=="))
  }
  
  #定义长度和宽度
  width<<-paste(y,1:length(da4[1,]),sep='.')
  width<<-c(width,"sum")
  height<<-paste(x,1:length(da4[,1]),sep='.')
  
  #求每一列的和
  daCoToal<-matrix(rowSums(da4),ncol = 1,byrow = FALSE)#行之和S
  
  #得到相对应的占比矩阵,并和初始数据集合并
  daPer<- paste(round(da4[,1:length(da4[1,])]/daCoToal[,1]*100,2),'%',sep='')
  newdaPer<-paste(paste("(",daPer,sep=""),")",sep = "")
  daPermatrix<-matrix(paste(da4,newdaPer,sep=''),nrow = length(da4[,1]))
  
  #添加一列总和的数据
  da4 <<- cbind(daPermatrix,daCoToal[,1:1])
  
  if(length(Xnames)*length(Ynames) == 1 && length(daPermatrix[1,]) <=2)
  {
    colnames(da4)<-c("no","yes","sum")
    rownames(da4)<-c(height)
    
  }
  else
  {
    #根据比对的选项个数生成对应的变量的个数
    colnames(da4)<-c(width)
    rownames(da4)<-c(height)
    
  }
  print(paste(paste(xIsName, yIsName, sep = "和"),"交叉比较的图表",sep=""))
  print(da4)
}

2调用程序方法

arr<-c("X1.您住的城市","X2.您的年龄","X3.您的家庭年收入为",
       "X4.洋快餐给您的印象","X5.在哪种情况下会选择吃洋快餐","X6.相对于中式快餐,洋快餐有什么特点",
       "X7.洋快餐销售中式食物(如饭,粥,豆浆),对您来说重要吗","X8.您一般会购买这些中式食物吗","X9.为什么会购买",
       "X10.为什么不会购买","X11.您觉得洋快餐的定价如何","X12.您最喜欢的是哪一个快餐品牌呢",
       "X13.这个品牌有什么独特之处呢")
#注:第一参数对应第三参数名称;第二参数对应第四参数名称
chiSquare("X1","X13",arr[1],arr[13])

3.程序的运行截图

在这里插入图片描述

  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值