【GitModel】假设检验1-方法论与一元数值检验学习笔记

本文内容根据Datawhale和GitModel开源学习教程整理,学习链接:https://github.com/Git-Model/Modeling-Universe/tree/main/Data-Story
感谢课程开发者的付出与贡献!

本节作业链接:戳我进入

1 假设检验介绍

  1. 作用:
  • 建模时通过假设检验对数据进行探索性的信息挖掘
  • 建模后通过特定的假设检验验证模型的有效性
  1. 分类:
  • 基于统计模型的假设检验:基于已知统计模型,为模型使用提供帮助,例如线性回归模型的系数显著性检验
  • 不基于统计模型的假设检验:从数据出发,检验数据的某些性质,例如正态性检验、双样本t检验、方差分析等

以下内容总结常见的不基于统计模型的假设检验。

1.1 假设检验的原理

1.1.1 假设检验的本质

  1. 定义:根据样本信息与已知信息,对一个描述样本所在总体性质的命题进行“是或否”的检验与回答
  2. 类型:
  • 参数假设检验:假设是关于总体的一个参数或者参数的集合
  • 非参数假设检验:假设不能用一个参数集合来表示,例如正态性检验

1.1.2 假设检验的推导

1. 假设的建议
  1. 问题描述:

    必胜中学初三年级学生的数学成绩 X X X 服从正态分布 X ∼ N ( μ , σ 2 ) X \sim N\left(\mu, \sigma^{2}\right) XN(μ,σ2) ,抽取一班学生成绩 做样本,已知样本均值 x ˉ = 108.2 \bar{x}=108.2 xˉ=108.2 ,样本标准差 s = 4 , s=4 , s=4 一班人数 n = 25 n=25 n=25 ,能否认为总体均值 μ > 110 \mu>110 μ>110 ?

    “总体均值 μ > 110 \mu>110 μ>110 ”是否正确涉及如下两个假设问题:
    H 0 : μ ⩽ 110 ↔ H 1 : μ > 110 H_{0}: \mu \leqslant 110 \leftrightarrow H_{1}: \mu>110 H0:μ110H1:μ>110

  2. H 0 H_{0} H0被称为原假设, H 1 H_{1} H1被称为备择假设,两个假设必须为互斥关系,因为只有这样,拒绝假设 H 0 H_{0} H0 才等价于接受假设 H 1 H_{1} H1 ,命题成立的探讨就转化为了拒绝原假设 H 0 H_{0} H0 的探讨

  • 强调对拒绝原假设的探讨,而非接受备择假设,因为无法通过一个特殊的样本证明一个假设成立,但是可以用来拒绝一个命题
  • 假设检验本质上在探讨如何通过拒绝原假设 H 0 H_{0} H0来接受备择假设 H 1 H_{1} H1
  1. 实际中通常将想要验证的命题作为备择假设 H 1 H_{1} H1,通过检验原假设 H 0 H_{0} H0是否被拒绝来判断是否接受 H 1 H_1 H1
2. 单参数检验的三种类型与原假设的注意事项
  1. 最常见的三种单参数检验问题,以均值检验为例:

    H 0 : μ ⩽ μ 0 ↔ H 1 : μ > μ 0 H_{0}: \mu \leqslant \mu_{0} \leftrightarrow H_{1}: \mu>\mu_{0} H0:μμ0H1:μ>μ0 单边检验
    H 0 : μ ⩾ μ 0 ↔ H 1 : μ < μ 0 H_{0}: \mu \geqslant \mu_{0} \leftrightarrow H_{1}: \mu<\mu_{0} H0:μμ0H1:μ<μ0 单边检验
    H 0 : μ = μ 0 ↔ H 1 : μ ≠ μ 0 H_{0}: \mu=\mu_{0} \leftrightarrow H_{1}: \mu \neq \mu_{0} H0:μ=μ0H1:μ=μ0 双边检验

  • 以上问题的原假设有另一种更常见的表达方式

    H 0 : μ = μ 0 ↔ H 1 : μ > μ 0 H_{0}: \mu=\mu_{0} \leftrightarrow H_{1}: \mu>\mu_{0} H0:μ=μ0H1:μ>μ0
    H 0 : μ = μ 0 ↔ H 1 : μ < μ 0 H_{0}: \mu=\mu_{0} \leftrightarrow H_{1}: \mu<\mu_{0} H0:μ=μ0H1:μ<μ0
    H 0 : μ = μ 0 ↔ H 1 : μ ≠ μ 0 H_{0}: \mu=\mu_{0} \leftrightarrow H_{1}: \mu \neq \mu_{0} H0:μ=μ0H1:μ=μ0

  • 这种写法与之前的写法并不互斥,但从结果上与前者等效

  1. 将欲验证的命题作为备择假设 H 1 H_1 H1,并不是“准则”,部分假设检验的原/备择假设的设置时固定的
  • 当检验某样本所在总体是否服从某个特定分布时(如正态性检验),通常会设置如下假设:

    H 0 H_{0} H0 : 样本所在总体服从某分布 ↔ H 1 \leftrightarrow H_{1} H1 :样本所在总体不服从某分布

  • 在单参数检验中,等号只会出现在 H 0 H_0 H0中,不会出现在 H 1 H_1 H1中,即我们不会做这样的假设

    H 0 : μ ≠ 110 ↔ H 1 : μ = 110 H_{0}: \mu \neq 110 \leftrightarrow H_{1}: \mu=110 H0:μ=110H1:μ=110

