我叫大衛‧伯納姆,這次我想探討的是,如何透過模擬產品隨時間推移發生的降解過程來估算其保存期限。一種方法是將產品放入溫控箱中。然而,這種方法可能需要數月甚至數年的時間才能累積足夠的數據來建立模型。但如果我們推出的新產品本身就不穩定呢?我們需要盡快獲得這方面的資訊。
加速穩定性研究的作用就是在短短幾週內為我們提供這些數據。我們透過對產品施加壓力來實現這一點,例如,我們可以將其儲存在高溫環境中。我開發了一個 JSL 應用程序,旨在對這些加速穩定性研究產生的數據進行建模。這項工作是 Pega Analytics 與幾家製藥公司合作完成的。 Pega Analytics 是我 15 年前創立的公司,主要提供 JMP 培訓,但也提供 JSL 服務。今天,我想在演講中探討一下藥物片劑降解建模的過程。
這種降解現象的發生是因為這些藥片並非完全穩定。其中含有會隨時間演變的雜質。我可以用動力學模型來科學地描述這個演化過程。雜質的演變是由藥片內部和環境中的熱能和水分所驅動的。讓我們來看看這類研究的數據。研究中使用的是高溫(即儲存溫度)和高相對濕度。由於這種加速作用,因為我們在短短兩週內對產品進行了高強度處理,所以可以測量到雜質的含量,而這些數值的變化足以讓我建立一個模型。
讓我為您展示一下模型的樣子。這個模型包含三個部分:溫度和相對濕度,這些是儲存條件;時間部分,代表雜質隨時間的演變。一旦這些數據足以建立模型,我就可以做兩件事。首先,我想降低儲存條件,使其恢復到正常的無應力狀態。然後,我想進行外推,嘗試預測該產品未來的變化趨勢。我調整一下Y軸的刻度,以便您更清楚地看到。在這個例子中,您可以看到時間曲線非常平緩,表示產品非常穩定,而且低於紫色線,也就是該產品1%的規格閾值。這個動力學模型看起來一切正常。
我們還可以建造另一種模型,即包裝模型。讓我們解釋一下為什麼要進行包裝。假設我有一個不穩定的產品。為了說明這一點,我將溫度調回 50 度。可以看到,大約 50 到 60 天后,雜質含量超過了規格限值,因此產品不再合格。我知道在這個例子中我將溫度調到了 50 度,但假設這是正常的儲存條件。那我們就需要考慮如何應對。我們可以引入包裝。包裝的作用是降低濕度。
隨著濕度降低,你會看到時間曲線變得平緩。事實上,隨著濕度降低,溫度敏感度也隨之降低。這裡我設定的相對濕度是20%,這是我在受控環境下包裝時可以達到的。我把藥片放入瓶中,在20%的濕度下密封瓶子。其實我不需要包裝模型就能做到這一點,我只需要把藥片放進瓶子裡就行了。但隨著時間的推移,瓶內的濕度會逐漸升高。這真是太神奇了。你可能覺得瓶子很堅固,但實際上水分會從瓶壁滲透進來,我們可以對這種滲透過程進行建模。這真是一個非常有趣的物理現象。
我們可以透過添加乾燥劑來減緩乾燥過程,並且可以模擬乾燥劑的作用。利用這些模型,我們可以根據乾燥劑的用量來假設分析。這就是我們對包裝模型感興趣的原因。雖然它非常小眾,但應用範圍很廣,也很有趣,因為它涉及物理和數學。為了讓更多人能夠理解,我將專注於講解動力學模型。即使我們研究的是包裝,如果我們不了解濕度對乾燥過程的影響,包裝模型也毫無用處。我將重點介紹這些動力學模型。我還想探討一下建立這些模型時遇到的挑戰。不是模型建構本身,而是模型選擇。
我認為模型選擇的挑戰在加速穩定性研究中非常獨特。 JSL 應用程式將幫助我解決這個問題。但在介紹應用程式本身之前,我想先讓你們了解我們如何使用 JMP 的原生功能來建立這些模型的一些機制。我將向你們介紹我認為針對這些數據可以建立的最簡單的模型。這裡有一個模型公式。這個公式是基於阿倫尼烏斯方程式。實際上,它包含一個溫度的指數項、一個時間項以及一個相對濕度項。我們擴展了阿倫尼烏斯方程,使其包含水分。現在我可以向你們展示這個公式的表現。
如果我取消隱藏這一列,公式就會預測我的雜質含量,但結果並不理想。它預測的是 10%,而實際值是 2.5%。這是怎麼回事呢?嗯,如果我再看一下這個公式,您應該知道,公式是基於不同列變數的表達式。但您可能不熟悉,也可能了解,公式還可以加入參數。我可以添加一個參數,給它命名並賦值。現在,這個公式有三個參數,每個參數的值都是隨意分配的。這不是我想要的。我想要的是為這些參數選擇最佳值。
我透過將模型擬合到我的數據來實現這一點。這個過程是在 JMP 的非線性平台中完成的。接下來,我將更詳細地了解非線性平台。首先,我將模型分配給我的預測公式,並將雜質分配給我的回應。這會彈出一個窗口,上面寫著「點擊開始」。在點擊「開始」按鈕之前,讓我先解釋一下它的作用。我們有一些參數,並且我已經為它們賦予了初始值。我想要做的是優化這些值。當我點擊“開始”按鈕時,它會應用高斯-牛頓演算法,該演算法旨在選擇使誤差平方和最小的值。這與最小平方法迴歸的概念類似。如果您願意,您可以將其轉換為均方根誤差約為 2。這就是我的最終模型。
接下來,我可以問,嗯,這就是我能做到的最好結果嗎?嗯,如果能有第二個模型進行比較就好了,這樣我們就可以建立比我展示的這個模型複雜得多的模型。讓我舉一個更複雜的模型的例子,它看起來是這樣的。之所以說它更複雜,是因為它有更多的參數,而這些參數又對應一個更複雜的表達式。我不會深入講解表達式的細節,我想專注於擬合這個模型的機制。因為你會發現,如果你點擊“運行”,它會失敗。我想探究一下建構這些模型的一些原因和挑戰。它提示我再次點擊“運行”。再次點擊“運行”,它仍然失敗。這並沒有真正幫助我。
發生了什麼事?嗯,迭代次數已超過上限。上限是 60,這代表什麼?嗯,這意味著我們正在執行梯度下降演算法。我就像坐在山坡上,正往下走,想到達山腳,但我只能走 60 步。嗯,我不太明白為什麼會有這個限制。對於現代電腦來說,走超過 60 步沒有任何問題。我們把限制設為 6000。我想重置這些參數。讓我把它們恢復到初始值,然後再點擊「運行」。它仍然失敗,但我們得到了不同的錯誤訊息。資訊提示說這個收斂標準太嚴格了,我們需要放寬它。嗯,這個收斂標準的值非常小。我想 10 的負 15 次方不太適合。
我想要一個較小的數字,但我認為 10 的負 7 次方已經很小了。我們來試試,我再恢復到初始參數,然後點擊「運行」。最終我收斂了,所以你可以看到,對於複雜的模型來說,有時需要更多的工作。現在我們來比較一下這兩個模型。我的誤差平方和是 128,或者說均方根誤差大約是 2.5,而另一個模型的均方根誤差是 2,誤差平方和是 91。右邊的模型比左邊的模型表現更好。但至少我們可以比較不同的模型。不過,我們在進行比較時要謹慎,因為左邊的模型仍然不是該模型的最佳表示。讓我再給你展示一下我們還可以做些什麼。
我要重新啟動第二個模型的分析,但我不會點擊「開始」按鈕。我說這是一個梯度下降演算法,就像下山一樣,我們討論過可以走多少步,但這也取決於你的起點。如果你從不同的位置開始,最終會到達不同的位置。你的起點取決於這裡的這個值。我想做的是探索不同的起始條件。 JMP 有一個非常棒的功能,可以讓我對這些起始條件進行網格搜尋。我需要定義這個網格,但我不太擅長邊打字邊說話,所以我會打字。你可能會聽到我說話,但我只是在自言自語,我需要設定好這個網格。
範圍是 1 到 10,步長為 3。這是最大的,範圍是 1 到 100,000,步長為 100。還有 0 到 10 的,我們拿 10 個。好了,我絮絮叨了。現在我又跟你說話了。我已經設定好了。如果我點擊“運行”,JMP 會評估所有這些初始條件。我有 27,000 個,我們來看看。嗯,不用全部都看,但你看,這裡有 27,000 個。對於每一行,我都有這些參數的初始條件組合,它計算了誤差平方和。現在我們把它們排序,按升序排列。你看,最佳誤差平方和是 145。跟這個比起來還是不太好。但記住,我們還沒有執行演算法。這只是在尋找初始條件。
這些是我想要使用的初始參數。我複製一下,表格就完成了,關掉它。我可以把它們貼到這裡。這是我的初始條件。現在我點擊「運行」。現在我已經收斂了,我們來看看結果。可以看到,誤差平方和是 1。記住,上次是 128,現在降到了 1。相較於之前的 91,這簡直太棒了。均方根誤差是 0.2,而上次是 2,所以小了 10 倍。我在這裡試圖展示的是擬合這些模型的一些挑戰,但其中蘊含著一個重要的教訓:對於複雜的模型,如果不進行網格搜尋來尋找初始條件,很可能會得到一個次優解。
我可以評估不同模型的各種參數,也可以比較不同的模型。我可能會使用均方根誤差,但我也想對複雜模型進行懲罰,所以我至少可以在軟體中計算AIC統計量,這是一個模型比較統計量。現在我要切換到軟體,也就是JSL應用程序,它可以幫助我建立模型並進行模型比較。讓我啟動軟體,介面是這樣的。首先,我需要為一個新項目命名。就叫它「柏林」吧。我已經有一個「柏林」計畫了。那就叫它「柏林2」吧,然後點選「確定」。你在這裡看到的這些圖示代表工作流程。首先,我們先來更全面地了解這個應用程式。
想想 JMP 的功能。 JMP 使我們能夠擬合模型、進行統計分析和視覺化。當我們編寫 JSL 腳本時,所有這些功能都相對容易實現,因為 JMP 已經為我們完成了所有繁重的工作。除此之外,此應用程式還旨在提供一種工作流程。我們需要執行一些步驟。這些步驟目前無法執行,它們已被鎖定。這兩個步驟是可用的,並且是建議的步驟。我們提供了一個工作流程,即一系列要執行的任務,同時我們也會持久化資訊。一旦設定完成,您就無需再次執行。如果您已經擬合了模型,則無需再次擬合。
你可以明天、下個月、明年再回來查看。這就是這個計畫的理念:它能長期保存所有資訊。我們先開始吧。第一步,也是建議的一步,就是選擇產品。實際上,我在這裡是在判斷,我手上的產品是液體還是固體?用行話來說,液體產品是大分子產品,而片劑是小分子產品。我的理解方式略有不同,我是從建模的角度來考慮的。液體對pH值很敏感,例如疫苗,它對pH值很敏感;而片劑可能對濕度敏感。我打算吃一片片劑。我真希望我沒說我要吃一片片劑。我真想笑出來。
接下來我要做的是分配一些數據,而我需要一些數據。這是一個數據表,它關聯了四個雜質。回到應用程式。我可以分配這些數據,然後它會詢問我是否要使用這些數據。是的,我同意。之後它會告訴我這些資料已經複製到專案中,我實際上不需要一直打開資料表。這些資料會作為專案的一部分持久化保存,但我們不需要實際查看該表。我們仍然可以進行列映射,所以我可以處理這四個雜質。這些是我的響應。這些是我要用來擬合模型的物件。對於每個雜質,我將擬合多個模型,然後我想為每個雜質選擇最佳模型。
讓我完成列映射。現在,對於每個回應,我都可以輸入規格。我這裡輸入 1%,也就是 1%。我們想表達的是,如果雜質含量低於 1%,那麼產品就是可行的。如果我們觀察雜質含量隨時間的變化,雜質含量超過 1% 的點就是產品的有效使用壽命。現在是最後一步,即提供模型選項。我們可以用八種不同的模型來擬合這些數據,這裡有必要解釋一下。想想雜質含量隨時間的變化,它可能呈線性增長,也可能增長速度減慢,或加快。我們有減速模型和加速模型的概念。
我們可以用不同的方式來表達這些模型。我的滑鼠好像丟了。好了,我們回到模型選項。這裡有八種模型類型。這些模型包含溫度和水活性的表達式或項。水活性可以用相對濕度或絕對濕度來表示。最終我們得到總共 16 種不同的模型變體。為了演示,我只使用八種模型變體,並且只關注涉及相對濕度的那些。我快完成了。還有一件事。資料本身是受壓儲存條件下的資料。我必須提供標準儲存條件:25 攝氏度,65% 濕度。
專案設定任務到此完成。現在我可以開始擬合動力學模型了。應大家的要求,我可以進行自動擬合,只需點擊確定即可。它會自動擬合所有模型並完成所有模型選擇。但我希望你們真正理解模型選擇的挑戰。自動擬合並不能提供任何有價值的資訊。我們至少要針對其中一個雜質單獨進行模型選擇。對於每種雜質,我們都要經歷一個三步驟流程(或者我只以雜質一為例),找到合適的模型。第一步是擬合模型。程式會依序擬合每個模型。完成後,會顯示一個儀錶板,確認這些模型已擬合完成。
最後一步是從這八個模型中選擇一個。但最好先有一個中間步驟,建立一個候選名單。第二步就是建立這個候選名單。軟體透過交通號誌系統來簡化此步驟。綠色區域的模型是最有可能的模型,黃色區域的模型可能性較低,而紅色區域的模型則可以捨棄。我們可以對這個名單進行合理性檢查。例如,最佳模型是一個減速模型。如果雜質濃度隨時間推移而降低,而不是加速,那麼我們可以捨棄那些加速的模型。
軟體並沒有使用那種邏輯,也許它應該用,也許它應該具備那種智慧。它現在只是冷冰冰的統計數據,計算AIC統計量。 AIC是一種模型比較統計量,用於懲罰模型的複雜度。 JMP在很多地方都用到了它,它貫穿整個JMP。雖然非線性平臺本身並沒有用到它,但我們可以在軟體內部計算它。我接下來只專注在綠色區域內的兩個模型,我會把它們移除。我的候選名單就只有這兩個模型了,現在我可以選擇我最心儀的模型,或者至少軟體會提供更多資訊來幫助我做出最終選擇。
我現在只關注這兩個模型。現階段統計數據本身對我幫助不大,因為我無法真正區分綠色區域內的兩個模型。如果你看R平方值或均方根誤差之類的指標,你會發現這些數值幾乎完全相同。我能做的就是先把這些指標關閉,以免分散我們的注意力。專注於一些診斷圖。我可以查看不同的診斷圖,也可以查看我選擇的兩個模型的診斷圖。我嘗試在軟體中加入一些提升使用者體驗的功能。我發現能夠並排查看這兩個模型非常有用。現在,我已經把第一個模型加入到清單中了。如果你願意的話,最好的模型在左邊,另一個模型在右邊。
我們先明確一下我們關注的是什麼:實際值與預測值。實際數據點與預測數據點的比較。如果我們有一個完美的模型,那麼所有資料點都會落在45度紅線上。這不僅能讓你了解模型預測數據的效果,還能讓我們比較兩個模型。我希望你注意到的是,它們完全一樣。它們如此相似。每次我看這些圖的時候,我都懷疑是不是軟體出了問題,沒能給你展示不同的圖表,但它們確實不一樣。這個數據點在紅線上,而這個數據點又在紅線外。它們是不同的圖表,但你可以看出它們有多相似。這就是模型選擇的挑戰。這裡很好地說明了這一點。
我們換個圖看看。我們來看一下殘差的常態機率圖。我們希望殘差能形成一條直線。在這個例子中,左邊的圖明顯比右邊的圖好。左邊的圖也是統計結果最好的。這時我想,那就選統計結果最好的模型,對吧?選了統計結果和診斷結果都最好的模型,應該不會丟掉工作,所以沒問題。但我還需要考慮如何使用這些模型。我可以看看預測分析器。我們知道預測結果是一樣的,這一點我們已經看到了。這些分析器看起來會一樣,或至少在我們擁有的資料範圍內看起來一樣。但這並不是我們使用這些模型的方式。
首先,讓我解釋一下預測分析器,因為您可能希望看到溫度和相對濕度。這些參數已移至下拉清單中。我們目前只關注時間演變。那麼,我想做什麼呢?我想將溫度調回正常的儲存條件,即 25 攝氏度和 65% 的濕度。然後,我想延長這些條件的時間。這又是一個提升使用者體驗的功能。我可以對這些圖表進行外推。現在您可以看到顯著的差異。當我們外推這些模型時,兩個模型都描述了減速過程,但左邊的減速更為顯著。
讓我們來看看這會帶來什麼後果。首先來看右邊的模型。這是模型與這條線相交的點。這條線代表了該點的設定閾值。但這並不是我們關注的重點。當我們對壽命進行建模時,我們實際上關注的是置信上限以及它與模型的交點。這才是我們真正感興趣的點。略高於 300 天。而左邊的模型則更接近 600 天。這些數字非常重要,它們在軟體中已經計算出來了,就在這裡。但我希望你們理解它們的來源,以及它們在模型選擇中的重要性。因為我們經常發現,這些是不同模型之間唯一有意義的統計差異。接下來我該怎麼做呢?讓我們思考一下我們為什麼要進行建模。
我不是想要告訴你這款產品的保存期限。如果你想知道,把它放在溫控箱裡兩年看看會發生什麼事。我們想做的是進行風險評估,看看這款產品是否有可能提前失效。這個模型告訴我,它有可能在300天後失效。當然,也可能不會。左邊的模型可能是正確的,它的壽命可能達到600天。但我希望採取一種風險規避的方法。我可能會選擇第二個模型,我可以解釋原因。我可以說明,我採取的是基於風險的方法,而綠色區域的模型會給出一些解釋。
如果你不滿意,你可以說這是基於科學判斷或其他原因。你也可以直接說我喜歡這個結果。但我們可以給一些解釋,或者我們可能想選擇左邊的模型,因為它統計數據最好。最終我們可以自己選擇。但我認為這是基於風險評估的理性選擇。我決定採用這個模型,這樣就完成了對該雜質的模型選擇。我們可以對所有雜質重複這個步驟,如果我給你看一個總結,你可以看到我們已經完成了雜質 1 的這三個步驟,我可以對其他三個雜質也做同樣的事情。我可以手動操作,也可以使用自動擬合,現在這三個雜質都可以自動擬合了。
如果我這樣做,我們可能要盯著螢幕看幾分鐘。不如這樣,我來示範如何切換到另一個專案。我選擇了另一個項目,數據是一樣的,唯一的區別是所有四種雜質都進行了自動擬合。我只是想讓你們看看輸出結果。如果你們點選了自動擬合按鈕,就會看到這樣的輸出結果。首先,雜質 1 的按鈕是琥珀色的。軟體裡有很多類似交通號誌的指示系統。其他雜質的按鈕都是綠色的。琥珀色的按鈕代表什麼呢?它表示模型選擇存在一些歧義,因為我可以選擇這兩個模型,而其他雜質的模型選擇則沒有歧義。
對於其他模型,我直接選擇了統計值最小、統計值最佳的。而對於這個模型,我是根據持續完整性(CI)失效持續時間來選擇的。這些持續時間都顯示出來了。這是311,也就是我們之前看到的那個數字。如果我點擊圖標,或者只是把滑鼠懸停在上面,它會告訴我估計值在311到569之間。如果我點擊那裡,它會顯示交通燈系統,並告訴我它選擇了第二個模型,因為它對這個數字的估計值最差。但情況並非總是如此。這裡,這個模型的保質期非常短。我們看到一個綠色圖標,綠色圖標告訴我,這裡的估計值範圍非常一致。綠色區域裡有四個模型,但它們的預測值幾乎相同。因此,我們可以根據統計數據選擇最佳模型。
根據模型之間表現的一致性,我們會做出不同的決策。最終,我們完成了所有模型的擬合,並為每種雜質選擇了合適的模型。這些雜質針對的是單一產品,之後我們可以做一些分析。例如,我可以將這些模型匯總到儀表板上,方便我們查看不同的模型。我們可以測試不同的儲存條件。這是一種分析方法。另一種方法是將動力學模型應用於儲存模型,並研究不同類型的容器對產品的影響。
讓我總結一下我今天講的內容。如果我沒記錯的話,我們先來看一些來自加速穩定性研究的數據,這項研究旨在對產品施加壓力。我提到的產品是一種藥品,具體來說是藥片。我可以模擬雜質的演變過程,建構這些動力學模型。我們已經了解如何使用非線性平台產生這些模型,我也嘗試向大家展示了使用該平台的一些挑戰。然後,我講解如何使用 JSL 應用程式來自動化模型擬合並簡化模型選擇過程。你們也可以進一步思考包裝產品的相關問題。今天的演講就到這裡。非常感謝。