python统计分析——多组比较

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

一、方差分析

1、原理

        方差分析的思想是将方差分为组间方差和组内方差,看看这些分布是否符合零假设,即所有组都来自同一分布。区分不同群体的变量通常被称为因素或处理。

        作为对比,t检验观察两组的均值,并检查他们是否和两组来自同一个分布的假设一致。

        例如,如果我们有一组不进行处理,另一组用处理A,第三组用处理B,对它们进行比较,那么我们就在进行单因素方差分析,有时也称为单向方差分析,其中处理是分析的单因素。注意在方差分析中,在各分析组中有着相同的样本数是很重要的(这被称为平衡方差分析:平衡的设计是指对于所有可能的因素组合都有相同数量的观测值。)

        由于无效假设是,组间没有差异,该检验基于观察到的组间变异(即,它们均值之间)和期望的观察到的组内变异(在对象间)的比较。

        单因素方差分析假定所有的样本都来自同方差的正态分布总体。同方差的假设可以用Levene检验进行检验

可参考:excel统计分析——Levene方差齐性检验_excel中方差齐性检验是什么-CSDN博客

        方差分析使用了传统的术语。DF表示自由度(degrees of freedom),总和叫做平方和(SS),二者之间的比率叫做均方(MS),并且平方的项都偏离了样本均值。总的来说,样本方差被定义为:

s^2=\frac{1}{DF}\sum(y_i-\bar{y})^2=\frac{SS}{DF}

        最基本的技术就是将总的平方和SS分割为在模型中使用的相关组分的效应。因此,方差分析估计3中样本方差:基于所有观测偏离总体均值的总方差(SS_T),一个处理方差(SS_t),还有一个基于所有观测值偏离他们合适的处理均值的错误方差(SS_e)。处理方差是基于处理均值偏离总均值,结果被乘以了每个处理组的中的观测数,用于计算观测方差和均值方差之间的差距。这3个平方和的关系如下:

SS_T=SS_t+SS_e

其中,SS_T是偏离总均值的平方和,SS_E是偏离组内均值的平方和,SS_t是每组均值和总均值的偏离平方和。如果无效假设为真,则所有的3个方差估计值是相等。

        自由度的个数也可以用类似地方式进行分割:

DF_T=DF_t+DF_e

2、案例

# 导入库
import numpy as np
from scipy import stats

# 写入案例数据
group_1=np.array([32.4,33.2,32.3,31.9])
group_2=np.array([24.7,31.2,25.8,27.5])
group_3=np.array([22.7,21.3,18.4,21.6])
group_4=np.array([23.3,21.1,22.3,21.9])

# 方法1:stats.f_oneway()函数
F,pVal=stats.f_oneway(group_1,group_2,group_3,group_4)
print("F统计量:",F)
print("p值:",pVal)

结果显示:处理间差异极显著。

# 方法2:statsmodels建立模型
# 导入库
import pandas as pd
import statsmodels.formula.api as smf
from statsmodels.stats.anova import anova_lm
# 获取符合要求的dataframe数据格式
df=pd.DataFrame({
    "group_1":group_1,
    "group_2":group_2,
    "group_3":group_3,
    "group_4":group_4
})
df=df.melt(var_name="treatment",value_name="value")
# 模型拟合
model=smf.ols('value~C(treatment)',df).fit()
anovaResults=anova_lm(model)
print(anovaResults)

方法一、方法二结果一致。

二、多重比较

        单因素方差分析的无效假设是所有样本的均值是相同的。所以如果单因素方差分析分析产生了一个显著的结果,我们只知道他们不是相同的。

        但是,我们常常并不只是关心所有的样本是否相同这样的联合假设,我们也想知道等着假设在哪对样本中被拒绝了。这种情况下,我们同时进行多种检验,每一个检验用于一对样本。

        这些检验有时被称为事后分析。在实验的设计和分析中,事后分析由下列部分组成,在实验结束后检验数据的在之前没有预设的模式。现在就是这种情况,因为方差分析的无效假设就是组间没有差异。

        随之而来的结果就是多重检验问题:由于我们进行了多重比较检验,我们应该补偿一下得到显著结果的风险,尽管我们的无效假设是真的。我们可以通过矫正p值来解决这个问题。

