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 函数将向量中的元素命名为对应的蛋白名称。

在这里插入图片描述

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

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

相关文章

Android AAudio

文章目录 基本概念启用流程基本流程HAL层对接数据流计时模型调试 基本概念 AAudio 是 Android 8.0 版本中引入的一种音频 API。 AAudio 提供了一个低延迟数据路径。在 EXCLUSIVE 模式下&#xff0c;使用该功能可将客户端应用代码直接写入与 ALSA 驱动程序共享的内存映射缓冲区…

数字图像处理(图像灰度变换、图像直方图及均衡、图像中值滤波、图像空域锐化增强、图像频域滤波)

数字图像处理&#xff08;图像灰度变换、图像直方图及均衡、图像中值滤波、图像空域锐化增强、图像频域滤波&#xff09; 目录 1 图像灰度变换 1.1 灰度线性变换 1.2 图像二值化 1.3 负象变换 1.4 灰度非线性变换 1.5 程序设计流程图 2 图像直方图及均衡 2.1 直方图 2…

Linux 服务器磁盘满了怎么办?详细清理大文件指南

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

Agilent安捷伦E4407B频谱分析仪26.5GHz

E4407B是安捷伦ESA-E系列频谱分析仪&#xff0c;它是一款能够适应未来需要的中性能频谱分析仪解决方案。该系列在测量速度、动态范围、精度和功率分辨能力上&#xff0c;都为类似价位的产品建立了性能标准。其灵活的平台设计使得研发、制造和现场服务工程师能够自定义产品&…

特征工程筛选重要变量

特征筛选主要分为3个方法&#xff1a;过滤法、嵌入法&#xff08;经典的一些树模型比如xgboost&#xff09;、包裹法&#xff08;经典的RFECV&#xff0c;RFE递归特征消除法&#xff09; 过滤法更快速&#xff0c;但更粗糙。 包装法和嵌入法更精确&#xff0c;比较适合具体到算…

【代码随想录】刷题笔记Day46

前言 刚考完自辩&#xff0c;Chat回答举例什么的真方便。早上做组会PPT去了&#xff0c;火速来刷题&#xff01; 139. 单词拆分 - 力扣&#xff08;LeetCode&#xff09; 单词是物品&#xff0c;字符串s是背包&#xff0c;单词能否组成字符串s&#xff0c;就是问物品能不能把…

SpringBoot学习(五)-Spring Security配置与应用

注&#xff1a;此为笔者学习狂神说SpringBoot的笔记&#xff0c;其中包含个人的笔记和理解&#xff0c;仅做学习笔记之用&#xff0c;更多详细资讯请出门左拐B站&#xff1a;狂神说!!! Spring Security Spring Security是一个基于Java的开源框架&#xff0c;用于在Java应用程…

【深度学习】cv领域中各种loss损失介绍

文章目录 前言一、均方误差二、交叉熵损失三、二元交叉熵损失四、Smooth L1 Loss五、IOU系列的loss 前言 损失函数是度量模型的预测输出与真实标签之间的差异或误差&#xff0c;在深度学习算法中起着重要作用。具体作用&#xff1a; 1、目标优化&#xff1a;损失函数是优化算法…

文件归类妙招:用关键字替换改扩展名方法,文件重命名技巧

在日常工作中&#xff0c;文件的数量会随着时间的推移不断增加。如果文件没有得到适当的归类和整理&#xff0c;就会导致很难找到所需的文件。所以文件归类是非常重要的任务。现在来看云炫文件管理器一些实用的文件归类妙招&#xff1a;用关键字替换修改文件扩展名的方法&#…

Kubernetes复习总结(二):Kubernetes容器网络

2、Kubernetes容器网络 1&#xff09;、Docker网络原理 Docker默认使用的网络模型是bridge&#xff0c;这里只讲bridge网络模型 1&#xff09;容器之间通信原理 当安装完docker之后&#xff0c;docker会在宿主机上创建一个名叫docker0的网桥&#xff0c;默认IP是172.17.0.1…

AI动作冒险电影《加勒比海盗:失落的宝藏》(下)

