统计假设检验报告了在诸如变量之间没有关联或组之间没有差异等假设下,观察到结果的可能性。
假设检验 不会评论如果关联或差异具有统计学意义,效应的大小。这凸显了计算和报告结果的标准方法的必要性。
效应量度量方法是指来自估计统计学领域的统计工具集,用于量化实验结果中效应的大小,可用于补充统计假设检验的结果。
在本教程中,您将了解效应量和效应量度量,以量化结果的幅度。
完成本教程后,您将了解:
- 在实验结果中计算和报告效应量的重要性。
- 用于量化变量之间关联的效应量度量,例如皮尔逊相关系数。
- 用于量化组之间差异的效应量度量,例如 Cohen's d 度量。
开始您的项目,阅读我的新书机器学习统计学,其中包括分步教程和所有示例的Python源代码文件。
让我们开始吧。

Python 中效应量度量的入门指南
照片由 scott1346 提供,部分权利保留。
教程概述
本教程分为三个部分;它们是:
- 报告效应量的必要性
- 什么是效应量?
- 如何计算效应量
需要机器学习统计学方面的帮助吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
报告效应量的必要性
一旦从业者掌握了统计方法,通常就会专注于量化结果的可能性。
这通常体现在以 p 值和显著性水平表示的统计假设检验结果的计算和呈现上。
在结果呈现中经常被忽略的一个方面是实际量化差异或关系,称为效应。很容易忘记实验的目的是量化效应。
研究查询的主要产出是一个或多个效应量度量,而不是 P 值。
— 我学到的东西(到目前为止),1990 年。
统计检验只能说明是否存在效应的可能性。它不能说明效应的大小。实验结果可能具有统计学意义,但效应非常小,以至于后果微乎其微。
一个结果可能具有统计学意义但微不足道,这既有可能,而且不幸的是也很常见。一个结果也可能在统计学上不显著但却很重要。
— 第 4 页,效应量指南:统计功效、荟萃分析和研究结果解释,2010 年。
忽略效应呈现的问题在于,它可能使用临时的度量方法来计算,甚至完全被忽略,留给读者自己解释。这是一个大问题,因为量化效应的大小对于解释结果至关重要。
什么是效应量?
效应量是指一个效应或结果在人群中预期发生的大小或幅度。
效应量是从样本数据中估计出来的。
效应量方法是指用于计算效应量的一系列统计工具。通常,效应量度量领域也简称为“效应量”,以表示该领域的普遍关注。
通常将效应量统计方法按类型进行分组,这些类型是需要量化的效应。计算效应量的两种主要方法是:
- 关联。用于量化变量之间关联的统计方法(例如,相关性)。
- 差异。用于量化变量之间差异的统计方法(例如,均值之间的差异)。
效应可以是比较组(例如,处理组和未处理组)之间所揭示的治疗结果,也可以描述两个相关变量之间的关联程度(例如,治疗剂量与健康状况)。
— 第 5 页,效应量指南:统计功效、荟萃分析和研究结果解释,2010 年。
效应量计算的结果必须进行解释,具体取决于使用的统计方法。必须根据解释目标选择度量。计算结果的三种类型包括:
- 标准化结果。效应量具有标准化的尺度,可以普遍解释,而不考虑应用(例如,Cohen's d 计算)。
- 原始单位结果。效应量可以使用变量的原始单位,这有助于在领域内进行解释(例如,两个样本均值之间的差异)。
- 无单位结果。效应量可能没有单位,例如计数或比例(例如,相关系数)。
因此,效应量可以指组均值之间的原始差异,或绝对效应量,以及效应的标准化度量,它们被计算出来以将效应转换为易于理解的尺度。当研究的变量具有内在意义时(例如,睡眠小时数),绝对效应量很有用。
— 使用效应量——或者为什么 P 值不够,2012 年。
最好使用多种度量来报告效应量,以帮助不同类型的读者理解您的发现。
有时,最好同时以原始单位(便于读者理解)和某种标准化度量(便于将来纳入荟萃分析)来报告结果。
— 第 41 页,理解新统计学:效应量、置信区间和荟萃分析,2011 年。
效应量不能取代统计假设检验的结果。相反,效应量是对检验的补充。理想情况下,应同时呈现假设检验和效应量计算的结果。
- 假设检验:量化观察到给定假设(零假设)的数据的可能性。
- 效应量:量化效应的大小,假设效应存在。
如何计算效应量
效应量的计算可以是样本均值的计算,也可以是两个均值之间的绝对差异。它也可以是更复杂的统计计算。
在本节中,我们将介绍一些常见的关联和差异效应量计算。方法示例并不完整;可能有数百种方法可用于计算效应量。
计算关联效应量
变量之间的关联通常被称为“r 系列”效应量方法。
这个名字来源于也许最常用的计算效应量的方法,称为皮尔逊相关系数,也称为皮尔逊 r。
皮尔逊相关系数衡量两个实值变量之间线性关联的程度。它是一种无单位的效应量度量,可以按如下方式进行标准化解释:
- -1.0:完全负相关。
- -0.7:强负相关
- -0.5:中等负相关
- -0.3:弱负相关
- 0.0:无关联。
- 0.3:弱正相关
- 0.5:中等正相关
- 0.7:强正相关
- 1.0:完全正相关。
可以使用 Python 中的 pearsonr() SciPy 函数计算皮尔逊相关系数。
下面的示例演示了皮尔逊相关系数的计算,用于量化两个随机高斯数样本之间的关联大小,其中一个样本与第二个样本有很强的关系。
1 2 3 4 5 6 7 8 9 10 11 12 |
# 计算两个变量之间的皮尔逊相关性 from numpy.random import randn from numpy.random import seed from scipy.stats import pearsonr # 设定随机数生成器种子 seed(1) # 准备数据 data1 = 10 * randn(10000) + 50 data2 = data1 + (10 * randn(10000) + 50) # 计算皮尔逊相关性 corr, _ = pearsonr(data1, data2) print('Pearsons correlation: %.3f' % corr) |
运行示例会计算并打印两个数据样本之间的皮尔逊相关性。我们可以看到,该效应显示了样本之间很强的正相关关系。
1 |
皮尔逊相关性:0.712 |
另一个非常流行的计算关联效应量的方法是 r 方度量,或 r^2,也称为决定系数。它总结了在一个变量中被另一个变量解释的方差的比例。
计算差异效应量
组之间的差异通常被称为“d 系列”效应量方法。
这个名字来源于也许最常用的计算组均值之间差异的方法,称为 Cohen's d。
Cohen's d 衡量两个高斯分布变量的均值之间的差异。它是一种标准分数,以标准差的数量总结差异。由于分数是标准化的,因此有一个表格用于解释结果,总结如下:
- 小效应量:d=0.20
- 中等效应量:d=0.50
- 大效应量:d=0.80
Python 中没有提供 Cohen's d 的计算;我们可以手动计算。
两个样本均值之间的差异计算如下:
1 |
d = (u1 - u2) / s |
其中 *d* 是 Cohen's d,*u1* 是第一个样本的均值,*u2* 是第二个样本的均值,*s* 是两个样本的合并标准差。
两个独立样本的合并标准差可以计算如下:
1 |
s = sqrt(((n1 - 1) . s1^2 + (n2 - 1) . s2^2) / (n1 + n2 - 2)) |
其中 *s* 是合并标准差,*n1* 和 *n2* 是第一个和第二个样本的大小,*s1^2* 和 *s2^2* 是第一个和第二个样本的方差。减法是自由度的调整。
下面的函数将计算两个实值变量样本的 Cohen's d 度量。NumPy 函数 mean() 和 var() 用于分别计算样本均值和方差。
1 2 3 4 5 6 7 8 9 10 11 12 |
# 计算独立样本 Cohen's d 的函数 def cohend(d1, d2): # 计算样本大小 n1, n2 = len(d1), len(d2) # 计算样本方差 s1, s2 = var(d1, ddof=1), var(d2, ddof=1) # 计算合并标准差 s = sqrt(((n1 - 1) * s1 + (n2 - 1) * s2) / (n1 + n2 - 2)) # 计算样本均值 u1, u2 = mean(d1), mean(d2) # 计算效应量 return (u1 - u2) / s |
下面的示例计算了两个具有不同均值的随机高斯变量样本的 Cohen's d 度量。
该示例是人为设计的,使得均值相差半个标准差,并且两个样本具有相同的标准差。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# 计算两个样本之间的 Cohen's d from numpy.random import randn from numpy.random import seed from numpy import mean from numpy import var from math import sqrt # 计算独立样本 Cohen's d 的函数 def cohend(d1, d2): # 计算样本大小 n1, n2 = len(d1), len(d2) # 计算样本方差 s1, s2 = var(d1, ddof=1), var(d2, ddof=1) # 计算合并标准差 s = sqrt(((n1 - 1) * s1 + (n2 - 1) * s2) / (n1 + n2 - 2)) # 计算样本均值 u1, u2 = mean(d1), mean(d2) # 计算效应量 return (u1 - u2) / s # 设定随机数生成器种子 seed(1) # 准备数据 data1 = 10 * randn(10000) + 60 data2 = 10 * randn(10000) + 55 # 计算 cohen's d d = cohend(data1, data2) print('Cohens d: %.3f' % d) |
运行示例会计算并打印 Cohen's d 效应量。
正如预期的那样,我们可以看到均值之间的差异是半个标准差,这被解释为中等效应量。
1 |
Cohen's d: 0.500 |
另外两个流行的量化差异效应量的方法是:
- 优势比。衡量一种治疗与另一种治疗相比,某种结果发生的几率。
- 相对风险比。衡量一种治疗与另一种治疗相比,某种结果发生的概率。
扩展
本节列出了一些您可能希望探索的扩展本教程的想法。
- 查找一份研究论文,其中效应量与统计显著性结果一起报告。
- 实现一个函数来计算配对样本的 Cohen's d,并在测试数据集上进行演示。
- 实现并演示另一种差异效应度量,例如优势比或风险比。
如果您探索了这些扩展中的任何一个,我很想知道。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
论文
- 使用效应量——或者为什么 P 值不够, 2012.
- 我学到的东西(到目前为止), 1990.
书籍
- 效应量基本指南:统计功效、元分析与研究结果解读, 2010.
- 理解新统计学:效应量、置信区间和元分析, 2011.
- 行为科学的统计功效分析, 1988.
API
文章
总结
在本教程中,您了解了效应量和效应量度量,以量化结果的幅度。
具体来说,你学到了:
- 在实验结果中计算和报告效应量的重要性。
- 用于量化变量之间关联的效应量度量,例如皮尔逊相关系数。
- 用于量化组之间差异的效应量度量,例如 Cohen's d 度量。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
Jason,很棒的介绍!
谢谢。
Jason,关于效应量,特别是 Cohen's d 计算,这篇教程很棒。Cohen's d 的效应量计算是否只适用于 2 个高斯分布,还是可以适用于任何 2 个分布?
例如,我想知道如果您有 2 个数据集是伽马分布,或者一个数据集是高斯分布而另一个是伽马分布,它是否适用?
我想问的是,这是否适用于任何 2 个分布,或者对于 Cohen's d 提供有意义的结果,是否存在对 2 个分布(即两个正态分布)的特定属性要求?
我相信数据必须是高斯分布。
也许你可以为不同的分布做一些修改。
你好 Jason,
如何理解 s1, s2 = var(d1, ddof=1), var(d2, ddof=1)? ddof 是什么意思?
意思是“自由度”
https://en.wikipedia.org/wiki/Degrees_of_freedom_(statistics)
Jason,精彩的文章。我正在尝试使用
effect_size = np.mean(sample_data) / np.std(sample_data)
nobs = 10
alpha = 0.05
在 statsmodels 中运行 TTestPower.solve_power,但我一直收到一个错误,要求我声明一个名为 self 的附加参数。我不知道这个 self 参数是什么,也无法在 statsmodels 网站上找到它的文档。我花了很多时间试图让这个函数工作。您的帮助将非常有益。
供参考。我正在使用的语法如下,后面是错误信息:
TTestPower.solve_power(effect_size=1,nobs = 10,alpha = 0.05)
—————————————————————————
TypeError Traceback (most recent call last)
in
—-> 1 TTestPower.solve_power(effect_size=1,nobs = 10,alpha = 0.05)
TypeError: solve_power() missing 1 required positional argument: ‘self’
抱歉,我没遇到过这个问题,也许检查一下你的库是否是最新的?
如果不是,也许可以尝试将你的代码和错误发布到 stackoverflow 上?
感谢这篇精彩的文章。有没有关于非参数效应量(非正态分布)和使用非参数效应量的荟萃分析的好参考资料?
也许“进一步阅读”部分的一些资源可以作为第一步提供帮助。
嘿,我发现了一些可能有所帮助的东西
– https://www.researchgate.net/post/What_is_the_appropriate_effect_size_calculation_for_Wilcoxon_signed_rank_test_related_samples
– file:///C:/Users/eLab/Downloads/Effect_Size_Estimates_Current_Use_Calculations_and.pdf
– 我按照这里的流程计算 z https://docs.scipy.org.cn/doc/scipy/reference/generated/scipy.stats.mannwhitneyu.html
感谢分享。
Jason,感谢另一篇精彩的文章,
我想问一下,根据中心极限定理,如果我们尝试在单个域上比较两个算法(配对双样本 t 检验),并且在测试集中至少有 30 个样本来测量评估指标(例如准确率),那么我们是否可以认为两个算法评估结果之间差异的分布是正态的?那么,在测试集包含超过 30 个样本的情况下,我们是否可以安全地使用 Cohen's d 来计算效应量?
精彩的文章!我想问一下:我们是否可以使用 Cohen's d 来量化两个机器学习模型的准确率之间的差异?我考虑的是,例如,通过 bootstrapping 计算的平均准确率周围的两个分布。