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