AI动作冒险电影《加勒比海盗&#xff1a;失落的宝藏》&#xff08;下&#xff09; 在宝藏岛屿的探险中&#xff0c;杰克船长不断遭遇铁钩胡克的追击&#xff0c;并陷入了一系列生死危机中。然而&#xff0c;当杰克终于找到宝藏所在的洞穴时&#xff0c;却发现了一个令人震惊的事…

HarmonyOS 开发基础(五)Button

HarmonyOS 开发基础&#xff08;五&#xff09;Button Entry Component struct Index {build() {Row() {Column() {// Button&#xff1a;ArkUI 的基础组件 按钮组件// label 参数&#xff1a;文字型按钮Button(我是按钮)// width&#xff1a;属性方法&#xff0c;设置组件的宽…

shell编程-分支语句和循环结构

流控制: •在一个shell脚本中的命令执行顺序称作脚本的流。大多数脚本会根据一个或多个条件来改变它们的流。 •流控制命令:能让脚本的流根据条件而改变的命令称为条件流控制命令 •exit语句:退出程序的执行&#xff0c;并返回一个返回码&#xff0c;返回码为0正常退出&#…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)在EventLoop中处理被激活的文件描述符的事件

文件描述符处理与回调函数 一、主要概念 反应堆模型&#xff1a;一种处理系统事件或网络事件的模型&#xff0c;当文件描述符被激活时&#xff0c;可以检测到文件描述符&#xff1a;在操作系统中&#xff0c;用于标识打开的文件、套接字等的一种数据类型 处理激活的文件描述符…

BUUCTF--pwnable_start1

查看保护&#xff1a; 32位程序保护全没开&#xff0c;黑盒测试下效果&#xff1a; 存在栈溢出&#xff0c;那么这题的想法就是直接ret2shellcode了。IDA中看看具体流程&#xff1a; 出奇的少&#xff0c;这题不能看反汇编的代码&#xff0c;直接去看汇编&#xff1a; 主要就2个…

【设计模式之美】面向对象分析方法论与实现(一):需求分析方法论

文章目录 一. 需求举例二. 对案例进行需求分析1. 第一轮基础分析2. 第二轮分析优化3. 第三轮分析优化4. 第四轮分析优化5. 最终确定需求 三. 小结 本文主要描述&#xff1a; 面向对象的需求分析方法论 一. 需求举例 假设&#xff0c;你正在参与开发一个微服务。微服务通过 HTT…

msvcr120.dll丢失怎样修复,三种修复msvcr120.dll丢失的方法

"msvcr120.dll"是一个重要的库文件&#xff0c;用于支持Microsoft Visual C 2013 Redistributable软件包中的应用程序。在本文中&#xff0c;我们将介绍"msvcr120.dll"文件的重要性和作用&#xff0c;并探讨当msvcr120.dll丢失怎样修复的办法。以及msvcr12…

Python基础教程——90行Python代码让微信地球转起来!!(完整版,附源码)

今天我们来一个好玩儿的东西&#xff0c;使用90行Python代码就可以让【微信第地球】转起来&#xff0c;太有意思啦&#xff01; 1.微信地球 手机重启后打开微信的一瞬间&#xff0c;会看到一幅有名的图片&#xff0c;上面站着一个张小龙。 你可曾想过这样一个问题&#xff0c…

走向云原生 破局数字化

近年来&#xff0c;随着云计算概念和技术的普及&#xff0c;云原生一词也越来越热门&#xff0c;云原生成为云计算领域的新变量。行业内&#xff0c;华为、阿里巴巴、字节跳动等各个大厂都在“抢滩”云原生市场。行业外&#xff0c;云原生也逐渐出圈&#xff0c;出现在大众视野…

GUI设计基础

层次结构 要学GUI&#xff0c;大概先知道它的层次结构&#xff0c;如下图所示&#xff0c;我们要设计的就是下面这个几个东西。 菜单uimenu 建立一级菜单项的函数调用格式&#xff1a; hmuimenu(h_parent,PropertyNamel,valuel,propertyName2,value2&#xff0c;...); hm 是…