picture from 500px by David Detko
本文为译文,原文作者:Sandve GK
译文首发于唧唧堂,译者:唧唧堂研究人 Wen
研究的可重复性是基础。然而,新的工具和技术、大量的数据、跨学科的方法、以及问题本身的复杂性都让重复工作变得愈加繁杂,也为科研人员的工作推进施加了更多压力。由于完全通过独立收集数据的方式重复研究是不可行的,大家急切地渴望着一个简单、可行的标准来检验研究的可重复性。这要求实证研究类的文章详细描述结果、并且给出清晰的流程,从而允许他人基于原始数据成功地进行重复分析。
最近,有研究发现,很多科研文章都遗漏了对于重复实验来说至关重要的细节,这更强调了可重复的重要性。已发表数据难以重复,越来越多的文章被召回,大量临床实验失败,这些问题引发了广泛的讨论:研究者、研究机构、资金提供方、以及学术刊物应该建立一套程序,从而增加学术透明和可重复性。也就是说,学术界应该为计算研究发展出一种“可重复文化”,并在出版申明里强调这一点。
可重复性并不仅仅是科学界的一种道德责任,对于任何一个研究者来说,可重复性的缺失都会是一种负担。比如,可重复性使得以前研究出的方法论能够被用于新的数据,原来的代码和结果也能够在新项目中继续发挥作用。换句话说,可重复性在长期的研究中大大节省了时间。
和许多技术和习惯一样,可重复性可以使研究过程更加有效、实际。我们所写下的十个黄金法则具体探讨到了可重复性的各个方面,并且讨论了在处理信息和追踪程序时所需注意的内容。如果你正使用准系统来进行生物信息分析,比如,运行各种各样的自定义脚本,你可能需要掌握所有的法则;但如果你使用一个整合的框架来进行分析,系统就已经为其中许多法则提供了支持,你仅仅需要学会利用我们所提出的这些可能性。
在实际情况中,由于发表文章的压力和截止日期,研究者可能需要在理想的可重复性和尽快发表研究之间做出权衡。当然,这两件事本身就是相关的。当大量数据分析都没有取得结果的时候,这种权衡尤其重要。但常见的情况是,人们开始考虑本来可以保证可重复性的那些机会的时候已经太迟了。我们相信,用来标注错误分析方法的那些宝贵的时间成本,是完全可以由可重复性带来的好处抵消掉的。
至少,你应该保证自己能够重复出结果,这是有影响力的研究的基本要求,它能让未来针对该研究提出的任何问题获得准确的解释。尽管这听起来是个很简单的要求,但它同样需要一定程度的小心和谨慎。它需要所使用的软件的版本、参数的量、预处理步骤等一系列数据的结合,而没能记录这些就意味着失去了实现可重复性的关键步骤。
除了这些最基本的要求,我们还可以期待更多。你可以从为了防止遭到批评而重复结果的级别,进展到真正再次利用你之前的工作、同时增加自己研究的可重复性的级别;此外,你还应该保证同行们能够重复你的结果,这能增加大家对你的研究和引用次数。
picture from 500px by Dina Belenko
法则一:记录得出所有结果的过程
只要得到的结果可能有价值,就记录下得到结果的过程。做这件事的时候,研究者经常会发现从原始数据到最终结果之前有许多相互关联的步骤(例如命令、脚本、程序),我们所说的就是这一系列工作流程,不论是自动完成的还是手动完成的。尽管分析中的关键部分通常仅仅是其中某一个步骤,对于获得结果而言,整个预处理和关键部分之后的流程都是必要的。你必须保证完整记录下了与执行这些步骤有关的每一个细节。如果这些步骤是由电脑完成的,这些细节就包括软件的名称和版本,以及所使用的参数和输入内容。
尽管手动记录步骤能够保证重复分析,但记录下的文件很可能跟最后的版本不一致。更好的方法是详细记录能够直接对照着操作的那些完整的工作流程,这样就可以保证记录和分析一致,你自己和其他人都可以重复进行分析。这类执行过程的描述形式可以是shell脚本、生成文件、命令行,以及以其他形式储存的工作流程。
至少,你应该足够细致地记录程序、参数和手动操作过程,从而允许你自己在一年内仍能重复得到结果。
法则二:避免进行手动更改数据的步骤
如果可能的话,依靠执行程序来修改数据,不要进行手动操作。这类手动操作大多低效、容易出错,而且难以重复。如果你是用UNIX命令行,通常可以用标准的UNIX命令或者一些自定义脚本完成修改工作。如果你使用成型的框架,通常也有很多用于修改数据的元件。比方说,为了兼容格式而手动调整数据文件这一流程,就可以用格式转换器代替。另外一些手动操作,比如文件之间的复制粘贴,也是可以避免的。如果实在不能避免手动操作,不论出于任何意图,你至少应该记录修改和移动数据文件的过程。
picture from 500px by Dina Belenko
法则三:保存所使用的程序版本
为了精确地重复结果,可能需要使用最初得到结果时使用的程序版本。由于不同版本的输入和输出格式也可能改变,有些程序的新版本甚至不能在不调整输入的前提下运行文件。有时即使标注了所使用的版本,对着现行的版本也什么都做不了。保存所使用的程序版本能够省却大量的麻烦。有些情况下,你所需要的仅仅是保存一个简单的执行文件或源代码。但另外一些情况下,某些程序还有安装其他程序/软件包的要求,或者依赖某种特定的操作系统。为了保证将来依然可以使用它们,唯一可行的办法就是保留整个系统和程序。至少,你应该记录下所使用的版本。
法则四:版本决定自定义脚本
对于计算机程序而言,即使是最小的变化也会产生巨大的后果,不管你本来想不想要这种后果。当你使用一种能够持续改变的代码(比如某种小型脚本)来得到某个结果的时候,即使你输入同样的数据和参量,也只有脚本当时的状态能够得到那个结果。也看看法则三和法则六吧,对于重复某些结果来说,特定的环境是飞铲必要的。如果计算机代码没有系统地存档,回溯代码状态就是不可能的。这会引起人们对之前结果的质疑,因为他们无法知道这一结果是否出现过故障或者其它不幸的问题。
回溯代码演化过程的标准做法是使用一个版本控制系统,比如Subversion,Git,或者Mercurial。这些系统易于安装和使用,而且可以系统保存代码的状态。
至少,你应该随时保存你的脚本副本,这样你就大概能知道代码状态发生的变化。
法则五:尽可能用标准格式记录所有的中间结果
原则上,在重现一个结果的时候,所有的中间数据也都可以重新得到。实际上,容易获得中间数据会带来很多好处。看一眼中间结果就能大概看到距离你所期望的还差多少,而且还能检查是否出现最终结果并不能展现的故障和错误。其次,中间数据还能直接呈现出各个步骤上备选的程序和参数得到的结果。第三,在完整的过程还没有准备好执行的时候,可以通过中间数据重复运行各个部分。第四,重现结果时,如果出现了不一致的情况,中间数据可以帮助我们找到产生问题的步骤。第五,中间数据可以检查结果背后的整个流程,而不需要再进行执行操作。可能的话,用标准格式记录中间结果。至少你可以在跑程序的时候把所有中间数据存档(只要存储空间允许)。
picture from 500px by Dina Belenko
法则六:分析过程涉及到随机时,记录随机种子
许多分析和预测都涉及到随机,这就意味着同一个程序可能会得到不同的结果。不过,拥有同一个随机种子的话,所有的随机值就都是相等的,这样每次跑程序就能得到同样的结果。观测到的精确结果与大约相等的结果之间存在很大差异。得到完全相等的结果就能充分证明程序的可重复性,而仅有大致相等的结果则不能得出任何结论。对于涉及到随机值的分析而言,这就意味着必须记录随机种子。在为随机值生成器提供随机种子的情况下,将来还能重复得到结果。至少,你应该记录那些步骤涉及到随机,所以在重复得到结果时,你就可以预期到可能出现的差异情况
法则七:始终保留图片的原始数据
图片从第一次生成到最终发表出来,可能会经过多次的修改。在一些情况下,修改可能只是为提高可读性、或者保证视觉上的一致性而进行的视觉调整。如果图片背后的原始数据得到了系统的保存,研究者就很容易找到图片的原始数据,从而调整绘图程序,而不是重新跑一遍整个分析过程。这样做的另一个优势是,如果有人想要查询图片中的数值,只要查原始数据就好了。由于许多绘图过程都包含把数据可视化的步骤,保存原始数据和可视化的结果都是必要的。比如说柱状图,集合之前的原始数据和放进每个盒子里的数(也就是可视化的柱)都应该保存。如果使用异命令为基础的系统来画图,比如R,存储绘图代码是很方便的。研究者只要对命令做出一些简单的修改就好了。至少,研究这应该记录图片涉及了那些数据、以及如何重建这些数据。
法则八:生成层次分析结果时,检查层级增长的细节
最终呈现在文章里的结果图和表,常常只能代表高度总结果的数据。比如,曲线上的每个值都只代表者某个属性的平均值。为了充分理解结果,常常需要检查总结之下的细节数值。最常用的、也是不实际的一种方式是在程序和脚本的源代码中加上除错的结果。在储存空间允许的情况下,更好的方法是简化生成主要结果时的其它输出内容,使用系统命名协议来保证可以通过总结的数值找到完整的数据。对此,我们发现超文本(例如html文件)相当有用,在生成结果的同时我们还能得到链接,只需要简单地点击就可以找到总结性的数值背后的所有数据。使用总结性的结果时,你至少应该对结果背后的细节数据完成一次生成、检查和证实的工作。
picture from 500px by Dina Belenko
法则九:将文本说明与其背后的结果联系起来
通常在研究项目中会进行各种各样的分析、以及根据这些结果的道德不同解释。尽管分析结果和对应的文本解释在概念上市相互联系的,在表达上,他们仍然是分离的:数据结果通常储存在伺服器或者个人电脑的数据区域,而文本形式的解释则出现在个人笔记以及发给合作者的邮件中。由于文本解释并不仅仅是数据的影子——文本中还有基于其它理论和结果做出的解释。所以,这些文本从数据中获得支持的同时,还携带着额外的信息。
如果你想要重新测量你之前的解释,或者允许同行为你发表的论断做出他们自己的检验,你就需要把给定的文本说明(解释、论断、结论等)和精确的结果联系起来。联系两者的过程可能很困难、甚至容易出错,因为你得在大量不同的分析和各个版本的内容中找到数据结果与其支持的文字。
为了提高回溯文本背后的数据的效率,我们建议,在一开始形成文本的时候就把数据和文本对应起来。这种联系可以仅仅是文件路径、分析框架中的结果ID、以及文本本身。要形成更加紧密的联系,还可以使用一些易于获取的工具,比如Sweave,GenePattern Word add-in,以及Galaxy Pages等,都能帮助研究者进行可重复分析。这些解决方法还可以用来将发表的文章联系在一起,这一点我们会在法则十当中讨论。
至少,你应该在提供文本说明的同时提供足够的细节和数据,从而方便未来的回溯。
法则十:公开脚本、运行和结果
最后,所有的输入数据、脚本、版本、参数、中间结果都应该公开、易于获取。现在有很多办法可以让分享数据的过程变得更加方便、标准化、在特定的域名直接获取,基因表达数据就是这样的。许多期刊允许文章提供在线补充材料,而有些期刊做出了更多努力,他们在发表文章的同时也带上了数据和代码。至少,你应该把主要数据和源代码作为补充材料上传,而且准备好回答同行关于数据和方法论的问题。
让你的工作能够被同行所重复,这意味着你的工作具有高质量、值得信任、并且是透明的。这也能够让你的文章得到更好、更快的评审,你的工作也更容易发表出来,更容易得到同行的引用和进一步的探索。
文章原文:
http://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1003285