• 论坛首页
  • 我的丁香客
  • 找人
    查找好友
  • 更多
    丁香园
    丁香通
    丁香人才
    丁香会议
    丁香搜索
    丁香医生
    丁香无线
    丁香导航
    丁当铺
    文献求助
    医药数据库
    丁香诊所
    来问医生
登录 注册

论文写作投稿

关注今日:7 | 主题:818936
论坛首页  >  论文写作和投稿交流天地   >  综合及其他话题
  • 发帖
    每发1个新帖
    可以获得0.5个丁当奖励
  • 回帖

分享到:

  • 微信

    微信扫一扫

  • 微博
  • 丁香客
  • 复制网址

论文中做出CNS高逼格的主成分分析图教程

  • 只看楼主
  • 页码直达:
  • 直达末页
楼主 医学统计学副教授
医学统计学副教授
科室保密
入门站友

  • 0
    积分
  • 296
    得票
  • 477
    丁当
  • 1楼

主成分分析(Principal Component Analysis,PCA), 是一种统计方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。 在实际问题研究中,为了全面分析问题,往往提出很多与此有关的变量(或因素),因为每个变量都在不同程度上反映了这个问题某些信息。 主成分分析首先是由K.皮尔森(Karl Pearson)对非随机变量引入的,尔后H.霍特林将此方法推广到随机向量的情形。信息的大小通常用离差平方和或方差来衡量。

具体的理论,不啰嗦,大家可以参考相关的书籍。

下面学习下如何绘制CNS级别的主成分图




##代码部分

expr_df <- read.csv(file='easy_input_expr.csv',row.names = 1, header = TRUE, sep=",", stringsAsFactors = FALSE) meta_df <- read.csv(file='easy_input_meta.csv', row.names = 1, header = TRUE, sep=",",stringsAsFactors = FALSE) #查看前3个基因在前4个sample中的表达矩阵 expr_df[1:3,1:4]


#用`prcomp`进行PCA分析 pca.results <- prcomp(expr_df, center = TRUE, scale. = FALSE) #定义足够多的颜色,用于展示分组 mycol <- c("#223D6C","#D20A13","#088247","#FFD121","#11AA4D","#58CDD9","#7A142C","#5D90BA","#431A3D","#91612D","#6E568C","#E0367A","#D8D155","#64495D","#7CC767")


开始画图 这里提供两种方法: 方法一:自动画图。用现成的R包全自动画图,必要时只需调整参数。 方法二:提取PCA分析结果,手动画图。 方法一:自动画图 用到做PCA的R包ggord,优点是能用背景色展示置信区间,缺点是没有画圈功能。

经典版 #install.packages("devtools") #library(devtools) #devtools::install_github("GuangchuangYu/yyplot") #devtools::install_github('fawda123/ggord') library(ggplot2) library(plyr) library(ggord) #library(yyplot) #有可能你的网络在安装yyplot时遇到困难,我把geom_ord_ellipse函数单独下载,通过本地进行加载。 #调用yyplot包里的geom_ord_ellipse函数 source('./geom_ord_ellipse.R') #该文件位于当前文件夹 #用ggord画基本PCA图 ggord(pca.results, grp_in = meta_df$group, repel=TRUE, ellipse = FALSE, #不显示置信区间背景色 size = 2, #样本的点大小 alpha=0.5, #设置点为半透明,出现叠加的效果 #如果用自定义的颜色,就运行下面这行 cols = mycol[1:length(unique(meta_df$group))], arrow = NULL,txt = NULL) + #不画箭头和箭头上的文字 theme(panel.grid =element_blank()) + #去除网格线 #用yyplot添加置信区间圆圈 geom_ord_ellipse(ellipse_pro = .95, #设置置信区间 size=1.5, #线的粗细 lty=1 ) #实线




