R 批量对多个变量进行单因素方差分析 批量计算均值±标准差

多个变量批量进行单因素方差 R实现

文章目录

  • 一、批量生成均值±标准差 P值
  • 二、添加协变量单因素方差分析,生成校正P值
  • 三、在分层情况下进行单因素方差分析
  • 四、添加协变量和交互项的单因素方差分析,生成交互项的P值


一、批量生成均值±标准差 P值

数据结构如下,1-54列变量为欲分析的连续变量,tert为分组变量,此外还包括如age,BMI等可能用到的协变量。

数据已经过处理,无缺失值
在这里插入图片描述

步骤如下:

  1. .使用 lapply 函数对数据框 df2 的前 54 列进行循环处理。每次迭代都执行一次方差分析,其中自变量为 x,因变量为 df2$tert,并将结果存储在 results 列表中。
  2. 使用 sapply 函数对 results 列表中的每个方差分析结果进行循环处理,提取出每个分析结果的 p 值,并将这些 p 值存储在 p_values 向量中
  3. 使用 aggregate 函数对 df2 的前 54 列进行聚合操作,按照 tert 列的值分组,并计算每个组的均值,将结果存储在 means 数据框中。同样计算每个组的标准差,将结果存储在 sds 数据框中。
  4. results_df <- data.frame(var = colnames(df2[,1:54]), low_mean_sd = NA, medium_mean_sd = NA, high_mean_sd = NA, p_value = round(p_values, 3)):创建一个新的数据框 results_df,其中包含了变量名、低、中、高三个分组的均值和标准差,以及方差分析的 p 值。初始时,这些列都被设置为 NA,而 p_values 向量经过取小数点后三位后被赋值给 p_value 列。
  5. results_df l o w m e a n s d < − p a s t e 0 ( r o u n d ( m e a n s [ m e a n s low_mean_sd <- paste0(round(means[means lowmeansd<paste0(round(means[meansGroup.1 == “low”, -1], 2), " ± ", round(sds[sds G r o u p . 1 = = " l o w " , − 1 ] , 2 ) ) :使用 p a s t e 0 函数将低分组的均值和标准差合并为一个字符串,并赋值给 r e s u l t s d f 的 l o w m e a n s d 列。 r o u n d 函数用于将均值和标准差保留两位小数。类似地, r e s u l t s d f Group.1 == "low", -1], 2)):使用 paste0 函数将低分组的均值和标准差合并为一个字符串,并赋值给 results_df 的 low_mean_sd 列。round 函数用于将均值和标准差保留两位小数。类似地,results_df Group.1=="low",1],2)):使用paste0函数将低分组的均值和标准差合并为一个字符串,并赋值给resultsdflowmeansd列。round函数用于将均值和标准差保留两位小数。类似地,resultsdfmedium_mean_sd 和 results_df$high_mean_sd 列也被赋值为中分组和高分组的均值与标准差的合并字符串。
# 进行方差分析
results <- lapply(df2[,1:54], function(x) {
  aov(x ~ df2$tert)
})

# 提取 P 值
p_values <- sapply(results, function(x) {
  summary(x)[[1]][["Pr(>F)"]][1]
})

# 计算均值和标准差
means <- aggregate(df2[,1:54],, by=list(df2$tert), FUN=mean)
sds <- aggregate(df2[,1:54],, by=list(df2$tert), FUN=sd)

# 创建一个新的数据框来存储结果
results_df <- data.frame(var = colnames(df2[,1:54]), low_mean_sd = NA, medium_mean_sd = NA, high_mean_sd = NA, p_value = round(p_values, 3))

# 计算均值±标准差
results_df$low_mean_sd <- paste0(round(means[means$Group.1 == "low", -1], 2), " ± ", round(sds[sds$Group.1 == "low", -1], 2))
results_df$medium_mean_sd <- paste0(round(means[means$Group.1 == "medium", -1], 2), " ± ", round(sds[sds$Group.1 == "medium", -1], 2))
results_df$high_mean_sd <- paste0(round(means[means$Group.1 == "high", -1], 2), " ± ", round(sds[sds$Group.1 == "high", -1], 2))

# 查看结果
head(results_df)

在这里插入图片描述

二、添加协变量单因素方差分析,生成校正P值

代码如下:

##########################ancova adjust covariate
# 进行方差分析
results <- lapply(df2[,1:54], function(x) {
  aov(x ~ df2$tert + df2$BMI+df2$Age+df2$nrace+df2$PAL+df2$calor+df2$allergy+df2$Asthma+df2$CRP)
})

# 提取 P 值
p_values <- sapply(results, function(x) {
  summary(x)[[1]][["Pr(>F)"]][1]
})
resultssummary <- cbind(results_df,round(p_values, 3))
colnames(resultssummary)[5:6] <- c("p_values", "adjust_p_values")
write.csv(resultssummary, file = "resultssummary.csv", row.names = FALSE)

在这里插入图片描述

三、在分层情况下进行单因素方差分析

如果在另一分层因素aoc1(L\M\H)情况下进行单因素方差分析

#整理数据
long_df <- df2 %>%
  pivot_longer(cols = starts_with("prot_"), names_to = "protein", values_to = "value")

在这里插入图片描述

result <- long_df %>%
  group_by(aoc1, tert, protein) %>%
  summarize(mean = mean(value), sd = sd(value)) %>%
  mutate(mean_sd = paste0(round(mean, 2), "±", round(sd, 2))) %>%
  select(-mean, -sd) %>%
  pivot_wider(names_from = c(aoc1, tert), values_from = mean_sd)

anova_results <- long_df %>% 
  group_by(protein,aoc1) %>% 
  do(tidy(aov(value ~ tert,data=.))) %>% 
  filter(term == "tert") %>% 
  select(protein,aoc1,p.value) %>% 
  spread(key=aoc1,value=p.value)%>%
  mutate(across(where(is.numeric), round, digits = 3))

final_result <- left_join(result,anova_results)

步骤如下:

  1. .对 long_df 数据框进行分组操作,按照 “aoc1”、“tert” 和 “protein” 进行分组,然后计算每个组别的均值和标准差,并将均值和标准差合并为一个字符串,并将结果保存在 “mean_sd” 列中。接着,移除 “mean” 和 “sd” 列,然后使用 pivot_wider 函数将数据重新转换,将 “aoc1” 和 “tert” 的组合作为列名,“mean_sd” 列的值作为对应的值。
    在这里插入图片描述
  1. 对 long_df 数据框进行分组操作,按照 “protein” 和 “aoc1” 进行分组,然后使用 tidy(aov(value ~ tert,data=.)) 函数计算方差分析,并将结果转换为长格式。接着,筛选出 “term” 列为 “tert” 的行,并选择 “protein”、“aoc1” 和 “p.value” 列。使用 spread 函数将 “aoc1” 的值作为列名,“p.value” 的值作为对应的值进行展开。最后,使用 mutate 函数将所有数值型列的值保留三位小数。
    在这里插入图片描述

3.使用 left_join 函数将 result 数据框和 anova_results 数据框进行左连接,将它们基于共同的列进行合并,并将结果保存在 final_result 中。
在这里插入图片描述

四、添加协变量和交互项的单因素方差分析,生成交互项的P值

计算交互项的 P 值是通过使用 anova 函数计算模型之间的 F 检验来实现的。

在R代码中,anova 函数被用于比较两个线性回归模型的拟合优度,并返回模型之间的方差分析表。通过提取方差分析表中的 P 值,可以得到模型之间的 F 检验的 P 值。

具体来说,对于每对模型(一个包含交互项,一个不包含交互项),anova 函数返回一个方差分析表,其中包含了模型之间的 F 统计量和对应的 P 值。通过计算并获得交互项的 P 值,可以评估交互项对于模型的统计显著性。

######################interaction gene*tert
#创建交互项
df2$aoc1_tert <- interaction(df2$aoc1, df2$tert)
#从 df2 数据框中选择前54列作为蛋白数据,并将结果保存在 proteins 变量中
proteins <- df2[, 1:54]
f_test <- function(model1, model2) {
  anova(model1, model2)$"Pr(>F)"[2]
}

# 对每个蛋白,分别建立有交互项和无交互项的模型,并用f_test函数比较它们

pvalues <- lapply(proteins, function(x) {
  
  model1 <- lm(x ~ aoc1_tert + BMI+Age+nrace+PAL+calor+allergy+Asthma+CRP, data = df2)
  
  model2 <- lm(x ~ aoc1 + tert + BMI+Age+nrace+PAL+calor+allergy+Asthma+CRP, data = df2)
  
  f_test(model1, model2)
  
})

