附录

现代科研兵刃谱

工欲善其事,必先利其器。今天绝大多数知识都是工具生产出来的,也就是想使用知识,肯定要先学工具,而工具又需要知识铺垫,这就成了一个鸡生蛋蛋生鸡的问题。虽然事后总结都有千般道理,但就我人经验而言,工具与知识是相辅相成缺一不可的,过于关注知识会导致脱离实际而沉迷于工具选择则有很高的迁移成本。这里的忠告就是不要想太多,先迈开步子,遵循梯度下降算法来寻优。也就是说,随便找个工具用起来,用实战来丰富需求,根据需求定向选择最适合自己的工具而不做工具的奴隶,如有必要,自己创造工具。另外,尽量选择那些花费百分之二十的精力可以掌握百分之八十的内容或应用场景的工具。同时系统学习那些使用频率高的工具,其余的只要知道其存在即可,不要捡芝麻丢西瓜。

文本编辑

科研用文本编辑工具主要应对排版要求,早期排版系统基本都是通过 TeX 语言来实现的,后来由于个人电脑普及及新兴学科的出现,很多科研人员上手会用的都是可见即可得的文本编辑器。现在期刊投稿一般会支持基于 TeX 的投稿及常见可见即可得文档,这些都是本地编辑。另一个当前流行的可见即可得文本编辑方式是在线协作,例如谷歌文档石墨文档腾讯文档等。对于需要协作完成的论文,在线协作文档极大方便了实时交互与版本控制。其实利用基于Git的GitHub也可以实现在线协作与修订,不过门槛比较高,但有希望成为一些期刊今后的投稿系统原型。例如 Authorea 就集成了在线协作、支持markdown、文献管理、数据分析、托管、版本控制、投稿等一系列功能,有希望成为下一代文本编辑工具,价格并不便宜但好于传统办公软件。数据分析环境容器化与项目化正在成为一种流行趋势。部署数据分析环境是很头疼的事,各类包依赖、软件版本混杂与系统平台大大阻碍了分析效率。目前有两个分支解决方案,一种是通过云计算或集群计算平台来实现在线数据分析,目前 R Cloud 与 RStudio 的RStudio Cloud就是代表;另一种则是对软件配置环境进行打包,确保本地部署的一致性,这条路需要容器化技术作为依托,docker 差不多是目前最流行的轻量容器化技术。目前市面上已经有针对Jupyter notebooks的Binder,可以直接将一个Github 仓库打包成 docker 镜像然后一键部署到JupyterHub上,也可以通过stencila本地创作后在线部署。R社区也有Rocker镜像或liftr包来实现分析环境的快速部署。当然单纯分析脚本是不够的,数据也应该可以打包或链接并方便分享,目前支持此功能的此类产品是CodeOcean,容器叫做胶囊,里面可以打包脚本、数据及生成docker镜像的配置文件,而且也有期刊支持胶囊与论文的同步发表了,但目前版本控制功能还没有,无论如何研究中的可重复性危机有望基于技术来减弱。

还有些文本编辑器是基于纯文本的,通过文本中的控制语句来实现排版,TeX就是其中最流行的。Overleaf支持基于 TeX 的在线文档协作,甚至你可以直接用其向特定期刊投稿,同样的工具还有sharelatex。不过,TeX的控制语句实在太丰富,学习起来比较困难。Pandoc 的出现方便了其他更简单的标记语言对 Tex 的转换,其中最容易上手的是Markdown。不过 Markdown 存在很多版本,其中基础版支持的排版功能非常有限,Pandoc 对其进行的扩展则支持了更丰富的功能方便排版。所以理论上你可以使用 Markdown 来写论文,不过这需要你的编辑器支持一些额外的功能。

总结一下,作为现代科研工具,理想文本编辑器需要至少有以下功能:

  • 支持在线协作、评论与修订
  • 支持版本控制
  • 支持常见文献管理工具
  • 支持期刊样式排版
  • 容易上手

文献管理

现在的文献管理工具一般都支持常见文本编辑工具,也就是可以很方便的插入参考文献。然而,文献管理工具要同时具有收集、整理与分析的功能为佳。当前主流文献管理工具都已经支持浏览器层次的文献收集,也就是直接通过快捷键、脚本或浏览器扩展一键自动提取文章页面中参考文献信息并存入用户指定的文献库。要实现这个功能,多数需要知道文献数据库网页结构,当前很多文献数据库都推出了自己的文献收集应用,有的直接收购了文献管理软件。

Endnote是比较老牌的文献管理工具,不同于前面所说的网页采集,其自身就有与常见数据库的搜索接口,国内科研机构图书馆大都提供培训。与之类似的NoteExpress则属于国产软件,据说对中文期刊格式支持更好,类似的还有Mendeley医学文献王、服务 TeX 里 BibTex 的 JabRef 与Mac OS 下的Papers。这些工具起步较早,从单机时代就有用户,还有些工具诞生于互联网时代,有着更丰富的功能。

Zotero 属于互联网精神的产物,特别是前者本身就是基于火狐浏览器,其支持的文献格式样式都非常多,而且也有着丰富的文本分析扩展应用。Paperpile则属于基于谷歌文档的应用,可以很方便地管理在谷歌文档中使用到的文献。DOIcrossref的出现则更方便了文献的搜索定位。可以说基于互联网的团队化文献管理正在成为趋势。

如果需要文献信息学方面的研究,CiteSpace 功能比较全,如果需要文本分析,可以利用 R 语言中的自然语言处理包来进行。

总结一下,作为现代科研工具,理想文献管理软件需要至少有以下功能:

  • 支持常见文本编辑器
  • 支持在线文献采集
  • 支持文献库协作与共享
  • 支持文献信息学探索
  • 容易上手

数据处理与绘图

数据处理方面很多学科只需要电子表格与基本的统计分析就可以了,很多在线服务就可以完成。然而,有些学科需要更丰富的功能例如多元统计分析与假设检验时,电子表格提供的功能可能就不那么明显了,有时需要学习使用电子表格的宏扩展来实现。此时,很多人容易陷入哪个分析一定要用哪个软件做的误区,其实多数数据分析软件的算法都差不多,只不过默认值可能不同,有些功能则藏的比较深,此时请善用搜索引擎。

所见即所得的数据处理与绘图软件有很多,Excel、OriginSigmaPlotSPSS 是科研中用的比较多的。这些软件都是图形界面操作且都收费,其内置很多现成的分析模块应对实际科研问题,但这些简化会导致使用者知其然不知其所以然,在分析方法使用上陷入误区。

编程分析与绘图则属于基础的工具,RPythonMatlabSAS 都是这类工具的代表,应该说掌握其中任意一个就足够应对科研中需要的数据分析了。不过通常这类工具比较难学,最好是配合数据分析方法的学习同步掌握,而且要通过案例来理解方法,累积经验。如果推荐一个,那么基于 R 的 ggplot2 作图与其背后的 tidyverse 数据分析套装则是很好的起点。如果更进一步,可以用shiny 来制作交互式数据展示界面。

此外,互联网上也有一些在线应用可以很方便地生成特殊图形例如百度脑图可以用来生成流程图或思维导图、Autodraw可以用来画简笔画、plotly可以在线完成绘图等。甚至网上还有直接上传数据后自动猜测你需要进行分析与制图的Charted。这样的工具只要搜索你所需要的分析然后加上“online”作为关键词就可以找到。

如果是偏生物的示意图,可以考虑BioRender

总结一下,作为现代科研工具,理想数据分析与绘图软件至少有以下功能:

  • 支持科研用统计分析
  • 图片默认输出美观大方支持绘图自定义
  • 具备可重复性的宏功能或数据处理脚本
  • 容易上手

数据同步

科研数据在不涉密情况下一定要备份,实验室要配备专用数据处理电脑,用NAS来进行本地备份,每个项目有独立文件夹结构化管理。工作文件夹原则上在实验室电脑上,通过远程登录软件例如 TeamViewer 或终端来处理数据。如果使用个人电脑,工作文件夹要做好云存储,国内的话iCloudOneDrive坚果云就可以,国外可选DropBox谷歌云端硬盘。文献可以通过坚果云的 Webdev 来同步全文。完成的项目要及时存档备份,可使用百度网盘

实验室管理

实验室内部管理可使用slack或国内的钉钉,最好区别工作与私人的交流工具。项目管理可以直接用GitHub项目功能来做,分为计划、进行中与完成三部分,每次组会进行更新。

幻灯片制作

幻灯片制作的工具不仅仅限于微软出品的PowerPoint(ppt)或苹果公司出品的 keynote,但不可否认的是可见即所得的工具对于幻灯片的制作是很方便的。基于 Beamer 的幻灯片虽然足够简洁美观,但也存在一定的制作难度,需要学习 TeX。基于 html5 技术的幻灯片一般支持 markdown 语法编辑,样式可用 CSS 模版进行控制。例如 xaringan 就是基于remark.js 这一网页幻灯片制作工具配合Rmarkdown来制作幻灯片的。不过,幻灯片制作不要沉迷于模版选择,只要不出错就够了,太花哨的功能喧宾夺主。不过从互动角度出发一些挂件例如countdown 来进行倒计时, DirectPoll 进行实时投票统计,也可以同时开视频或进行语音输入