箭头版 #用ggord画基本PCA图和置信区间背景色 ggord(pca.results, grp_in = meta_df$group, repel=TRUE, alpha = 0.6,#点和置信区间背景设为半透明,以凸显箭头和文字 #或者单独修改置信区间背景的透明度 #alpha_el = 0.3, ellipse_pro = 0.95,#置信区间 size = 2, #如果想用默认的颜色,就在下面这行前面加个# #cols = mycol[1:length(unique(meta_df$group))], arrow=0.2, #箭头的头的大小 vec_ext = 5,#箭头尾巴长短 veccol="brown",#箭头颜色 txt=3) + #箭头指向的基因名的字体大小 theme(panel.grid =element_blank()) + #用yyplot继续添加虚线的置信区间 geom_ord_ellipse(ellipse_pro = .95, #先画个.95的圆圈 color='darkgrey', #圈圈的颜色 size=0.5, lty=2 ) + #画成虚线,可以用1-6的数字设置为其他线型 geom_ord_ellipse(ellipse_pro = .98, #再画个.98的圆圈 #color='grey', #把这行注释掉,就是跟点一样的颜色 size=0.5, lty=2 )



方法二:提取PCA分析结果,手动画图 从PCA结果到画图所需的输入数据整理 用prcomp进行PCA分析后,获取降维后每个样本对应的主成分值和每个主成分的解释的变异。


#install.packages("ggplot2") #install.packages("dplyr") #install.packages("plyr") library(ggplot2) library(dplyr)

library(plyr) pca.rotation <- pca.results$rotation

pca.pv <- summary(pca.results)$importance[2,]

调整数据结构,用于作图 提取前两个主成分构建数据框,并增加分组信息列 low_dim_df <- as.data.frame(pca.results$x[,c(1,2)]) low_dim_df$group <- meta_df$group


下面以PCA分析得到的“low_dim_df”作为输入,画图 画置信区间圆圈的函数 先运行函数add_ellipase,用来增加置信区间椭圆线。 通过调整参数,以达到你想要的效果,参数含义为: p: ggplot2返回的对象 x,y: 主成分的列名 group: 分组列 ellipse_pro: 置信区间,默认0.95 linetype可选类型: blank, solid, dashed, dotted, dotdash, longdash, twodash colour:颜色 lwd:线的粗细


add_ellipase <- function(p, x="PC1", y="PC2", group="group", ellipase_pro = 0.95, linetype="dashed", colour = "black", lwd = 2,...){ obs <- p$data[,c(x, y, group)] colnames(obs) <- c("x", "y", "group") ellipse_pro <- ellipase_pro theta <- c(seq(-pi, pi, length = 50), seq(pi, -pi, length = 50)) circle <- cbind(cos(theta), sin(theta)) ell <- ddply(obs, 'group', function(x) { if(nrow(x) <= 2) { return(NULL) } sigma <- var(cbind(x$x, x$y)) mu <- c(mean(x$x), mean(x$y)) ed <- sqrt(qchisq(ellipse_pro, df = 2)) data.frame(sweep(circle %*% chol(sigma) * ed, 2, mu, FUN = '+')) }) names(ell)[2:3] <- c('x', 'y') ell <- ddply(ell, .(group) , function(x) x[chull(x$x, x$y), ]) p <- p + geom_polygon(data = ell, aes(x=x,y=y,group = group), colour = colour, alpha = 1,fill = NA, linetype=linetype, lwd =lwd) return(p) }


开始画图 #计算坐标轴标签 pc1.pv <- paste0(round(pca.pv['PC1'],digits = 3) * 100, "%") pc2.pv <- paste0(round(pca.pv['PC2'],digits = 3) * 100, "%") #画出各个样本在二维空间的点 p <- ggplot(low_dim_df) + geom_point(aes(x=PC1, y=PC2, color=group), size=2, #点的大小 shape=20,#点的形状 alpha=0.5) +#设置点为半透明,出现叠加的效果 #如果使用默认的颜色,就在下面这行前面加个# scale_color_manual(values = mycol[1:length(unique(meta_df$group))]) + #还能调整整体的颜色亮度 #scale_colour_hue(l=45) + theme_bw() + #去除背景色 theme(panel.grid =element_blank()) + #去除网格线 #添加标签,同样可以加到方法一的同一位置 annotate("text",x=-8.5,y=-1.2,label = "BRCA",color = mycol[1]) + annotate("text",x=5,y=5.6,label = "LUCA",color = mycol[2]) + annotate("text",x=5,y=-2.5,label = "OV",color = mycol[3]) + #图例 guides(color=guide_legend(title = NULL)) + theme(legend.background = element_blank(), #移除整体边框 #图例的左上角置于绘图区域的左上角 legend.position = c(0,1),legend.justification = c(0,1), legend.text = element_text(size=12)) + #字体大小 #调整坐标轴标签 xlab(paste0("PC1 ( ", pc1.pv," variance )")) + ylab(paste0("PC2 ( ", pc2.pv," variance )")) p