# 将pvalues转换为一个向量,并给它命名为proteins
pvalues <- unlist(pvalues)
names(pvalues) <- colnames(proteins)

# 创建一个数据框,包含蛋白名称、交互项名称、交互项P值
output <- data.frame(protein = names(pvalues), interaction = "aoc1_tert", pvalue = pvalues)%>%
  mutate(across(where(is.numeric), round, digits = 3))

上述代码思路如下:

  1. .首先,对于每个蛋白数据,使用 lm 函数建立两个线性回归模型:

模型 1:x ~ aoc1_tert + BMI + Age + nrace + PAL + calor + allergy + Asthma + CRP
模型 2:x ~ aoc1 + tert + BMI + Age + nrace + PAL + calor + allergy + Asthma + CRP。
其中 x 是当前蛋白数据,aoc1_tert 是交互项,aoc1 和 tert 是原始变量,其余是控制变量。

  1. 定义一个函数 f_test,该函数接受两个模型作为输入,并使用 anova 函数计算模型之间的 F 检验值。然后,提取出 F 检验的 P 值。
  2. 使用 lapply 函数迭代处理每个蛋白数据,并对每个蛋白数据执行以下操作:在模型 1 和模型 2 上调用 f_test 函数,得到交互项的 P 值;将 P 值保存在一个列表中。
  3. 通过 unlist 函数将列表转换为向量,并使用 names 函数将向量中的元素命名为对应的蛋白名称。

在这里插入图片描述

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

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

相关文章

pyfolio工具结合backtrader分析量化策略组合,附源码+问题分析

pyfolio可以分析backtrader的策略&#xff0c;并生成一系列好看的图表&#xff0c;但是由于pyfolio直接install的稳定版有缺陷&#xff0c;开发版也存在诸多问题&#xff0c;使用的依赖版本都偏低&#xff0c;试用了一下之后还是更推荐quantstats。 1、安装依赖 pip install …

【STM32】STM32学习笔记-TIM输出比较(15)

00. 目录 文章目录 00. 目录01. 输出比较简介02. PWM简介03. 输出比较通道(高级)04. 输出比较通道(通用)05. 输出比较模式06. PWM基本结构07. PWM参数计算08. 舵机简介09. 舵机硬件电路10. 直流电机及驱动简介11. 直流电机硬件电路12. 附录 01. 输出比较简介 OC&#xff08;Ou…

ASP.NET可视化流程设计器源码

源码介绍: ASP.NET可视化流程设计器源码已应用于众多大型企事业单位。拥有全浏览器兼容的可视化流程设计器、表单设计器、基于角色的权限管理等系统开发必须功能&#xff0c;大大为您节省开发时间&#xff0c;是您开发OA.CRM、HR等企事业各种应用管理系统和工作流系统的最佳基…

Redis高级特性和应用(慢查询、Pipeline、事务、Lua)

Redis的慢查询 许多存储系统(例如 MySQL)提供慢查询日志帮助开发和运维人员定位系统存在的慢操作。所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录下来,Redis也提供了类似…

【开源】基于JAVA语言的服装店库存管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 服装档案模块2.4 服装入库模块2.5 服装出库模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 服装档案表3.2.3 服装入库表3.2.4 服装出库表 四、系统展示五、核心代码5.…

梦想家内容管理系统(Dreamer CMS)跨站请求伪造漏洞

梦想家内容管理系统&#xff08;Dreamer CMS&#xff09;跨站请求伪造漏洞 目标:GitHub - iteachyou-wjn/dreamer_cms: Dreamer CMS 梦想家内容发布系统采用流行的SpringBoot搭建&#xff0c;支持静态化、标签化建站。不需要专业的后台开发技能&#xff0c;会HTML就能建站&…

java数据结构与算法刷题-----LeetCode63. 不同路径 II

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -后端鉴权拦截器实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

【GitHub】-design-pattern-extend(设计模式扩展)

写在前面 偶然间看到一篇文章 《Java 中保持扩展性的几种套路和实现》&#xff0c;写的不错&#xff0c;但是类图画的差了点儿意思。于是&#xff0c;自己动手画了画&#xff0c;对其中的内容作了一些调整&#xff0c;对包做了进一步划分&#xff0c;便于理解消化。以下是对Git…

C++ Qt开发:Charts与数据库组件联动

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍Charts组件与QSql数据库组件的常用方法及灵活…