同样,谷歌幻灯片可以实现在线制作幻灯片。很多网站可以直接制作网页版幻灯片,例如基于reveal.jsslides 或基于有漂亮切换类似prezimpress.jsstrut。在线制作幻灯片可以让分享变得很容易并提高了曝光度,很多网站例如slideshareSpeaker Deck 也支持上传本地幻灯片进行分享。

建议日常计划用幻灯片进行总结,图片达到会议级别。

作为现代科研工具,理想幻灯片制作软件至少有以下功能:

  • 简洁的编辑制作页面
  • 模版简洁可自定义
  • 可在线分享

学术交流

学术交流是科研生活中可以说最重要的一环,现代科研体系的分工合作都要通过学术交流来实现。主流趋势包括论文预印本服务器、开放获取与线上学术交流。

预印本指在通过同行评议发表之前事先将论文手稿托管在公开服务器的研究工作。预印本服务器可以加速新思想的交流,接受预印本发表的期刊可以从维基百科上查到。比较知名的预印本服务器包括偏数学物理计算机科学的arxiv、偏生命科学的biorxiv 与偏化学的chemrxiv。国内也有中科院的科技论文预发布平台来服务国内科研人员。很多期刊出版方也在推广自己的预印本服务器来吸引高水平研究,所以可酌情选择。

开放获取是另一个趋势,要求研究工作可以公开让大众阅读。目前很多科研基金都开始有了这方面的要求及预算。但值得注意的是虽然开放获取期刊可能有更好的阅读数与引用表现,但有很多机构的开放获取期刊属于掠夺性期刊,给钱就发表,对学术评价与学科发展非常不利,可以通过一些网络上的列表来鉴别或选择。要实现开放获取或者说透明科研,f1000researchPeerJ还有Plos都是还不错的先行者,它们在实践一些新理念,不过显然并不便宜。

线上学术交流除了期刊外,实际还要包括学术博客、多媒体展示、学术出版与网络身份。制作学术博客的工具可以直接借助平台例如科学网博客,也可以自己搭建例如使用WordpressBlogdown或者Netlify等工具。幻灯片制作也最好使用网页模式方便交流,xaringanlearnr等其他基于Markdown语言的幻灯片制作工具可以满足要求。学术出版物则可以通过bookdownrticles等工具来完成。线上的学术身份识别对于存在大量重名现象的中国科研人员也是很有必要的,ORCIDResearcher IDScopus Auther ID谷歌学术个人主页及国内的百度学术个人主页都是不错的网上学术名片。在线出版可以考虑leanpub/gitbook/amazon kindle direct publishing或者按需求出版纸质版的 lulu.com。而在线交流的手段则可通过ResearchGateAcademiaLinkedintwitter来完成。

审稿也是很重要的学术交流方式,建议使用 Publons 来构建自己的学术审稿记录。当然你可以在博客或微博上评论最新研究,甚至很多网络期刊网站的评论也有很好的思想碰撞,这里最关键的是要搞清楚你所在学科最活跃的网络交流平台,如果没有,自己搭建一个也无妨。

数据分享

数据分享是一个很重要现代科研特征,越来越多的科研成果正在开放自己的原始数据供社区推动学科进步。其中,figshareOpen Science FrameworkDataverseZenodo都是这一潮流的引领者。良好的数据分享不仅包含原始数据,还要包括处理后数据、数据收集相关信息与处理代码,另外对于共享数据的使用也要尊重数据生产者。这里有一份列表对不同学科的数据分享提供指南。

代码管理

后续我们会看到所有学科都会不可逆引入编程,所以代码管理工具也非常重要。GitHubBitbucket都是非常实用的在线代码管理与版本控制平台。而RmarkdownJupyter Notebook等工具背后提倡的文学化编程也是很重要的代码开发工具。此外应考虑为未来自己做好注释并记录运行环境保证重复性。Docker image等完整的数据分析环境也可能成为现代科研的主流。代码的编写要能站到巨人肩上:

Good writers borrow from other authors, great authors steal outright

如果你进行R语言软件包的开发,建议打印相关Rstudio出品的小抄作为参考。同时作为IDE,Rstudio提供了包开发的模版,可以使用formatRRd2roxgen来重新格式化旧代码。用 Git 进行版本控制,同时使用roxygen2来编写开发文档。为了让包更容易使用,可以用Rmarkdown来写小品文方便读者上手,另外就是使用testthat来进行代码的单元测试。对于代码的执行效率,可以用Profvis进行可视化而集成在线测试则可以通过travis-ciappveyor来分别对R包进行Linux与Windows系统下的测试并统计代码覆盖率,本地跨平台测试可以使用 R-hub 包。可以在 Github 上发布、选择许可证、在 CRAN 上发布,也可以添加演示数据、提供 shiny 应用、写更新日志与 Readme 文档且放上前面所说的测试结果、下载量及覆盖度的各类徽章…你甚至还可以用 hexSticker 给自己软件包做个六边形贴纸当商标。当然,包完成后可通过 pkgdown来制作网站并通过learnr 来制作交互式教程。

全栈科学家自测题

  • 定性定量分子量100-100万的物质需要用到哪些仪器?优缺点是什么

  • 多重比较与多重检验的区别与联系是什么?

  • 傅立叶变换在光谱分析与质谱分析中的应用场景有哪些?

  • 简述21世纪学术圈出现的“可重复性危机”主要指什么?

  • ssh远程登录启用图形界面需要加什么参数?

  • 野外采样的就餐原则是什么?

  • 如何快速将牛腩煮烂?这个方法与提取亚细胞结构的内在联系是什么

  • 伪码写一下梯度下降算法

  • 简述文献管理的原则与你的方案

  • 审稿意见该怎么写?

  • 观察实验与控制实验的模型选择有什么区别与联系?

  • 两组样品同时测定了100个指标,简述可视化与统计分析两组样品差异与共性的思路

  • 冷干法不适于测定生物样品的哪类指标?

  • t检验、方差分析、线性模型的共性是什么?

  • 超净台日常使用的注意事项及与通风橱的区别

  • 15分钟学术报告需要多少张幻灯片?

  • 简述引用文献的不规范行为有哪些?

  • 给你的研究写一份新闻稿

  • 实验室如何进行项目管理

  • 什么是编译?为什么有些软件需要编译?

  • 三间分布在调查类研究中的常用统计方法有哪些?

  • 组学数据的功效分析怎么做?谈下思路

  • 完全萃取与不完全萃取的定量原理有什么区别?

  • 简述二代测序的原理

  • NCBI的常用数据库有哪些?能查到什么信息?

  • 石墨、石墨烯、石墨炔、碳纳米管的区别联系

  • 从头计算、DFT及分子动力学模拟常用来解释什么问题?

  • 主成分分析与偏最小二乘回归的区别与联系

  • 用正则表达式提取日期

  • 分析化学的灵敏度与统计学的灵敏度概念有何异同?

  • agent based model 可以用来做什么?

  • 请列出3D打印实验仪器所需要的硬件与软件平台

  • 统计模型与仿真模型的区别与联系

  • 生物学实验数据log转化的物理学基础是什么?

  • 细胞培养防污染需要哪些措施?

  • 与非门与异或门是什么?电路标记画一下

  • 简述下样品命名的原则

  • 随机数如何重现?

  • 有限元分析的应用场景有哪些?

  • 课题组需要一个网站来发布信息,请简述搭建过程及前端设计

  • 实验用品供应商如何联系与筛选?

  • 利用网络开放数据可以做什么样的研究,请举例

  • 如何鉴定采样得到的植物种属?

  • 实验室数据安全需要注意些什么?

  • 实验室人员流动时交接程序有哪些?

  • 实验室垃圾分类该怎么做?

  • 简单说下你对团队协作软件的看法

  • 学术伦理主要涉及哪些方面?

  • 野外采样期间突发事件如何处理?例如生病、交通延误、地方黑恶势力等

  • 如何甄别实验室数据造假?

  • 技术重复与生物重复的区别是什么?

  • 电镜照片计算平均粒径的方法是什么?

  • 探索性数据分析的常见方法有哪些?应用场景是什么?

  • 正交试验结果如何解释?

  • 自制层析柱有哪些指示物可以用来标示洗脱进度?

  • 不同材质手套的使用场景

  • 反应釜的温控手段有哪些?

  • 常用样品脱水材料或手段有哪些?

  • 如何从论文图片中提取数据?

  • 如何鉴定培养基污染菌种?

  • 如何计算数据处理所需内存?

  • 并行计算在CPU与GPU平台上有哪些流行的框架?

  • 哪类问题可以进行集群计算?

  • 贝叶斯统计的可信区间与置信区间有什么区别?

  • 相关不代表因果,那么能代表什么?有哪些其他解释?

  • 时间序列最大的特点是什么?

  • 常用物质数据库有哪些?

  • 谱图比对匹配的算法原理是什么?

  • 动态规划算法用来解决什么问题?

  • EM算法用来解决什么问题?

  • 直接质谱分析与表面增强拉曼光谱各自优缺点是什么?

  • 解释下内标法定量

  • 无监督聚类有哪些方法?

  • 用决策树算法配合重采样技术估计变量重要性如何实现?

  • 线性混合模型用来解决什么问题?

  • 模型验证方法有哪些?解释下ROC

  • 常见的认知偏误有哪些?

  • 当前学术评价体系的优缺点是什么?

  • 在你的专业领域,过去20年有哪些技术进步值得关注?

  • 你的研究方向目前存在的难点是什么?

  • 列举几个思想实验并解释其与科研的关系

  • 如何看待学术界里的歧视问题?

  • 设计一门一学期课程的教学大纲

  • 简述你的探索性数据分析思路

  • 如何写综述?

  • 简述几种应对挑战调节心态的方法

  • 科研团队里你的角色通常是什么?如何做好?

  • 科研用工作站的配置要求与理由

  • 机构数据库找不到文献怎么办?

  • 常见的开源软件许可证有哪些?

  • 论文挂名原则是什么?

  • 如何开导遭遇挫折的同事与学生?

  • 如何做项目预算?超支怎么办?

  • 如何应对民间科学家的上门挑战?

  • 如何写感谢信?什么科研场合需要写感谢信?

  • 发现自己课题组里有人有学术不端行为应如何处理?

  • 因停电样本污染发生后该如何处理?

  • 如何写软件文档?

  • 简述实验室最贵仪器的SOP

  • 你认为自己的基本工资应该在什么范围?给出理由

