卡方检验是以χ2分布为基础的一种常用假设检验方法,它的零假设H0是:观察频数与期望频数没有差别。
该检验的基本思想是:首先假设H0成立,基于此前提计算出χ2值,它表示观察值与理论值之间的偏离程度。根据χ2分布及自由度可以确定在H0假设成立的情况下获得当前统计量及更极端情况的概率P。如果P值很小(一般认为是小于5%),说明观察值与理论值偏离程度太大,应当拒绝零假设,表示比较资料之间有显著差异;否则就不能拒绝零假设,尚不能认为样本所代表的实际情况和理论假设有差别。
χ2是观察频数与期望频数之间距离的一种度量指标,也是假设成立与否的度量指标。如果χ2值“小”,研究者就倾向于不拒绝H0;如果χ2值大,就倾向于拒绝H0。至于χ2在每个具体研究中究竟要大到什么程度才能拒绝H0,则要借助于卡方分布求出所对应的P值来确定。
首先先来看一下原始的问卷:
每个选项对应Excel表中的数据格式分别是1、 2、 3···
首先设法建立列联表
library(dplyr)
library(ggplot2)
survey <- read.csv("1.csv")
degree <- c('A.十分期待', 'B.比较期待', 'C.期待', 'D.无感觉', 'E.不期待')
time <- c('A.1小时以内', 'B.1~2小时', 'C.2~3小时', 'D.3~4小时', 'E.无所谓')
table1 <- survey %>% select(X18.您对这门课的期待程度, X22.您期望每周用于完成本课程作业的时间是)
names(table1)[1] = '期待程度'
names(table1)[2] = '花费时间'
table1[,1] = degree[table1[,1]]
table1[,2] = time[table1[,2]]
table1 %>% table
table1为:
花费时间
期待程度 A.1小时以内 B.1~2小时 C.2~3小时 D.3~4小时 E.无所谓
A.十分期待 12 29 21 6 7
B.比较期待 6 15 9 1 1
C.期待 3 2 1 0 1
D.无感觉 0 1 0 0 0
没有人选不期待(这个选项听起来太冷漠了),所以就没有显示出来。为什么要在前面加上ABC呢,因为不加的效果就像下面一样,由于列联表行和列的向量是按字典序排列的,因而毫无逻辑顺序。
花费时间
期待程度 1~2小时 1小时以内 2~3小时 3~4小时 无所谓
比较期待 15 6 9 1 1
期待 2 3 1 0 1
十分期待 29 12 21 6 7
无感觉 1 0 0 0 0
画一个对比图。
table1 %>% as.data.frame %>% ggplot(aes(x = 期待程度, y = 1, fill = 花费时间)) + geom_bar(stat = 'identity') +
ylab('人数') +
labs(title = "对比图")+
theme(plot.title=element_text(hjust=0.5))
然后简单粗暴地检验独立性。
table1 %>% table %>% chisq.test
Pearson's Chi-squared test
data: .
X-squared = 7.9067, df = 12, p-value = 0.7924
Warning message:
In chisq.test(.) : Chi-squared approximation may be incorrect
结果是期待程度和花费时间是独立的。但是有报错是怎么回事。哦,原来卡方检验是有条件的。
卡方分布本身是连续型分布,但是在分类资料的统计分析中,显然频数只能以整数形式出现,因此计算出的统计量是非连续的。只有当样本量比较充足时,才可以忽略两者的差异,否则将可能导致较大的偏差具体而言,一般认为对于卡方检验中的每一个单元格,要求其最小期望频数均大于1,且至少有4/5的单元格期望频数大于5,此时使用卡方分布计算出的概率值才是准确的。如果数据不符合要求,可以采用确切概率法进行概率的计算。
四格表资料的卡方检验:用于进行两个率或两个构成比的比较,要求样本含量应大于40且每个格子中的理论频数不应小于5。当样本含量大于40但理论频数有小于5的情况时卡方值需要校正,当样本含量小于40时只能用确切概率法计算概率。
行×列表资料的卡方检验:用于多个率或多个构成比的比较,要求每个格子中的理论频数T均大于5或1
这样看来,我必须要调整一下table了。
经过不断尝试,我发现table要一直化简到这样才可以:
table1 <- subset(table1, 期待程度!= 'D.无感觉'&期待程度!= 'C.期待'&花费时间!='E.无所谓'&花费时间!='D.3~4小时')
table1 %>% table
花费时间
期待程度 A.1小时以内 B.1~2小时 C.2~3小时
A.十分期待 12 29 21
B.比较期待 6 15 9
画出的图表是这样的:
> table1 %>% table %>% chisq.test
Pearson's Chi-squared test
data: .
X-squared = 0.14119, df = 2, p-value = 0.9318
大体可以看出,在选定的数据集下,期待程度是独立的属性。
但这样还有许多的数据没有用上,那有没有什么办法来整体分析一下这些属性呢?
我想到了将数据放大这种方案。
table2 <- table1 %>% table
table2 = table2*500
table2[table2==0] = 5
> table2
花费时间
期待程度 A.1小时以内 B.1~2小时 C.2~3小时 D.3~4小时 E.无所谓
A.十分期待 6000 14500 10500 3000 3500
B.比较期待 3000 7500 4500 500 500
C.期待 1500 1000 500 5 500
D.无感觉 5 500 5 5 5
table2 %>% chisq.test
Pearson's Chi-squared test
data: .
X-squared = 3873.7, df = 12, p-value < 2.2e-16
从上图可以看出,p值非常小,可以得出期待程度是非独立的这一结论。
小tips:
- alt+-可以召唤 <-
- ctrl+shift+m可以召唤 %>%