1、Tukey's检验

        Tukey's检验,有时被称为Tukey诚实显著差异检验(HSD)方法,在多重检验时控制一类错误,是被一门广泛接受的技术。它基于一个我们还没遇到的一个统计量——学生化范围,常常用变量q表示。学生化范围通过一列数字进行计算:

q_n=\frac{max\left \{ x_1,...,x_n \right \}-min\left \{x_1,...,x_n \right \}}{s}

其中,s是样本标准差。在Tukey HSD方法中,样本x1,x2,...,xn是均值的一组样本,q是基本的检验统计量。它可以在拒绝无效假设(即所有的组来自相同总体,它们的均值相等)后,用来在事后分析中检验哪两组均值有着显著差异。

参考:excel统计分析——Tukey法多重比较_用excel 进行tukey法统计-CSDN博客

excel统计分析——Tukey‘s-b法多重比较_ceres tukey鈥檚 biweight-CSDN博客

2、Bonferroni矫正

        Tukey HSD是一个专门用来比较k个样本的所有配对的检验。相反,我们可以在所有的配对上进行t检验,计算p值,并应用一个多重检验问题中的p值矫正方法。最简单同时也是非常保守的方法是将得到的p值除以我们进行检验的次数(Bonferroni矫正)。

        尽管多重比较还没有被标准化地包括在python中,我们可以从statsmodels包中获得许多多重比较检验校正。【注:《python统计分析》的出版时间是2018年】

参考:excel统计分析——Sidak、Bonferroni法多重比较_sidak多重比较-CSDN博客

3、Holm矫正

        Holm调整,有时也叫作Holm-Bonferroni方法,按照顺序比较最低的p值和随着每次检验都逐渐减小的Ⅰ类错误率。

三、Kruskal-Wallis检验

        当我们将两组进行相互比较的时候,如果是正态分布的,我们就用t检验,如果是非正态分布的,就用非参数的Mann-Whitney u检验。对于3组或3组以上的数据比较,如果是正态分布数据就用方差分析,如果是非正态分布的数据,对应的检验是Kruskal-Wallis H检验。当无效假设是真的情况下,Kruskal-Wallis检验的检验统计量服从卡方分布。

参考:excel统计分析——多组数据的秩和检验_多组秩和检验-CSDN博客

案例:

# 导入库
import numpy as np
from scipy import stats

# 录入数据
group_1=np.array([2.23,1.14,2.63,1.00,1.35,2.01,1.64,1.13,1.01,1.70])
group_2=np.array([5.59,0.96,6.96,1.23,1.61,2.94,1.96,3.68,1.54,2.59])
group_3=np.array([4.50,3.92,10.33,8.23,2.07,4.90,6.84,6.42,3.72,6.00])
group_4=np.array([1.35,1.06,0.74,0.96,1.16,2.08,0.69,0.68,0.84,1.34])
group_5=np.array([1.40,1.51,2.49,1.74,1.59,1.36,3.00,4.81,5.21,5.12])
# 多组数据的非参数检验
h,pVal=stats.kruskal(group_1,group_2,group_3,group_4,group_5)
print("H统计量:",h)
print("p值:",pVal)

四、两因素方差分析

        和单因素方差分析分析相比,用两因素方差分析时,我们不仅要观察每个因素是否显著,也需要检验这些因素的交互因素是否对数据的分布有显著影响。python进行两因素方差分析最好的方法是使用statsmodels。

代码参考如下:

# 导入库
import numpy as np
import pandas as pd
from scipy import stats
import statsmodels.formula.api as smf
from statsmodels.stats.anova import anova_lm

# 写入案例数据
data_1=np.array(["A1","A1","A1","A1","A1","A1","A1","A1","A1","A1","A1","A1","A2","A2","A2","A2","A2","A2","A2","A2","A2","A2","A2","A2","A3","A3","A3","A3","A3","A3","A3","A3","A3","A3","A3","A3","A4","A4","A4","A4","A4","A4","A4","A4","A4","A4","A4","A4"])
data_2=np.array(["B1","B1","B1","B2","B2","B2","B3","B3","B3","B4","B4","B4","B1","B1","B1","B2","B2","B2","B3","B3","B3","B4","B4","B4","B1","B1","B1","B2","B2","B2","B3","B3","B3","B4","B4","B4","B1","B1","B1","B2","B2","B2","B3","B3","B3","B4","B4","B4"])
data_3=np.array([22,26.5,24.4,30,27.5,26,32.4,26.5,27,30.5,27,25.1,23.5,25.8,27,33.2,28.5,30.1,38,35.5,33,26.5,24,25,30.5,26.8,25.5,36.5,34,33.5,28,30.5,24.6,20.5,22.5,19.5,34.5,31.4,29.3,29,27.5,28,27.5,26.3,28.5,18.5,20,19])
df=pd.DataFrame({
    "factor_A":data_1,
    "factor_B":data_2,
    "value":data_3
})