科研日常词典

研究生版

  • 研究生:本科生用来缓解找不到工作尴尬的高虚荣低薪工作,导师的廉价劳动力,20世纪中后期中国社会对本科生前景预计的21世纪版
  • 博后:博士生用来缓解找不到工作尴尬的高虚荣低薪工作,导师的廉价高产劳动力,北京落户捷径
  • 本研:本科来实验室加素质发展分或套瓷推研或拿留学推荐信的进步正能量免费劳动力,外表天真可爱背景完全神秘的NPC,研究生获取外界流行趋势的主要途径
  • 师兄:猥琐全能型NPC,口头禅多为“给你挂个二作”,部分具有强社会人属性,部分则从大学阶段就与社会脱节,格子衬衫篮球鞋迷
  • 师姐:已婚的为大姐大型NPC,已育后口头禅多为“我家XX”,XX为孩子小名,未婚的则多徘徊在实验与父母逼婚压力之间,轻度忧郁症晚期患者,匿名出没于晋江起点看言情小说
  • 师弟:师姐最常使唤的劳动力,单身优质的属濒危物种,单身普通的则属前者的NPC,格子衬衫篮球迷
  • 师妹:最常使唤师兄的非劳动力,大城市单身的不属于但自认属于的濒危物种,匿名出没于晋江起点写言情小说
  • 隔壁组:论文发表在传说中期刊上国奖赏金猎人,与之对话会掉膝盖的NPC
  • 聚餐:AA制联谊活动,内因多为撺掇某对师兄弟姐妹,低成功率保障了活动的长期有效
  • 学术:研究生过往人生某阶段的终身奋斗目标,后伴随各种打击化作硬币、赞或转发输出给了up主、大v或朋友圈,个别会祸害下一代
  • 组会:管饭的廉价劳动力福利,研究生突然主动读文献的原因,师兄会早起的日子
  • 学术会议:廉价劳动力平均一年一次的公费旅游/找工作福利,前提是拿到口头报告
  • 报告:博后/博士/教职近距离套瓷会,照片多为领导人风格的买家秀,投影/电脑/提问中至少有一个环节会出问题
  • csc:流行于海外教授圈的知名廉价劳动力输出与基本生活保障基金
  • 校友会:毕业有成的师兄师姐就业内推与装腔组织,毕业无成的师兄师姐收不到或假装收不到通知的组织
  • 校友群:毕业后有闲没钱的师兄师姐集赞拉票组织,毕业后无闲没钱的师兄师姐点赞投票组织
  • 院/系/实验室年会:课题组长炫富哭穷大赛
  • 宿舍:虽然有书有桌有花有独卫,但唯一用到的只有床跟晾衣绳
  • 研究生会:存在于楼下大厅海报中的虚拟NPC组织,多运行一个阅读量为泊松分布的院系研会公众号
  • 工会:职工运动会组织者,但多调用研究生来获取奖品,研究生运动套装报销组织
  • 校医院:在你病怏怏时咨询你过往用药种类与剂量的地方
  • 器材:库房里什么都有但就是没有你想要的东西
  • 行政:课题组间地下红娘组织,导师佚事集散地
  • 财务:视研究生为亲爱的孙子/孙女的非血缘NPC,经常为了先发票后付款与先付款后发票而跟同行赌气,研究生的财会税法启蒙运动支部
  • 联合培养:中科院体系广为流行的缓解教育部卡名额的解决方案
  • 清真餐厅:最后的物美价廉食堂
  • 外卖:会出现在烤串、小龙虾与糖醋里脊之间犹豫半天最终选了当日特价套餐状况的就餐选择
  • 番茄工作法:知道、用过、不错、闲置系列产品
  • 待办事项:知道、用过、不错、外卖小票背面替代系列产品
  • 终身学习:知道、没用过、不错、想用时都收开收智商税了系列产品
  • 印象笔记:知道、买过、不错、其实付费功能完全用不到系列产品
  • 手帐:知道、买过买不起、不错、单面打印论文背面替代系列产品
  • 份子钱:不读研朋友不定期发放的无息融资手段,单身研究生(多数本金无望)节假日旅游目的地邀请函,与知识付费和健身卡并称三大研究生致贫致困原因
  • 室友:除了呼噜声都不知其存在的人,桌上灰尘可作画,但其实两人两年都用不了100块的电
  • 节假日:研究生自认为可以阅读1元拍下的kindle大部头电子书与某新建文件夹里大量文献但实际只会在参加婚礼与补实验两种状态徘徊的日子,三天常被计划三周都完不成的任务,而且更多时候第一天其实是完全睡过去的
  • 周末:虚拟节假日
  • 一作:毕业终极目标
  • 通讯:经费负责人
  • 二作:跟其他作没区别也没用的致谢名单
  • 最后一个作者:投稿吉祥物
  • 前言:别人做的毫无意义工作的汇总与自己做的开天辟地工作的介绍
  • 方法:英文语序转换训练大全
  • 结果:阳性结果汇总
  • 讨论:别人做的毫无意义工作为什么毫无意义与自己做的开天辟地工作为什么开天辟地
  • 结论:开天辟地的另一种摘要式描述方法
  • 致谢:导师纠结排序的快结题基金列表
  • 查重:某神秘软件,网上可买到服务
  • 外审:彩票促销手段
  • 毕业论文致谢:实验室过往成员名单,答辩时导师唯一逐字阅读篇章
  • 答辩:导师低调装腔的重要场合,研究生镀金完工仪式
  • 拨穗:照片之所以丑是因为不是自己拍的
  • 审稿:被动读文献的触发条件
  • 审稿人:匿名掩盖下的不懂装懂者,完美主义者出没地,他引的广告机会
  • 院系所主页:奖学金申请表下载站
  • 实验室网站:重点实验室评审时才更新的网站或年轻课题组长默默更新的网站
  • BBS:沦为内网后基本消失的研究生吐槽园地
  • 知乎:BBS没落后研究生吐槽园地,研究生装腔社会人指南
  • 果壳:中科系研究生吐槽但没落园地
  • 豆瓣:丧系研究生吐槽园地,此处可自嘲却万不可群嘲,否则后果不堪设想
  • B站:研究生不能暴露ID的网站
  • 得到:研究生智商税主流收取机构
  • 淘宝:师姐妹只看不买系列网站
  • 京东:师兄弟只看买不起系列网站
  • 支付宝:余额稳定在3-4位数但总被当成6-7位数的研究生理财工具
  • 银行流水:研究生炒股被套日志
  • 加密钱包流水:研究生炒币被套日志
  • 科学网:用户平均年龄比果壳知乎高约10岁的有教职学者吐槽园地
  • 百度:前言拯救者
  • 小木虫:文献下载利器
  • MOOC:下定决心开始学新东西但平均出勤不超过三节的在线技校培训网站
  • 幻化材生:主流实验学科,科研民工主产区,上述网站研究生的学科来源
  • 知识分子:研究生都订阅但只在朋友圈看转发的公众号
  • ipv6:研究生娱乐圈与个别研究生学术圈
  • 美剧:研究生等待实验结果阶段开着论文实际在看的拖延症病因
  • 英剧:其实只为看卷福但要区别于并高于美剧的研究生等待实验结果阶段开着论文实际在看的拖延症病因
  • 日剧:看过但不讨论的研究生等待实验结果阶段开着论文实际在看的拖延症病因
  • 韩剧:看过但坚决不承认的研究生等待实验结果阶段开着论文实际在看的拖延症病因
  • 网剧:为了跟朋友聊天不得不看的等待实验结果阶段开着论文实际在看的拖延症病因
  • 泰剧:只看过介绍视频就嘲讽的等待实验结果阶段开着论文实际在看的拖延症病因
  • TBBT:无论看不看都说看过的美剧,一般掌握些术语梗且强调其不如英剧《IT狂人》,虽然也没看过
  • 星际迷航:根本看不下去但还是要通过百科等途径了解后说看过的伪geek特征梗
  • 冰与火之歌:一定要跟着骂马丁但搞不清楚跟《权力的游戏》区别的大尺度美剧的小说,以看过原著为荣
  • 西部世界:HBO出品的另一大尺度谈资
  • 唐顿庄园:理想英伦生活的装腔指南
  • 海贼王:预计啥时完结啥时毕业的动漫
  • 银魂:研究生同病相怜的卢瑟指南
  • 微信:实验室管理工具,90前自认为的主流交流工具
  • QQ:90后或95后研究生私下交流工具
  • 朋友圈:论文装腔大赛主会场
  • endnote:只在写论文时用但最后还是手工排的文献管理工具
  • origin7.0: 网上可下载到的稳定破解版绘图软件
  • pdf阅读器:特指adobe acrobat pro而非adobe reader但一定要装破解版的pdf阅读器
  • qq邮箱:研究生网上犯事被人肉时的关键线索
  • 树莓派:伪geek特征属性,除在线教程外并不知道如何使用
  • 彩票:研究生眼中与按期毕业/论文直接接收概率相当所以每到毕业季会买一注来碰碰手气的梦
  • 《公务员教材》:研究生代代相传最后全新状态卖了废纸的阶段理想
  • 《GRE红宝书》:研究生出国必买不看系列,深夜助眠读物
  • 《百年孤独》:这本书的孤独就在于买的人从来不陪伴,研究生深夜助眠读物
  • 《麦田里的守望者》:这本书的守望就在于买的人从来不回来,研究生深夜助眠读物
  • 《三体》:多数研究生眼中科幻的全部
  • 《明朝那些事儿》:多数研究生眼中历史逻辑的全部
  • 《解忧杂货店》:读不下去跑去看电影系列
  • 《追风筝的人》:读不下去跑去看电影系列
  • 《小王子》:不知道为何这么贵系列
  • 东野圭吾:日本作家,跟村上春树分不清楚
  • 村上春树:日本作家,跟东野圭吾分不清楚
  • 清北:两所互相瞧不起但更瞧不起其他国内高校的在排行榜上世界知名的中国高校,某乎上一半用户能攀上关系
  • 华东五校:所谓外导除清北外也知道的五所国内高校
  • c9: 西交大、哈工大学生网络自我介绍专用
  • 985: 除c9外985高校学生网络自我介绍专用
  • 211: 除985高校外211高校学生网络自我介绍专用
  • 双一流:只有原来不在985里高校学生会用的签名档
  • 国科大:两所背景深厚高校的共用简称
  • 中科院:自诩比肩清北但就业时研究生常因不属于985高校毕业而被刷掉简历的学位授予机构
  • 教育部:各种排名想办法挤兑中科院的学位授予单位
  • 科技部:有经费但教科研单位申请较少的单位
  • 基金委:不管钱多钱少都有人来申的单位
  • 师资博后:多附带口头2年后转讲师或副高的学术过渡期或转行期职位
  • 讲师:院系高压全能型群体,职位通常需要行政、教学、科研、打杂等技能
  • 青椒:学术圈无职称低收入的焦虑梦想家群体,通常具有博士学历,身份多为师资博后、讲师或助研
  • 副高:绝大多数青椒的退休或养老职称
  • 教授:多有半年到一年国家支持的海外访学经历且顺带让孩子学英语的退休或养老职称
  • 导师:多为非师范院校出身,对教育学一无所知但要表现出无所不知的校园形象,研究生的老板,实验室级创业公司合伙人,社交活动家,比乞丐学历高(疑似)的职业募捐者
  • 帽子:各类人才项目总称
  • 青千:海归博士博后的归国意愿保障体系高校版,已绝版
  • 百人:海归博士博后的归国意愿保障体系中科院版
  • 百篇优博:优秀高校土鳖博士认证,中科院系统已退出评选
  • 优青:杰青的低配版
  • 海外优青:换皮青千
  • 长江学者、杰青、大千人:院士的低配版,学科间利益协调系统,各学科子学科代言人队伍,学科级会议分会场keynote报告人
  • XX学者:除长江学者外一般为省级或地方人才引进项目负责人,长江学者、杰青、大千人预备队或评审人员
  • 青基、面上、重大:基金委的职称评定指南,申请人基本对应中级、副高及正高职称,拿到后有希望晋级
  • 两院院士:学科间利益协调系统,学科级会议大会报告报告人与吉祥物
  • 基金委子学科主任:身份等同两院院士的金主
  • 副校长:研究方向跟会议研究主题完全无关的致辞人
  • 领导:省/市级分管科教的二把手,无研究方向的会议致辞人
  • 纸:学科内高水平期刊论文
  • 水:学科内非高水平期刊论文
  • 中科院分区:期刊划分标准,在除中科院体系外的科教单位中流行
  • 核心期刊:本科生科研成果汇编
  • SCI:研究生科研成果汇编
  • h-指数:自引狂魔不会用,青年学者用不了,中年学者纳入讲座海报介绍的指数,一般至少两位数才会报
  • 影响因子:一般用分来形容,描述期刊的面子,分越高面子越大,但要避免PO,SR等雷区
  • CNS:评职称利器,帽子敲门砖,根据学科情况子刊也算
  • 开放获取:高收费期刊的另一个名字

