python统计分析——分类数据的检验
参考资料:python统计分析【托马斯】
一、比率分析
1、置信区间
如果我们有一组样本数据,我们可以检查该样本是否代表标准总体。为了这样做,我们需要知道特征在标准人群中的比例p。一个n人的组的特征出现服从二项分布,其中均值=n×p。带有该特征的样本的标准误是:
并且,对应的95%置信区间是:
2、解释
如果我们有n个来自二项分布B(k,p)的独立样本,它们的样本均值的方差是:
其中,q=1-p。
①对于任意随机变量x和任意常数都成立。
②独立随机样本的和的方差等于方差的和。
当k=n时,我们可以得到;
当k=1时,二项变量是伯努利试验,标准误则是
二、频数表分析
如果数据可以被组织在一组类别中,并且它们被作为频数给出,即每个类别中的样本总数(而不是百分比),那么下面讲述的检验适用于这类数据分析。
许多这些检验分析的是距离期望值的偏差。由于卡方分布描述了数据的变异程度,这些检验中许多都是指该分布,因此,也就被称为卡方检验。
若n为表格中包含的所有观测总数,双向表中的每个单元格的期望值是:
假定我们观察到的绝对频数是o_i,期望的绝对频数e_i。在所有数据都来自同一总体的无效假设之下,检验统计量为:
其服从卡方分布,其中f为自由度。
1、单因素卡方检验
import numpy as np
from scipy import statsdata=np.array([10,6,5,4,5,3])
V,p=stats.chisquare(data)
print("卡方值:",V)
print("p值:",p)
有卡方检验结果可以知道:出现本例情况的概率是0.37,不具有统计学显著性。
2、卡方列联表检验
当数据可以被组织成行列的形式,我们可以检查在每一列中的数字是否取决于行值。由于这个原因,该检验有时被叫作列联表检验。
(1)假设
检验统计量V近似于卡方分布,当:①对于所有的绝对值期望频数e_i,都满足e_i≥1;②对于至少80%的绝对期望频数,都满足e_i≥5。
对于小样本数,应对卡方分布造成的偏误进行连续性矫正,因为频数按照定义是整数。该矫正被称作Yates矫正。
(2)自由度
自由度由可自由选择的绝对观测频数的数据来计算。例如,一个在底部和侧边带有总数的2×2表格,只有一个单元格需要被填充,其他的可以通过减法获得。
一般来说,一个r×c的表格,有r行c列,它的自由度为:
示例如下:【stats.chi2_contingency()函数默认对自由度为1的联列表使用连续性矫正。】
import numpy as np
from scipy import statsdata=np.array([[43,9],[44,4]])
V,p,df,expected=stats.chi2_contingency(data)
print("卡方值:",V)
print("p值:",p)
3、Fisher精确检验
如果不满足80%的单元格期望值至少为5的要求,则应使用Fisher精确测试。此检测基于所观察到的行和列总数。该方法包括评估与所有可能的2×2表相关联的概率,这些表与所观察到的数据具有相同的行和列总数,使得零假设(即行和列变量是无关的)是真的。
大多数情况下,Fisher的精确测试优于卡方检验。它被称为“精确”,是因为偏离一个空假设的显著性可以精确地计算出来,而不是依赖于一个近似值。
在使用该检验时,我们首先需要决定使用单尾还是双尾检验。
python中使用的函数是:oddsratio,pVal=stats.fisher_exact(obs,alternative="greater")
import numpy as np
from scipy import statsdata=np.array([[43,9],[44,4]])
oddsratio,p=stats.fisher_exact(data)
print("oddsratio:",oddsratio)
print("p值:",p)
4、McNemar检验
McNemar检验是从表的边际总和得出的比例之间的差异:和。McNemar检验的问题是:这两个比例(p_A和p_B)是否显著不同?p_A和p_B的关联是由于它们两个都包含了表格左上角单元格的数量a。
McNemar检验通常用于在病人自身对照的研究中,或“前后比较”的研究设计中。
以上图为例,“边缘同质性”的零假设意味着没有治疗效果。从上图案例数据可以看出,Yates连续性矫正的McNemar检验通量为:
其中服从1个自由度的卡方分布。对于小样本数,correctionFactor应该是0.5(Yates矫正)或1.0(Edward矫正)。(对于b+c<25,应该进行二项式计算,事实上,大多数软件包只是简单的在所有情况下都执行二项式计算,因为所有情况下的结果都是精确的。)用Yates矫正,我们得到:
结果值是21.01,这非常不可能来自无效假设推断的分布(即)。因此,该检验为无治疗效果的无效假设提供了很强的拒绝证据。
from statsmodels.sandbox.stats.runs import mcnemar
obs=[[a,b],[c,d]]
chi2,p=mcnemar(obs)
python代码如下:
import numpy as np
from statsmodels.sandbox.stats.runs import mcnemardata=np.array([[101,121],[59,33]])
chi2,p=mcnemar(data,exact=False,correction=True)
print("卡方统计量:",chi2)
print("p值:",p)
mcnemar()函数中各参数的解释:
(1)exact,默认是True,即使用二项式计算,进行精确检验(当b+c<25时,用二项式分布计算)。当exact=False,则使用卡方分布进行近似检验(大样本时可以使用卡方分布计算)。
(2)当exact=False时,correction用于设置是否需要进行连续性矫正。当correction=True时,进行Edward矫正;当correction=False时,则不进行矫正。【所以代码运行结果与案例展示的结果(使用Yates矫正)存在差异】
5、Cochran's Q检验
Cochran's Q检验是一个假设检验,其中响应变量只能采用两种可能的结果(编码为0和1)。这是一个非参数统计检验,以验证k个处理是否具有相同的效果。
Cochran's Q检验不应与Cochran's C检验混淆,Cochran's C检验是一种方差异常检验。
对于Cochran's Q检验的零假设是变量之间没有差异。如果计算出的概率p低于选定的显著水平,则零假设被拒绝,可以得出结论,至少2个变量中的比例是显著不同的。
实现代码如下:
import numpy as np
from statsmodels.sandbox.stats.runs import cochrans_q
# 将行数据转换为列数据
obs=np.array([[0,1,1,0,1,0,0,1,0,0,0,0],[1,1,1,0,0,1,0,1,1,1,1,1],[0,0,1,0,0,1,0,0,0,0,0,0]]).T
q_stats,p=cochrans_q(obs)
print("Q统计量:",q_stats)
print("p值:",p)