python实现two way ANOVA

news2024/9/22 21:32:06

文章目录

  • 目的:用python实现two way ANOVA 双因素方差分析
    • 1. python代码实现
      • 1 加载python库
      • 2 加载数据
      • 3 统计样本重复次数,均值和方差,绘制箱线图
      • 4 查看people和group是否存在交互效应
      • 5 模型拟合与Two Way ANOVA:双因素方差分析
      • 6 多重比较,post hoc t-tests
      • 7 计算效应量Correlation family: η^2、ω^2 (适用于 Correlational data)
    • 2. 双因素方差分析理论和公式
    • 3. 效应量分析

目的:用python实现two way ANOVA 双因素方差分析

1. python代码实现

在这里插入图片描述

1 加载python库

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats   

from statsmodels.formula.api import ols                     # 最小二乘法拟合
from statsmodels.stats.anova import anova_lm                # 方差分析
from statsmodels.stats.multicomp import pairwise_tukeyhsd   # post Hoc t_test

2 加载数据

value(month):治疗2周的各类被试的血糖值
group(PhysicalTherapy):表示有两种治疗方案,sham组(1)和rTMS组(2)
people(PsychiatricTreatment):表示有3种被试,年轻健康组(3)、老年健康组(1)、老年患病组(2)

df = pd.read_excel('data//TMS_demoData1.xlsx')
data = pd.DataFrame(df)
data.head(24)
valuegrouppeople
011.011
19.412
212.513
39.611
49.612
511.513
610.811
79.612
810.513
910.511
1010.812
1112.513
1210.521
1310.822
1410.523
1511.521
1610.522
1711.823
1812.021
1910.522
2011.523
2111.821
2210.222
2311.523

3 统计样本重复次数,均值和方差,绘制箱线图

data.describe()
valuegrouppeople
count24.00000024.00000024.000000
mean10.8916671.5000002.000000
std0.8895120.5107540.834058
min9.4000001.0000001.000000
25%10.5000001.0000001.000000
50%10.8000001.5000002.000000
75%11.5000002.0000003.000000
max12.5000002.0000003.000000
fig, ax = plt.subplots(1,2,figsize=(12,6),dpi=600)  # 1行2列的子图
sns.boxplot(x = 'group', y = 'value', data = data, ax = ax[0])
sns.boxplot(x = 'people', y = 'value', data = data, ax = ax[1])

## 可以看出rTMS组的血糖水平sham组的高,因此我们得看这是由于治疗方案引起的还是由于随机误差引起的
## 即从试验结果推断,因素 group 对试验结果有无显著影响,即当 group 取不同水平时试验结果有无显著差别
## 第5步方差分析的结果显示,因素 group 对试验结果无显著影响(p = 0.149),即当 group 取不同水平时试验结果无显著差别

请添加图片描述

4 查看people和group是否存在交互效应

  • 主效应:一个自变量变化时,因变量所出现的变化。
  • 交互效应:反应的是两个或多个自变量对因变量的联合影响,这种影响不能简单的通过自变量的主效应相加获得。
fig, ax = plt.subplots(1,2,figsize=(12,6),dpi=600)  # 1行2列的子图
sns.lineplot(y='value', x = 'people', hue = 'group', palette="tab10", data=data, ax = ax[0])
sns.lineplot(y='value', x = 'group', hue = 'people', palette="tab10", data=data, ax = ax[1])

请添加图片描述

从上图可以看出,people 2和3之间是存在交互效应的,下面可以通过方差分析来检验

5 模型拟合与Two Way ANOVA:双因素方差分析

model = ols('value ~C(group) + C(people) + C(group):C(people)', data = data).fit()
anova_table = anova_lm(model, type = 2)
pd.DataFrame(anova_table)
dfsum_sqmean_sqFPR(>F)
C(group)1.00.9600000.9600002.2721890.149064
C(people)2.07.4858333.7429178.8589740.002096
C(group):C(people)2.02.1475001.0737502.5414200.106623
Residual18.07.6050000.422500NaNNaN

根据上述结果可以发现:

  1. people组是小于0.05的,存在显著性差异。即people因素对指标value有显著性影响。
  2. group和两者的交互效应是大于0.05的,接受假设,不存在显著性差异,不存在交互效应。
  3. 因为people对value存在显著性差异,我们得进行进一步的T检验,查看是那两组之间存在显著性差异。
