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

news2025/1/11 12:55:41

多个变量批量进行单因素方差 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 函数将向量中的元素命名为对应的蛋白名称。

在这里插入图片描述

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

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

相关文章

设计模式之单例模式的懒饿汉

懒汉式 说白了就是你不叫我我不动&#xff0c;你叫我我才动。 类初始化模式&#xff0c;也叫延迟占位模式。在单例类的内部由一个私有静态内部类来持有这个单例类的实例。因为在 JVM 中&#xff0c;对类的加载和类初始化&#xff0c;由虚拟机保证线程安全。 public class Singl…

【Proteus仿真】【Arduino单片机】水箱液位监控系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用LCD1602液晶、按键、蜂鸣器、液位传感器、ADC转换器、水泵等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示当前水位、上下限阈…

支持 input 函数的在线 python 运行环境 - 基于队列

支持 input 函数的在线 python 运行环境 - 基于队列 思路两次用户输入三次用户输入 实现前端使用 vue element uiWindows 环境的执行器子进程需要执行的代码 代码仓库参考 本文提供了一种方式来实现支持 input 函数&#xff0c;即支持用户输的在线 python 运行环境。效果如下图…

[NAND Flash 5.2] SLC、MLC、TLC、QLC、PLC NAND_闪存颗粒类型

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 前言 闪存最小物理单位是 Cell, 一个Cell 是一个晶体管。 闪存是通过晶体管储存电子来表示信息的。在晶体管上加入了浮动栅贮存电子…

网络调试 TCP,开发板用静态地址-入门7

用两台电脑&#xff08;无线网络&#xff09;做实验 1.1, 在电脑A上设置为Server如下&#xff1a; 选择TCP Server后&#xff0c;直接跳出用本机IP做为“本地主机地址” 1.2在 电脑B上设置为Client, 远程主机地址设置为Server的 IP 1.3, 在A, B两台电脑上能够互相发送数据 用…

Pyinstaller 打包的文件过大,根本原因在于包含了无用的依赖文件

环境要求&#xff1a;Windows&#xff0c;Pyinstaller 6.3.0 (不是这个版本的话&#xff0c;请逐步校对以下我在运行过程中的截图) 本文所使用代码不开源&#xff0c;觉得本文的思路可行的话&#xff0c;请加 QQ - 1398173074 购买 (&#xffe5;30&#xff0c;注明来意)&…

算力-计算量,关于TOPS和FLOPS,及FLOPs

目录 一、易混淆的三个点 二、芯片算力单位详解 四、模型算力单位详解 五、算力单位量级变换 六、计算机存储单位换算 七、科学计算单位换算 一、易混淆的三个点 关于TOPS和FLOPS&#xff0c;及FLOPs&#xff0c;这里有3个易混淆的点。 1、最大的混淆点&#xff0c…

MybatisPlus—快速入门

目录 1.使用MybatisPlus的基本步骤 1.1引入MybatisPlus的起步依赖 1.2 定义Mapper 2.MybatisPlus常用注解 2.1 TableName 2.2 TableId 2.3 TableField 2.4 小结 3. 常用配置 4. 总结 1.使用MybatisPlus的基本步骤 1.1引入MybatisPlus的起步依赖 MyBatisPlus官方提…

(04)刻蚀——选择刻蚀材料创建所需图形

01、光“堆叠”可不行 前期我们了解了如何制作“饼干模具”。本期,我们就来讲讲如何采用这个“饼干模具”印出我们想要的“饼干”。这一步骤的重点,在于如何移除不需要的材料,即“刻蚀(Etching)工艺”。 ▲ 图1: 移除饼干中间部分,再倒入巧克力糖浆 让我们再来回想一下…

im6ull学习总结(三-3)freetype

1、Freetype简介 FreeType是一个开源的字体渲染引擎&#xff0c;主要用于将字体文件转换为位图或矢量图形&#xff0c;并在屏幕上渲染出高质量的字体。它提供了一组API&#xff0c;使开发者能够在自己的应用程序中使用和呈现字体。 FreeType最初是作为一个独立项目开发的&…

基于X86的助力智慧船载监控系统

船载综合监控系统结合雷达、AIS、CCTV、GPS等探测技术&#xff0c;以及高度融合的实时态势与认知技术&#xff0c;实现对本船以及范围内船舶的有效监控&#xff0c;延伸岸基监控中心监管范围&#xff0c;保障行船安全&#xff0c;为船舶安全管理部门实现岸基可控的数据通信和动…

程序员必知!责任链模式的实战应用与案例分析

责任链模式让多个对象依次处理请求&#xff0c;降低发送者和接收者的耦合度&#xff0c;以在线购物为例&#xff0c;用户提交订单需经多步验证&#xff0c;通过责任链模式&#xff0c;验证器按顺序处理请求&#xff0c;先用户身份&#xff0c;再支付方式&#xff0c;最后配送地…

odoo16 连接postgresql错误

odoo16 连接postgresql错误 odoo16 用odoo15的环境出错&#xff0c;看到是psycopg2.OperationalError分析是postgresql版本问题&#xff0c;安装了13版本&#xff0c;还是出错&#xff0c;多版本共存问题如下&#xff1a; Traceback (most recent call last):File "D:\o…

@JsonFormat与@DateTimeFormat

JsonFormat注解很好的解决了后端传给前端的格式&#xff0c;我们通过使用 JsonFormat可以很好的解决&#xff1a;后台到前台时间格式保持一致的问题 其次&#xff0c;另一个问题是&#xff0c;我们在使用WEB服务的时&#xff0c;可 能会需要用到&#xff0c;传入时间给后台&am…

书生·浦语大模型实战营第一次课堂笔记

书生浦语大模型全链路开源体系。大模型是发展通用人工智能的重要途径,是人工通用人工智能的一个重要途径。书生浦语大模型覆盖轻量级、重量级、重量级的三种不同大小模型,可用于智能客服、个人助手等领域。还介绍了书生浦语大模型的性能在多个数据集上全面超过了相似量级或相近…

算法训练第六十天|84.柱状图中最大的矩形

84.柱状图中最大的矩形&#xff1a; 题目链接 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 : 输入&#xff1a;heights [2,1,5,6,2,3] 输出…

基于JavaWeb+SSM+Vue家政项目微信小程序系统的设计和实现

基于JavaWebSSMVue家政项目微信小程序系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关技术 2…

Mathtype7.4安装与嵌入WPS

文章目录 Mathtype安装教程&#xff08;7.4&#xff09;Mathtype简介Mathtype下载安装软件下载软件安装运行MathType.exe运行注册表 Mathtype嵌入wps Mathtype安装教程&#xff08;7.4&#xff09; Mathtype简介 MathType是一款强大的数学公式编辑器&#xff0c;适用于教育教…

【大数据实验系列】一文轻松搞定云服务器Centos8.x下安装MySQL5.x版本,以阿里云服务器为例!(超详细安装流程)

1. 文章主要内容 本篇博客主要涉及云服务器(以阿里云服务器为例子)Centos8.x下安装MySQL软件。&#xff08;通读本篇博客需要10分钟左右的时间&#xff09;。 本篇博客内容参考于&#xff1a;centOS8安装MySql5.7 2. 详细安装教程 2.1 MySQL rpm源包下载 我们首先点击…