3. 临界值、拒绝域、显著性水平
  1. 临界值:
  • 为给出拒绝原假设的标准,设立一个临界值 C C C,若实际样本计算出来的 x ˉ \bar{x} xˉ 满足 x ˉ − 110 > C \bar{x}-110>C xˉ110>C ,就拒绝原假设
  1. 拒绝域
  • 上述例子中的 x ˉ − 110 > C \bar{x}-110>C xˉ110>C 也叫拒绝域,它可以被写成:

    { x ˉ : x ˉ > 110 + C } \{\bar{x}: \bar{x}>110+C\} {xˉ:xˉ>110+C}

    • 样本计算结果落入拒绝域,就拒绝原假设,否则不能拒绝原假设
  • 拒绝域还可以直接用检验统计量与对应的分布分位点表示,这样更省时间,不用再计算临界值 C C C
    t > t n − 1 ( 1 − α ) t>t_{n-1}(1-\alpha) t>tn1(1α)

    • 以正态分布为例的图示
      在这里插入图片描述

    • 三种假设的分位点分别对应右侧分位点、左侧分位点、双侧分位点

    • 对应代码为本小节第五点的第二小点

  1. 如何确定临界值 C C C?用概率确定
  • 由于抽样具有随机性,凭借样本信息去判断总体的性质总是会有犯错的概率——即不论我们是否拒绝原假设 H 0 H_0 H0,都有概率犯以下两类错误中的一种:

    • 第一类错误:原假设 H 0 H_{0} H0 为真,但是数据却落入了拒绝域 (因此做出拒绝 H 0 H_{0} H0 的判断)。 犯第一类错误的概率被称为拒真概率 α \alpha α
    • 第二类错误:原假设 H 0 H_{0} H0 为假,但是数据却没有落入拒绝域(因此做出接受 H 0 H_{0} H0 的判 断)。犯第二类错误的概率被称为受伪概率 β \beta β
  • 由于两种犯错概率互相对立,因此采取折中方案——通常只限制犯第一类错误的概率 α \alpha α

  • 再决定临界值时,要保证发生第一类错误的概率 α \alpha α在一个给定的、较小的水平(通常取 α = 0.05 / 0.1 \alpha=0.05 / 0.1 α=0.05/0.1),此时 α \alpha α被称为显著性水平

  • 确定临界值 C C C的标准是:原假设 H 0 H_0 H0为真,但数据却落入拒绝域的概率恰好为给定的 α \alpha α,在上述例子中该概率可写为

    P H 0  is true  ( x ˉ − μ 0 > C ) = P ( x ˉ − 110 > C ) = α P_{H_{0} \text { is true }}\left(\bar{x}-\mu_{0}>C\right)=P(\bar{x}-110>C)=\alpha PH0 is true (xˉμ0>C)=P(xˉ110>C)=α

4. 用分布处理概率——构造检验统计量
  1. P ( x ˉ − 110 > C ) P(\bar{x}-110>C) P(xˉ110>C)构造成某个分布的分位数形式,这样可以计算出临界值 C C C,概率实际为:

    P ( x ˉ − E ( x ˉ ) > C ) , E ( x ˉ ) = μ 0 = 110 P(\bar{x}-E(\bar{x})>C), E(\bar{x})=\mu_{0}=110 P(xˉE(xˉ)>C),E(xˉ)=μ0=110

  2. 由于 x ˉ \bar{x} xˉ服从正态分布,可以构造t统计量:

    P ( x ˉ − E ( x ˉ ) > C ) = P ( x ˉ − E ( x ˉ ) s > C s ) = α , x ˉ − E ( x ˉ ) s ∼ t n − 1 P(\bar{x}-E(\bar{x})>C)=P\left(\frac{\bar{x}-E(\bar{x})}{s}>\frac{C}{s}\right)=\alpha, \frac{\bar{x}-E(\bar{x})}{s} \sim t_{n-1} P(xˉE(xˉ)>C)=P(sxˉE(xˉ)>sC)=α,sxˉE(xˉ)tn1

  • C s \frac{C}{s} sC 恰好是 t n − 1 ( 1 − α ) t_{n-1}(1-\alpha) tn1(1α) 分位点,对于确定的分布而言,分位点已知,求解出 C C C C = s ⋅ t n − 1 ( 1 − α ) C=s \cdot t_{n-1}(1-\alpha) C=stn1(1α)
  1. 代入公式有

    P ( x ˉ − E ( x ˉ ) s > C s ) = P ( x ˉ − μ 0 s > s ⋅ t n − 1 ( 1 − α ) s ) P\left(\frac{\bar{x}-E(\bar{x})}{s}>\frac{C}{s}\right)=P\left(\frac{\bar{x}-\mu_{0}}{s}>\frac{s \cdot t_{n-1}(1-\alpha)}{s}\right) P(sxˉE(xˉ)>sC)=P(sxˉμ0>sstn1(1α))
    = P ( x ˉ > μ 0 + s ⋅ t n − 1 ( 1 − α ) ) = α =P\left(\bar{x}>\mu_{0}+s \cdot t_{n-1}(1-\alpha)\right)=\alpha =P(xˉ>μ0+stn1(1α))=α

    得出:只需 x ˉ > 110 + s ⋅ t n − 1 ( 1 − α ) \bar{x}>110+s \cdot t_{n-1}(1-\alpha) xˉ>110+stn1(1α) ,就可以在显著性水平 α \alpha α 下拒绝原假设

  2. 假设检验思路:构造检验统计量——输出对应分布的分位点——计算临界值(拒绝域)——做出判断

  • 上述例子中,检验统计量为:
    t = x ˉ − μ 0 s t=\frac{\bar{x}-\mu_{0}}{s} t=sxˉμ0
  • 对应t分布的分位点为:
    t n − 1 ( 1 − α ) t_{n-1}(1-\alpha) tn1(1α)
  • 拒绝域为:
    x ˉ > 110 + s ⋅ t n − 1 ( 1 − α ) \bar{x}>110+s \cdot t_{n-1}(1-\alpha) xˉ>110+stn1(1α)
5. 结合代码
  1. 代码示例
## 加载包
import numpy as np
import pandas as pd
from scipy.stats import t

n=25 
x_bar=108.2
s=4
mu=110

# 计算检验统计量
tvalue=(x_bar-mu)
print('t值为:{}'.format(tvalue))

# 输出分位点
'''
ppf:单侧左分位点
isf:单侧右分位点
interval:双侧分位点
'''
#由于备择假设是大于号,因此应当选用单侧右分位点,0.05为显著性水平a,n-1为自由度
T_isf=t.isf(0.05,n-1)
# 如果备择假设是小于号,则应选用单侧左分位点ppf,里面的参数设置不变,依次为显著性水平a与分布自由度

print('分位点为:{}'.format(T_isf))
# 拒绝域
Deny_domain=110+s*T_isf
print('拒绝域的临界点为:{}'.format(Deny_domain))

# 判断
print('样本均值是否位于拒绝域:{}'.format(x_bar>Deny_domain))
print('因此,不能拒绝原假设,不能认为总体均值大于110.')
t值为:-1.7999999999999972
分位点为:1.7108820799094282
拒绝域的临界点为:116.84352831963771
样本均值是否位于拒绝域:False
因此,不能拒绝原假设,不能认为总体均值大于110.
  1. 利用拒绝域第二种方式来检验
# 直接用检验统计量与分布分位点判断
print('检验统计量是否位于拒绝域:{}'.format(tvalue>T_isf))
检验统计量是否位于拒绝域:False
  • 假设利用Example.1中的数据进行双边检验
    H 0 : μ = 110 ↔ H 1 : μ ≠ 110 H_{0}: \mu=110 \leftrightarrow H_{1}: \mu \neq 110 H0:μ=110H1:μ=110
    则拒绝域为
    ∣ t ∣ > ∣ t n − 1 ( 1 − α 2 ) ∣ |t|>\left|t_{n-1}\left(1-\frac{\alpha}{2}\right)\right| t> tn1(12α)