# 用交互项确定方差分析
formula="value~C(factor_A)+C(factor_B)+C(factor_A):C(factor_B)"
lm=smf.ols(formula,df).fit()
anovaResults=anova_lm(lm)
# 输出方差分析结果
print(anovaResults)

结论:A因素各水平差异显著,B因素各水平差异显著,A因素与B因素间存在显著的交互作用。

五、三因素方差分析

        有两个以上的因素时,建议使用统计学建模的方法进行数据分析。当然,正如我们常常分析统计学数据那样,应该首先对数据进行可视化检查。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/524737.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(React Hooks)前端八股文修炼Day9

一 对 React Hook 的理解,它的实现原理是什么 React Hooks是React 16.8版本中引入的一个特性,它允许你在不编写类组件的情况下,使用state以及其他的React特性。Hooks的出现主要是为了解决类组件的一些问题,如复杂组件难以理解、难…

科技云报道:卷完参数卷应用,大模型落地有眉目了?

科技云报道原创。 国内大模型战场的比拼正在进入新的阶段。 随着产业界对模型落地的态度逐渐回归理性,企业客户的认知从原来的“觉得大模型什么都能做”的阶段,已经收敛到“大模型能够给自身业务带来什么价值上了”。 2023 年下半年,不少企…

Zotero参考文献引用(适用国内)

配置环境 【1】Windows 10 【2】Office 2021 【3】Zotero 6 目录 配置环境 前言 一、软件及插件安装 二、网页信息抓取 三、文献引用 注意事项 前言 本教程记录使用zotero作为自动插入参看文献引用工具的全流程,流程较为简洁,适用于平时论文写作不多&…

C语言 | Leetcode C语言题解之第15题三数之和

题目&#xff1a; 题解&#xff1a; int cmp(const void *x, const void *y) {return *(int*)x - *(int*)y; } //判断重复的三元组 bool TheSame(int a, int b, int c, int **ans, int returnSize) {bool ret true;for(int i 0;i < returnSize;i){if(a ans[i][0] &&…

书生·浦语训练营二期第三次笔记-茴香豆:搭建你的 RAG 智能助理

RAG学习文档1&#xff1a; https://paragshah.medium.com/unlock-the-power-of-your-knowledge-base-with-openai-gpt-apis-db9a1138cac4 RAG学习文档2: https://blog.demir.io/hands-on-with-rag-step-by-step-guide-to-integrating-retrieval-augmented-generation-in-llms-a…

2024/4/1—力扣—主要元素

代码实现&#xff1a; 思路&#xff1a;摩尔投票算法 int majorityElement(int *nums, int numsSize) {int candidate -1;int count 0;for (int i 0; i < numsSize; i) {if (count 0) {candidate nums[i];}if (nums[i] candidate) {count;} else {count--;}}count 0;…

操作系统复习

虚拟内存 内存(memory)资源永远都是稀缺的&#xff0c;当越来越多的进程需要越来越来内存时&#xff0c;某些进程会因为得不到内存而无法运行&#xff1b; 虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存&#xff0c;而实际上&#xff0…

网络与并发编程(一)

并发编程介绍_串行_并行_并发的区别 串行、并行与并发的区别 串行(serial)&#xff1a;一个CPU上&#xff0c;按顺序完成多个任务并行(parallelism)&#xff1a;指的是任务数小于等于cpu核数&#xff0c;即任务真的是一起执行的并发(concurrency)&#xff1a;一个CPU采用时间…

JVM虚拟机(一)介绍、JVM组成、堆、栈、方法区/元空间、直接内存

目录 一、JVM 介绍1.1 为什么要学 JVM&#xff1f;1.2 JVM 是什么&#xff1f; 二、JVM 组成2.1 程序计数器2.2 Java堆1&#xff09;JVM 内存结构2&#xff09;Java 1.7 和 1.8 中堆的区别 2.3 Java虚拟机栈1&#xff09;虚拟机栈 和 栈帧2&#xff09;常见面试题 2.4 方法区/元…

