首页 > 其他分享 >R:PCA(第二版)

R:PCA(第二版)

时间:2024-01-25 16:57:24浏览次数:26  
标签:rename dplyr PC2 第二 PC1 library PCA

rm (list = ls ()) 
library(vegan) 
library(tidyverse) 
library(ggalt) 
library(car)
library(ggforce)
library(ggpubr)
library(patchwork) 

# 2. 定义所需的函数。
pairwise.adonis1 <- function(x, factors, p.adjust.m) { #定义了一个名为pairwise.adonis1的函数,该函数接受三个参数:x,factors和p.adjust.m
  x = as.matrix(x)
  co = as.matrix(combn(unique(factors), 2))
  pairs <- F.Model <- R2 <- p.value <- c()
  for (elem in 1:ncol(co)) { 
    ad = adonis(x[factors %in% c(as.character(co[1, elem]), as.character(co[2, elem])), 
                  factors %in% c(as.character(co[1, elem]), as.character(co[2, elem]))] ~ 
                  factors[factors %in% c(as.character(co[1, elem]), as.character(co[2, elem]))], permutations = 999) 
    pairs <- c(pairs, paste(co[1, elem], 'vs', co[2, elem])) 
    F.Model <- c(F.Model, ad$aov.tab[1, 4]) 
    R2 <- c(R2, ad$aov.tab[1, 5]) 
    p.value <- c(p.value, ad$aov.tab[1, 6]) 
  }
  
  # p值调整
  p.adjusted = p.adjust(p.value, method = p.adjust.m) 
  pairw.res = data.frame(pairs, F.Model, R2, p.value, p.adjusted) 
  return(pairw.res)
}

# 3. 读取和处理数据。
setwd("C:\\Users\\Administrator\\Desktop\\新建文件夹\\PCA_Pathway") 
otu <- read.table("./Path_table_R.txt", row.names = 1, sep = "\t", header = TRUE) %>% as.data.frame()
map <- read.table("./group.txt", sep = "\t", header = TRUE) 
colnames(map)[1] <- "ID" 
row.names(map) <- map$ID 
idx <- rownames(map) %in% colnames(otu) 
map1 <- map[idx,]
otu <- otu[, rownames(map1)]

# 4. 进行adonis分析并计算统计值。
bray_curtis <- vegan::vegdist(t(otu), method = "bray", na.rm = TRUE)
ado <- adonis(bray_curtis ~ map1$Group, permutations = 999, method = "bray") #进行了Adonis分析。
R2_value <- round(as.data.frame(ado$aov.tab[5])[1, 1], 3)
p_v_value <- as.data.frame(ado$aov.tab[6])[1, 1]
title <- paste("Adonis:R^2 = ", R2_value, " P_value = ", p_v_value, sep = "")

# 5. 绘制PCA图。
otu_centered <- scale(t(otu), scale = FALSE) # 对数据进行中心化处理
#otu_standardized <- scale(t(otu), scale = TRUE) # 对数据进行标准化处理
pca <- prcomp(otu_centered) # 使用prcomp函数进行了主成分分析(PCA)
#pca <- prcomp(t(otu)) # 使用prcomp函数进行了主成分分析(PCA)
summary_pca <- summary(pca) # 获取PCA的详细结果
points <- as.data.frame(pca$x) %>% dplyr::rename(x = "PC1", y = "PC2") # 将PCA的结果转换为数据框,并重命名了列名.
# pca$x是PCA结果中的坐标,dplyr::rename(x = "PC1", y = "PC2")将列名"PC1"和"PC2"改为"x"和"y"。
eig <- pca$eig
points <- cbind(points, map1[match(rownames(points), map1$ID),]) # 将map1数据框中的元数据添加到了PCA的结果中。

n <- 0.85
colors <- c("B73_DAS28"="#8FC9E2","B73_DAS42"="#8FC9E2","B73_DAS56"="#8FC9E2","B73_DAS70"="#8FC9E2","Mo17_DAS28"="#ECC97F","Mo17_DAS42"="#ECC97F","Mo17_DAS56"="#ECC97F","Mo17_DAS70"="#ECC97F")
# 定义了颜色和形状的映射关系,用于后续的可视化。
shapes <- c("B73_DAS28"=24, "B73_DAS42"=22, "B73_DAS56"=21, "B73_DAS70"=23, 
            "Mo17_DAS28"=24, "Mo17_DAS42"=22, "Mo17_DAS56"=21, "Mo17_DAS70"=23)
levels_order <- c("B73_DAS28", "B73_DAS42", "B73_DAS56", "B73_DAS70", "Mo17_DAS28", "Mo17_DAS42", "Mo17_DAS56", "Mo17_DAS70") #定义顺序
points$Group <- factor(points$Group, levels = levels_order)
# 在ggplot中使用这些形状
p1 <- ggplot(points, aes(x = x, y = y, fill = Group, shape = Group)) + 
  geom_point(alpha = .7, size = 6) + 
  scale_shape_manual(values = shapes) + 
  scale_fill_manual(values = colors) +
  labs(x = paste("PC1 (", format(summary_pca$importance[2, 1] * 100, digits = 4), "%)", sep = ""),
       y = paste("PC2 (", format(summary_pca$importance[2, 2] * 100, digits = 4), "%)", sep = ""), title = title) +
  geom_mark_ellipse(aes(fill = Group, label = Group), alpha = 0.1, color = "grey", linetype = 3) +
  theme_bw() +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.text = element_text(color = "black", size = 9),
        axis.title = element_text(size = 20), # 改变坐标轴标题的大小
        legend.text = element_text(size = 14), # 改变图例文字的大小
        legend.key.size = unit(1, "cm")) +# 改变图例图形的大小
  coord_cartesian(xlim = c(-max(abs(points$x)) * 1.1, max(abs(points$x)) * 1.1), ylim = c(-max(abs(points$y)) * 1.1, max(abs(points$y)) * 1.1)) + # 改变x轴和y轴的范围
  geom_vline(xintercept = 0, linetype = "dashed", color = "black") + # 添加垂直虚线
  geom_hline(yintercept = 0, linetype = "dashed", color = "black") # 添加水平虚线