# 进行双边检验
## 计算双侧分位点
T_int=t.interval(1-0.05,n-1) # 对于双侧检验(双侧分位点),分位点参数应该输入1-a,这里是1-0.05=0.95
print('检验统计量t的绝对值:{}'.format(np.abs(tvalue)))
print('双侧分位点:{}'.format(T_int))
print('显然,检验统计量不在拒绝域内,因此无法拒绝原假设')
检验统计量t的绝对值:1.7999999999999972
双侧分位点:(-2.0638985616280205, 2.0638985616280205)
显然,检验统计量不在拒绝域内,因此无法拒绝原假设
  1. p值
  • 采用拒绝域的方法进行假设检验有一个缺点:分位点值与显著性水平 α \alpha α是相关的。如果要在不同的显著水平下检验,就需要计算不同的分位点再比较,因此需要利用p值这个指标来判断是否拒绝原假设

  • p值是在确定的样本观测值下,给出的能拒绝原假设的最小显著性水平,只与样本观测值和我们做的假设检验有关。p值越小越可以拒绝原假设

    • 例如:如果p值为0.001,比0.01的置信水平还要小,我们认为在0.01的置信水平下我们也可以拒绝原假设;而如果p值为0.025,比0.01的置信水平要大,但小于0.05,则我们认为在0.05的置信水平下我们可以拒绝原假设,但在0.01置信水平下不可以拒绝
  • p \mathrm{p} p 值的形式与我们做的备择假设 H 1 H_{1} H1 有关

    H 1 H_{1} H1 的符号为 ≠ \neq = ,则: p v a l u e pvalue pvalue = P ( ∣ X ∣ > ∣ =P(|X|>\mid =P(X>∣ Test statistics ∣ ) \mid) )
    H 1 H_{1} H1 的符号为 > > >,则: p v a l u e pvalue pvalue = P ( X > =P(X> =P(X> Test statistics ) ) )
    H 1 H_{1} H1 的符号为 < < < ,则: p u a l u e pualue pualue = P ( X < =P(X< =P(X< Test statistics ) ) )

    • 其中 X X X为服从某个特定分布的变量,Test stastistics为前面提到的检验统计量
    • p值本质上是一种累积概率,对于符号为 > > > 的备择假设,p值则是右侧累积概率;对于符号为 < < < 的备择假设,p值则是左侧累积概率;而对于相同的检验统计量Test statistics而言,双边检验的p值为某类单边检验的两倍
# 利用example.1的数据进行三种假设检验
# 利用p值进行假设检验
'''
sf:右尾累积概率
cdf:左尾累积概率
'''
# 若备择假设为mu>110
pvalue=t.sf(tvalue,n-1) 
print('备择假设为mu>110的p值为:{}'.format(pvalue))

# 若备择假设为mu<110
pvalue=t.cdf(tvalue,n-1)
print('备择假设为mu<110的p值为:{}'.format(pvalue))

# 若备择假设为mu不等于110
pvalue=t.cdf(tvalue,n-1)*2 # 之所以是左尾累积概率的两倍,是因为右尾累积概率大于0.5,而p值不可能大于1。
print('备择假设为mu不等于110的p值为:{}'.format(pvalue))
备择假设为mu>110的p值为:0.9577775745385242
备择假设为mu<110的p值为:0.042222425461475775
备择假设为mu不等于110的p值为:0.08444485092295155
  • 使用p值进行假设检验在实际应用中更常见,python中进行假设检验的所有包都会输出检验统计量与p值

1.1.3 假设检验的基本步骤——基于p值

  1. 确定备择假设 H 1 H_1 H1,备择假设的符号决定我们使用何种累积概率
  2. 明确检验统计量Test statistics的公式,不同假设检验都有其确定的检验统计量
  3. 明确检验统计量所服从的分布,这样我们才能算累积概率
  4. 根据备择假设 H 1 H_1 H1与检验统计量Test statistics计算p值
  5. 将p值与显著性水平 α \alpha α比较,若 p > α p>\alpha p>α,则不能拒绝原假设;若 p < α p<\alpha p<α,则可以拒绝原假设

1.2 假设检验的分类

在这里插入图片描述

2 一元数值数据假设检验

  • 本部分内容覆盖一元数值数据中的组间均值假设检验的内容,学习如何通过样本数据对其所在总体的均值的性质进行检验

2.1 正态性检验

  • 由于参数检验比非参数检验更灵敏,因此数据若是正态分布的,应该使用参数检验
  • 以下三种方法可以帮助判断数据的正态性

2.1.1 概率图

  1. 原理:对于一个给定的样本数据集,概率图会先将数据 x x x 从小到大排序,并计算排序后数据 x x x 对应的分布分位数
  2. 图示表达:
  • 横轴:分位数;纵轴:有序样本值
  • 若数据大致服从目标分布,则数据点会近似地沿着 y = x y=x y=x 分布。若数据不服从目标分布,则会观察到数据点偏离线 y = x y=x y=x
  1. 代码演示
# 生成1000个服从正态分布的数据
data_norm = stats.norm.rvs(loc=10, scale=10, size=1000) # rvs(loc,scale,size):生成服从指定分布的随机数,loc:期望;scale:标准差;size:数据个数
# 生成1000个服从卡方分布的数据
data_chi=stats.chi2.rvs(2,3,size=1000)

# 画出两个概率图
fig=plt.figure(figsize=(12,6))
ax1=fig.add_subplot(1,2,1)
plot1=stats.probplot(data_norm,plot=ax1) # 正态数据
ax2=fig.add_subplot(1,2,2)
plot2=stats.probplot(data_chi,plot=ax2) # 卡方分布数据
  • 结果分析:正态性数据在正态分布概率图中十分接近直线 y = x y=x y=x,而卡方分布数据几乎完全偏离该直线
  • 图示
    在这里插入图片描述

2.1.2 两种正态性检验

  1. 正态性检验的两个假设如下: H 0 : 样本所在总体服从正态分布 ↔ H 1 :   样本所在总体不服从正态分布 H_0:\text{样本所在总体服从正态分布}\leftrightarrow H_1:\,\text{样本所在总体不服从正态分布} H0:样本所在总体服从正态分布H1:样本所在总体不服从正态分布
  2. 两种检验方案对比
