python统计分析——分类数据的检验

本文详细介绍了Python中进行统计分析的方法,包括比率分析中的置信区间计算,以及频数表分析中的单因素卡方、列联表检验、Fisher精确检验、McNemar检验和CochransQ检验的应用。
摘要由CSDN通过智能技术生成

参考资料:python统计分析【托马斯】

一、比率分析

1、置信区间

        如果我们有一组样本数据,我们可以检查该样本是否代表标准总体。为了这样做,我们需要知道特征在标准人群中的比例p。一个n人的组的特征出现服从二项分布,其中均值=n×p。带有该特征的样本的标准误是:

se(p)=\sqrt{p(1-p)/n}

        并且,对应的95%置信区间是:

ci=mean\pm se\times t_{n,0.025}

2、解释

        如果我们有n个来自二项分布B(k,p)的独立样本,它们的样本均值的方差是:

var(\frac{1}{n}\sum_{i=1}^nX_i)=\frac{1}{n^2}\sum_{i=1}^n var(X_i)=\frac{n var(X_i)}{n^2}=\frac{kpq}{n}

        其中,q=1-p。

                ①var(cX)=c^2var(X)对于任意随机变量x和任意常数都成立。

                ②独立随机样本的和的方差等于方差的和。

        当k=n时,我们可以得到se=\sqrt{pq}

        当k=1时,二项变量是伯努利试验,标准误则是se=\sqrt{\frac{pq}{n}}

二、频数表分析

        如果数据可以被组织在一组类别中,并且它们被作为频数给出,即每个类别中的样本总数(而不是百分比),那么下面讲述的检验适用于这类数据分析。

        许多这些检验分析的是距离期望值的偏差。由于卡方分布描述了数据的变异程度,这些检验中许多都是指该分布,因此,也就被称为卡方检验。

        若n为表格中包含的所有观测总数,双向表中的每个单元格的期望值是:

expectedFrequency=\frac{RowTotal\times ColumnTotal}{n}

        假定我们观察到的绝对频数是o_i,期望的绝对频数e_i。在所有数据都来自同一总体的无效假设之下,检验统计量为:

V=\sum_{i=1}^n\frac{(o_i-e_i)^2}{e_i}\approx \chi_f^2

其服从卡方分布,其中f为自由度。

1、单因素卡方检验

import numpy as np
from scipy import stats

data=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列,它的自由度为:

df=(r-1)(c-1)

示例如下:【stats.chi2_contingency()函数默认对自由度为1的联列表使用连续性矫正。】

import numpy as np
from scipy import stats

data=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 stats

data=np.array([[43,9],
               [44,4]])
oddsratio,p=stats.fisher_exact(data)
print("oddsratio:",oddsratio)
print("p值:",p)

 4、McNemar检验

        McNemar检验是从表的边际总和得出的比例之间的差异:p_A=(a+b)/Np_B=(a+c)/N。McNemar检验的问题是:这两个比例(p_A和p_B)是否显著不同?p_A和p_B的关联是由于它们两个都包含了表格左上角单元格的数量a。

        McNemar检验通常用于在病人自身对照的研究中,或“前后比较”的研究设计中。

        以上图为例,“边缘同质性”的零假设意味着没有治疗效果。从上图案例数据可以看出,Yates连续性矫正的McNemar检验通量为:

\chi^2=\frac{(|b-c|-correctionFactor)^2}{b+c}

        其中\chi^2服从1个自由度的卡方分布。对于小样本数,correctionFactor应该是0.5(Yates矫正)或1.0(Edward矫正)。(对于b+c<25,应该进行二项式计算,事实上,大多数软件包只是简单的在所有情况下都执行二项式计算,因为所有情况下的结果都是精确的。)用Yates矫正,我们得到:

\chi^2=\frac{(|121-59|-0.5)^2}{121+59}

        结果值是21.01,这非常不可能来自无效假设推断的分布(即p_b=p_c)。因此,该检验为无治疗效果的无效假设提供了很强的拒绝证据。

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 mcnemar

data=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)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值