留学生版

  • 三件套:Costco会员卡、宜家家具与二手车或二十手车
  • 西服:留学生求职必备,平时吃灰
  • Business casual:最灵活的着装要求,但留学生几乎都会overdressed,除非你在东部
  • 国货:质优价廉代表
  • 品牌差:国内定位中高端,国外定位平价的品牌,传递的SES(社会经济地位)信号自然也不一样
  • 双肩包:多为带学校校徽的联名款背包,留学生通勤必备
  • 微信厨房:以微信群为阵地的中餐预订平台,价格公道不上税,常见一队华人排队在一辆私家车后备箱取餐
  • 闷烧杯:留学生必买不用系列
  • 落地灯:留学生必买,因为住处一般没有灯,另外记得同时买灯泡
  • 慢炖锅:留学生买前想的都是美食,买后只处于吃灰与熬粥两种状态
  • 平底锅:留学生必买懵圈系列,对炒菜极其不友好,还是去亚超买圆底炒锅熬宽油过瘾
  • 老干妈、王致和、王守义:拯救留学生厨艺的三位东方先贤
  • 烤箱:留学生不会用系列,燃气的传统烤炉需要火柴或点火器引燃,玩火系列
  • 咖啡机:办公室必备,融入美式八卦文化的关键,但至少要分清阿拉比卡种(Arabica)和罗伯氏特种(Robusta),否则还是喝茶或饮水处按水好些
  • 微波炉:留学生午餐必备
  • meal plan:住校生餐厅套餐饭票,贵且难吃的代表
  • 可乐鸡翅:留学生必会菜谱,包纳了两种超市里差不多最便宜的食材
  • 冷冻蔬菜:用来制造冰箱比较满幻象的伪健康食品
  • 西红柿炒鸡蛋:留学生必会菜谱,西红柿一般用番茄酱代替
  • 左宗棠鸡:美式中餐的典范,lunch special
  • 橙子鸡:trader joe‘s 必买冷餐
  • seminar:free lunch special
  • Tariarki:日式中餐的典范,口感类似过量的酱油
  • Gyro:中东卷饼
  • Bagel:空心扁馒头
  • pizza:摊大了的馅饼,没有皮
  • 三明治:方形多层馅饼,对角切开卖
  • 培根:五花肉替代品,省的腌了
  • 热狗:便宜的异形肉夹馍
  • cheesesteak:长面包夹牛肉奶酪,奶酪要选whiz
  • omelette:鸡蛋煎饼,经常放蔬菜火腿
  • 韦斯特醋:国内叫辣酱油,烧烤肉类用
  • spaghetti:面条,需要煮时间长点,配番茄罗勒酱吃
  • pita: 中东卷饼
  • taco: 墨西哥卷饼
  • 鲭鱼罐头:日本留学生经常买
  • Tandoori:与印度朋友聚餐首选鸡肉,否则你想象不到他们的禁忌会是啥
  • Pho:跟兰州拉面一样流行的越南米粉
  • pops/soda/coke:碳酸饮料代称,有地域特色
  • double double:加拿大TH首选糖奶味咖啡
  • subway:其实你只要说all of them就好了而不必纠结调味料单词是什么,防尴尬点餐:daily special-white bread-full length-no cheese-heat, pls-onion/tomato/pickle/cabbage/cucumber-barbecue sauce-that’s it-thanks
  • 电影:手里备几张 AMC black ticket 还是很有必要的
  • casino:自助比较便宜,但别买筹码,否则就贵了
  • 寿司店:老板多是中国人,卖的多是紫菜包饭
  • 米其林:留学生17年之前的旅游必备体验项目
  • 城市:一般泛指硅谷与纽约曼哈顿
  • 谷:特指硅谷,特特指硅谷码农
  • 街:特指花街,特特指华尔街金融民工
  • 下谷上街:理工科留学生毕业首选,研究生肄业转行目的地
  • 农村:绝大多数不在硅谷与曼哈顿学校的生存环境
  • CSSA:留学生租房、二手交易、接送机信息集散地,多有公众号
  • 统舱:大开间,具备厨房独立卫生间,多见于城市
  • house:别墅,一般主卧自带卫生间,次卧常需要共享卫生间,所有住客共享大厅与厨房
  • 公寓:租金比house贵,有的自带卫生间,共享大厅厨房,没有主卧次卧之分
  • 半土库:一面有出口或落地窗的地下室,多自带卫生间,性价比之王
  • 土库:租金最便宜的地下室,有些地方不合法
  • 积分卡:留学生买菜购物累计里程享受折扣必备
  • 健身卡:留学生钱包里有但几乎不用或几乎天天用的卡
  • 保险卡:最应该替代钱包健身卡所占卡槽的卡
  • prime会员:学生身份免费半年外带半价,但也会有几人共用一个号的情况
  • plaza:农村住宅区之间的商区,一般会有一个大超市、一个小超市、一家银行、一家披萨或subway或DQ、一家中餐馆、一家美式餐馆、一家牙医诊所与一家美甲店,路对面会有一到两个带便利店的加油站
  • 1元店:留学生文具耗材补充基地,可以感受家乡的气息
  • photoID:带照片、生日与签名的政府签发身份证明,护照、驾照比较常见
  • 住址:用来判断税款的信息,但可以租邮箱
  • 驾照:留学生为了不用天天带护照与身份证明而办的,农村留学生生活必需品
  • 灰狗:没车留学生进城工具
  • carpool:留学生进城或接送机工具,总能找到华人在做
  • 加油返利信用卡:养车留学生必备
  • discovery免年费信用卡:留学生拿到ssn首选信用卡
  • 唐人街:留学生理发、买熟食与寄快递的地方
  • xx大学留学生微信群:通常人数是满的,但常发言的只有几个表演欲强的人
  • Asian fit:留学生配眼镜专属型号,不然会达成眼镜贴脸成就
  • mitbbs:中年有身份有孩子华人吹牛灌水发泄之处,中年无身份华人求审稿机会平台
  • dealmoon:留学生购物指南,返利养活了一个产业
  • Reddit:类似贴吧的存在
  • cashback:收银处储蓄卡取现金服务,但现在更多人理解为信用卡的返现
  • reference number:报案或投诉一定要记住的号码
  • 小费:留学生手机计算器的主要应用场景
  • 税表:意外收入来源
  • 邮件列表:留学生想移到垃圾邮件又不想错过重要信息的学校内部信息源
  • 月末聚会:系里或学校学生会组织的庆祝月华虚度的饮料畅饮尬聊会
  • baby shower:为准妈妈准备的庆祝聚会,要准备礼卡或礼物
  • BBQ party:夏天聚会首选,礼物可以带甜点或饼干
  • 资格考试:title从student变为candidate的一次答辩
  • 大秘:特指系里秘书,绝对不能惹又绝对可依赖系列
  • Dean:退休前faculty的养老服务类职位
  • 副教授:系里八卦来源,要么云淡风轻,要么忙忙碌碌评教授
  • AP:小心翼翼的常任轨新兵,每日遛娃申基金重写论文,重度焦虑患者
  • 博后:千老居多,虽然大多数期望拿教职,但最后大都转SRA培养下一代去了
  • opt:美帝三年暂住证
  • 宠物:留学生独居心灵寄托,但多数房东不让养,富人区里多为妇女社交工具
  • 97移民:特指说粤语的香港移民,回归前跑到了其他英联邦国家
  • 留学炒房团:一出国就买房,上学时同时做房东,房租还按揭,毕业了卖掉,因为是学区房,差价大概相当于留学学费的玩法,投资需谨慎
  • 新移民:新世纪以来通过留学后拿到身份的留学生,与前面修铁路、偷渡的早期移民及改革开放后八九十年代之交移民的高华聊不到一起,喜欢用微信
  • 计划生育移民:多数称孩子被强制打掉获取身份的同胞,少数是真的
  • 民运移民:多数称被政府迫害获取身份的同胞,少数是真的
  • 大法:多数称被政府迫害获取身份的同胞,多数自认为是真的,领着国内退休金,喜欢强行传教并运营神韵晚会
  • 华人教会:不少同胞的灵魂归宿,然而不乏龌龊事
  • 陪读妈妈:这个词本身就是个故事
  • 政评人:活跃在油管上以取悦海外华人与营造优越感为生的自媒体
  • 月子中心:制造事实上两国国籍同胞的组织
  • 孔院:一般跟语言学校混在一起的组织,办公室常年冷清
  • ABC:美国华裔二代移民
  • CBC:加拿大华裔二代移民
  • Amigo:拉美友人统称
  • Bro:非洲友人统称
  • 大妈团:背着单反来国外扫货的退休大妈,特别亲切,但不受待见
  • 宣讲会:留学生归国鬼门关,多是高校副校长带队
  • 流浪汉:uptown大街上强词夺理要钱的人
  • bless you:可用来估计留学时长的打喷嚏后问候语,不说的一半都是短期访问
  • skid row:北美大城市平民窟
  • Gaslighting:老板常用的员工心理操控大法,pua祖宗,万恶之源
  • care:中英混杂常见词,表示是否关心,假洋鬼子/女口头语标签之一
  • judge:中英混杂常见词,表示轻易评判或八卦,假洋鬼子/女口头语标签之一
  • show:中英混杂常见词,表示表演演出,假洋鬼子/女口头语标签之一
  • make sense:中英混杂常见词,表示是否有意义,假洋鬼子/女口头语标签之一
  • due:中英混杂常见词,表示截止日期,假洋鬼子/女口头语标签之一