名称适用问题原因样本量适用范围
Shapiro-Wilk检验小样本正态性检验该检验在每一个样本值都是唯一时的检验效果最好样本量最低为8,<50最佳,<2000效果较好,>5000不再适用
D’Agostino’s K-squared test大样本正态性检验分布曲线的偏度和峰度容易受到数据量的影响,数据量越大,偏度与峰度的计算就越准确样本量最低为4,除此以外越大越好
  • D’Agostino’s K-squared test原理:通过计算偏度(Skewness)和峰度(Kurtosis)来量化数据分布曲线与标准正态分布曲线之间的差异与不对称性,然后计算这些值与正态分布期望值的之间的不同程度

2.1.3 同时使用多种方法判断正态性

  • 使用多种方法判别的原因:实际应用中由于数据复杂性,使用一种方法可能会产生误差,此时需要观察数据的特征,寻找结果不一致的原因
  1. 代码示例
data_small = stats.norm.rvs(0, 1, size=30) # 小样本正态性数据集
data_large = stats.norm.rvs(0, 1, size=6000) # 大样本正态性数据集
# 定义一个正态性检验函数,它可以输出:
## 正态概率图
## 小样本Shapiro-Wilk检验的p值
## 大样本D'Agostino's K-squared检验的p值

from statsmodels.stats.diagnostic import lilliefors
from typing import List

def check_normality(data: np.ndarray, show_flag: bool=True) -> List[float]:
    """
    输入参数
    ----------
    data : numpy数组或者pandas.Series
    show_flag : 是否显示概率图
    Returns
    -------
    两种检验的p值;概率图
    """
    if show_flag:
        _ = stats.probplot(data, plot=plt)
        plt.show()

    pVals = pd.Series(dtype='float64')
    # D'Agostino's K-squared test
    _, pVals['Omnibus'] = stats.normaltest(data) 

    # Shapiro-Wilk test
    _, pVals['Shapiro-Wilk'] = stats.shapiro(data)

    print(f'数据量为{len(data)}的数据集正态性假设检验的结果 : ----------------')
    print(pVals)
check_normality(data_small,show_flag=True)

在这里插入图片描述

check_normality(data_large,show_flag=False) # 当样本量大于5000,会出现警告

在这里插入图片描述

2.2 均值检验

  • 一元数值样本的总体均值的检验,每种均值检验都会有相应的参数检验(t检验)与非参数检验

2.2.1 单组样本均值假定的检验

  1. 单组样本均值假定的检验:检验一个样本所在总体的均值是否和一个参考值相等
  2. Example.2:10名同学的成绩:136,136,134,136,131,133,142,145,137,140,目标均分137。判断班级(人数>10)均分与目标均分是否有差距
1. 单样本t检验(One Sample t-test)
  1. t检验要求总体服从正态分布,即有 x ∼ N ( μ , σ 2 ) x\sim N\left( \mu ,\sigma ^2 \right) xN(μ,σ2)
  • 在t检验中,总体的标准差 σ \sigma σ不需要事先知道,与z检验不同,因此t检验应用更广
  1. 使用p值进行假设检验的基本流程(按照1.1.3)
  • 单样本t检验的两个假设为: H 0 : μ = μ 0 ↔ H 1 : μ ≠ μ 0   H_0:\mu =\mu_0\leftrightarrow H_1:\mu \ne \mu_0\, H0:μ=μ0H1:μ=μ0
  • 对应的检验统计量为: T e s t    s t a t i s t i c s = x ˉ − μ 0 s Test\,\,statistics=\frac{\bar{x}-\mu _0}{s} Teststatistics=sxˉμ0
  • 检验统计量服从的分布为: T e s t    s t a t i s t i c s ∼ t n − 1 Test\,\,statistics\sim t_{n-1} Teststatisticstn1 其中, n n n为样本量
  • 可以根据以上信息计算p值(Python中也有相应的api)
