不知道刚接触科研的大伙儿有没有这么一个感觉,别人的研究很大可能你重复不出来,尤其是社科实证研究,到现在我都还觉得所谓的实证是个很玄乎的东西;

如果是刚开始做数据分析,很多时候你会发现自己的分析结果过几天自己都重复不出来。反正我自己是有这样的经历的。有可能是某一步操作忘记了,自己都不知道,尤其是用菜单式的分析软件,比如spss,少点一下按钮结果都可能不一样,这种问题没人摆上来说,但实际上是很普遍的。

细节的无心失误大概率不会影响到结果,但是大家毕竟是在做“科研”!严格来说还是在做比较神圣的工作,这个问题一天不解决,自己不去关心,课题组也不关心,课题负责人不关心,你自己应该感到不安的,应该对所谓的“科研”感到不安,应该对自己正在做的事和自己的前途和科学的发展感到不安。

虽然自己已经脱离学术界,但是仍然认为这个问题确实是一个很大的问题,社会科学想要真正的发展,自己的工作自己都重复不出来,你这不是来搞笑嘛。

Recently, researchers across the health, behavioral, and social sciences have become increasingly concerned with the reproducibility of research. The concern ranges from asserting that “most claimed research findings are false” (Ioannidis 2005, pg. 696) to “we need to make substantial changes to how we conduct research,” (Cumming 2014, abstract). Some have come to refer to the situation as a “reproducibility crisis”

这种情况有一个叫法,叫做科研的可重复危机“reproducibility crisis”,这个东西在国内应该有更多人站出来呼吁才行,至少我读书的时候没接触过,个人感觉这个理念应该作为科研入门第一课来加以强调。

可重复危机

科研的可重复性包括3个大的方面:

  • 方法的可重复:指的是我可以仅仅根据用你文章中描写的操作,如果有相同数据的话就能够重复出来你的分析方法。
  • 结果的可重复:指的是我用和你一样的方法,如果还能拿到你的原始数据,那么我可以做出来和你一样的结果。
  • 结论的可重复:指的是我自己根据你文章的描述去模仿着做你的研究,我能得到和你一样的结论。

方法的可重复强调的是你写文章的时候方法部分要将分析步骤写详细,结果的可重复强调的是你要主动分享已发表文献的原始数据,供同行做可重复检验;结论的可重复强调是你没有选择性报告结果。

这个就是研究真实性的3条硬杠杠。

上面的3点都做到,都大面积推行,那科研作假肯定会少很多,尤其是在社会科学领域,具体怎么样去保证实施,社会科学领域的科研工作者愿不愿意去落地实施,阻力有多大,我这个小屁民就关心不到了,不过还是希望科研管理部门能够积极推动,研究生教育管理部门能够对这方面强调并加以切实落实,杂志发表审稿也应该加以规范。

今天要给大家介绍的是保证大家自己能完全重复自己研究的方法,咱先做好自己,解决自己的可重复危机。就是学会使用Rmarkdown。

Rmarkdown

学了这个Rmarkdown科研就可重复了?就没有危机了?逻辑在哪里?

逻辑就在于Rmarkdown是一个闭环,本身是一个self-contained的东西。中间有任何地方出错就knit不了,你就出不了结果。就意味着你只要这一次knit得出结果,然后将文件保存好,之后你无论将文件放到天荒地老,哪天想起来复现下结果,你都保证可以做得到。逻辑就在这。

The document’s code must be fully self-contained. That means, anything you want it to run has to be in the document, regardless of what you’ve already run outside of knitting. For example, if we are testing our code and running it throughout, when we go to knit. It will re-run everything in the document and forget everything else you’ve done that is not in the document.

这样就相当使用于Rmarkdown就强制性要求你的工作流程是捋的清清楚楚的,不能有任何错误,流程捋通顺后就可以一键复现,并且别的研究者只要拿到你的Rmarkdown文件,也可以一键复现你的整个工作。

In fact, it makes it so another research could reproduce your work by just downloading and running your R Markdown document. This removes all guesswork for others regarding your data analysis and reporting.

大家可以理解为作为一个self-contained的系统,我们喂给Rmarkdown原始数据和代码再将论文文本内容整合进去就可以随时复现或者直接发表。

上面就是Rmarkdown保证你的工作可以随时重复的逻辑。下面就给大家写Rmarkdown的基础实操:

第一次写Rmarkdown,我们还是从最基础的给大家介绍:

Rmarkdown就是在整合在R语言中的markdown,为什么要整合,就是为了把代码运行和文章写作放一起,而不是割裂开。markdown本身是一种文档格式,比如很多的平台都支持markdown写作,简书是吧,CSDN都是支持的,在Pandoc包的加持下,markdown文件又可以很方便地输出成丰富的文档格式,比如PDF,HTML,WORD等。

