「医学统计学之二」卡方检验之独立性检验:python的scipy实现
△ 概念:
1 独立性检验:是对两个或两个以上因子彼此之间是否相互独立做检验时,就要用到卡方检验。
2 列联表中变量独立性的卡方检验,采用python中scipy包的
scipy.stats.chi2_contingency来实现,详细讲解该函数的具体使用细节,举例说明。
△ 举例1:
1 表如下,四格表。
2 特点:理论数T<5但T≥1,并且n≥40,用连续性校正的卡方进行检验。
即n数=55+35+4+12=106>40,T最小为4,T<5但T≥1。
3 代码如下:
from scipy.stats import chi2_contingency
data=[[55, 4], [35, 12]]
#def chi2_contingency(observed, correction=True, lambda_=None)
#校正过的卡方,即correction=True
#out=chi2_contingency(data,True)
out=chi2_contingency(data) # 默认是矫正的
print(out)
'''
#结果
(5.789316123732822, 0.01612386041580374, 1, array([[50.09433962, 8.90566038],
[39.90566038, 7.09433962]]))
'''
△ 举例2:
1 想知道吃鸡蛋对小儿肺炎发病率有没有影响。
先假设,H0,吃鸡蛋对患肺炎发病率是没有影响的,即吃鸡蛋和患肺炎是独立无关的。
H1假设:吃鸡蛋和患肺炎是非独立有关的。
2 表如下:
3 特点,理论数T≥5并且总样本量n≥40,用Pearson卡方进行检验。属于典型的四格表,其中n总数>40,T最小32>5。
4
scipy.stats.chi2_contingency不需要矫正,即correction=False,需要特别声明。
5 代码如下:
from scipy.stats import chi2_contingency
data=[[45, 94], [32, 85]]
out=chi2_contingency(data,False) # 不需要矫正
print(out)
'''
# 结果
(0.762324118459322, 0.3826021729944693, 1, array([[41.80859375, 97.19140625],
[35.19140625, 81.80859375]]))
'''
6 结果分析:
6.1 显然0.76<3.84(查表得到),所以吃鸡蛋和患肺炎是独立不相关的假设不成立。
6.2 即拒绝H1,接受H0,即H0假设成立:吃鸡蛋和患肺炎有关系,非独立的。但也不是说因为吃了鸡蛋就容易得肺炎。因P=0.383>0.05,无显著统计学差异。
△ 举例3:
1 高级版代码,还是四格表独立性的卡方检验。
2 列联表:
2.1 是观测数据按两个或多个(定型变量)分类时所列出的频数的表,又叫交叉分类数据。
2.2 列联表分析的基本问题:考察各属性之间有无关联,即判断两个属性是否独立。
3 四格表
4 性别与色盲是否相关?
那么:原假设,H0,性别与色盲之间是独立无关系的。
H1,性别与色盲之间是非独立有关系的。
5 代码:
import numpy as np
from scipy.stats import chi2_contingency # 列联表分析
from scipy.stats import chi2 # 卡方分布
def chi2_independence(alpha, data):
# 无需矫正,虽然默认矫正
chi2_v, p, dof, prediction_v = chi2_contingency(data,False)
if dof == 0:
print('自由度应该大于等于1')
elif dof == 1:
cv = chi2.isf(alpha * 0.5, dof)
else:
cv = chi2.isf(alpha * 0.5, dof-1)
if chi2_v > cv:
re = 1 # 表示拒绝原假设
else:
re = 0 # 表示接受原假设
# 卡方值,p,自由度,0=H0=接受原假设,1=H1=拒绝原假设,预测
return chi2_v, p, dof, re, prediction_v
alpha = 0.01 # 置信度,常用0.01,0.05,用于确定拒绝域的临界值
# 数据
data = np.array([[534, 66], [380, 19]])
out= chi2_independence(alpha, data)
print(out)
6 结果:
(11.979219278083217, 0.0005379711835989079, 1, 1, array([[548.94894895, 51.05105105],[365.05105105, 33.94894895]]))
第一个是卡方值chi2_v≈11.9792>3.84(查表得),故拒绝原假设 H0,接受H1假设,认为性别与视觉非独立有关的。
第二个是P值≈0.0005<0.01,有统计学上显著差异。
第三个是自由度1;第四个是1,提示拒绝原假设,接受H1假设。
以上是个人学习心得,仅供参考,欢迎大家批评指正。
△ 赋诗一首:(巩固一下原创性)
卡方检验很复杂,
医学统计头很大,
跟我用python呀,
省钱省力很简单。