如何在 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>
补充请求:我还想使用分析器显示每个输出的堆叠比例——类似于名义逻辑回归显示每个标签的堆叠概率的方式。您的解决方案实现了堆叠可视化,但它只预测最高类别的概率,而不是每个输出的确切比例。
我附上了一个手动转换的示例供您参考。
此致,