Transformer模型-Feed Forward前馈网络和Relu激活函数的简明介绍

今天介绍transformer模型的Feed Forward network前馈网络和Relu激活函数 背景 位置感知Position-Wise前馈网络&#xff08;FFN&#xff09;由两个全连接层&#xff08;fully connected dense layers&#xff0c;就是线性层&#xff08;Linear Layer&#xff09;&#xff0c;或密…

LLM-base版本和chat版本的比较

突然想到了这个问题&#xff0c;网上搜集了一些资料&#xff0c;自己也总结一下 首先放一张llama2论文当中的图&#xff0c;可以很直观的看到区别 面试回答版 问题&#xff1a; 大语言模型base版和chat版的区别是什么&#xff1f; 回答&#xff1a; base版本更适合文本补全…

医疗器械FDA | 常见的网络安全材料发补问题都有哪些?

FDA网络安全资料发补咨询点此​​获取https://work.weixin.qq.com/ca/cawcde5ee29d239046 ————————--- 01 安全文档编写问题 FDA网络安全文档编写格式、内容、可读性等未满足官方要求&#xff0c;则将可能被要求发补整改编写后的文档。 02 安全管理问题 a. 网络安…

Apache-Pulsar安装操作说明

说明 Pulsar 是一种用于服务器到服务器消息传递的多租户高性能解决方案。 Pulsar 的主要特性如下&#xff1a; 对 Pulsar 实例中的多个集群的本机支持&#xff0c;并跨集群无缝地复制消息。 极低的发布和端到端延迟。 无缝可扩展至超过一百万个主题。 一个简单的客户端 API&…

C语言--#运算符和##运算符

#运算符和##运算符 这里提前补充一点printf C语言里面会天然的吧printf里面俩字符串合并为一个 #的使用 在C语言中&#xff0c;#符号主要用于预处理器指令。预处理器是在代码编译之前执行的&#xff0c;它处理所有以#开始的指令。以下是一些常见的使用情况&#xff1a;1. **…

自定义校验器

1.前端校验 <template><el-dialog:title"!dataForm.brandId ? 新增 : 修改":close-on-click-modal"false":visible.sync"visible"><el-form:model"dataForm":rules"dataRule"ref"dataForm"keyu…

MySQL-主从复制:概述、原理、同步数据一致性问题、搭建流程

主从复制 1. 主从复制概述 1.1 如何提升数据库并发能力 一般应用对数据库而言都是“读多写少”&#xff0c;也就说对数据库读取数据的压力比较大&#xff0c;有一个思路就是采用数据库集群的方案&#xff0c;做主从架构、进行读写分离&#xff0c;这样同样可以提升数据库的并…

基于R语言、MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作

第一章、理论篇&#xff1a;以问题导入的方式&#xff0c;深入掌握原理基础 什么是MaxEnt模型&#xff1f; MaxEnt模型的原理是什么&#xff1f;有哪些用途&#xff1f; MaxEnt运行需要哪些输入文件&#xff1f;注意那些事项&#xff1f; 融合R语言的MaxEnt模型的优势&…

从0到1搭建文档库——sphinx + git + read the docs

sphinx git read the docs 目录 一、sphinx 1 sphinx的安装 2 本地构建文件框架 1&#xff09;创建基本框架&#xff08;生成index.rst &#xff1b;conf.py&#xff09; conf.py默认内容 index.rst默认内容 2&#xff09;生成页面&#xff08;Windows系统下&#xf…

大厂高频面试题复习JAVA学习笔记-JUC多线程及高并发(上)

目录 0 JUC基础概念 wait/sleep的区别 并发与并行的区别 线程的六个状态 JUC结构 ​编辑 1 请谈谈你对volatile的理解 JMM&#xff08;java内存模型&#xff09; 可见性 不保证原子性 有序性​编辑 指令重排 哪些地方用到volatile&#xff1a; 双端检查机制DLC …

PaddleVideo:PP-TSM视频分类

本文记录&#xff1a;使用Paddle框架训练TSM&#xff08;Temporal Shift Module&#xff09; 前提条件&#xff1a;已经安装Paddle和PadleVideo&#xff0c;具体可参考前一篇文章。 1-数据准备&#xff1a; 以UCF101为例&#xff1a;内含13320 个短视频&#xff0c;视频类别&…