创业版

  • 投资人:政府或企业
  • 公司:项目或课题
  • 董事长:课题组长(PI)
  • 经理:小老板或子课题负责人
  • 项目经理:博士生/硕士生/本科生
  • 员工:无
  • idea/论文:产品
  • 质检员:审稿人
  • 产品上市:论文发表
  • 产品发布平台:学术期刊
  • 产品未通过内部质检:论文拒稿
  • 产品有销量:论文被引用
  • 产品成为爆款:论文被大量引用
  • 产品被媒体推荐:论文被编辑或综述点评
  • 产品滞销:论文无引用
  • 产品原料配料表:论文数据共享
  • 产品生产流程:数据处理
  • 产品被模仿:论文被重复验证
  • 产品补丁:论文修正
  • 产品更新换代:论文跟进发表
  • 产品推介会:学术会议
  • 产品退市:论文撤稿
  • 公司融资:申请基金
  • 新三板/创业板:申请青基
  • A股:申请面上
  • 路演:项目申请书
  • 估值:学术影响力
  • 竞争公司:研究方向

书中所有代码

tb <- data.frame(
        stringsAsFactors = FALSE,
        已知 = c("大学教材","系统科学"),
        未知 = c("职业科研", "科学幻想"))
rownames(tb) <- c('已知','未知')
knitr::kable(
  tb, booktabs = TRUE,
  caption = '已知-未知列联表'
)
knitr::include_graphics("data/knowledge.png")
library(showtext)
showtext::showtext_auto()
# 数据来自维基百科
wp <- read.csv('data/wp.csv', check.names = F)
plot(wp$population~wp$year,pch = 19,xlab = '年份',ylab = '万人')
# 数据来自世界银行
e2p <- read.csv('data/e2p.csv', check.names = F)
plot(e2p$World~e2p$`Country Name`,pch = 19,xlab = '年份',ylab = '世界就业人口比(%)')
# 数据来自中国考研网 http://www.chinakaoyan.com/info/article/id/77817.shtml
gradapply <- read.csv('data/gradapply.csv')
plot(gradapply$application~gradapply$year,pch = 19,xlab = '年份',ylab = '研究生报名人数(万人)')
# 高考报名与录取数据来自教育部网站
cee <- read.csv('data/cee.csv')
plot(cee$application~cee$year,pch = 19,xlab = '年份',ylab = '人数(万人)',ylim = c(0,1100))
points(cee$entrants~cee$year,col='red',pch = 15)
legend('bottomright',legend = c('报名人数','录取人数'),pch=c(19,15),col=c('black','red'))
# 数据来自教育部
graduate <- read.csv('data/graduate.csv', check.names = F)
graduate2 <- graduate[graduate$category == 'Total',]
par(mfrow=c(1,2))
plot(graduate2$year,graduate2$`Enrolment(Master)`,xlab = '年份',ylab = '人数',pch=19,col='black',ylim=c(min(graduate2$`Admitted(Master)`),max(graduate2$`Enrolment(Master)`)),main='硕士研究生')
points(graduate2$year,graduate2$`Admitted(Master)`,pch=18,col='blue')
points(graduate2$year,graduate2$`Graduates(Master)`,pch=17,col = 'red')
legend('topleft',legend = c('在校生','录取人数','毕业人数'),pch=c(19,18,17), col = c('black','blue','red'))

