开展“稳健”的生物信息学研究的9个要点
昨天推薦了一本學(xué)習(xí)生信的好書,新手友好,實戰(zhàn)性強(qiáng);今天看到生物城堡公眾號的一位朋友編譯了部分內(nèi)容,分享于此。
穩(wěn)健的研究在很大程度上是采取一系列方案,這些方案共同累積了可靠度,我們的目的是防止“無聲”的錯誤混淆結(jié)果。
01 重視實驗設(shè)計
穩(wěn)健的研究始于良好的實驗設(shè)計。不幸的是,再多精彩的分析也救不了一個設(shè)計糟糕的實驗。
我見過項目落在我的桌子上準(zhǔn)備進(jìn)行分析,花了數(shù)萬元測序,但當(dāng)數(shù)據(jù)放在這時,其實已經(jīng)完全“死”了。無論如何,在實驗結(jié)束后,我們都無法挽救設(shè)計糟糕的實驗。
大多數(shù)統(tǒng)計學(xué)入門課程和書籍都涵蓋了實驗設(shè)計中的基本方法。不過,基因組學(xué)實驗中的實驗設(shè)計是另一回事,并且正在積極研究和改進(jìn)。確保你的數(shù)萬元的實驗達(dá)到它的潛力的最好方法是,看看你這種類型的項目同行中做的最好的是什么樣的。咨詢您當(dāng)?shù)赜押玫慕y(tǒng)計學(xué)家,了解任何實驗設(shè)計問題或您在計劃實驗時可能存在的問題。
02 為人類編寫代碼,為計算機(jī)編寫數(shù)據(jù)
調(diào)試的難度是最初編寫代碼的兩倍。生物信息學(xué)項目可能涉及堆積如山的代碼,而我們針對bug的最好防御就是為人類,而不是為計算機(jī)編寫代碼。人類是進(jìn)行調(diào)試的人,因此編寫簡單、清晰的代碼可以使調(diào)試變得更容易。
代碼應(yīng)該是可讀的,分解為小的包含組件(模塊化),并且可重用(因此不需要重寫代碼來一遍又一遍地執(zhí)行相同的任務(wù))。這些實踐在編程圈中是至關(guān)重要的,也應(yīng)該應(yīng)用于生物信息學(xué)工作中。注釋代碼和遵守代碼風(fēng)格指南是提高代碼可讀性的簡單方法。
為什么代碼的可讀性如此重要?首先,可讀代碼使項目更具可重復(fù)性,因為其他人可以更容易地理解腳本做什么以及它們是如何工作的。其次,在可讀的、注釋良好的代碼中查找和更正軟件錯誤要比混亂的代碼容易得多。第三,當(dāng)代碼注釋良好且編寫清晰時,將來重新訪問代碼總是更容易。編寫模塊化和可重用代碼只是需要多加練習(xí)而已。
與代碼相反,數(shù)據(jù)的格式應(yīng)該便于計算機(jī)讀取。很多時候,我們?nèi)祟愑涗洈?shù)據(jù)的方式最大限度地提高了數(shù)據(jù)對我們?nèi)祟惖目勺x性,但在計算機(jī)處理數(shù)據(jù)之前需要進(jìn)行大量的整理工作。計算機(jī)可讀的數(shù)據(jù)越多,我們就越能利用計算機(jī)來處理這些數(shù)據(jù)。
03 讓你的電腦替你工作
人們做死記硬背的事情往往會犯很多錯誤。讓你的工作更健壯的最簡單的方法之一就是,讓你的電腦盡可能多地做這種死記硬背的工作。這種自動化任務(wù)的方法更穩(wěn)健,因為它降低了犯小錯誤的可能性(如意外遺漏文件或輸出文件命名錯誤)。
例如,通過單獨鍵入每個命令在20個不同的文件上運行程序是脆弱的--每處理一個文件,發(fā)生粗心錯誤的可能性都會增加。在生物信息學(xué)工作中,應(yīng)該養(yǎng)成讓計算機(jī)為你做這種重復(fù)性工作的習(xí)慣。與其粘貼相同的命令20次,不如編寫一個腳本來完成這項工作,只需更改輸入和輸出文件。這不僅更容易并且不太可能導(dǎo)致錯誤,而且還增加了可重復(fù)性,因為腳本記錄下了對每個文件所做的事情。
04 在代碼和方法中進(jìn)行斷言并“發(fā)出聲音”
當(dāng)我們寫代碼時,我們傾向于對我們的數(shù)據(jù)有隱含的假設(shè)。例如,我們期望只有三個DNA鏈選項(正向,反向和未知),基因的起始位置小于結(jié)束位置,并且我們不能有負(fù)位置。我們對數(shù)據(jù)所做的這些隱含的假設(shè)會影響我們編寫代碼的方式;例如,如果我們假設(shè)某種情況不會發(fā)生,我們可能不會考慮在代碼中處理它。然而,這可能導(dǎo)致可怕的靜默錯誤:我們的代碼或程序接收到超出我們預(yù)期的值,但仍然在沒有警告的情況下返回輸出。防止此類錯誤的最佳方法是使用斷言語句(如Python的assert()和R的stopifnot())顯式聲明,測試我們關(guān)于代碼中數(shù)據(jù)的假設(shè)。
幾乎每種編程語言都有自己的Assert函數(shù)版本。這些Assert函數(shù)的操作方式類似:如果語句的計算結(jié)果為false,則Assert函數(shù)將停止程序并引發(fā)錯誤。它們可能很簡單,但這些斷言函數(shù)在穩(wěn)健研究中是必不可少的。在我學(xué)術(shù)生涯的早期,一位導(dǎo)師激勵我養(yǎng)成了非常寬松地使用斷言的習(xí)慣--即使看起來似乎絕對不可能有問題--但我一直驚訝于這些斷言有多少次捕捉到了微妙的錯誤。在生物信息學(xué)(以及所有領(lǐng)域)中,至關(guān)重要的是我們盡可能地將可怕的“無聲”錯誤轉(zhuǎn)變?yōu)椤绊懥痢钡腻e誤。
05 測試代碼,或者讓代碼測試代碼
程序猿們是一群聰明的人,他們把讓自己的計算機(jī)做工作的想法提升到一個新的水平,讓代碼測試其他代碼,而不是手工完成。測試代碼的一種常見方法稱為單元測試。在單元測試中,我們將代碼分解為單獨的模塊化單元(這也可以提高可讀性的),并編寫測試此代碼的附加代碼。在實踐中,這意味著如果我們有一個名為add()的函數(shù),我們就會編寫一個名為test_add()的附加函數(shù)(通常在單獨的文件中)。這個test_add()函數(shù)將調(diào)用具有特定輸入的add()函數(shù),并測試輸出是否如預(yù)期的那樣。在Python中,這可能類似于:
EPS = 0.00001 # 比較浮點值時使用的較小數(shù)字 def add(x, y): """求和.""" return x + y def test_add(): """測試add()函數(shù)是否適用于各種數(shù)值類型。""" assert(add(2, 3) == 5) assert(add(-2, 3) == 1) assert(add(-1, -1) == -2) assert(abs(add(2.4, 0.1) - 2.5) < EPS)test_add()函數(shù)的最后一行看起來比其他行更復(fù)雜,因為它比較的是浮點值。很難在計算機(jī)上比較浮點值,因為存在表示和舍入誤差。然而,這是一個很好的提醒,我們總是受到我們的機(jī)器所能做的事情的限制,我們必須在分析中記住這些限制。
與軟件行業(yè)相比,單元測試在科研編碼中的使用要少得多,盡管科研代碼更有可能包含錯誤(因為我們的代碼通常只運行一次以生成出版物的結(jié)果,并且科研代碼中的許多錯誤都是沉默的)。可以稱為科研編碼的悖論:科研編碼容易出錯的本質(zhì)意味著我們應(yīng)該使用與軟件行業(yè)一樣多或更多的測試,但實際上我們做的測試要少得多。這是令人遺憾的,因為現(xiàn)在許多科學(xué)結(jié)論都是堆積如山的代碼的結(jié)果,但這些代碼卻沒有經(jīng)過充分測試。
雖然測試代碼是發(fā)現(xiàn)、修復(fù)和防止軟件錯誤的最好方法,但測試并不便宜。測試代碼使我們的結(jié)果變得健壯,但它也占用了我們相當(dāng)多的時間。對于研究人員來說,為他們編寫的每一段代碼編寫單元測試需要花費太多的時間。科學(xué)發(fā)展迅速,在編寫和執(zhí)行單元測試所需的時間內(nèi),研究可能會過時或被搶發(fā)。更明智的策略是在每次編寫代碼時考慮三個重要變量:
此代碼被其他代碼調(diào)用了多少次?
如果此代碼錯誤,對最終結(jié)果會有多大危害?
如果發(fā)生錯誤,錯誤會有多明顯?
測試一段代碼的重要性與前兩個變量成正比,與第三個變量成反比(如果bug非常明顯,就沒有必要為它編寫測試)。
07?將數(shù)據(jù)處理為只讀
許多科學(xué)家花費大量時間使用Excel,眼都不眨一下,就會改變單元格中的值并保存結(jié)果。我強(qiáng)烈反對以這種方式修改數(shù)據(jù)。相反,更好的方法是將所有數(shù)據(jù)視為只讀,并且只允許程序讀取數(shù)據(jù)并創(chuàng)建新的、額外的結(jié)果文件。
為什么在生物信息學(xué)中將數(shù)據(jù)作為只讀處理很重要?首先,就地修改數(shù)據(jù)很容易遇到崩潰的結(jié)果。例如,假設(shè)您編寫了一個直接修改文件的腳本。在處理大型文件的過程中,腳本遇到錯誤并崩潰。因為您已經(jīng)修改了原始文件,所以無法撤銷更改并重試(除非您有備份)!本質(zhì)上,此文件已損壞,無法再使用。
其次,當(dāng)我們就地修改文件時,很容易忘記我們是如何更改它的。與每個步驟都有一個輸入文件和一個輸出文件的工作流不同,就地修改的文件不會給出我們對它所做的任何指示。如果我們忘記了我們是如何更改文件的,并且沒有原始數(shù)據(jù)的備份副本,那么我們的更改基本上是不可重復(fù)的。
對于熟悉在Excel中工作的科學(xué)家來說,將數(shù)據(jù)視為只讀似乎有違直覺,但這對于穩(wěn)健的研究是必不可少的(并可防止災(zāi)難,并有助于重復(fù)性)。最初的困難是值得的;除了保護(hù)數(shù)據(jù)不受損壞和不正確的更改之外(Excel改變了你的基因名,30% 相關(guān)Nature文章受影響,NCBI也受波及),它還促進(jìn)了可重復(fù)性。此外,分析的任何步驟都可以很容易地重做,因為程序不會改變輸入數(shù)據(jù)。
08 花時間將常用腳本開發(fā)為工具
在您作為一名高技能生物信息學(xué)家的整個開發(fā)過程中,您最終將創(chuàng)建一些反復(fù)使用的腳本。這些可能是從數(shù)據(jù)庫下載數(shù)據(jù)的腳本,或者處理某種類型的文件,或者可能只是生成相同的漂亮圖形。這些腳本可以與實驗室成員共享,甚至可以跨實驗室共享。您應(yīng)該付出額外的努力和關(guān)注,使這些高使用率或高度共享的腳本盡可能健壯。我認(rèn)為這個過程是將一次性腳本變成工具。
與腳本不同的是,工具被設(shè)計為可以一遍又一遍地運行。它們有良好的文檔記錄,具有顯式的版本控制,具有可理解的命令行參數(shù),并保存在共享的版本控制存儲庫中。
重復(fù)應(yīng)用于大量數(shù)據(jù)集的腳本會影響更多結(jié)果,因此應(yīng)該進(jìn)行更多開發(fā),以使它們更加健壯和用戶友好。與其他研究人員共享的腳本尤其如此,這些研究人員需要能夠查閱文檔并將您的工具安全地應(yīng)用于他們自己的數(shù)據(jù)。雖然開發(fā)工具比編寫一次性腳本更費力,但從長遠(yuǎn)來看,它可以節(jié)省時間并防止頭痛。
09 讓數(shù)據(jù)證明它的高質(zhì)量
當(dāng)科學(xué)家考慮分析數(shù)據(jù)時,他們通常會考慮分析實驗數(shù)據(jù)以得出生物學(xué)結(jié)論。然而,為了進(jìn)行穩(wěn)健的生物信息學(xué)工作,我們實際上需要分析的不僅僅是實驗數(shù)據(jù)。這包括檢查和分析關(guān)于實驗數(shù)據(jù)質(zhì)量的數(shù)據(jù),來自生物信息學(xué)程序的中間輸出文件,以及可能的模擬測試數(shù)據(jù)。這樣做可以確保我們的數(shù)據(jù)處理功能如我們預(yù)期的那樣運行,并體現(xiàn)了生物信息學(xué)的黃金法則:永遠(yuǎn)不要相信你的工具或數(shù)據(jù)。
永遠(yuǎn)不要假設(shè)數(shù)據(jù)集是高質(zhì)量的,這一點很重要。相反,數(shù)據(jù)的質(zhì)量應(yīng)該通過探索性數(shù)據(jù)分析(稱為EDA)來證明。EDA既不復(fù)雜也不耗時,并且將使您的研究對大型數(shù)據(jù)集中潛伏的驚喜更加健壯。
文章部分來源于Bioinformatics Data Skills. 編譯:生物城堡公眾號。
生信學(xué)習(xí)學(xué)的是什么?常識!
分享清華大學(xué)魯志教授實驗室生物信息學(xué)教程
這個為生信學(xué)習(xí)和生信作圖打造的開源R教程真香!!!
這個為生信學(xué)習(xí)打造的開源Linux教程真香!!!
這個為生信學(xué)習(xí)打造的開源 Python 文字教程真香!!!
該如何自學(xué)入門生物信息學(xué)
哈佛大學(xué)劉小樂教授講授的計算生物學(xué)和生物信息學(xué)導(dǎo)論 (2020 視頻+資料)
往期精品(點擊圖片直達(dá)文字對應(yīng)教程)
機(jī)器學(xué)習(xí)
后臺回復(fù)“生信寶典福利第一波”或點擊閱讀原文獲取教程合集
總結(jié)
以上是生活随笔為你收集整理的开展“稳健”的生物信息学研究的9个要点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无代码调整聚类热图分支顺序
- 下一篇: 这些基因的名字太有才了,研究一下都可以发