如何在 JMP 中建立具有約束響應(輸出總和 = 1)的線性或非線性模型?我經常需要對錶示各類別比例的連續反應變數進行建模,其中每個樣本的反應總和必須為 1(例如,P1=10%,P2=25%,P3=35%,P4=30%)。
在 Python 中,我使用 softmax 輸出層來強制執行總和為 1 的限制。
- 如何在 JMP 中建立這樣的模型(無論是線性模型還是神經網路模型),同時確保預測響應總和等於 1?
- 是否有建議的工作流程(例如,多項式邏輯迴歸、具有適當連接函數的神經網路)?
- 最後,能否提供一個分析器,顯示每個類別的預測比例(類似顯示類別機率的分類分析器)?
感謝您的任何指導或範例!
進階統計建模回覆:如何在 JMP 中建立具有約束響應(輸出總和 = 1)的線性或非線性模型?你好,
實現您所尋找的目標的一個非常簡單的方法是建立一個與最高 y 值對應的名目回應列,並使用名目邏輯迴歸將其擬合到 x 值(請參閱附件表格)。
這能滿足您的需求嗎?您能否幫我詳細了解您的使用場景?這些數據代表什麼?您想從中了解什麼?
回覆:如何在 JMP 中建立具有約束響應(輸出總和 = 1)的線性或非線性模型?嗨,哈德利,
謝謝你的幫忙。不過,你的建議並不能完全滿足我的具體需求。
我的目標:我需要預測輸出,並滿足總和等於 1 的限制條件——這在根據其屬性對人口比例或混合物配方進行建模時很常見。
我的解決方案:我手動實現了中心對數比 (CLR) 變換。工作流程如下:
- 輸出結果轉換為中心對數空間
- 對轉換後的變數擬合模型
- 應用逆變換以確保約束條件得到滿足。
以下是轉換的程式碼:
<SPAN>// Adjust zeros </SPAN><SPAN>epsilon = 0.0000001; </SPAN><SPAN>p1_adj = If(:p1 == 0, epsilon, :p1); </SPAN><SPAN>p2_adj = If(:p2 == 0, epsilon, :p2); </SPAN><SPAN>pk_adj = If(:pk == 0, epsilon, :pk); </SPAN>
<SPAN>// Scaling </SPAN><SPAN>sum_adj = p1_adj + p2_adj + ... + pk_adj; </SPAN><SPAN>p1_norm = p1_adj / sum_adj; </SPAN><SPAN>p2_norm = p2_adj / sum_adj; </SPAN><SPAN>pk_norm = pk_adj / sum_adj; </SPAN>
<SPAN>// Geometric mean </SPAN><SPAN>geom_mean = (p1_norm * p2_norm * ... * pk_norm)^(1/k); </SPAN>
<SPAN>// CLR transformation </SPAN><SPAN>y1_clr = Log(p1_norm / geom_mean); </SPAN><SPAN>y2_clr = Log(p2_norm / geom_mean); </SPAN><SPAN>yk_clr = Log(pk_norm / geom_mean); </SPAN>
<SPAN>// Inverse transformation (after prediction) </SPAN><SPAN>sum_exp = Exp(:y1_clr_pred) + Exp(:y2_clr_pred) + ... + Exp(:yk_clr_pred); </SPAN><SPAN>p1_pred = Exp(:y1_clr_pred) / sum_exp; </SPAN><SPAN>p2_pred = Exp(:y2_clr_pred) / sum_exp; </SPAN><SPAN>pk_pred = Exp(:yk_clr_pred) / sum_exp;</SPAN>
補充請求:我還想使用 Profiler 顯示每個輸出的堆疊比例——類似於 Nominal Logistic 模型顯示每個標籤的堆疊機率的方式。您的解決方案實現了堆疊視覺化,但它只預測最高類別的機率,而不是每個輸出的確切比例。
我附上了一個手動轉換的範例供您參考。
此致,