plot(graduate2$year,graduate2$`Enrolment(Doctor)`,xlab = '年份',ylab = '人数',pch=19,col='black',ylim=c(min(graduate2$`Entrants(Doctor)`),max(graduate2$`Enrolment(Doctor)`)),main='博士研究生')
points(graduate2$year,graduate2$`Entrants(Doctor)`,pch=18,col='blue')
points(graduate2$year,graduate2$`Graduates(Doctor)`,pch=17,col = 'red')
legend('topleft',legend = c('在校生','录取人数','毕业人数'), col = c('black','blue','red'),pch=c(19,18,17))
# 数据来自教育部
faculty <- read.csv('data/faculty.csv', check.names = F)
faculty2 <- faculty[faculty$category == 'Total', ]

par(mfrow=c(1,2))
plot(faculty$year[faculty$category == 'Total'],faculty$total[faculty$category == 'Total'],pch=19, main='教职数',ylim=c(0,max(faculty$total)),xlab = '年份', ylab = '人数')
points(faculty$year[faculty$category == 'Professors'], faculty$total[faculty$category == 'Professors'],pch=18,col='blue')
points(faculty$year[faculty$category == 'Asso. Professors'],faculty$total[faculty$category == 'Asso. Professors'],pch=17,col='red')
points(faculty$year[faculty$category == 'middle'],faculty$total[faculty$category == 'middle'],pch=15,col='orange')
legend('topleft',legend = c('总数','教授','副教授','中级职称'), col = c('black','blue','red','orange'),pch=c(19,18,17,15))

col = RColorBrewer::brewer.pal(8,'Set2')
plot(faculty2$year,faculty2$`30 Years & Under`,pch=19, main='教职数',ylim=c(0,110000),xlab = '年份', ylab = '人数',col=col[1])
points(faculty2$year,faculty2$`31-35years`,pch=18,col=col[2])
points(faculty2$year,faculty2$`36-40years`,pch=17,col=col[3])
points(faculty2$year,faculty2$`41-45years`,pch=15,col=col[4])
points(faculty2$year,faculty2$`46-50years`,pch=14,col=col[5])
points(faculty2$year,faculty2$`51-55years`,pch=13,col=col[6])
points(faculty2$year,faculty2$`56-60years`,pch=12,col=col[7])
points(faculty2$year,faculty2$`61 Years & Over`,pch=11,col=col[8])
legend('topleft',legend = c('30岁以下','30-34','35-39','40-44','45-49','50-54','55-59','60岁以上'), col = col,pch=c(19,18,17,15,14,13,12,11))
tb <- data.frame(
        stringsAsFactors = FALSE,
        指标 = c("年产文章","文章档次","年龄","规模",
               "课程","会议","职称","期刊","帽子","年新增人数/总人数","基金/年审批数目","行政"),
        博士博后 = c("1","专业期刊","32","1","带学生",
                 "口头报告","讲师/研究员","审稿人","百篇优博","10万/100万","青基 /20000",
                 "跑腿"),
        独立课题组 = c("2","一超多强","35","<10",
                  "本科研究生教学","keynote","副教授","编委","百人/优青/青千","2000/50万",
                  "面上 /20000","自给自足"),
        学术带头人 = c("~10","综述","45","20-30/有梯队",
                  "学位培养计划","分会场主席","教授","副主编","长江/杰青/千人","500/2万",
                  "重点 /1000","院系领导"),
        学科带头人 = c(">10","CNS","70",
                  "50-100/有传承","学科前沿指导","大会报告","学生教授","主编","院士","50/2000",
                  "重大 /个位数","院长校长")
)
knitr::kable(tb
             , longtable = TRUE, booktabs = TRUE,
             caption = '理想学术路径'
)
set.seed(1)
# 真实差异
x <- c(rep(100, 260), rep(200, 260))
# 随机差异
xr <- rnorm(520)
# 考虑误差的真实差异
xm <- c(rep(100, 260), rep(200, 260)) + rnorm(520)
p <- pr <- pm <- c()
for (i in 1:10000) {
        # 随机化分组
        g <- factor(sample(c(1, 2), 520, replace = T))
        p[i] <- t.test(x ~ g)$p.value
        pr[i] <- t.test(xr ~ g)$p.value
        pm[i] <- t.test(xm ~ g)$p.value
}
# 显示中文
library('showtext')
showtext_auto()
par(mfrow = c(1, 3))
# 展示真实差异t检验下p值的分布
hist(
        p,
        breaks = 100,
        main = substitute(paste('存在真实差异时', italic('p'), "值分布")),
        xlab = substitute(paste(italic('p'), "值")),
        ylab = '频率'
)
# 展示随机差异t检验下p值的分布
hist(
        pr,
        breaks = 100,
        main = substitute(paste('不存在真实差异时', italic('p'), "值分布")),
        xlab = substitute(paste(italic('p'), "值")),
        ylab = '频率'
)
# 展示考虑误差的真实差异t检验下p值的分布
hist(
        pm,
        breaks = 100,
        main = substitute(paste('存在真实差异与噪声时', italic('p'), "值分布")),
        xlab = substitute(paste(italic('p'), "值")),
        ylab = '频率'
)
set.seed(42)
# 生成均匀分布
ref <- runif(10000)
par(mfrow = c(1, 3))
# 用分位图对比均匀分布与不同的p值分布
qqplot(ref, p, xlab = '均匀分布', ylab = substitute(paste('存在真实差异时', italic('p'), "值分布")))
qqplot(ref, pr, xlab = '均匀分布', ylab = substitute(paste('不存在真实差异时', italic('p'), "值分布")))
qqplot(ref, pm, xlab = '均匀分布', ylab = substitute(paste('存在真实差异与噪声时', italic('p'), "值分布")))
set.seed(1)
# 固定分组
g <- factor(c(rep(1, 260), rep(2, 260)))
p <- c()
for (i in 1:10000) {
        # 随机化采样
        x <-  sample(c(rep(100, 260), rep(200, 260)) + rnorm(520), 520)
        p[i] <- t.test(x ~ g)$p.value
}
par(mfrow = c(1, 2))
hist(
        p,
        breaks = 100,
        main = substitute(paste('采样随机时', italic('p'), "值分布")),
        xlab = substitute(paste(italic('p'), "值")),
        ylab = '频率'
)
qqplot(ref, p, xlab = '均匀分布', ylab = substitute(paste('采样随机时', italic('p'), "值分布")))
library(scifigure)
exps <- init_experiments(2)
exps[c("analysis_plan","data"), 2] <- "unobserved"
exps[c("experimenter", "analyst", "estimate","claim"), 2] <- "different"
exps["code", 2] <- "incorrect"
hide_stages = NULL
sci_figure(exps)
# 代码源自animation包quincunx函数
op = par(mar = c(1, 0.1, 0.1, 0.1), mfcol = c(4, 1))
nmax = 10000+15-2
# 15层钉板
layers = 15
# 10000个小球
balls = 10000
# 模拟三层钉板
layerx = layery = newlayerx = newlayery = NULL
flagi = ifelse(layers%%2, 1, 0)
for (i in 1:layers) {
        if (flagi) {
                newi = ifelse(i%%2, 1, 2)
        }
        else {
                newi = ifelse(i%%2, 2, 1)
        }
        layerx = c(layerx, seq(0.5 * (i + 1), layers - 0.5 * 
                                       (i - 1), 1))
        layery = c(layery, rep(i, layers - i + 1))
        if (i > 1) {
                newlayerx = c(newlayerx, seq(0.5 * (newi + 1), layers - 
                                                     0.5 * (newi - 1), 1))
                newlayery = c(newlayery, rep(i, layers - newi + 1))
        }
}
# 模拟小球过钉板
ballx = bally = matrix(nrow = balls, ncol = nmax)
finalx = newfinalx = numeric(balls)
# 第一层钉板
for (i in 1:balls) {
        ballx[i, i] = (1 + layers)/2
        if (layers > 2) {
                tmp = rbinom(layers - 2, 1, 0.5) * 2 - 1
                ballx[i, i + 1:(layers - 2)] = cumsum(tmp) * 0.5 + 
                        (1 + layers)/2
        }
        bally[i, (i - 1) + 1:(layers - 1)] = (layers - 1):1
        finalx[i] = ballx[i, i + layers - 2]
}
# 第二层钉板
rgx = c(1, layers)
rgy = c(0, max(table(finalx)))
newballx = ballx
diag(newballx) = finalx
for (i in 1:balls) {
        tmp = rbinom(layers - 2, 1, 0.5) * 2 - 1
        tmp = ifelse(newballx[i, i] + cumsum(tmp) < rgx[2], tmp, 
                     -1)
        tmp = ifelse(newballx[i, i] + cumsum(tmp) > rgx[1], tmp, 
                     +1)
        newballx[i, i + 1:(layers - 2)] = newballx[i, i] + cumsum(tmp) * 
                0.5
        newfinalx[i] = newballx[i, i + layers - 2]
}
# 绘制钉板与分布图
plot(1:layers, type = "n", ann = FALSE, axes = FALSE)
points(layerx, layery, pch = 19)
hist(finalx,breaks = 1:layers,main = "", xlab = "", ylab = "", ann = FALSE, axes = FALSE, xlim = rgx, ylim = rgy)
plot(1:layers, type = "n", ann = FALSE, axes = FALSE)
points(newlayerx, newlayery, pch = 19)
hist(newfinalx,breaks = 1:layers,main = "", xlab = "", ylab = "", ann = FALSE, axes = FALSE, xlim = rgx, ylim = rgy)
tb <- rbind.data.frame(
        stringsAsFactors = FALSE,
        对照组 = c(34,13,13/47,16,12,12/28,18,1,1/19),
        服药组 = c(38,11,11/49,4,8,8/12,34,3,3/37)
        )