R Markdown was designed for easier reproducibility, since both the computing code and narratives are in the same document, and results are automatically generated from the source code. R Markdown supports dozens of static and dynamic/interactive output formats.

一个Rmarkdown文件包括三个基础的部分:metadata、text、code。

There are three basic components of an R Markdown document: the metadata, text, and code.

就是说我们使用Rmarkdown的基本流程就是首先写好metadata,然后写我们的markdown文本(文本中可嵌套R代码,代码块),最后输出成目标文件类型。这个就是一个完整的流程,这个流程跑下来,存好,就不用担心你的工作的重复性问题了。

Rmarkdown能输出的文件类型非常多,帮助你完成的任务非常多,比如下面这一大堆:做个PPT,写个Shiny应用都可以:

这些功能强烈鼓励大家自己去探索一番,我们今天给大家介绍了基础操作。然后重点就放在学术论文的可重复危机角度,重点给大家介绍Rmarkdown学术论文写作和帮助大家理解Rmarkdown能结局科研重复危机的逻辑。

操作基础

花里胡哨的东西没有,直接在Rstudio按照下面代码即可生成一个Rmarkdown文件:

首先是对metadata的也就是YAML Headers的操作,所谓的YAML标题就是Rmarkdown文档的第一块,长这样:

基础有4个参数,可以写标题,作者,时间和输出格式,还可以加目录,代码和对应的输出如下:

还可以通过theme参数设置不同的输出主题。

第二个部分是Rmarkdown中的代码部分,代码部分以```{r}开头,以```结尾,下图就是一个代码块,可以在这块地方写自己的R代码(平时怎么在script中怎么写,这儿就怎么写),通过R代码输出我们的统计结果:

大家可以注意到上图代码块开头有一些参数,比如setup,include,这些都是对该代码块进行显示控制的参数,setup是代码块的名字,include是控制该代码块是否运行的参数,还有echo是显示不显示代码的fig.width, fig.height, and fig.cap是控制输出图片的参数;还有message and warning是控制代码输出信息的参数

具体的语法原则在下图中有可以查阅,重点就是要反复练习,反复尝试才能掌握好:

剩下的部分就是用markdown语法写文本的部分,比如一个示例的Rmarkdown文件(Rstudio自带的)如下:

我们将这个Rmarkdown文件,Knit之后的输出设定为pdf就是下图右侧的样子。

可以看到输出的pdf中有图有表,有文字有结果。左边是分析代码右边是结果呈现,只要拿到左边的Rmarkdown文件右边的结果就可以一键,这个就是Rmarkdown的基本工作流程,保障了自己工作的随时可重复。

基础部分就写到这儿,接下来看利用Rmarkdown写学术论文。

用Rmarkdown写学术论文

我们明白了Rmarkdown解决科研的重复性危机和熟悉其基本工作流程之后,延申的应用就是用Rmarkdown来写科研论文,就是你将Rmarkdown中的text部分都换成你的论文内容,整个就变成了论文一键修改和一键复现,相当于不仅解决了统计结果的可重复,连论文格式本身也做到了可重复。

首先点击file然后找个学术出版社的模板(得安装rticles包):里面有各种系列杂志的模板的,比如IEEE,PLOS,Elsevier, Springer,MDPI等等还有预印本平台arXiv Preprint的模板,反正够你用的。

万一不行,上面还有自定义选项,啧啧啧。

我们依照springer出版社的模板来完成一篇示例论文:具体操作便是点击file-new file-Rmarkdown,然后点击上图中的From Template然后找到Springer journal,然后就会出来一个模板,我将作者标题做了改动(内容你都可以按照你实际论文的内容进行相应改动),如下:

然后点击Knit按钮,即可输出属于我的Springer发表格式的文献,如下图:

直接拿去投稿就行了。如果结果需要改动,直接改原来的Rmarkdown中的R代码即可。保障了自己工作的可重复性。

