好的。感謝各位收聽今天的節目。我今天主要會聊聊JMP,特別是如何在Amirys公司利用它實現分析工作流程的自動化,同時也會探討更複雜的流程,以及如何利用JMP原生平台實現自動化或資料自動化。在正式開始之前,我想先簡單介紹一下自己。我叫Stefan,是Amirys公司的數據科學副總監,擁有15年的生命科學產業經驗,涉獵廣泛。我曾在許多化學實驗室、發酵實驗室和高通量篩選團隊工作過。我的工作經驗涵蓋品質管理、統計學、數據分析,當然還有現在的數據科學。我熱愛一切與資料相關的事物,從資料儲存到人們使用和存取資料的方式。目前,我為更廣泛的AMRA科學社群提供工具和分析方法的支援。今天,我將主要介紹三個部分。我會先簡單介紹一下我們將要使用的案例研究的背景和情況,我將用它來講解一些自動化範例。我們會從最簡單的開始。
我們如何使用 JMP 來自動化運行分析工作流程?這些分析可能是您日常進行的,而您希望提高其效率。在最後一部分,我們將探討更進階的自動化,也就是更複雜的工作流程。我們可能會研究如何分析更廣泛的技術團隊所使用的這些工作流程。如何將其推廣,以同時支援資料處理和導入以及分析環節?我們今天的案例研究來自我所在的公司 Amirys。簡單介紹一下 Amirys。我們是一家合成生物學公司。我們專注於酵母編程和工業發酵,為酵母提供糖分,並將糖轉化為純淨的成分或化學物質。我們的總部位於加州埃默里維爾,大部分生產都在巴西進行。我們今天的案例研究並非著眼於生產方面,而是著重於研發方面。在埃默里維爾,我們擁有許多高度自動化的實驗室,我們稱之為篩選和分析實驗室,我們每月在這些 96 個壁板中篩選數十萬株菌株。
您可以看到圖片上有一些條碼標記的培養板。這些就是我們用來當作小型發酵槽的。這是我們測試這些菌株產量的第一步,看看它們生產的是什麼。我們正在尋找這些菌株的特定表型。我們在這些96孔板中培養牠們,然後使用一整套不同的分析方法來產生測量數據,通常是對這些孔進行多維測量。我們還有很多內部資料庫,許多資料以及相關的元資料都儲存在應用程式資料庫和資料倉儲中,我們可以使用JMP等工具存取這些資料。這就是JMP的作用所在。當然,篩選的最後一步是篩選大量的菌株,產生大量數據。現在我們需要理解這些數據,做出決定,選擇哪個菌株進行反應器發酵,並有可能在巴西進行生產。
我們將從 JMP 中的簡單自動化開始。今天我想做的是,如果你以前從未在 JMP 中進行過自動化操作,或者從未使用過這些平台,我希望能夠以一種易於理解、相對無需編寫程式碼的方式向你介紹它們,並讓你對這些平台的構建方式有一個基本的了解,以及我在自學和向他人學習使用這些自動化平台的過程中所學到的東西。
我常說,如果某件事重複執行超過 10 次,那它可能就值得自動化了。如果你是自動化新手,我認為最好的起點就是從你自己的分析著手。這樣做的好處在於,或者如果你對分析結果非常熟悉,你可以給自己回饋。當然,這通常比為更大的團隊進行更廣泛的分析要簡單得多。在我們的例子中,我們將進行一個非常簡單的測量—在培養皿上進行單次測量。我們從預培養階段到生產階段,對培養皿進行連續的擴增。在第二個培養皿中,我們進行單次測量。在這個模擬範例中,我們會說:「嘿,我們一直在重複進行完全相同的實驗。」每次進行實驗時,我們都會將資料匯入 JMP。我們會新增一個計算列。然後,我們會根據該列進行篩選,並產生一些視覺化和統計測試,以幫助我們做出決策。做一次,花不了多少時間,但如果你每天都重複這樣做,時間就會累積起來。
在深入探討自動化部分之前,我想先簡單提一下結構化數據,這其實是自動化的先決條件。如果大部分標準化和結構化工作都在上游完成,例如在收集資料並將其匯入資料庫(或 CSV 檔案)時,你的工作將會輕鬆許多。在我們的例子中,資料庫本身就已經是結構化的了。當然,你可以在 JMP 中完成很多資料處理工作,而且通常需要根據你所使用的應用程式或分析方法來選擇合適的工具。但你真的應該認真思考數據的來源是什麼?你越早處理數據,效果就越好。如果你使用的是資料庫數據,我建議使用查詢建構器。今天我們就不深入探討這方面了。這是我的整體建議。 JMP 腳本編寫的基礎是日誌。無論你是否意識到,JMP 預設都會記錄你的操作,包括你點擊使用者介面時執行的 JSL 程式碼和腳本。如果你打開“檢視”選單,點擊“日誌”,即可查看日誌,其中記錄了你執行的大部分步驟。
點擊任何一個步驟,都會顯示用於執行該步驟的 JSL 程式碼。在這個例子中,我們正在執行新增計算列的第一步,我已經點擊並高亮顯示了那裡的 JSL 程式碼。這是一種快速查看每個步驟正在執行的 JSL 程式碼的方法,您可以直接從日誌中執行該程式碼或重新運行先前的程式碼。話雖如此,我並不建議您在日誌中嘗試真正實現自動化操作。它只是代碼的來源之一。您可以將日誌中的內容提取到例如資料表中的一種方法是使用資料表腳本。長期以來,這都是在 JMP 中實現分步自動化的方法。在這個例子中,我打開了這個資料表,點擊了紅色熱點,產生了一個新腳本。這會彈出一個空白窗口,我直接從日誌中貼上了兩個步驟的程式碼:第一步建立新列,第二步為該列設定公式。
你還可以進一步清理程式碼。這完全是可選的。但在後面的章節中,當我們開始討論更複雜的範例時,你可能需要思考:如何讓我的程式碼更容易維護或更簡潔?在這個例子中,我們進行了兩步驟清理。第一步,我們刪除了冗餘的資料表引用。第二步,我們進一步壓縮了程式碼,不再重新命名第 21 列,而是從一開始就使用正確的名稱。每個方框都能正常運作,它們的功能完全相同。在這種情況下,你不會注意到效能上的任何差異,但這可以讓程式碼更簡潔、更容易維護。如果你是 JSL 新手,看到這段程式碼可能會想:這到底是做什麼的?你可以將這些程式碼貼到你喜歡的 LLM 工具中。我們使用 Copilot、ChatGPT 等等。如果你有權限去 JMP 學習機器人,可以問它「嘿,這段程式碼是做什麼的?」。它通常能讓你很好地了解這段程式碼的作用。
我們從日誌中提取了數據,或者說,從日誌中提取了程式碼,並將其貼到數據表腳本中。這是最手動的自動產生 JSL 的方法。您可以在這裡看到它。正如我們命名的那樣,第一步是添加計算列。在大多數平台上,還有更多直接的方法來產生這些表腳本並保存產生特定輸出的腳本。許多平台在紅色熱點下方提供了這些選項。在紅色熱點下方,您可以一直向下滾動。有一個“保存腳本”選項,它提供了許多選項。您可以將其儲存到剪貼簿,也可以直接儲存到資料表(我們將採用這種方式),以及其他選項。這使得直接從使用者介面自動產生 JSL 變得非常簡單。我們將其保存到數據表中。在這種情況下,我們所做的只是重命名該腳本,進行第二步,即資料篩選,然後繼續進行分析。我們可以在最後一步完成這項工作,即產生 Y 乘 X 圖,並且我們也應用了 Dunnett 檢定和參考組。
再次,我們點擊紅色熱點,選擇“儲存腳本”,然後將其儲存到資料表中。我們創造的就是這個偽工作流程。它包含一個三步驟自動化流程:首先,在表中新增一個計算列;其次,新增或應用一個資料篩選器;最後,使用鄧內特檢定進行單因子變異數分析。這引導你進入表格腳本的使用領域,這種情況持續了很長時間,直到 JMP 16 或 17 版本左右,工作流程功能才出現。工作流程真正實現了表格腳本功能的升級,增加了更多功能。工作流程是一個全新的平台,它是 JMP 中的一個獨立平台。你可以透過「檔案」、「新建」、「工作流程」來存取它。它提供了許多功能,不僅可以簡化工作流程的開發,還能顯著提升最終用戶的使用體驗。例如,你可以點擊一個按鈕來運行工作流程中的所有步驟。 JMP 提供步驟錄製功能,可記錄您在 JMP 中的操作並自動將其新增至工作流程。您可以直接在工作流程中註解腳本,也可以新增邏輯閘、互動功能、使用者提示等,功能非常豐富,今天我們當然沒有時間一一介紹。
但我會展示一些範例,尤其是在更高級的版本中。現在我們可以使用這些表格腳本,這樣我們就得到了一個偽工作流程。我們可以想像一下,這可能是在工作流程出現之前創建的,JMP 新增了工作流程平台,現在我們又將其新增到了工作流程建構器中。我在這裡所做的只是添加了三個步驟。我貼上了每個步驟的 JSL 程式碼,您可以看到,工作流程中的三個步驟與資料表腳本中的完全相同。我將在這裡簡要演示一下這些步驟在我們真實數據或演示數據中的效果。在第一個範例中,我們有結構化資料。我們有一些測量值。我們想要再次執行這三個步驟。我們可以看到,在這種資料表腳本方法中,您只需逐一點擊即可。我點擊了它。現在我們新增了這個計算列。我們應用了一個數據過濾器,它會彈出並應用此過濾器,然後我們為這個特定實驗產生單因素分析。
很簡單,對吧?這些方法都有效。對於像這樣的簡單操作來說,這些方法非常有效。你需要切換到工作流程嗎?你需要進行更複雜的操作嗎?不一定。如果這個方法有效,那就很好了。我們可以重置它,你會看到我在這裡需要手動操作。我們要清除行狀態,確保資料篩選器已關閉,然後就可以查看工作流程了。這同樣是三個步驟。這裡更方便的是,我現在可以自動查看程式碼。這裡不行。在這裡,我必須右鍵單擊,選擇“編輯”,然後在新視窗中查看定義。而在這個選項中,我可以看到每個步驟的程式碼。在這裡,我可以點擊播放,它會同時執行所有三個步驟。我看到了漂亮的綠色對勾,告訴我它運行沒有錯誤。你會看到我們有了新的列。我們應用了篩選器,並且開啟了相同的分析。介面更清晰了。下一節,我們將更深入地探討使用該工作流程的其他附加功能。
我想簡單提一下演示中的錄製按鈕,它非常棒,尤其適合那些不熟悉 JSL,甚至完全不懂程式設計的人,這是創建自動化流程最簡單的方法。你只需點擊錄製按鈕,我在這個平台上做的任何操作都會被記錄到工作流程中。我舉個例子,繪製一個測量分佈圖,假設它代表一些有意義的數據。回到工作流程,你會看到這裡多了一個步驟,也就是我們的 JSL 腳本。我可以重命名它、新增註解、修改它等等。工作流程建構器的一個非常棒的功能就是這個錄製按鈕。我們再深入探討一下。也許你已經為某個特定應用場景實現了自動化,或者它適用於某種實驗類型。那麼,如何將它應用到更複雜的流程中呢?這就是我們之前遇到的問題。
在 Amirys,現實情況是我們需要處理很多不同的實驗類型,我們希望盡可能用最少的流程來支援它們。我們不想為每一次迭代創建一個獨特的流程,因為這樣維護起來會非常困難,開發起來也會非常棘手。當你進行更進階的開發時,我建議你使用 JMP 專案來組織我所謂的開發環境。這個建議是我在 JMP 社群的某個影片中看到的。自動化這些複雜操作的一大痛點在於,你會看到各種各樣的資料表、視窗等等,它們會不斷彈出,難以管理。如果你使用項目,你可以把它當作開發環境的封裝層,最終也能更好地利用這個工具。
這裡我打開了一些預設的專案平台,像是工作區和內容。我添加了一個日誌作為佔位符。這樣,工作流程打開的任何新視窗都會以新標籤頁的形式打開,而不是在我的桌面上以新視窗的形式打開。當然,你也可以使用這個日誌來記錄文件或說明。右邊是我實際建立的工作流程。底部我還添加了我的日誌。
如果我需要進行一些故障排除,或者需要查看錯誤訊息的更多詳細信息,日誌就在那裡,我可以直接在一個視窗中完成所有操作。這也是我在該專案中演示此工作流程的方式。我收到的用戶回饋普遍積極,他們不喜歡表格和視覺化圖表過多。當我們談到自動化通用化時,我們希望瞄準高影響力應用,因為自動化通用化並非易事,無論是資料自動化還是物理自動化,如果您曾在實驗室或製造業進行過相關工作,對吧?這需要大量的精力、金錢、時間和人力。一般來說,如果您希望自動化資料工作流程,請優先考慮將其應用於標準化工作流程,或將其作為推動標準化的一種方式。例如,您可以說:“嘿,如果我們標準化了這些流程,我們也可以自動化您每天都在做的那些非常繁瑣的數據處理工作。”
資料工作流程通常需要一定的彈性,這可能是流程本身的局限性,也可能是因為人們查看資料的方式不同。這時,你可以逐步實現自動化。這正是 JMP 的強大之處,因為常常有人問我,既然要自動化,為什麼不直接用 Python 呢?為什麼不直接用純程式碼平台來實現自動化呢?問題在於,一旦完全基於程式碼,就會為用戶設定很高的進入門檻。除非你能實現端到端的自動化,否則如果流程進行到某個階段,用戶需要接手,而你又要求他們“精通 Python”,那麼即使是像我合作的科學家群體這樣技術水平很高的群體,也會面臨巨大的准入門檻。
JMP 的確很棒,因為它可以自動化第一步,之後最終使用者就可以直接在 JMP 中使用。他們可以透過使用者介面輕鬆上手,隨心所欲地操作,充分發揮自動化功能的優勢。當然,我們希望找到高價值的機會,因為這確實需要付出努力。就我們而言,我們當時在研究這些微孔板實驗,並與科學家們交流,詢問他們“獲取這些數據需要花費多少時間?” 我們注意到,很多人都在手動操作,重複複製粘貼等繁瑣步驟。
我們團隊有17位科學家。我們做了一些調查,估計我們花在所有這些工作上的時間大約相當於一個人的時間,而且這時間成本相當高。這對我們來說是一個機會,讓我們意識到:「嘿,很多工作看起來都是手動完成的,重複性很高,而且完全可以自動化。」讓我們試試看。你肯定會遇到的最大挑戰是複雜性。當我們考慮自動化時,有兩個維度。一個是工作流程中的總步驟數,另一個是每個步驟的變體數。變體其實就是路徑上的一個分支。我喜歡右邊的這張圖,因為它很容易演變成一個指數級增長的問題,你需要解決某個流程的太多可能的迭代或變體。你必須考慮如何著手處理這個問題,你需要問自己:它是否可控?如果不可控,你能做些什麼讓它可控?你可以像我們提到的那樣,通過標準化來消除差異,或者說,“嘿,這種特殊情況無法通過數據分析來解釋。”
您甚至可以添加錯誤訊息,正如您在工作流程中看到的那樣。您也可以使用自動化退出機制來省略步驟。這就是我之前提到的,讓使用者接手操作。如果存在非常精細、獨特的品質控制步驟,您可以暫停工作流程,讓使用者完成他們需要做的任何操作,然後他們可以從那裡恢復工作流程。您有很多選擇需要考慮,但毫無疑問,在考慮自動化時,周密的計劃對您大有裨益。在我們的案例中,我們研究了這些印版工藝,這也是我最初給出的例子。如果我們進行單次印版複製,我們會進行一次測量,我們將此過程稱為第一次複製。
當我們開始研究不同實驗之間的差異時,我們發現,「嘿,實際上,有時我們會從這個板上進行兩次測量,而不僅僅是一次。」 有時,我們還會從串行傳播中的第一個板上進行測量。有時,我們會對兩個板都進行兩次測量。有時,我們實際上是將板子分開。我們不只是簡單地進行一對一測量,而是進行一對二或一對多的測量。
我們正在對這些數據進行測量。有時我們會將它們分開,分別對兩組數據進行不同的測量。我並不指望你們能記住這些細節,但我想說明的是,我們的流程有很大的差異。我這裡只是舉幾個例子。我們的流程有幾十種不同的變體。我們剛才關注的是流程本身的複雜性,也就是我們實驗室產生資料的流程。我們甚至還沒開始思考,人們查看和分析數據的方式有多標準化?他們使用哪些統計檢定?他們是使用匯總指標,還是使用中位數或平均值?
複雜性可能很快就會變得非常棘手,所以事先做好調查至關重要。我們一直在研究一個仍在開發中的項目,雖然已經部署,但我們仍在不斷迭代改進。我的另一個建議是,先確定哪些功能是真正有用的,然後定期從最終用戶收集回饋。我們針對平面分析提出了這種通用方法。
這就是一個更複雜的工作流程。我們實際上是在調整資料庫中的數據,並直接提示使用者根據他們要尋找的特定實驗篩選數據。我們進行了大量資料處理,修復資料類型、命名規則,並確保這些方面保持一致。我們根據該流程拆分資料。我們看到了串行傳播。我們需要了解哪個測量值與哪個板相關聯。我們進行一些檢查,檢查是否有我們不支援的流程?是否存在此自動化流程不支援的測量值?如果有錯誤,我們會拋出錯誤並向使用者顯示訊息。我們圍繞透視進行更多數據處理。我們甚至為用戶提供添加離線資料的選項。使用者可能對他們的基因型進行了手動註釋。最後,我們產生一組預設的視覺化和分析。
我再詳細解釋一下,給大家示範一下。就像我剛才展示的,我們現在在專案裡。這裡有工作區內容,有日誌,還有工作日誌。我打算把工作日誌關掉,因為演示中不需要它,而且它佔用了螢幕寶貴的空間。
但我們這裡有工作流程。我已經盡可能地將這些步驟簡化到易於理解的程度,以便您可以理解每個步驟的作用。您也可以看到,您可以啟用或停用某些步驟,在本例中,僅用於本次會議。我們只是導入靜態數據,因為我們不會連接到公司資料庫來提取真實的實驗數據。我們這裡直接包含了原始資料。您還會注意到這裡的一些邏輯閘,對吧?這些 if/out 語句可讓您設定邏輯開關或不同的路徑,也就是不同的分支,例如,如果資料符合特定條件,則執行此操作;否則,執行其他操作。
我這就運行。我們正在導入資料。我這裡有一句可能有點陰陽怪氣的話,其實就是…你可以設定一些小彈跳窗來給使用者回饋。我說,很好。你們的電腦面板只有B測量數據,對吧?這是我們唯一允許的。幹得好。他們點擊了確定。程式繼續運行。現在我們給他們一個提示。提示是:嘿,你想添加手動建立的元資料嗎?
這通常是該數據集的基因型數據。第一次運行時,我直接點擊“否”。實際上,這裡沒有任何數據。就像,好的,我們先運行一遍。現在我們已經產生並運行了所有內容。所有項目都已完成,並顯示綠色對勾。在左側,您可以看到一些資料表,以及一些預設的效能視覺化圖表,還有我們對菌株選擇板進行的歸一化處理。
現在,這裡真正巧妙的地方在於,我可以點擊這個按鈕,也就是重置按鈕,它會關閉工作流程打開的所有內容,並將其重置到開頭。現在我已經重置了。您可以看到我們回到了日誌頁面,以及開頭的小箭頭。我現在可以再次運行它。在同一個提示中,我選擇“是”。這將引導我進入一個略有不同的路徑。我選擇“是”,我想新增手動資料。現在它會彈出另一個提示,詢問我想使用哪一列來連接資料?我將使用這個 X 編號,它是一個唯一識別碼。
我們使用了四種菌株。點選確定。它會提示:「嘿,我在你的資料集中找不到這個。」 當然,它找不到,因為這是我自己的離線資料。我要去我的電腦上,找到它。在這個例子中,我把它儲存在一個 CSV 檔案中,我們要把它合併,然後執行腳本。你會注意到,我們最終得到了相同的結果。我們有了這個標準化。我們有了這個用於測量的圖表建立器箱線圖視覺化。但我們所做的是,我們現在還添加了一些額外的……這些列,啟動子突變,以及其他一些信息,這些信息原本存在於離線數據中,現在我們已經將它們合併到主數據中,而之前並沒有這樣做。
這些通用工作流程功能非常強大。發布這些工作流程時,我也會將其儲存到一個專案中。這就是專案中的工作流程。我會在這裡添加用戶文檔以及任何相關的內部文檔的超連結。使用者造訪此頁面後,點擊播放按鈕,系統會提示他們輸入實驗 ID。這將動態地改變導入的數據,然後流程會按照此流程運行。
你會注意到這裡還有一些關於拋出錯誤之類的操作。這是為了應對我們不支持的特定情況,或者可能遇到意料之外的實驗類型。另外,如果你要進行概括,需要注意的是,預設情況下,很多表和列的引用都是自動產生的。無論你是使用記錄按鈕,還是使用平台上的紅色下拉選單,這些引用通常都是明確的,會顯示「資料表名稱」和「列名稱」。但當你進行概括時,這種做法並不總是適用。
你可能會發現自己需要學習並手動修改 JSL 程式碼,其中一項內容是關於列和資料表引用,如何管理它們,以及如何使它們動態化。我匯入的列數可能會根據使用者匯入的內容而變化,我需要能夠支援這種情況。一旦你開始接觸這方面,幾乎肯定需要寫一些 JSL 程式碼。但同樣,JMP 可以幫助你完成 90% 的工作,包括大量的流程記錄、日誌記錄,以及所有那些紅色熱點和腳本保存選項。
當你需要寫 JSL 程式碼時,你會去哪裡找答案?我使用過很多不同的資料工具、資料軟體和程式語言。 JMP 的學習資源非常出色。它本身就內建了腳本索引。現在,你也可以使用 LLM 的輔助功能來排查 JSL 問題,甚至產生 JSL 程式碼。我認為它不如 Python 之類的語言好用,部分原因是它的訓練資料集比 Python 的要小得多,但它仍然可以幫助你入門。
這正是JMP社群真正獨一無二之處。一定要利用論壇。舉個今年早些時候的例子。我發了這個問題,最讓我印象深刻的是時間。我是晚上7點15分提交的。 Jim,這位大神,當天晚上9點45分就回覆了。隔天早上,Mark大約12小時後也回覆了。不到24小時,我就得到了兩位專家的解答。每次我在論壇發帖,都能得到這樣的回應。
特別感謝大家,尤其是Mark和Jim。我常常看到你們的名字,但其實論壇上每個人都用這些名字。它們對你們的學習非常有價值。最後,我想總結一下,並鼓勵大家檢視自己的組織、團隊、實驗室,無論你們的工作是什麼,都要尋找能夠應用通用自動化的高影響力機會。就我們而言,我們發現某個領域,我們每個實驗都要花費數小時,一個月內要運行50多個這類實驗。那幾乎佔據了一個人的全部時間,他要花在處理這些數據上。
一旦你確定了目標,就要管理和規劃應對複雜性。我們在實驗設計和篩選過程中遇到了許多變數。我們透過以下方式解決了這個問題:一方面,我們賦予使用者更多選擇權;另一方面,我們限制了報告支援的內容;同時,我們也充分利用 JMP 的使用者介面,告訴使用者「接下來就看你們的了」。你們仍然可以按照自己喜歡的方式進行視覺化。這促使我們實施這些高階工作流程,從而消除重複性任務,並將其作為標準化分析的一種手段。我經常看到的情況是,我們喜歡把事情標準化,但一旦涉及到數據分析,我們就把它看作是手工操作。
這固然有一定道理,但也存在一些可以製定最佳實踐的機會。我們該如何看待這些數據?針對這些數據所呈現的特徵,應該採用哪一種統計檢定方法?這為您提供了一個機會,可以將這些方法編入類似 JMP 工作流程之類的工具中。