tb <- round(tb,2)
colnames(tb) <- c('总康复','总死亡', '总病死率','男性康复','男性死亡', '男性病死率','女性康复','女性死亡', '女性病死率')
rownames(tb) <- c('对照组','服药组')
knitr::kable(tb
             , booktabs = TRUE,
             caption = '辛普森悖论'
)
knitr::include_graphics('data/gerrymandering.png')
# 谢林隔离模型,代码源于 https://simulatingcomplexity.wordpress.com/2016/01/06/building-a-schelling-segregation-model-in-r/
# 生成单元格矩阵,两种颜色随机分布
number<-2000
group<-c(rep(0,(51*51)-number),rep(1,number/2),rep(2,number/2))
grid<-matrix(sample(group,2601,replace=F), ncol=51)
# 找邻居函数
get_neighbors<-function(coords) {
        n<-c()
        for (i in c(1:8)) {
                
                if (i == 1) {
                        x<-coords[1] + 1
                        y<-coords[2]
                }
                
                if (i == 2) {
                        x<-coords[1] + 1
                        y<-coords[2] + 1
                }
                
                if (i == 3) {
                        x<-coords[1]
                        y<-coords[2] + 1
                }
                
                if (i == 4) {
                        x<-coords[1] - 1
                        y<-coords[2] + 1
                }
                
                if (i == 5) {
                        x<-coords[1] - 1
                        y<-coords[2]
                }
                
                if (i == 6) {
                        x<-coords[1] - 1
                        y<-coords[2] - 1
                }
                
                if (i == 7) {
                        x<-coords[1]
                        y<-coords[2] - 1
                }
                
                if (i == 8) {
                        x<-coords[1] + 1
                        y<-coords[2] - 1
                }
                
                if (x < 1) {
                        x<-51
                }
                if (x > 51) {
                        x<-1
                }
                if (y < 1) {
                        y<-51
                }
                if (y > 51) {
                        y<-1
                }
                n<-rbind(n,c(x,y))
        }
        n
}
par(mfrow=c(1,2))
image(grid,col=c("black","blue","yellow"),axes=F)
# 设定喜好度,此处设定为50%,也就是单元格里人周围少于四个单元格的人与自己颜色相同时,这个人就会随机搬家到另一个单元格
alike_preference<-0.5
# 模拟搬家十次
for (t in c(1:10)){
        happy_cells<-c()
        unhappy_cells<-c()
        for (j in c(1:51)) {
                for (k in c(1:51)) {
                        current<-c(j,k)
                        value<-grid[j,k] 
                        if (value > 0) {
                                like_neighbors<-0
                                all_neighbors<-0
                                neighbors<-get_neighbors(current)
                                for (i in c(1:nrow(neighbors))){
                                        x<-neighbors[i,1]
                                        y<-neighbors[i,2]
                                        if (grid[x,y] > 0) {
                                                all_neighbors<-all_neighbors + 1
                                        }
                                        if (grid[x,y] == value) {
                                                like_neighbors<-like_neighbors + 1
                                        }
                                }
                                if (is.nan(like_neighbors / all_neighbors)==FALSE) {
                                        if ((like_neighbors / all_neighbors) < alike_preference) {
                                                unhappy_cells<-rbind(unhappy_cells,c(current[1],current[2]))
                                        }
                                        else {
                                                happy_cells<-rbind(happy_cells,c(current[1],current[2]))
                                        }
                                }
                                
                                else {
                                        happy_cells<-rbind(happy_cells,c(current[1],current[2]))
                                }
                        }
                }
        } 
        rand<-sample(nrow(unhappy_cells))
        for (i in rand) {
                mover<-unhappy_cells[i,]
                mover_val<-grid[mover[1],mover[2]]
                move_to<-c(sample(1:51,1),sample(1:51,1))
                move_to_val<-grid[move_to[1],move_to[2]]
                while (move_to_val > 0 ){
                        move_to<-c(sample(1:51,1),sample(1:51,1))
                        move_to_val<-grid[move_to[1],move_to[2]]
                }
                grid[mover[1],mover[2]]<-0
                grid[move_to[1],move_to[2]]<-mover_val
        }
}
# 观察此时的单元格颜色分布状况
image(grid,col=c("black","blue","yellow"),axes=F)
suppressMessages(library(FrF2))
pb(12,nfactors = 9)
plan.annotated <- pb(12,nfactors = 9)
response <- c(35, 36, 38, 39, 37, 36, 39, 37, 41, 32, 42, 37)
plan.resp <- add.response(plan.annotated, response)
MEPlot(plan.resp, abbrev = 5, cex.xax = 1.6, cex.main = 2)
summary(lm(plan.resp))
halfnormal(plan.resp)
show.oas(nruns = c(0, 54), nlevels = c(2, 3, 3, 2, 2, 6), showmetrics = TRUE)
# 设计一个三因素三水平的实验
test <- oa.design(L36.2.10.3.8.6.1, nlevels = c(3, 3, 3),columns = "min34")
oa.design(L36.2.10.3.8.6.1, nlevels = c(2, 3, 3, 2, 2, 6), columns = "min34")
# 这里我们故意设计一个A因素无影响,B与C因素有影响但C影响大的响应
response <- apply(as.data.frame(test),1,function(x) sum(as.numeric(x)%*%c(0,20,100)))
test.resp <- add.response(test, response)
summary(aov(test.resp))
summary(lm(test.resp, response = "response"))
plot(test.resp)
# 读入鸢尾花数据集,150个样本及其花萼长度/宽度,花瓣长度/宽度还有种属
data("iris")
# 一维可视化花萼长度
hist(iris$Sepal.Length, xlab = '花萼长度', ylab = '频数', main = '')
# 二维可视化花萼长度与宽度的关系
plot(iris$Sepal.Length~iris$Sepal.Width,xlab = '花萼宽度', ylab = '花萼长度', pch = 19)
# 三维可视化花萼长度、宽度及种属的关系
plot(iris$Sepal.Length~iris$Sepal.Width,xlab = '花萼宽度', ylab = '花萼长度', col= iris$Species, pch = c(15,17,19)[as.numeric(iris$Species)])
legend('topright',legend = unique(iris$Species), col = unique(iris$Species), pch = c(15,17,19))
# 利用样本相关性探索样本间关系,这里用32辆车的10维测试数据
cor <- cor(t(mtcars))
# 相关系数阈值0.99
cor[cor<0.99] <- 0
df <- data.frame(from=rownames(mtcars)[which(lower.tri(cor), arr.ind = T)[, 1]],to=rownames(mtcars)[which(lower.tri(cor), arr.ind = T)[, 2]],cor=cor[lower.tri(cor)])
df <- df[abs(df$cor)>0,]
# 用网络可视化
library(igraph)
library(ggraph)
net <- graph_from_data_frame(df,directed = F)
autograph(net,layout = 'fr',node_size = 3,)+
        geom_node_text(aes(label = name), repel = TRUE, 
                 point.padding = unit(0.2, "lines")) +
        guides(size = 'none')+
        theme_void()
set.seed(42)
# 随机数的10000次比较
pvalue <- NULL
for (i in 1:10000) {
  a <- rnorm(10)
  b <- rnorm(10)
  c <- t.test(a, b)
  pvalue[i] <- c$p.value
}
# 看下p值分布
hist(
  pvalue,
  main = substitute(paste(italic('p'), "值分布")),
  xlab = substitute(paste(italic('p'), "值")),
  ylab = '频率'
)
# 小于0.05的个数
sum(pvalue < 0.05)
# 小于0.0001的个数
sum(pvalue < 0.0001)
set.seed(42)
pvalue <- NULL
for (i in 1:10000) {
  a <- rnorm(10, 1)
  b <- a + 1
  c <- t.test(a, b)
  pvalue[i] <- c$p.value
}
# 看下p值分布
hist(
  pvalue,
  main = substitute(paste(italic('p'), "值分布")),
  xlab = substitute(paste(italic('p'), "值")),
  ylab = '频率'
)
# 显示p值里小于0.05的个数
sum(pvalue < 0.05)
# 显示p值里小于0.0001的个数
sum(pvalue < 0.0001)
set.seed(42)
pvalue <- NULL
for (i in 1:5000) {
  a <- rnorm(10, 1)
  b <- a + 1
  c <- t.test(a, b)
  pvalue[i] <- c$p.value
}
for (i in 1:5000) {
  a <- rnorm(10, 1)
  b <- rnorm(10, 1)
  c <- t.test(a, b)
  pvalue[i + 5000] <- c$p.value
}
# 看下p值分布
hist(
  pvalue,
  main = substitute(paste(italic('p'), "值分布")),
  xlab = substitute(paste(italic('p'), "值")),
  ylab = '频率'
)
# 显示p值里小于0.05的个数
sum(pvalue < 0.05)
# 显示p值里小于0.0001的个数
sum(pvalue < 0.0001)
# 比较次数
n <- c(1:10 %o% 10 ^ (1:2))
# 整体出现假阳性概率
p0 <- 1 - (1 - 0.05) ^ n
# Bonferroni方法控制后的整体假阳性概率
p <- 1 - (1 - 0.05 / n) ^ n
# 不进行控制
plot(
  p0 ~ n,
  ylim = c(0, 1),
  pch = 19,
  xlab = '测试数',
  ylab = '整体错误率(FWER)'
)
# Bonferroni方法控制
points(p ~ n, pch = 17, col = 'grey')
legend('right',
       c('Bonferroni方法', '无矫正'),
       pch = c(17,19),
       col = c('grey','black'))