R数据分析:解决科研中的“可重复危机”,理解Rmarkdown的更多相关文章

  1. Android解决Intent中的数据重复问题

    转载地址:http://www.cnblogs.com/anrainie/articles/2383941.html 最近在研究Android,遇到了一些Notification(通知)的问题: .N ...

  2. 使用mysql的SUBSTRING_INDEX函数解决项目中编码非重复问题的实现方案!

    一 SUBSTRING_INDEX函数介绍 作用:按关键字截取字符串 substring_index(str,delim,count) 说明:substring_index(被截取字段,关键字,关键字 ...

  3. R数据分析:二分类因变量的混合效应,多水平logistics模型介绍

    今天给大家写广义混合效应模型Generalised Linear Random Intercept Model的第一部分 ,混合效应logistics回归模型,这个和线性混合效应模型一样也有好几个叫法 ...

  4. 解决VS2010中winsock.h与winsock2.h冲突(重复定义)——转载

    解决VS2010中winsock.h与winsock2.h冲突(重复定义)——转载 当这两个头文件顺序颠倒时,编译会出现许多莫名其妙的错误,错误如下: 1>…\include\ws2def.h( ...

  5. 大幅度改变celery日志外观,修改成日志可点击跳转和鲜艳五彩日志,解决脚本中已添加handler的logger和框架日志重复记录问题。

    大幅度改变celery日志外观,修改成日志可点击跳转和鲜艳五彩日志,解决脚本中已添加handler的logger和框架日志重复记录问题.打猴子补丁. 先把脚本中的所有logger的handlers全部 ...

  6. 【转】利用匿名namespace解决C++中重复定义的问题

    目录 利用匿名namespace解决C++中重复定义的问题 原文:https://blog.csdn.net/pi9nc/article/details/11267031 利用匿名namespace解 ...

  7. R数据分析:潜类别轨迹模型LCTM的做法,实例解析

    最近看了好多潜类别轨迹latent class trajectory models的文章,发现这个方法和我之前常用的横断面数据的潜类别和潜剖面分析完全不是一个东西,做纵向轨迹的正宗流派还是这个方法,当 ...

  8. Android ListView滑动过程中图片显示重复错乱闪烁问题解决

    最新内容建议直接访问原文:Android ListView滑动过程中图片显示重复错乱闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及L ...

  9. R数据分析:如何简洁高效地展示统计结果

    之前给大家写过一篇数据清洗的文章,解决的问题是你拿到原始数据后如何快速地对数据进行处理,处理到你基本上可以拿来分析的地步,其中介绍了如何选变量如何筛选个案,变量重新编码,如何去重,如何替换缺失值,如何 ...

  10. R语言作为BI中ETL的工具

    R语言作为BI中ETL的工具,增删改 R语言提供了强大的R_package与各种数据库进行数据交互. 外加其强大数据变换清洗函数,为ETL提供一条方便快捷的道路. RODBC ROracal RMys ...

随机推荐

  1. 重新编译Unity Mono遇到的坑,大坑,巨坑!!!

    因为项目需要,要整一个DLL热更功能,本身也想对DLL进行加密,所以需要修改Mono的代码,并重新编译.参考了网上的教程后,决定在linux下做重编的工作. 然而在实际执行的时候,一开始就碰到了巨大的 ...

  2. vue之数组的方法

    目录 简介 filter方法 简介 本文会把遇到的数组的方法慢慢补充进来 filter方法 filter()方法是一个过虑方法 以下面的为例:列表dataList会每次取一个值,把值给匿名函数,并执行 ...

  3. GitHub+Hexo 搭建博客网站

    Hexo是一款基于Node.js的静态博客框架,依赖少易于安装使用,可以方便的生成静态网页托管在GitHub和Heroku上,是搭建博客的首选框架. 配置Github root@hello:~/cby ...

  4. Java内部类的使用介绍详解

    前言 在之前讲解static静态内部类时,就给大家简单说过内部类的概念.但实际上,内部类并不是那么简单,所以今天我们需要对内部类进行专门地讲解和学习. 全文大约 [6500]字,不说废话,只讲可以让你 ...

  5. [Maven]探究settings.xml

    1 settings.xml的配置模块 1-1 localRepository The path to the local repository maven will use to store art ...

  6. 基于SqlSugar的开发框架循序渐进介绍(25)-- 基于SignalR实现多端的消息通讯

    基于ASP.NET Core SignalR 可以实现客户端和服务器之间进行即时通信.本篇随笔介绍一些SignalR的基础知识,以及结合对SqlSugar的开发框架的支持,实现SignalR的多端处理 ...

  7. Express实现定时发送邮件

    在开发中我们有时候需要每隔 一段时间发送一次电子邮件,或者在某个特定的时间进行发送邮件, 无需手动去操作,基于这样的情况下我们需要用到了定时任务,一般可以写个定时器,来完成相应的需求,在 node.j ...

  8. okio中数据存储的基本单位Segment

    1.Segment是Buffer缓冲区存储数据的基本单位,每个Segment能存储的最大字节是8192也就是8k的数据 /** The size of all segments in bytes. * ...

  9. Windows服务器重启注意事项

    windows作为服务器有它的优势,但是相比于基于linux作为服务器来说,它不够稳定,这里的windows服务器作为服务器有各种版本,windows2012,2008,甚至还有2003,XP的系统, ...

  10. 连接MongoDB+Docker安装MongoDB

    一.连接MongoDB 工具:studio 3T 下载:https://studio3t.com/download-thank-you/?OS=win64 1.无设置密码 最终成功页面 2.设置了密码 ...