不知不觉2020年都要过去了,加入菜鸟团后发的第一篇推文都已经是三年以前的事情了:浅谈Entrez ID。
我记得第一次写菜鸟团推文应该是在济南的长清大学城的一个教室里面,当时是陪媳妇去考”一建“,我找了一个教室开始搜集资料、写公众号推文(不得不吐槽一句,当时的网络太差了,而且刚开始是在图书馆,没有找到有电的插座,后来总算找到一个可以充电的教室才没能让我那12年的”上古神器“笔记本中途休克)。那个时候刚刚系统接触生信主题的知识,虽然每次的推文话题都比较简单,但是对于只有少许linux经验和一知半解的基因组知识的我来说,还是颇为新鲜和有挑战性的。
说到这里不得不再次感谢一下Jimmy,当时除了特别想去学习一下生信的心态之外,其实并没有如何去学习生信的渠道和计划,而且受限于当时的工作属性基本上全是湿实验,在后续的实践和阅历上都无法有效的提高自己的生信知识。
Jimmy统筹安排并制定了入门生信的知识图谱和路径,有幸作为其中一个成员去参与生信菜鸟团的生信推文计划,每周完成一个话题。到今年,我也从湿实验的工作转到几乎全是干实验的生信工作,由于需求驱动的影响,相信以后的我的生信的学习速度会进一步加快。
2020专栏总结
2020年初期时在做Statquest的统计视频的学习来补充自己的知识栈,原本是要进一步去学习机器学习的。后来入职生信工作后,由于下游分析很多,且主要是使用R来完成,因此今年的推文主要是R相关的。
StatQuest生物统计学 - 二项分布
StatQuest生物统计学 - 中心极限定理
StatQuest生物统计学 - 箱线图
StatQuest生物统计学 - 二项分布的极大似然估计
StatQuest生物统计学 - 机器学习介绍
StatQuest生物统计学 - 机器学习之ConfusionMatrix
StatQuest统计学视频列表更新
现在再回看这些撰写R推文,还是有很多不够优雅的地方,不过作为一个解决方法的思路还是有一定参考意义的。
R:ROCR包用于ROC分析
R:purrr包用于循环迭代
R:STRINGdb包用于string蛋白互作分析
R:如何使用RMarkdown渲染中文pdf报告
R:R调试工具
R:gtable包用于处理ggplot2图像
R:ggtext包丰富ggplot2中文本的表现力
R tips:unique和duplicated的区别
R tips:使用lapply和do.call读取并合并多个文件
R tips:使用enframe和map2优雅的迭代列表
R tips:使用!!来增加dplyr的可操作性
R tips:选择性屏蔽输出及输出重定向
R tips:dplyr编程
R tips:使用{}自由的使用管道
R tips:使用gtable绘制四轴散点图
R tips:调整ggplot2的坐标轴或legend的label长度
聊完推文的总结,感觉可以聊聊一些R及编程的经验。随着对R的了解的加深,现在已经逐渐从“苦苦的去思索应该如何完成目标”过渡到“解决的办法不止一种,哪一种实现方法更加优雅”的思路上来,这种稍微死磕一下实现路径的思路,我觉得也挺好,很多有意思的想法在这个过程中可能突然间就出现了。在这个过程中有一些想法和大家分享:
编程规划优于直接实现:当对基础语法足够了解之后,要完成一个任务的编程实现,对于任务的规划可能要更优先于直接进行任务实现。尤其是一些大的任务和使用率较高的任务,可维护性是相当关键的。目前看,在进行编程前是很需要对需求做一些分析的,将需求做一下拆分,梳理好相互之间的依赖关系。然后自己写工具函数的时候可以考虑写测试函数,这在对自己的脚本做升级时相当重要。任务规划可以让脚本和工具函数的撰写更加合理,测试函数让工具函数的升级变得轻松和可信。
人生苦短,记得解耦联:解耦联!要想让脚本具有高的可维护性,解耦联非常关键,其实它也是任务规划的一方面,由于从个人的经验来看,它非常重要,值得单独再强调一遍。如果是需要长期维护和高度可复用的代码,任务规划就一定要做好解耦联。简单说解耦联就是尽量让任务实现拆分成多个相对独立的模块,彼此之间的相互依赖降到最低,比如一个数据可视化任务,可以简单分成“数据导入 - 数据变换 - 可视化”三个模块,这种拆分设计的好处在于,进行需求升级和debug的时候非常聚焦,当有升级需求时,往往只需要调整部分代码即可。
小Tips,全局参数可以设置统一开关:对于一些要在脚本中多处使用和有频繁修改需求的参数与常量,可以在脚本开头处做好统一的开关。如果规划的好,真的非常有利于脚本的复用。
注:这个Tips仅限于任务脚本,而不是自己写工具函数集,工具函数集就是一个简略版的R包了。说到这里,强烈建议大家多去看R包源码,真的非常有意思,记得要从框架入手,就是先根据自己使用R包的经验,脑海中尽量能够猜出来或者边看边猜这个R包的工具函数的大概流程,这样才不会被R代码的细节给淹没了,举一个小例子,R包的函数的结构中,前面一大部分代码往往都是参数校验,这部分内容很多时候大概浏览一下就可以了。
2021年的技术栈
随着工作内容涉及的知识面越来越广,也需要保持相当快的学习速度和相当广的学习面。就目前的情况看,2021年应该会有如下的进一步学习方向,到时候的一些学习经验希望可以和大家分享。
R进一步学习
S4类:R中的高级话题:类,主要是S4类,目前个人阅读S4类的代码是比较舒服的,很有结构感,但是我还没有实际写过S4类的工具函数,这个方向要进一步加深学习,我现在能想象到它对代码的可维护性的提高非常有效;
ggplot2图层及grid:ggplot2的图层写法是ggplot2的高级话题,但是要想写出来图层,又需要对grid有很高的理解程度才行;
写一个R包:单纯去写一个R包,比如使用一些入门教程写一个简单R包,并不是特别有意义,其最大的意义应该是加深了理解R包在R中的作用机制。
我觉得写R包应该是需求优先,届时我可能会尝试去写的R包是以下三个之一:
- R中的ggplot2原生不支持填充图案,但是图案填充在黑白色的图形可视化中非常重要;我记得有一个pattern plot包可以实现,但是它的使用方式真的太不ggplot2,太不优雅了,不过它的实现方式也许可以参考。
- 双维度ggplot2图层,设想中的这个图层会多展示一个维度的信息,它的主体是散点图,但是它的每个点其实是一个饼图、柱状图、boxplot等等,其实Y叔的ggimage可以实现这个功能,但是不能直接使用,需要先保存一批饼图、柱状图、boxplot等,然后再将其嵌入到图形中,虽然ggimage很赞,但是它与我设想中的在双维度ggplot2图层的实现还是不完全契合,如果只靠一个图层就可以完成这个工作就真的很有意思了;
- 由于工作需要,RMarkdown的使用率非常高,但是它的原生渲染风格只能说是勉强够用,可能届时会想办法写一个RMarkdown主题相关的R包,这个需要对前端有一定的了解;
shiny:其实目前对shiny已经有了少许心得,但是远远谈不上有多了解,什么时候可以复现这个网站的设计https://cistrome.shinyapps.io/timer/,基本上就算是Shiny合格了。只是使用R就可以实现一个非常不错的可运行的网站,确实是很省心高效的典范了。
前端
不管是shiny还是RMarkdown,要想深入一下他们的高级话题,基本上总是逃不开前端的知识,所以前端三剑客html css jacascript怕也是需要了解的。多从专业的计算机领域汲取养分,确实可以极大的优化自己生信技术栈。
Python
Python基本上已经接触过很多年了,算起来”Python学习手册“从2012年就开始看了,但是基本上没有写过特别正式的Python代码,它作为万能胶水语言,在除生信下游分析以外的区域混的如鱼得水。
组学
现在的很多工作集中在表达数据的下游分析和可视化,基本上不涉及上游分析,而且也没怎么做过基因组的数据,有限的理解还是读研时的h37rv(貌似是这个)基因组的生信课程实践,所以有关于组学的实践也需要进一步加强。毕竟太多技术升级更像是迭代的而不是革命,就算是单细胞也参考了不少RNA-seq的东西,所以经典的东西总是会有很多可以挖掘的价值的。
附录
这些是TCGA相关的几篇推文,有一篇是跨年的推文,考虑到很久没有做整合了,刚好再列一个索引:
使用cgdsr包获取TCGA数据
RTCGA(1) 数据概况与数据下载
RTCGA(2) 数据分析与可视化
使用RTCGAToolbox包获取TCGA数据
批量下载TCGA数据库
TCGA之获取指定癌症的感兴趣基因的表达量
TCGA之生存分析(1)基本概念与操作
TCGA之生存分析(2)
从GDC下载最新的TCGA临床数据
TCGA之miRNA预测临床表现