# 所有有差异的
R <- sum(pvalue<0.05)
R
# 假阳性
V <- sum(pvalue[5001:10000]<0.05)
V
# 错误发现率
Q <- V/R
Q
# 所有有差异的
R <- sum(pvalue<0.01)
R
# 假阳性
V <- sum(pvalue[5001:10000]<0.01)
V
# 错误发现率
Q <- V/R
Q
# BH法控制错误发现率
pbh <- p.adjust(pvalue, method = 'BH')
# holm法控制错误发现率
ph <- p.adjust(pvalue, method = 'holm')
plot(pbh ~ pvalue,
     ylab = '错误发现率(FDR)',
     xlab = substitute(paste(italic('p'), "值")),
     pch = 19)
points(ph ~ pvalue, pch = 17, col = 'grey')
legend('bottomright',
       c('Holm 法', 'BH 法'),
       col = c('grey', 'black'),
       pch = c(17,19))
library(qvalue)
q <- qvalue(pvalue)
# q值
plot(
  q$qvalues ~ pvalue,
  ylab = substitute(paste(italic('q'), "值")),
  xlab = substitute(paste(italic('p'), "值"))
)
set.seed(42)
pvalue <- NULL
for (i in 1:500) {
  a <- rnorm(10, 1)
  b <- a + 1
  c <- t.test(a, b)
  pvalue[i] <- c$p.value
}
for (i in 1:9500) {
  a <- rnorm(10, 1)
  b <- rnorm(10, 1)
  c <- t.test(a, b)
  pvalue[i + 500] <- c$p.value
}
pbh <- p.adjust(pvalue, method = 'BH')
q <- qvalue(pvalue)
plot(pbh ~ pvalue,
     ylab = '错误发现率(FDR)',
     xlab = substitute(paste(italic('p'), "值")),
     pch = 15)
# Q值
points(q$qvalues ~ pvalue, pch = 16, col = 'grey')
legend(
  'bottomright',
  c(expression(paste(italic(
    "q"
  ), " 值")), 'BH 法'),
  pch = c(16,15),
  col = c('grey','black')
)
set.seed(42)
a <- runif(100,min=0,max=10)+rnorm(100)
b <- a*1.2+rnorm(100)
c <- b*1.2+rnorm(100)
y <- a+b+c+rnorm(100)
summary(lm(y~a))
summary(lm(y~a+b+c))
knitr::include_graphics("data/PCA.png")
# remotes::install_github("yufree/scifetch")
library(scifetch)
library(lubridate)
library(dplyr)
library(tidytext)
library(stringr)
library(ggplot2)
library(tidyr)
library(broom)
library(purrr)
library(scales)
# 10年跨度 MeSH 关键词 期刊ES&T
query <- '"mass spectrometry"[MeSH Terms] AND 2010/01:2020/01[DP] AND 0013-936X[TA]'
tmdf <- getpubmed(query, start = 1, end = 10000) %>%
        getpubmedtbl() %>%
        mutate(time = as.POSIXct(date, origin = "1970-01-01"),
         month = round_date(date, "month"))
# 摘要分词
wordfabs <- tmdf %>%
        filter(nchar(abstract) > 0) %>%
        unnest_tokens(word, abstract,drop = F) %>%
        anti_join(stop_words) %>%
        filter(str_detect(word, "[^\\d]")) %>%
        filter(!str_detect(word, "abs")) %>%
        group_by(word) %>%
        mutate(word_total = n()) %>%
        ungroup() %>%
        mutate(source = 'abstract')
# 可视化词频前20的关键词
wordfabs %>%
        count(word, sort = TRUE) %>%
        top_n(20,n) %>%
        mutate(word = reorder(word, n)) %>%
        ggplot(aes(word, n)) +
  geom_col(show.legend = FALSE) +
  ggtitle("摘要中前20常见词") +
  ylab("词频") +
  xlab("词") +
  coord_flip()
papers_per_month <- tmdf %>%
  group_by(month) %>%
  summarize(month_total = n())
# 摘要中关键词
word_month_counts <- wordfabs %>%
  filter(word_total >= 100) %>%
  count(word, month) %>%
  complete(word, month, fill = list(n = 0)) %>%
  inner_join(papers_per_month, by = "month") %>%
  mutate(percent = n / month_total) %>%
  mutate(year = year(month) + yday(month) / 365) %>%
        filter(percent<1)
# 计数数据广义二项回归
mod <- ~ glm(cbind(n, month_total - n) ~ year, ., family = "binomial")
# 计算斜率
slopes <- word_month_counts %>%
  nest(-word) %>%
  mutate(model = map(data, mod)) %>%
  mutate(models = map(model,tidy)) %>%
  unnest(cols = c(models)) %>%
  filter(term == "year") %>%
  arrange(desc(estimate))
# 快速成长关键词
slopes %>%
  head(9) %>%
  inner_join(word_month_counts, by = "word") %>%
  mutate(word = reorder(word, -estimate)) %>%
  ggplot(aes(month, n / month_total, color = word)) +
  geom_line(show.legend = FALSE) +
  scale_y_continuous(labels = percent_format()) +
  facet_wrap(~ word, scales = "free_y") +
  expand_limits(y = 0) +
  labs(x = "年份",
       y = "摘要中含有该关键词的百分比",
       title = "增长率最快的9个词"
              )
# 衰退关键词
slopes %>%
  tail(9) %>%
  inner_join(word_month_counts, by = "word") %>%
  mutate(word = reorder(word, estimate)) %>%
  ggplot(aes(month, n / month_total, color = word)) +
  geom_line(show.legend = FALSE) +
  scale_y_continuous(labels = percent_format()) +
  facet_wrap(~ word, scales = "free_y") +
  expand_limits(y = 0) +
  labs(x = "年份",
       y = "摘要中含有该关键词的百分比",
       title = "衰退最快的9个词"
              )
library(widyr)
library(igraph)
library(ggraph)
# 计算两个词同时出现在摘要的频率,词频用边的宽度来表示
word_pairs <- wordfabs %>%
        pairwise_count(word,line,sort = TRUE)

set.seed(42)
word_pairs %>%
  filter(n >= 150) %>%
  graph_from_data_frame() %>%
  ggraph(layout = "fr") +
  geom_edge_link(aes(edge_alpha = n, edge_width = n), edge_colour = "cyan4") +
  geom_node_point(size = 1) +
  geom_node_text(aes(label = name), repel = TRUE, 
                 point.padding = unit(0.2, "lines")) +
  labs(title = "摘要中的词对(Bigrams)") +
  theme_void()
desc_dtm <- wordfabs %>%
        count(line, word, sort = TRUE) %>%
        ungroup() %>%
        cast_dtm(line, word, n)

library(topicmodels)
# 潜在狄利克雷分布模型寻找6个潜在的子领域
desc_lda <- LDA(desc_dtm, k = 6, control = list(seed = 42))
tidy_lda <- tidy(desc_lda)

top_terms <- tidy_lda %>%
  group_by(topic) %>%
  top_n(10, beta) %>%
  ungroup() %>%
  arrange(topic, -beta)

top_terms %>%
  mutate(term = reorder(term, beta)) %>%
  group_by(topic, term) %>%    
  arrange(desc(beta)) %>%  
  ungroup() %>%
  mutate(term = factor(paste(term, topic, sep = "__"), 
                       levels = rev(paste(term, topic, sep = "__")))) %>%
  ggplot(aes(term, beta, fill = as.factor(topic))) +
  geom_col(show.legend = FALSE) +
  coord_flip() +
  scale_x_discrete(labels = function(x) gsub("__.+$", "", x)) +
  labs(title = "6个子领域主题的前10关键词",
       x = NULL, y = expression(beta)) +
  facet_wrap(~ topic, ncol = 2, scales = "free")
# 10年跨度
query <- 'janusz pawliszyn[AU] AND 2010/01:2020/01[DP]'
tmdf <- getpubmed(query, start = 1, end = 10000) %>%
        getpubmedtbl() %>%
        mutate(time = as.POSIXct(date, origin = "1970-01-01"),
         month = round_date(date, "month"))
# 给出发表数前10的期刊
table(tmdf$journal)[order(table(tmdf$journal),decreasing = T)][1:10]   
knitr::include_graphics("data/SWOT.png")
knitr::include_graphics("data/Eisenhower.png")