昨天收到我们上一期学员的一个提问,他在学会了R语言,linux,以及各种常见的GEO数据库挖掘,单细胞等技能后,就开始马不停蹄的进行各种实战分析啦,我们的马拉松授课最新一期就在下周一开课,感兴趣的小伙伴快去看看吧:生信入门&数据挖掘线上直播课4月班
学员的问题是:他的样本分组有一组只有三个样本,问做PCA分析的时候能不能加那个椭圆圈呢?
图片
先问一下kimiQ:fviz_pca_ind函数绘制PCA结果,每组三个样本,可以画置信区间的圈吗?
A:
“在使用 fviz_pca_ind 函数绘制 PCA 结果时,是可以为每组样本绘制置信区间的圈的。具体可以通过设置参数 addEllipses = TRUE 来添加置信椭圆。此外,还可以通过以下参数进一步自定义置信椭圆的样式:
ellipse.type:指定椭圆的类型,可选值包括 "confidence"(置信椭圆)、"convex"(凸包)、"t"(假设多变量 t 分布)、"norm"(假设多元正态分布)等。ellipse.level:设置置信水平,默认为 0.95,也可以根据需要调整为其他值。“例如,以下代码可以为每组样本绘制 95% 置信椭圆:
fviz_pca_ind(pca.res, col.ind = iris$Species, addEllipses = TRUE, ellipse.type = "confidence", # 使用置信椭圆 ellipse.level = 0.95, # 设置置信水平为 95% legend.title = "Groups")
如果每组只有三个样本,置信椭圆可能会比较小,但仍然可以正常绘制。
它居然回答可以!下面就来试试~
找个数据试试看我找了一个GEO数据:https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE140275,这个数据恰好是6个样本,每组三个:
GSM4158685 ctr_1GSM4158686 ctr_2GSM4158687 ctr_3GSM4158688 stroke_1GSM4158689 stroke_2GSM4158690 stroke_3
处理一下数据:
rm(list = ls())#清空当前的工作环境options(stringsAsFactors = F)#不以因子变量读取options(scipen = 20)#不以科学计数法显示library(data.table)library(tinyarray)library(stringr)# 创建目录getwd()gse <- "GSE140275"dir.create(gse)if(T){# load counts table from GEO urld <- "https://www.ncbi.nlm.nih.gov/geo/download/?type=rnaseq_counts&" path <- paste0(urld, "acc=", gse, "&format=file&file=",gse,"_raw_counts_GRCh38.p13_NCBI.tsv.gz"); file <- paste0(gse,"_raw_counts_GRCh38.p13_NCBI.tsv.gz") path file# download.file(url = path, destfile = file) paste0("GSE140275/",file) tbl <- as.matrix(data.table::fread(paste0("GSE140275/",file), header=T, colClasses="integer"), rownames=1) dim(tbl) ensembl_matrix=as.data.frame(tbl) library(AnnoProbe) library(org.Hs.eg.db) keytypes(org.Hs.eg.db) e2s<-AnnotationDbi::select(org.Hs.eg.db, keys= rownames(ensembl_matrix), columns="SYMBOL", keytype = "ENTREZID") head(e2s) ids = na.omit(e2s) ids=ids[!duplicated(ids$SYMBOL),] ids=ids[!duplicated(ids$ENTREZID),] head(ids) symbol_matrix= ensembl_matrix[match(ids$ENTREZID,rownames(ensembl_matrix)),] rownames(symbol_matrix) = ids$SYMBOL symbol_matrix[1:4,1:4] colnames(symbol_matrix)}
获取样本分组:
library(AnnoProbe)library(GEOquery)gsegset = getGEO(gse, destdir = './GSE140275/', getGPL = F) pd = pData(gset[[1]]) pd[1:4,1:5]colnames(pd)rownames(pd)colnames(symbol_matrix)com <- intersect(rownames(pd), colnames(symbol_matrix))symbol_matrix <- symbol_matrix[, com]pd=pd[com,]pd$titlegroup_list= str_split(pd$title, "_", n=2, simplify = T)[,1]group_listgroup_listtable(group_list)dat=log10(edgeR::cpm(symbol_matrix)+1)save(symbol_matrix,dat,group_list,file = '1-QC/step1-output.Rdata')PCA分析加圈
library("FactoMineR")#画主成分分析图需要加载这两个包library("factoextra") dir.create("1-QC")list.files("1-QC/")load(file = '1-QC/step1-output.Rdata')table(group_list)# 每次都要检测数据dat[1:4,1:4] dim(dat)cg=names(tail(sort(apply(dat,1,sd)),1000))#apply按行('1'是按行取,'2'是按列取)取每一行的方差,从小到大排序,取最大的1000个## 下面是画PCA的必须操作,需要看说明书。dat=t(dat[cg,])#画PCA图时要求是行名时样本名,列名时探针名,因此此时需要转换dat=as.data.frame(dat)#将matrix转换为data.frame library("FactoMineR")#画主成分分析图需要加载这两个包library("factoextra") dat.pca <- PCA(dat , graph = FALSE)#现在dat最后一列是group_list,需要重新赋值给一个dat.pca,这个矩阵是不含有分组信息的fviz_pca_ind(dat.pca, geom.ind = "point", # show points only (nbut not "text") col.ind = group_list, addEllipses = T, legend.title = "Groups")
结果提示:Too few points to calculate:an ellipse
图如下:这根本没有圈嘛!kimi它骗我,我这就去质问一下他。
图片
我又问:
“但是我现在绘制它显示 Too few points to calculate:an ellipse 真的可以加圈吗?
A:
“根据你的描述,你遇到了在使用 fviz_pca_ind 函数时,因样本数量过少(每组只有三个样本)而导致无法计算置信椭圆的问题。这是因为置信椭圆的计算需要足够的数据点来估计分布。
解决方案 “使用凸包(Convex Hull)代替置信椭圆如果样本数量较少,可以使用凸包来代替置信椭圆。凸包是包含所有点的最小凸多边形,适合样本数量较少的情况。可以通过设置 ellipse.type = "convex" 来实现。
fviz_pca_ind(pca.res, col.ind = iris$Species, # 按组别上色 addEllipses = TRUE, # 添加凸包 ellipse.type = "convex", # 使用凸包 legend.title = "Groups")“检查数据和分组信息确保分组信息正确无误,并且每个组的样本数量确实为三。如果某些组的样本数量不足,可能会导致无法计算椭圆。“增加样本数量(如果可能)如果条件允许,可以尝试增加每组的样本数量,以满足置信椭圆计算的要求。“
通过上述方法,你应该可以解决因样本数量过少而导致无法绘制置信椭圆的问题。
根据上面的提示,我们要设置一个参数:ellipse.type = "convex", # 使用凸包
在 fviz_pca_ind 函数中,当设置 ellipse.type = "convex" 时,绘制的是凸包(Convex Hull),而不是传统的置信椭圆。
凸包的机制凸包是指能够包含给定点集的最小凸多边形。它的计算机制是基于几何学的,通过找到点集的边界点,并将这些点连接起来形成一个多边形。这个多边形能够完全包围点集中的所有点。
为什么凸包适用于样本数量较少的情况计算简单:凸包的计算不需要假设数据的分布,因此即使样本数量较少,也可以轻松计算。直观展示:凸包能够直观地展示一组点的边界范围,适合用于样本数量较少时无法绘制置信椭圆的情况。fviz_pca_ind(dat.pca, geom.ind = "point", # show points only (nbut not "text") col.ind = group_list, addEllipses = T, ellipse.type = "convex", # 使用凸包 legend.title = "Groups")这回真的加了一个圈上来了:
图片
如果你也有类似的问题,来看看我们最新一期培训吧:生信入门&数据挖掘线上直播课4月班开课时间接下来的直播互动授课开始时间是2025年3月31日, 晚上跟直播白天可以很方便的实践操作!
我们的课程每月滚动开班,在线直播互动授课,可以根据自己的时间安排就近报名,随时插班或者咨询下一期报名。
我们的马拉松生信课程已经有了一年多线下全国巡讲、四年多线上互动授课的积累,有经验丰富的专业教学团队,已有数千名学员从培训班毕业,仅致谢我们的正式发表文章就有200+篇!欢迎选择影响了无数生信学习者、桃李满天下的生信技能树。
报名咨询如果你已经熟悉了我们的课程,就联系我们报名吧~ (添加好友务必备注 高校或者工作单位+姓名+马拉松,方便后续认识)
招生对象生信入门班:生物、医学、农学等方向需要学习生物信息学数据分析的人,本科、硕博、生信相关公司职员、医生等。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报。