R資料分析:解決科研中的「可重複危機」,理解Rmarkdown

2023-06-23 06:01:00

不知道剛接觸科研的大夥兒有沒有這麼一個感覺,別人的研究很大可能你重複不出來,尤其是社科實證研究,到現在我都還覺得所謂的實證是個很玄乎的東西;

如果是剛開始做資料分析,很多時候你會發現自己的分析結果過幾天自己都重複不出來。反正我自己是有這樣的經歷的。有可能是某一步操作忘記了,自己都不知道,尤其是用選單式的分析軟體,比如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程式碼即可。保障了自己工作的可重複性。