【STM32】STM32学习笔记-定时器定时中断 定时器外部时钟(14)

00. 目录 文章目录 00. 目录01. 定时器中断相关API1.1 TIM_InternalClockConfig1.2 TIM_TimeBaseInit1.3 TIM_TimeBaseInitTypeDef1.4 TIM_ClearFlag1.5 TIM_ITConfig1.6 TIM_Cmd1.7 中断服务函数1.8 TIM_ETRClockMode2Config 02. 定时器定时中断接线图03. 定时器定时中断示例0…

嵌入式项目——平衡小车(1)

焊接 驱动板需要焊接的如上图。 陀螺仪8pin排母电机两路排线插口。(个别同学需要焊接)两个电池仓,注意电池仓分正反。 安装 底部电池板 4个 双通尼龙柱M3*224个 尼龙螺钉M3*6电机驱动板

个人笔记:分布式大数据技术原理(二)构建在 Hadoop 框架之上的 Hive 与 Impala

有了 MapReduce&#xff0c;Tez 和 Spark 之后&#xff0c;程序员发现&#xff0c;MapReduce 的程序写起来真麻烦。他们希望简化这个过程。这就好比你有了汇编语言&#xff0c;虽然你几乎什么都能干了&#xff0c;但是你还是觉得繁琐。你希望有个更高层更抽象的语言层来描述算法…

Java数组:一维数组、二维数组、Arrays

文章目录 1、一维数组1.1 数组概念1.2 数组的声明1.3 数组的静态初始化1.4 数组的动态初始化1.5 地址值1.6 数组元素访问1.7 索引1.8 数组的遍历1.9 数组两种初始化方式的区别 2、二维数组2.1 二维数组的声明2.2 二维数组的静态初始化2.3 二维数组的动态初始化2.4 二维数组的遍…

扩散模型: Diffusion Model概念讲解

Diffusion Model 课件视频前向扩散过程 在原始图像中逐步添加高斯分布随机噪声,直到最后得到完全噪声的图像。 反向降噪过程 逐步去除噪声图中的噪声,得到最后原图。 根据噪声图和时间步得到预测的噪声,然后噪声图减去噪声得到原始图 噪声预测的标签来自于前向扩散过程中添加…

TSINGSEE青犀智能分析网关V4在智慧园区车辆违停检测场景中的应用

一、背景与需求 园区作为企业办公、生产制造的重要场所&#xff0c;主要道路车辆违停等违规行为会对园区的安全造成隐患&#xff0c;并且在上下班高峰期内&#xff0c;由于发现不及时&#xff0c;车辆违停行为会造成出入口拥堵现象&#xff0c;这也成为园区管理的棘手问题。为了…

胡圆圆的暑期实习经验分享

背景 实验室一般是在研究生二年级的时候会放实习&#xff0c;在以后的日子就是自己完成毕业工作要求&#xff0c;基本上不再涉及实验室的活了&#xff0c;目前是一月份也是开始准备暑期实习的好时间。实验室每年这个时候都会有学长学姐组织暑期实习经验分享&#xff0c;本着不…

uniappVue3版本中组件生命周期和页面生命周期的详细介绍

一、什么是生命周期&#xff1f; 生命周期有多重叫法&#xff0c;有叫生命周期函数的&#xff0c;也有叫生命周期钩子的&#xff0c;还有钩子函数的&#xff0c;其实都是代表&#xff0c;在 Vue 实例创建、更新和销毁的不同阶段触发的一组钩子函数&#xff0c;这些生命周期函数…

STM32F407-14.3.10-表73具有有断路功能的互补通道OCx和OCxN的输出控制位-00x00-11x11(总结)

如上表73所示&#xff0c;主输出使能&#xff08;MOE0&#xff09;的8种OCx与OCxN的输出状态及波形图&#xff0c;已经单独整理输出8篇文章&#xff0c;方便需要时单独回查。 根据表73可得以下结论 1、从00x00~01x00的前5种状态的OCx与OCxN的引脚电平全由GPIO端口的上下拉决定…

Java序列化篇----第一篇

系列文章目录 文章目录 系列文章目录前言一、什么是java序列化,如何实现java序列化?二、保存(持久化)对象及其状态到内存或者磁盘三、序列化对象以字节数组保持-静态成员不保存四、序列化用户远程对象传输前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,…