2. wilcoxon符号秩和检验
  1. 若样本数据非正态,应使用wilcoxon符号秩和检验。该检验是非参数检验

  2. 什么是“”。设 x 1 , ⋯   , x n x_1,\cdots ,x_n x1,,xn为来自连续分布的简单随机样本,将它们从小到大排序,得到有序样本 x ( 1 ) ⩽ ⋯ ⩽ x ( n ) x_{\left( 1 \right)}\leqslant \cdots \leqslant x_{\left( n \right)} x(1)x(n)。观测值 x i x_i xi在有序样本中的序号 r r r被称为 x i x_i xi。秩其实就是样本值 x i x_i xi在所有样本中“第几小”的意思

  3. 秩和检验,要有“秩的和”

    x 1 , ⋯   , x n x_1,\cdots ,x_n x1,,xn为样本,对它们做绝对值变换,记 R i R_i Ri ∣ x i ∣ |x_i| xi ( ∣ x 1 ∣ , ⋯   , ∣ x n ∣ ) \left( |x_1|,\cdots ,|x_n| \right) (x1,,xn)的秩

    I ( x i > 0 ) = { 1 , x i > 0 0 , x i ≠ 0 I\left(x_{i}>0\right)=\left\{\begin{array}{ll} 1, & x_{i}>0 \\ 0, & x_{i} \neq 0 \end{array}\right. I(xi>0)={1,0,xi>0xi=0

    则称 W + = ∑ i = 1 n R i I ( x i > 0 ) W^{+}=\sum_{i=1}^{n} R_{i} I\left(x_{i}>0\right) W+=i=1nRiI(xi>0) 为秩和统计量

  4. 单样本均值比较的wilcoxon符号秩和检验的两个假设依旧为 H 0 : μ = μ 0 ↔ H 1 : μ ≠ μ 0   H_0:\mu =\mu_0\leftrightarrow H_1:\mu \ne \mu_0\, H0:μ=μ0H1:μ=μ0

    对于待分析样本 x 1 , ⋯   , x n x_1,\cdots ,x_n x1,,xn,让所有样本减去对比值 μ 0 \mu_0 μ0,得: x 1 − μ 0 , ⋯   , x n − μ 0 x_1-\mu_0,\cdots ,x_n-\mu_0 x1μ0,,xnμ0,计算出它们的秩和统计量 W + W^{+} W+

    然后,检验统计量便可以计算为 T e s t    s t a t i s t i c s = W + − n ( n + 1 ) 4 n ( n + 1 ) ( 2 n + 1 ) 24 Test\,\,statistics=\frac{W^{+}-\frac{n(n+1)}{4}}{\sqrt{\frac{n(n+1)(2 n+1)}{24}}} Teststatistics=24n(n+1)(2n+1) W+4n(n+1) 检验统计量近似服从分布 T e s t    s t a t i s t i c s → N ( 0 , 1 ) Test\,\,statistics\rightarrow N\left( 0,1 \right) TeststatisticsN(0,1) 其中, n n n为样本量

    最后,p值的计算与备择假设 H 1 H_1 H1的符号有关,这一点与t检验相同(Python中也有相应的api)

  5. 该方法最好在样本量>25的情况下使用,这样检验统计量才近似服从正态分布

3. 代码
data=np.array([136,136,134,136,131,133,142,145,137,140])
# 定义一个单组样本均值检验函数,使它可以同时输出t检验与wilcoxon符号秩和检验的p值
def check_mean(data,checkvalue,confidence=0.05,alternative='two-sided'):        
    '''
    输入参数
    ----------
    data : numpy数组或者pandas.Series
    checkvalue : 想要比较的均值
    confidence : 显著性水平
    alternative : 检验类型,这取决于我们备择假设的符号:two-sided为双侧检验、greater为右侧检验、less为左侧检验

    输出
    -------
    在两种检验下的p值
    在显著性水平下是否拒绝原假设
    '''
    pVal=pd.Series(dtype='float64')
    # 正态性数据检验-t检验
    _, pVal['t-test'] = stats.ttest_1samp(data, checkvalue,alternative=alternative)
    print('t-test------------------------')
    if pVal['t-test'] < confidence:
      print(('目标值{0:4.2f}在显著性水平{1:}下不等于样本均值(p={2:5.3f}).'.format(checkvalue,confidence,pVal['t-test'])))
    else:
      print(('目标值{0:4.2f}在显著性水平{1:}下无法拒绝等于样本均值的假设.(p={2:5.3f})'.format(checkvalue,confidence,pVal['t-test'])))

    # 非正态性数据检验-wilcoxon检验
    _, pVal['wilcoxon'] = stats.wilcoxon(data-checkvalue,alternative=alternative)
    print('wilcoxon------------------------')    
    if pVal['wilcoxon'] < confidence:
      print(('目标值{0:4.2f}在显著性水平{1:}下不等于样本均值(p={2:5.3f}).'.format(checkvalue,confidence,pVal['wilcoxon'])))
    else:
      print(('目标值{0:4.2f}在显著性水平{1:}下无法拒绝等于样本均值的假设.(p={2:5.3f})'.format(checkvalue,confidence,pVal['wilcoxon'])))
    
    return pVal
check_mean(data,137,0.05)
  • 输出
    在这里插入图片描述

2.2.2 两组样本的均值相等性检验

  • 在对两组间的均值进行比较前,我们需要判断:这两组样本间是否独立?
1. 组别间独立
  1. Example.3:Ex2中的班级A有竞争班级B,班级B部分12名同学成绩为:134,136,135,145,147,140,142,137,139,140,141,135。是否可认为两个班级的均分相等?这是一个典型的双独立样本的均值检验问题
  • 这里的“独立”指的是抽样意义上的独立,而非统计意义的独立——只需保证这两个班级的样本在选取时是“现实上”的互不影响,并不关心两者在数值上是否独立(通过独立性检验判断的独立性)
  • 抽样意义上独立的解释:两个样本中,一个样本中的受试不能影响另一个样本中的受试
  • 在Ex2和Ex3中,两个班级的授课老师不同,因此两个班学生的成绩不会受到同一个老师的影响;两个班级考试同时进行,不存在泄题行为。可以认为这是两个独立的样本
  • 实际上,两个样本是否在抽样意义上独立,没有固定答案,很多情况下,我们既不能保证两个样本间完全独立,也很难判断出两者是否存在相关性
  1. 双样本t检验(Two Sample t-test)
  • 若两个样本的总体都服从正态分布,那么可以使用双样本t检验

  • 双样本t检验有两个分类

    • 总体的标准差 σ \sigma σ相等
    • 总体的标准差 σ \sigma σ不相等
    • 这两种情况下的检验统计量不相同,服从的t分布的自由度也不相同。
  • 两种检验的假设问题是相同的: H 0 : μ x = μ y ↔ H 1 : μ x ≠ μ y   H_0:\mu _x=\mu _y\leftrightarrow H_1:\mu _x\ne \mu _y\, H0:μx=μyH1:μx=μy

  • 若两个样本的总体方差相等,则检验统计量为 T e s t    s t a t i s t i c s = x ˉ − y ˉ s w 1 m + 1 n    , s w = 1 m + n − 2 [ ∑ i = 1 m ( x i − x ˉ ) 2 + ∑ i = 1 n ( y i − y ˉ ) 2 ] Test\,\,statistics=\frac{\bar{x}-\bar{y}}{s_w\sqrt{\frac{1}{m}+\frac{1}{n}}}\,\,, s_w=\sqrt{\frac{1}{m+n-2}\left[ \sum_{i=1}^m{\left( x_i-\bar{x} \right) ^2+\sum_{i=1}^n{\left( y_i-\bar{y} \right) ^2}} \right]} Teststatistics=swm1+n1 xˉyˉ,sw=m+n21[i=1m(xixˉ)2+i=1n(yiyˉ)2]

    • 检验统计量服从分布 T e s t    s t a t i s t i c s ∼ t n + m − 2 Test\,\,statistics\sim t_{n+m-2} Teststatisticstn+m2 其中, m m m为样本 x x x的样本量, n n n为样本 y y y的样本量
  • 若两个样本的总体方差不相等,则检验统计量为 T e s t    s t a t i s t i c s = x ˉ − y ˉ s x 2 m + s y 2 n   Test\,\,statistics=\frac{\bar{x}-\bar{y}}{\sqrt{\frac{s_{x}^{2}}{m}+\frac{s_{y}^{2}}{n}}}\, Teststatistics=msx2+nsy2 xˉyˉ

    • 检验统计量近似服从分布 T e s t    s t a t i s t i c s → t l    , l = ( s x 2 m + s y 2 n ) 2 s x 2 m 2 ( m − 1 ) + s y 2 n 2 ( n − 1 ) Test\,\,statistics\rightarrow t_l\,\,, l=\frac{\left( \frac{s_{x}^{2}}{m}+\frac{s_{y}^{2}}{n} \right) ^2}{\frac{s_{x}^{2}}{m^2\left( m-1 \right)}+\frac{s_{y}^{2}}{n^2\left( n-1 \right)}} Teststatisticstl,l=m2(m1)sx2+n2(n1)sy2(msx2+nsy2)2
  • 在大多数情况下,总体的信息是很难知晓的,即我们很难知道两个总体的标准差是否相等,这时我们可以用方差齐性检验levene检验进行判断。

  1. Mannwhitneyu秩和检验
  • Mannwhitneyu秩和检验也是一种非参数检验
  • 做法:首先将两类样本混合在一起,对所有样本按照所考察的特征从小到大排序。在两类样本中分别计算所得排序序号之和 T 1 T_1 T1 T 2 T_2 T2,我们将之称作秩和
  • 基本思想:如果一类样本的秩和显著地比另一类小(或大),则两类样本在所考察的特征上有显著差异
  • 值得注意,秩和检验与符号秩和检验不同:前者不考虑符号的问题,后者考虑符号问题
  1. 代码
# 定义一个单组样本均值检验函数,使它可以同时输出t检验与mannwhitneyu检验的p值
def unpaired_data(group1:np.ndarray,group2:np.ndarray,confidence=0.05,alternative='two-sided'):
    """ 
    输入参数
    ----------
    group1/2 : 用于比较的两组数据
    confidence : 显著性水平
    alternative : 检验类型,这取决于我们备择假设的符号:two-sided为双侧检验、greater为右侧检验、less为左侧检验
    输出
    -------
    在两种检验下的p值
    在显著性水平下是否拒绝原假设
    """
    pVal=pd.Series(dtype='float64')

    # 先进行两组数据的方差齐性检验
    _,pVal['levene']=stats.levene(group1,group2)


    # t检验-若数据服从正态分布
    if pVal['levene']<confidence:
        print('在显著性水平{0:}下,两组样本的方差不相等(p={1:.4f}),因此需要使用方差不等的t检验'.format(confidence,pVal['levene']))
        print('------------------------------------')
        _, pVal['t-test'] = stats.ttest_ind(group1, group2,equal_var=False,alternative=alternative) # 因为方差不相等,因此是False
        print('t检验p值:{}'.format(pVal['t']))
    else:
        print('在显著性水平{0:}下,不能拒绝两组样本方差相等的假设(p={1:.4f}),因此需要使用方差相等的t检验'.format(confidence,pVal['levene']))
        print('------------------------------------')
        _, pVal['t-test'] = stats.ttest_ind(group1, group2,equal_var=True,alternative=alternative) # 因为方差相等,因此是True     
        print('t检验p值:{:.3f}'.format(pVal['t-test']))   
    

    # mannwhitneyu检验-数据不服从正态检验
    _, pVal['mannwhitneyu'] = stats.mannwhitneyu(group1, group2,alternative=alternative)
    print('Mann-Whitney检验p值:{:.3f}'.format(pVal['mannwhitneyu']))
    # --- >>> STOP stats <<< ---
    
    # 两组样本均值的散点图可视化
    print('------------------------------------')
    print('两组样本均值的散点图可视化')
    plt.plot(group1, 'bx', label='group1')
    plt.plot(group2, 'ro', label='group2')
    plt.legend(loc=0)
    plt.show()
    
    return pVal 
# A班级
group1=data
# B班级
group2=np.array([134,136,135,145,147,140,142,137,139,140,141,135])

unpaired_data(group1,group2)
  • 结果
    在这里插入图片描述
2. 成对组别
  1. 在进行两组间均值比较时,有一种特殊情况——两个样本“故意”不独立
  • 这种情况多出现两个样本分别为同一个受试个体不同时间的受试结果,这两个样本是“成对”的,是紧密相连的
  • 对这样两个样本进行均值比较检验,就是成对检验
  1. Example4:A班经过训练后再次考试,依旧抽取与上次相同的十名同学成绩:139,141,137,136,135,132,141,148,145,139。这次班级均分与上次是否存在显著差异呢?
  • 两个样本分别为相同的同学前后两次的考试成绩,是非常典型的成对数据,因此我们可以使用成对检验
  1. 成对检验有两种
  • 若总体服从正态分布,则使用成对t检验
  • 若总体不服从正态分布,则使用成对wilcoxon秩和检验
  1. 成对t检验
  • 成对检验与独立双样本检验的假设问题是一样的 H 0 : μ x = μ y ↔ H 1 : μ x ≠ μ y   H_0:\mu _x=\mu _y\leftrightarrow H_1:\mu _x\ne \mu _y\, H0:μx=μyH1:μx=μy
  • 事实上,成对t检验本质上是检验 μ x − μ y \mu_x-\mu_y μxμy的差值是否为0的单样本均值t检验,检验统计量可以按照单样本均值t检验的检验统计量构造,只不过变量换成了 x − y x-y xy,目标值为0
  • 检验统计量为: T e s t    s t a t i s t i c s = x ˉ − y ˉ s d    , d = x − y Test\,\,statistics=\frac{\bar{x}-\bar{y}}{s_d}\,\,, d=x-y Teststatistics=sdxˉyˉ,d=xy
  • 检验统计量服从分布: T e s t    s t a t i s t i c s ∼ t n − 1 Test\,\,statistics\sim t_{n-1} Teststatisticstn1 其中, n n n为样本量
  1. 成对wilcoxon符号秩和检验
  • 和成对t检验相同,成对wilcoxon符号秩和检验本质上就是前面的单样本wilcoxon符号秩和检验,变量也是换成了 x − y x-y xy,目标值为0
  1. 代码
def paired_data(group1:np.ndarray,group2:np.ndarray,confidence,alternative='two-sided'):
    """
    输入参数
    ----------
    group1/2 : 用于比较的两组数据,注意,两组数据的样本顺序必须相同
    confidence : 显著性水平
    alternative : 检验类型,这取决于我们备择假设的符号:two-sided为双侧检验、greater为右侧检验、less为左侧检验

    输出
    -------
    在两种检验下的p值
    在显著性水平下是否拒绝原假设
    """
    pVal=pd.Series(dtype='float64')

    # 配对t检验-样本服从正态分布
    _, pVal['t-test'] = stats.ttest_1samp(post - pre, 0,alternative=alternative)
    print('t-test------------------------')
    if pVal['t-test'] < confidence:
      print(('在显著性水平{0:}下,两组配对样本的均值不相等(p={1:5.3f}).'.format(confidence,pVal['t-test'])))
    else:
      print(('在显著性水平{0:}下无法拒绝等于样本均值的假设.(p={1:5.3f})'.format(confidence,pVal['t-test'])))    

    # wilcoxon秩和检验
    _, pVal['wilcoxon'] = stats.wilcoxon(group1,group2, mode='approx',alternative=alternative)
    print('wilcoxon------------------------')
    if pVal['wilcoxon'] < confidence:
      print(('在显著性水平{0:}下,两组配对样本的均值不相等(p={1:5.3f}).'.format(confidence,pVal['wilcoxon'])))
    else:
      print(('在显著性水平{0:}下无法拒绝等于样本均值的假设.(p={1:5.3f})'.format(confidence,pVal['wilcoxon'])))    
    
    return pVal
# 第一次测验
pre=data
# 第二次测验
post=np.array([139,141,137,136,135,132,141,148,145,139])

paired_data(pre,post,0.05)
  • 输出结果
    在这里插入图片描述

  • 两种检验都显示两次测验的均分在显著性水平0.05下有显著差异,根据双边检验的p值是某侧单边检验两倍的结论,可以推测出第二次测验的均分均值显著地高于第一次测验均分

2.2.3 方差分析-多组样本间的均值相等性检验

  • 方差分析(Analysis of variance,ANOVA):对多个总体的均值做比较检验的统计方法
1. 单因素方差分析
  1. 单/多因素方差分析中的因素含义:
  • 问题举例:

    1. 四种不同商标的同一类型产品的质量指标是否一致
    2. 对同样的商品,采取三种不同的销售方式是否会导致显著不同的销售量
    3. 五个不同居民区的居民购买力是否存在显著差异。
  • 商标、销售方式、居民区这些区分不同组别的依据就是因素(也叫因子),通常用大写字母 A , B , C A,B,C A,B,C等表示这些因素,而一个因素所处的不同的状态被称为水平,用 A 1 , A 2 A_1,A_2 A1,A2等表示

  • 这三个例子中,因素都只有一个,它们都是单因素方差分析;若因素有多个,则被称为多因素方差分析

  1. 对于单因素方差分析而言,进行比较的样本个数,本质上就是该因素的水平个数
  • 在举例a中,比较的是四个商标不同的产品质量指标样本均值(所在总体的均值),在该例中,因素“商标”的因子水平个数为4
  1. 方差分析的多个总体均值该如何比较?并非两两相互比较,而是同时比较,写出假设检验的形式有:

    H 0 : μ 1 = μ 2 = μ i = ⋯ μ k ↔ H 1 : μ i 不全相等 H_0:\mu _1=\mu _2=\mu _i=\cdots \mu _k\leftrightarrow H_1: \mu _i\text{不全相等} H0:μ1=μ2=μi=μkH1:μi不全相等 其中, k k k为样本个数(因子水平个数)

  • 总体均值不全相等的情形:
    在这里插入图片描述
  1. 方差分析的假设
  • 方差分析需要满足的假设:
    1. 每个样本的总体均为正态总体
    2. 各总体的标准差相同
    3. 从每个总体中抽取的样本相互独立
  • 若样本满足以上条件,方差分析的结果是准确的。但在大样本下,就算不满足假设1与假设2,方差分析的结果也是稳健的
  1. 方差分析的思想
  • 既然我们检验的是不同总体的均值是否相等,那么很自然便想观测各样本的样本均值的“差异程度”,如果各样本的均值差异很大,那么它们的总体均值也有很大可能存在差异

  • **样本间均值的“差异程度”**是一个很好的评判指标,但这并不足够,还有一个指标也十分重要:各样本的样本内差异程度

  • 在相同的样本间差异程度下,样本内差异程度越大,各总体间均值存在差异的可能性就越小,为什么呢?简单来说,就是样本内差异程度越大,“偶然性”越大,我们越难判断两个不相等的均值是否真的不相等

  • 举例来说:

    小红均分是91,小刚均分是89,考试成绩如下表所示:

    次数小红分数小刚分数样本内部标准差样本内部方差两者均值差
    A9189002
    B179936362
    B294706362
    • 在情况A下,可以很容易判断两人均分存在明显差异
    • 在情况B下,高达36的方差,2分的均值差没有说服力
    • 在该例子中,当小红小刚这两个样本的样本内差异程度过大,即便在样本间均值的差异程度相同时,结果依然不具有可信度
  1. 原理解析

    y i j y_{ij} yij为第 i i i个样本的第 j j j个样品,假设有r个样本,每个样本的样品数量都同为 m m m,于是我们有 r × m r\times m r×m个样品: y i j , i = 1 , 2 , ⋯   , r , j = 1 , 2 , ⋯   , m , y_{i j}, \quad i=1,2, \cdots, r, \quad j=1,2, \cdots, m, yij,i=1,2,,r,j=1,2,,m,

  • 既然要研究“差异程度”,那么观察每个样本值 y i j y_{ij} yij与平均值的偏差一定是必不可少的

  • 数据 y i j y_{ij} yij与所有数据的总平均 y ˉ \bar{y} yˉ的偏差可用 y i j − y ˉ y_{ij}-\bar{y} yijyˉ表示,这个总偏差可以解构为两个偏差之和: y i j − y ˉ = ( y i j − y ˉ i ⋅ ) + ( y ˉ i ⋅ − y ˉ ) y_{ij}-\bar{y}=\left( y_{ij}-\bar{y}_{i·} \right) +\left( \bar{y}_{i·}-\bar{y} \right) yijyˉ=(yijyˉi)+(yˉiyˉ)

    • y ˉ i ⋅ \bar{y}_{i·} yˉi为因素 A A A在第 i i i个水平下的样本均值(或者就是第 i i i个样本的均值)。
    • y i j − y ˉ i ⋅ y_{ij}-\bar{y}_{i·} yijyˉi被称为组内偏差,它反映了第 i i i个样本的组内数据与组内平均值的随机误差
    • y ˉ i ⋅ − y ˉ \bar{y}_{i·}-\bar{y} yˉiyˉ被称为组间偏差,除了反映随机误差外,还反映了第 i i i个的总体均值与全总体均值的差值,可以理解为因素 A A A的第 i i i个水平带来的主效应
    • 以上两种偏差分别对应前面所提到的样本内差异程度样本间均值的差异程度

    完成对一个样本值与平均值偏差的解构后,接下来将所有的偏差汇总起来,计算总的“差异程度”

  • y i j y_{ij} yij间总的差异大小可以用总偏差平方和 S T S_T ST表示 S T = ∑ i = 1 r ∑ j = 1 m ( y i j − y ˉ ) 2 , f T = n − 1 S_{T}=\sum_{i=1}^{r} \sum_{j=1}^{m}\left(y_{i j}-\bar{y}\right)^{2}, \quad f_{T}=n-1 ST=i=1rj=1m(yijyˉ)2,fT=n1

  • 仅由随机误差引起的数据间差异可用组内偏差平方和 S e S_e Se表示

    S e = ∑ i = 1 r ∑ j = 1 m ( y i j − y ˉ i . ) 2 , f e = r ( m − 1 ) = n − r . S_{e}=\sum_{i=1}^{r} \sum_{j=1}^{m}\left(y_{i j}-\bar{y}_{i} .\right)^{2}, \quad f_{e}=r(m-1)=n-r . Se=i=1rj=1m(yijyˉi.)2,fe=r(m1)=nr.

  • 由于效应不同引起的数据差异可用组间偏差平方和 S A S_A SA表示

    S A = m ∑ i = 1 ( y ˉ i . − y ˉ ) 2 , f A = r − 1 S_{A}=m \sum_{i=1}\left(\bar{y}_{i} .-\bar{y}\right)^{2}, \quad f_{A}=r-1 SA=mi=1(yˉi.yˉ)2,fA=r1 其中, f f f为它们各自的自由度

    以上三种偏差平方和的大小和数据的个数(或者自由度)有关,通常而言,数据越多,偏差平方和越大,这不利于进行偏差平方和之间的比较。因此需要统一它们的“量纲”

  • 定义: M S A = S A f A , M S e = S e f e M S_{A}=\frac{S_{A}}{f_{A}}, \quad M S_{e}=\frac{S_{e}}{f_{e}} MSA=fASA,MSe=feSe

    然后将两者相除,就可以判断多组样本的均值是否相等

  1. 单因素方差分析检验统计量: T e s t    s t a t i s t i c s = M S A M S e Test\,\,statistics=\frac{MS_A}{MS_e} Teststatistics=MSeMSA
    检验统计量服从分布 : T e s t    s t a t i s t i c s ∼ F ( f A , f e ) Test\,\,statistics\sim F\left( f_A,f_e \right) TeststatisticsF(fA,fe)
    p值计算: p v a l u e = P ( F > T e s t    s t a t i s t i c s ) pvalue=P\left( F>Test\,\,statistics \right) pvalue=P(F>Teststatistics)
  • 尽管方差分析做的是多均值的“相等性”检验,它的p值并不是双边检验,而是单边检验
  • 之前所说看备择假设的符号判断p值的形式只适用于单样本与双样本均值检验
  1. kruskalwallis检验——非正态性检验
  • 尽管在大样本下,非正态性数据的方差分析也是稳健的,但是在小样本下,对非正态性数据做方差分析还是可能存在误差
  • 此时,我们可以使用kruskalwallis检验。该检验也是一种非参数检验
  1. 代码实操:对altman_910.txt数据集进行方差分析。该数据记录了3组心脏搭桥病人给予不同水平的一氧化氮通气下,他们的红细胞内叶酸水平。注:三组样本都是正态性样本
data = np.genfromtxt('./data/altman_910.txt', delimiter=',') 
group1 = data[data[:,1]==1,0]
group2 = data[data[:,1]==2,0]
group3 = data[data[:,1]==3,0]
group1

from typing import Tuple

def anova_oneway() -> Tuple[float, float]:

    pVal=pd.Series(dtype='float64')

    # 先做方差齐性检验
    _,pVal['levene'] = stats.levene(group1, group2, group3)
    if pVal['levene']<0.05: #这里假设显著性水平为0.05
        print('警告: 方差齐性检验的p值小于0.05: p={},方差分析结果在小样本下可能不准确'.format(pVal['levene']))
        print('-------------------------------')

    # 单因素方差分析-假设样本服从正态分布
    _, pVal['anova_oneway_normal'] = stats.f_oneway(group1, group2, group3) # 在这里输入待分析的数据
    
    print('若样本服从正态分布,单因素方差分析的p值为{}'.format(pVal['anova_oneway_normal']))
    if pVal['anova_oneway_normal'] < 0.05:
        print('检验在0.05的显著性水平下显著,多组样本中至少存在一组样本均值与其它样本的均值不相等。')

    print('---------------------------------')

    # 单因素方差分析-假设样本不服从正态分布
    _, pVal['anova_oneway_notnormal'] = stats.mstats.kruskalwallis(group1, group2, group3) # 在这里输入待分析的数据
    
    print('若样本不服从正态分布,单因素方差分析的p值为{}'.format(pVal['anova_oneway_notnormal']))
    if pVal['anova_oneway_notnormal'] < 0.05:
        print('检验在0.05的显著性水平下显著,多组样本中至少存在一组样本均值与其它样本的均值不相等。')    

    return pVal
anova_oneway()
  • 输出
    在这里插入图片描述

  • 两种检验的结果相差很大,若满足正态性假设,ANOVA的灵敏度优于kruskalwallis检验,因此我们在进行方差分析前最好做一次正态性检验

2. 双因素分析
  1. 尽管单因素方差分析具备比较多个总体均值的功能,但其实它的本质是探究因素 A A A是否显著。若显著,则意味着这些总体均值的不相等是因为因素 A A A导致的;若不显著,则意味着因素 A A A不能导致他们不相等。
  2. 如果我们将因素个数提升至两个,此时方差分析就变为了双因素方差分析
  • 双因素方差分析不仅仅探究两个因素是否显著,还要探究两个因素的交互项是否显著
  • 对于这种多因素的方差分析,借用线性回归模型来解决问题可以事半功倍
  1. 实例讲解:测量婴儿头围hs
  • 现在有3个婴儿的头围需要测量,我们想知道他们的头围有无显著的区别。注意,如果我们只探究这个问题,则此时就是单因素方差分析,探究的是(因素:婴儿fetus)对头围的是否有显著性影响

  • 人工测量总是有误差的。为了保证客观性,我们请了四位观察者observer,让他们对每个婴儿的头围重复测量重复测量三次,并记录每一次测量的结果,此时,我们总共会得到36个样品。我们将(因素:observer)也纳入考量,同时考量两个因素以及他们的交互项的显著性

  • 如果观察者因素没有显著差别,就说明观察者观察的结果很一致;反之,他们观察的差距非常大,可能要另外寻找其他的观察者

  • 代码示例

# statsmodel包分析的对象更多的是dataframe,前面的分析对象多为数组,这一点需要注意。
data = np.genfromtxt('./data/altman_12_6.txt', delimiter=',')
df = pd.DataFrame(data, columns=['hs', 'fetus', 'observer'])
import statsmodels.api as sm
from statsmodels.stats.anova import anova_lm

lm = sm.formula.ols('hs~C(fetus)+C(observer)+C(fetus):C(observer)',data=df).fit()
# 将待分析的因变量放在~左侧,因素放在~右侧
# 因素用C()括起来,交互项使用:将两者联系在一起。
anovaResults = anova_lm(lm) # 方差分析
print(anovaResults)# 3. 多元数值向量的假设检验
  • 结果输出
                        df      sum_sq     mean_sq            F        PR(>F)
C(fetus)               2.0  324.008889  162.004444  2113.101449  1.051039e-27
C(observer)            3.0    1.198611    0.399537     5.211353  6.497055e-03
C(fetus):C(observer)   6.0    0.562222    0.093704     1.222222  3.295509e-01
Residual              24.0    1.840000    0.076667          NaN           NaN
  • 直接观察最后的p值:婴儿因素与观察者因素都显著,但是两者的交互项不显著,这说明三个婴儿的头围确实存在差异,但是观察者差异也很大,且没有一个单独的观察者对特定的一个胎儿有显著影响
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值