#画圈圈 p1 <- add_ellipase(p,ellipase_pro = 0.95,colour = "dimgrey",linetype=1,lwd=1) p1



#也可以多次叠加,画两个圆圈 p2 <- add_ellipase(p,ellipase_pro = 0.95,colour = "dimgrey",linetype=2,lwd=0.5) p2 <- add_ellipase(p2,ellipase_pro = 0.98,colour = "dimgrey",linetype=2,lwd=0.5) p2

相关原创视频见下,持续更新,

基于Logistic回归的临床预测模型论文的常见套路总结【原创】

R语言Logistic回归临床预测模型【第一节 概述】

R语言Logistic回归临床预测模型【第二节-变量筛选1-先单后多】

R语言Logistic回归临床预测模型【第三节-变量筛选2-lasso】

R语言Logistic回归临床预测模型【第四节-变量筛选3-逐步回归】

R语言Logistic回归临床预测模型【第五节-变量筛选4-随机森林】

R语言Logistic回归临床预测模型【第六节 模型构建1-nomogram】

R语言Logistic回归临床预测模型【第七节 calibration校准曲线】

R语言Logistic回归临床预测模型【第八节 C指数计算】

R语言Logistic回归临床预测模型【第九节 ROC及其AUC】

R语言Logistic回归临床预测模型【第十节 拟合优度检验】

R语言Logistic回归临床预测模型【第十一节 决策曲线DCA】

R语言Logistic回归临床预测模型【第十二节 NRI与IDI】

  • 邀请讨论
  • 不知道邀请谁?试试他们

    换一换
2020-11-27 22:35 浏览 : 3820 回复 : 1
  • 投票 12
  • 收藏 16
  • 打赏
  • 引用
  • 分享
    • 微信扫一扫

    • 新浪微博
    • 丁香客
    • 复制网址
  • 举报
    • 广告宣传推广
    • 政治敏感、违法虚假信息
    • 恶意灌水、重复发帖
    • 违规侵权、站友争执
    • 附件异常、链接失效
    • 其他
dxy_gonkvj64 编辑于 2020-12-05 16:01
  • • 大家见过从患者体内取出过哪些异物?
遥望孙思邈
遥望孙思邈
中医儿科
入门站友

  • 0
    积分
  • 16
    得票
  • 315
    丁当
  • 2楼
感谢
2021-01-21 07:26 来自 Android客户端
  • 投票
  • 收藏
  • 打赏
  • 引用
  • 分享
    • 微信扫一扫

    • 新浪微博
    • 丁香客
    • 复制网址
  • 举报
    • 广告宣传推广
    • 政治敏感、违法虚假信息
    • 恶意灌水、重复发帖
    • 违规侵权、站友争执
    • 附件异常、链接失效
    • 其他
  • • 一个难遇合的小伤口,阻碍伤口愈合原因您看到了吗?(已出答案)

关闭提示

需要2个丁当

丁香园旗下网站

  • 丁香园
  • 用药助手
  • 丁香通
  • 文献求助
  • 丁香人才
  • 丁香医生
  • 丁香导航
  • 丁香会议
  • 手机丁香园
  • 医药数据库

关于丁香园

  • 关于我们
  • 丁香园标志
  • 友情链接
  • 联系我们
  • 加盟丁香园
  • 版权声明
  • 资格证书

官方链接

  • 丁香志
  • 丁香园新浪微博
引用回复