# 显示绘制的图
p1
# 6. 输出pairwise adonis结果。
pair_bray_adonis <- pairwise.adonis1(bray_curtis, map1$Group, p.adjust.m = "bonferroni") #进行了成对的Adonis分析
# 存储为文本文件
write.table(as.data.frame(pair_bray_adonis), "table.txt", sep = "\t", quote = FALSE, row.names = FALSE) #将Adonis分析的结果保存为了一个文本文件。
tab2 <- ggtexttable(pair_bray_adonis, rows = NULL)
p2 <- tab2
p2
ggsave(filename = "PCA_plot3.png", plot = p1, width = 12, height = 10, units = "in", dpi = 600)

 

标签:rename,dplyr,PC2,第二,PC1,library,PCA
From: https://www.cnblogs.com/wzbzk/p/17987513

相关文章

  • 第二天
    常用的dos命令#打开cmdwin+r#同盘符切换目录cd+目录位置#不同盘符切换cd+/d+位置#查看当前文件夹目录dir#清屏cls#新建文件夹md#新建文件cd>文件名#删除文件del文件名#查看本机ipipconfig#查看网站信息ping+网站#返回上一级cd..#退出exit......
  • 某省信息安全管理与评估第二阶段应急响应
    别人发我的题目,!!工作任务第一部分网络安全事件响应任务1:应急响应A集团的WebServer服务器被黑客入侵,该服务器的应用系统被上传恶意软件,重要文件被破坏,作为一个信息安全工程师需要针对企业发生的网络安全事件启动应急响应,根据企业提供的环境信息进行数据取证调查,调查服务器被黑......
  • 人工智能 第三版 第二章笔记
    人工智能第三版第二章笔记空间状态图状态空间图(state-spacegraph)是对问题的一种表示方法。其中有两种特殊类型的节点。其中一种是表示问题起始状态(startstate)的起始节点(startnode)。另一种特殊类型的节点对应于问题的终点或终止状态。问题的状态空间树包含了问题可能出现......
  • 第二篇博客(依旧摆烂)
    2024.1.23哦豁,恍惚间又过了一个月,依旧没有动笔(悲!!!);自放假以来一直在oi里埋头苦读;然而Lyn学长讲的dp是一点也不会,状态转移方程到底是什么鬼东西啊!!!(写不了一点);极度怀疑gg说的精兵强将是否属实(只对本人来说);!!!;啊啊啊啊啊啊啊啊啊啊啊!!!!(发疯ing);果然依旧是蒟蒻oier;希望能成......
  • Leetcode刷题第二天-贪心
    655:非递减数列链接:665.非递减数列-力扣(LeetCode)直接找最大最小值进行替换不行,[1,5,4,6,7,8,9]最大最小值所处位置可能是非递减数列如果nums[i]>nums[i+1],当前这俩个数递减,修改谁,记录前一个数,比较前一个数和当前数的大小,前一个数大,小变大,后一个数大,大变小统计次数,出现两次......
  • AI驱动下的算力浪潮,中国稳居全球第二
    AI大模型的发展引发了对算力的进一步需求。中国信通院发布的《中国综合算力指数(2023年)》显示,当前算力规模中,通用算力占比达74%,智能算力规模同比增加60%至25%。大模型对人工智能算力的重要推动作用。如今,算力已深入渗透到科研、工业生产乃至日常生活的各个角落,成为与水电同等重要的......
  • python随机生成图片验证码第二篇
    Python生成随机验证码,需要使用PIL模块.安装: pip3installpillow基本使用1.创建图片fromPILimportImageimg=Image.new(mode='RGB',size=(120,30),color=(255,255,255))#在图片查看器中打开#img.show()#保存在本地withopen('code.png','wb')asf......
  • 《算法引论》第二章(数学归纳法)
    第二章总结2.1原始的数学归纳法可以变形为各种形式,核心是有几个知道的n比较小的值或者性质+有一些从前向后的推断方式,然后推出一系列东西。比较常见的变形有强归纳法、间隔归纳法(n=1,2,..k时成立,n-k成立能推出n成立)、指数归纳法(n/k推n),等等。关键:根据我们掌握了什么决定使用什么......
  • Springboot学习第二天
    今天的学习内容是如何在项目中设计统一响应接口返回值,达到统一的格式1.响应实体我们首先要定义一个公共的接口响应实体,以后所有的接口返回值,都是返回的这个公共响应实体。这样做的好处是可以统一返回值的风格,编译接口的维护。需要包含3个关键的成员变量:状态码返回信息数......
  • RHCE第二周(文件的权限管理)
     一:初识文件权限1:为什么需要文件权限如果没有权限的话,所有人都能访问这个文件,对于所有人来说是透明的,所以需要文件权限来限制用户进行访问,系统就有安全保证2:权限的实质就是系统中的每个文件和目录都有uid和gid(哪些是用户创建的,文件和目录就会自动的继承这个用户的uid和gid),表......