Friedman检验(The Friedman Non-parametric Repeated Measures ANOVA Test)——Python软件实现

发布于 2023年4月24日 星期一 20:15:42 浏览:1598
原创不易,转载请注明来源,感谢!
附件下载:
Friedman检验.zip 请勿重复点击,如无响应请耐心等待或稍后再试。

在前面文章中介绍了Friedman检验的假设检验理论,本篇文章将使用实例演示在Python软件中实现Friedman检验的操作步骤。

关键词:Python软件; 非参数检验; 秩和检验; Friedman检验; 重复测量非参数检验

一、案例介绍

8名受试对象在相同试验条件下分别接受A、B、C 3种不同频率振动的刺激,测量其反应率(%),问3种频率振动刺激的反应率是否有差别?数据见图1。本案例数据可从“附件下载”处下载。

二、问题分析

本案例的分析目的是判断多组相关数据的差异,首先对3组数据进行正态性检验,若发现不符从正态分布,可以使用Friedman检验。Friedman检验可应用于多组配对或相关数据的秩转换非参数检验,但需要满足两个条件:

条件1:观察变量为连续变量或有序分类变量。本研究中反应率为连续变量,该条件满足。

条件2:观察变量具有3个及以上的分组,为配对设计,或各组之间存在相关性。本研究中3组数据均是对同一批研究对象所测量,该条件满足。

三、软件操作及结果解读

(一) 导入数据

import pandas as pd #导入pandas包
df = pd.read_csv('Friedman检验.csv')  #导入CSV数据
df  #查看数据

图1

在数据栏目中可以查看全部数据情况,数据集中共有4个变量和8个观察数据,4个变量分别代表被调查者的编号(ID)以及3种不同频率震动的刺激(A、B、C)。

(二) 适用条件判断

1. 软件操作

## 绘制Q-Q图 ##

import statsmodels.api as sm
import pylab
sm.qqplot(df['A'], line='s') #绘制A的qq图
pylab.show()
sm.qqplot(df['B'], line='s') #绘制B的qq图
pylab.show()
sm.qqplot(df['C'], line='s') #绘制C的qq图
pylab.show()

图2-1

图2-2

图2-3

## 正态性检验 ##

from scipy import stats #导入scipy包
shapiro_test1 = stats.shapiro(df.A)   # A的shapiro-Wilk正态性检验
print(shapiro_test1)
shapiro_test2 = stats.shapiro(df.B)   # B的shapiro-Wilk正态性检验
print(shapiro_test2)
shapiro_test3 = stats.shapiro(df.C)   # C的shapiro-Wilk正态性检验
print(shapiro_test3)

图3

2. 结果解读

Q-Q图 (图2-1、图2-2和图2-3) 显示3组散点偏离对角线较远,尤其是A、B两组数据,提示3组数据不服从正态分布;正态性检验结果 (图3) 显示A、B、C三组的P值分别为0.05988、0.03698和0.5969,前两组P值均<0.1,也提示两组数据不满足正态性条件。因此,本案例应使用Friedman检验比较3组反应率的差异。关于正态性检验的注意事项详见文章正态性假设检验(Normality Hypothesis Test)——SPSS软件实现(链接)。

(三) 整体检验

1. 统计描述

(1) 软件操作

## 描述性统计 ##

df.describe()

图4

(2) 结果解读

“describe (描述性分析)”运行结果 (图4) 提供了三组数据的“mean (均数)”、“std (标准差)”、“min (最小值)”、“25%(下四分位数)”、“50% (中位数)”、“75% (上四分位数)”和“max (最大值)”。可知,受试者对A频率振动的反应率为8.750% (P25~P75:8.300%~9.100%);对B频率振动的反应率为9.050% (P25~P75:8.575%~9.650%);对C频率振动的反应率为9.700% (P25~P75:9.350%~10.175%)。

2. 整体检验

(1) 软件操作

## 统计推断 ##

from scipy import stats
df_A = df['A']
df_B = df['B']
df_C = df['C']
stats.friedmanchisquare(df_A, df_B, df_C)#friedman检验

图5

(2) 结果解读

Friedman检验结果(图5)显示,χ²=7.4, P = 0.02472,差异有统计学意义(P < 0.05)。即3种频率振动刺激的反应率总体比较差别具有统计学意义(P < 0.05) (至少存在两组不相同)。

(四) 事后检验(两两比较)

虽然得到了“3种频率振动刺激的反应率总体比较差别具有统计学意义”的结论,但若要清楚了解到底是哪些频率刺激的反应率不同,则需要进一步进行两两比较。

1. 软件操作

## 事后检验  ##

import numpy as np
import scikit_posthocs as sp
data = np.array([df_A, df_B, df_C])
sp.posthoc_nemenyi_friedman(data.T)

注:若未安装“scikit_posthocs”包,需要先安装该包,代码为:

! pip install scikit_posthocs

图6

2. 结果解读

两两比较结果(图6)显示,频率A和频率B的差异无统计学意义(P=0.499),频率A和频率C的差异有统计学意义(P=0.024),频率B和频率C的差异尚无统计学意义(P=0.291)。

四、结论

本案例欲比较在3种不同频率振动(A、B、C)的刺激下受试者的反应率(%)是否存在差异。通过绘制Q-Q图和Shapiro-Wilk检验,提示数据不服从正态分布,故采用Friedman检验对数据进行分析。

结果显示,受试者对3种不同频率振动 (A、B、C) 的刺激反应率(%)分别为8.750% (P25~P75:8.300%~9.100%)、9.050% (P25~P75:8.575%~9.650%)、9.700% (P25~P75:9.350%~10.175%),差异有统计学意义(χ²=7.4,P = 0.02472)。进一步两两比较显示,频率A和频率B的差异无统计学意义(P=0.499),频率A和频率C的差异有统计学意义(P=0.024),频率B和频率C的差异尚无统计学意义(P=0.291)。

End
文章目录 沉浸式阅读