print(model.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  value   R-squared:                       0.582
Model:                            OLS   Adj. R-squared:                  0.466
Method:                 Least Squares   F-statistic:                     5.015
Date:                Thu, 30 Nov 2023   Prob (F-statistic):            0.00473
Time:                        17:55:19   Log-Likelihood:                -20.264
No. Observations:                  24   AIC:                             52.53
Df Residuals:                      18   BIC:                             59.60
Df Model:                           5                                         
Covariance Type:            nonrobust                                         
================================================================================================
                                   coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------------------------
Intercept                       10.4750      0.325     32.231      0.000       9.792      11.158
C(group)[T.2]                    0.9750      0.460      2.121      0.048       0.009       1.941
C(people)[T.2]                  -0.6250      0.460     -1.360      0.191      -1.591       0.341
C(people)[T.3]                   1.2750      0.460      2.774      0.013       0.309       2.241
C(group)[T.2]:C(people)[T.2]    -0.3250      0.650     -0.500      0.623      -1.691       1.041
C(group)[T.2]:C(people)[T.3]    -1.4000      0.650     -2.154      0.045      -2.766      -0.034
==============================================================================
Omnibus:                        1.196   Durbin-Watson:                   2.279
Prob(Omnibus):                  0.550   Jarque-Bera (JB):                1.081
Skew:                          -0.461   Prob(JB):                        0.582
Kurtosis:                       2.518   Cond. No.                         9.77
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
print(model.params)
# 拟合公式
# Yij = 10.475*G(1)*P(1) + 0.9150*G(2) - 0.625*P(2) + 1.275*P(3) - 0.325*G(2)*P(2) -1.4*G(2)*P(3)
Intercept                       10.475
C(group)[T.2]                    0.975
C(people)[T.2]                  -0.625
C(people)[T.3]                   1.275
C(group)[T.2]:C(people)[T.2]    -0.325
C(group)[T.2]:C(people)[T.3]    -1.400
dtype: float64

曲线拟合出来的实为每一种组合的均值:拟合参数验算
*** 无论是普通线性模型还是广义线性模型,预测的都是自变量x取特定值时因变量y的平均值。
因变量y的实际取值与其平均值之差被称为误差项,而误差的分布很大程度上决定了使用什么模型。

# Yij = 10.475*G(1)*P(1) + 0.9150*G(2) - 0.625*P(2) + 1.275*P(3) - 0.325*G(2)*P(2) -1.4*G(2)*P(3)
# GPxx:实际值
# Y_GPxx:预测值
''' Group = 1,People = 1 这个作为截距,后面的每一种组合要加上Intercept'''
Intercept = (11+9.6+10.8+10.5)/4 

''' Group = 1, People = 2 '''
GP12 = (9.4+9.6+9.6+10.8)/4
Y_GP12 = 10.475 - 0.625

''' Group = 1, People = 3 '''
GP13 = (12.5+11.5+10.5+12.5)/4
Y_GP13 = 10.475 + 1.275

''' Group = 2, People = 1 '''
GP21 = (10.5+11.5+12+11.8)/4
Y_GP21 = 10.475 + 0.9105

''' Group = 2, People = 2 '''
GP22 = (10.8+10.5+10.5+10.2)/4
Y_GP22 = 10.475 + 0.9105 - 0.625 - 0.325

''' Group = 2, People = 3 '''
GP23 = (10.5+11.8+11.5+11.5)/4
Y_GP23 = 10.475 + 0.9105 + 1.275 - 1.4

print('Intercept:', Intercept)
print('GP12:',GP12, 'Y_GP12:',Y_GP12)
print('GP13:',GP13, 'Y_GP13:',Y_GP13)
print('GP21:',GP21, 'Y_GP21:',Y_GP21)
print('GP22:',GP22, 'Y_GP22:',Y_GP22)
print('GP23:',GP23, 'Y_GP23:',Y_GP23)
Intercept: 10.475000000000001
GP12: 9.850000000000001 Y_GP12: 9.85
GP13: 11.75 Y_GP13: 11.75
GP21: 11.45 Y_GP21: 11.3855
GP22: 10.5 Y_GP22: 10.435500000000001
GP23: 11.325 Y_GP23: 11.2605

6 多重比较,post hoc t-tests

print("people因子不同水平的比较结果:", pairwise_tukeyhsd(data['value'], data['people']))
print("###########################\n")
print("group 因子不同水平的比较结果:", pairwise_tukeyhsd(data['value'], data['group']))

print("结果说明: reject=True,说明两组之间有显著性差异。")
people因子不同水平的比较结果: Multiple Comparison of Means - Tukey HSD, FWER=0.05
===================================================
group1 group2 meandiff p-adj   lower  upper  reject
---------------------------------------------------
     1      2  -0.7875 0.0935 -1.6876 0.1126  False
     1      3    0.575 0.2635 -0.3251 1.4751  False
     2      3   1.3625 0.0028  0.4624 2.2626   True
---------------------------------------------------
###########################

group 因子不同水平的比较结果: Multiple Comparison of Means - Tukey HSD, FWER=0.05
===================================================
group1 group2 meandiff p-adj   lower  upper  reject
---------------------------------------------------
     1      2      0.4 0.2803 -0.3495 1.1495  False
---------------------------------------------------
结果说明: reject=True,说明两组之间有显著性差异。

7 计算效应量Correlation family: η2、ω2 (适用于 Correlational data)

神奇的发现:计算方式不同,但是η^2 = ω^2

# η^2 = (F_A X df_A)/(F_A X df_A +df_e)
yitaG = (2.272 * 1)/(2.272 * 1 + 18)
yitaP = (8.86 * 2)/(8.86 * 2 + 18)
yitaGP = (2.5414 * 2)/(2.5414 * 2 + 18)
print('Group的效应量', yitaG)
print('People的效应量',yitaP)
print('GroupxPeople的效应量',yitaGP)
Group的效应量 0.11207576953433307
People的效应量 0.49608062709966405
GroupxPeople的效应量 0.22019858942589288
# ω^2 = sq_A /(sq_A + sq_e)
oumigaG = 0.96/(0.96 + 7.605)
oumigaP = 7.486/(7.486 + 7.605)
oumigaGP = 2.147/(2.147 + 7.605)
print('Group的效应量', oumigaG)
print('People的效应量',oumigaP)
print('GroupxPeople的效应量',oumigaGP)
Group的效应量 0.11208406304728544
People的效应量 0.49605725266715256
GroupxPeople的效应量 0.22015996718621816

2. 双因素方差分析理论和公式

参考:https://zhuanlan.zhihu.com/p/33357167

3. 效应量分析

参考:https://zhuanlan.zhihu.com/p/137779235

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ELFK集群部署(Filebeat+ELK) 本地收集nginx日志 远程收集多个日志

filebeat是一款轻量级的日志收集工具,可以在非JAVA环境下运行。 因此,filebeat常被用在非JAVAf的服务器上用于替代Logstash,收集日志信息。 实际上,Filebeat几乎可以起到与Logstash相同的作用, 可以将数据转发到Logst…

融资经理简历模板

这份简历内容,以综合柜员招聘需求为背景,我们制作了1份全面、专业且具有参考价值的简历案例,大家可以灵活借鉴。 融资经理简历在线编辑下载:百度幻主简历 求职意向 求职类型:全职 意向岗位:融资经理 …

Python Pyvis库:可视化复杂网络结构的利器

更多Python学习内容:ipengtao.com 大家好,我是涛哥,今天为大家分享 Python Pyvis库:可视化复杂网络结构的利器,全文4000字,阅读大约12钟。 在数据科学和网络分析领域,理解和可视化复杂网络结构是…

JeecgBoot低代码开发—Vue3版前端入门教程

JeecgBoot低代码开发—Vue3版前端入门教程 后端接口配置VUE3 必备知识1.vue3新特性a. https://v3.cn.vuejs.org/b.setup的用法c.ref 和 reactive 的用法d.新版 v-model 的用法e.script setup的用法 2.TypeScript基础 后端接口配置 如何修改后台项目路径 http://127.168.3.52:8…

Ubuntu systemd-analyze命令(系统启动性能分析工具:分析系统启动时间,找出可能导致启动缓慢的原因)

文章目录 Ubuntu systemd-analyze命令剖析目录简介systemd与systemd-analyze工作原理 安装和使用命令参数详解用例与示例显示启动时间(systemd-analyze time)列出启动过程中各个服务的启动时间(systemd-analyze blame)显示系统启动…

R语言单因素方差分析+差异显著字母法标注+逐行详细解释

R语言单因素方差分析 代码如下 df <- read.csv("data.csv",header TRUE,row.names 1) library(reshape2) df <- melt(df,idc()) names(df) <- c(trt, val) df aov1 <- aov(val~trt,datadf) summary(aov1)library(agricolae) data <- LSD.test(aov…

windows远程桌面登录,提示:“出现身份验证错误,要求的函数不受支持”

问题&#xff1a; windows登录远程桌面&#xff0c;提示&#xff1a;“出现身份验证错误&#xff0c;要求的函数不受支持”&#xff0c;如下图&#xff1a; 问题原因&#xff1a; windows系统更新&#xff0c;微软系统补丁的更新将 CredSSP 身份验证协议的默认设置进行了调…

【腾讯云云上实验室-向量数据库】个人对腾讯云向量数据库的体验心得

目录 前言Tencent Cloud VectorDB概念使用初体验腾讯云向量数据库的优势应用场景有哪些&#xff1f;未来展望番外篇&#xff1a;腾讯云向量数据库的设计核心结语 前言 还是那句话&#xff0c;不用多说想必大家都能猜到&#xff0c;现在技术圈最火的是什么&#xff1f;非人工智…

ZZULIOJ 2466: 楼上瞎说,楼下才是,Java

2466: 楼上瞎说&#xff0c;楼下才是 题目描述 《九章算术》的内容十分丰富&#xff0c;全书采用问题集的形式&#xff0c;收有246个与生产、生活实践有联系的应用问题&#xff0c;其中每道题有问&#xff08;题目&#xff09;、答&#xff08;答案&#xff09;、术&#xff…

【Vulnhub 靶场】【DriftingBlues: 9 (final)】【简单】【20210509】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/driftingblues-9-final,695/ 靶场下载&#xff1a;https://download.vulnhub.com/driftingblues/driftingblues9.ova 靶场难度&#xff1a;简单 发布日期&#xff1a;2021年05月09日 文件大小&#xff1a;738 …

编程之外,生活的美好航程

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

涵盖多种功能,龙讯旷腾Module第二期:电子结构及声子计算

Module是什么 在PWmat的基础功能上&#xff0c;我们针对用户的使用需求开发了一些顶层模块&#xff08;Module&#xff09;。这些Module中的一部分是与已有的优秀工具的接口&#xff0c;一部分是以PWmat的计算结果为基础得到实际需要的物理量&#xff0c;一部分则是为特定的计…

Jmeter接口测试:jmeter_HTTP Cookie管理器看这一篇文章就够了

HTTP Cookie管理器 HTTP Cookie管理器可以像浏览器一样自动存储和发送cookie&#xff0c;以这种自 动收集的方式收集到的cookie不会在cookie manager中进行展示&#xff0c;但是运行后&#xff0c; 可以通过 查看结果树&#xff08;监听器&#xff09;可以查看到cookie信息 除…

WPF实战项目十九(客户端):修改RestSharp的引用

修改HttpRestClient&#xff0c;更新RestSharp到110.2.0&#xff0c;因为106版本和110版本的代码不一样&#xff0c;所以需要修改下代码 using Newtonsoft.Json; using RestSharp; using System; using System.Threading.Tasks; using WPFProjectShared;namespace WPFProject.S…

中国毫米波雷达产业分析4——毫米波雷达企业介绍

一、矽典微 &#xff08;一&#xff09;公司简介 矽典微致力于实现射频技术的智能化&#xff0c;专注于研发高性能无线技术相关芯片&#xff0c;产品广泛适用于毫米波传感器、下一代移动通信、卫星通信等无线领域。 整合自身在芯片、系统、软件、算法等领域的专业能力&#xf…

【驱动】SPI驱动分析(四)-关键API解析

关键API 设备树 设备树解析 我们以Firefly 的SPI demo 分析下dts中对spi的描述&#xff1a; /* Firefly SPI demo */ &spi1 {spi_demo: spi-demo00{status "okay";compatible "firefly,rk3399-spi";reg <0x00>;spi-max-frequency <48…

哈希思想的应用:位图、布隆过滤器及哈希切割

一.位图引入 给40定亿个不重复的无符号整数存储在文件中&#xff0c;如何判断一个数在不在其中&#xff1f; 分析&#xff1a;最容易想到的思路是将这些数字存储到某个能够实现快速查找的容器中&#xff0c;如红黑树或哈希表。 但是&#xff0c;10亿个字节大约占1G内存&#x…

使用JDBC操作数据库时,插入数据中文乱码

如图&#xff1a; 解决办法&#xff1a; 修改连接数据库的路径&#xff0c;即url 如下&#xff1a; 设置编码格式为utf-8 urljdbc:mysql://localhost:3306/qfedu?useUnicodetrue&characterEncodingUTF-8再次运行&#xff0c;插入数据即可

python pytorch实现RNN,LSTM,GRU,文本情感分类

python pytorch实现RNN,LSTM&#xff0c;GRU&#xff0c;文本情感分类 数据集格式&#xff1a; 有需要的可以联系我 实现步骤就是&#xff1a; 1.先对句子进行分词并构建词表 2.生成word2id 3.构建模型 4.训练模型 5.测试模型 代码如下&#xff1a; import pandas as pd im…

Linux多线程同步

Linux多线程同步 1、线程同步的概念1.1 为什么要同步1.2 同步方式 2、互斥锁2.1 互斥锁函数2.2 互斥锁使用 3、死锁4、读写锁4.1 读写锁函数4.2 读写锁使用 5、条件变量5.1 条件变量函数5.2 生产者和消费者 6、信号量6.1 信号量函数6.2 生产者和消费者6.3 信号量的使用6.3.1 总…