Wie erstellt man in JMP lineare oder nichtlineare Modelle mit beschränkten Zielgrößen (Summe der Ausgaben = 1)?Ich muss häufig kontinuierliche Antwortvariablen modellieren, die Anteile über Kategorien hinweg darstellen, wobei die Antworten für jede Stichprobe sich zu 1 addieren müssen (z. B. P1 = 10 %, P2 = 25 %, P3 = 35 %, P4 = 30 %).
In Python verwende ich eine Softmax-Ausgabeschicht, um die Summe-zu-Eins-Bedingung durchzusetzen.
- Wie kann ich solche Modelle in JMP erstellen – entweder lineare Modelle oder neuronale Netze – und dabei sicherstellen, dass die Summe der vorhergesagten Antworten gleich 1 ist?
- Gibt es einen empfohlenen Arbeitsablauf (z. B. multinomiale logistische Regression, neuronale Netze mit geeigneten Linkfunktionen)?
- Gibt es abschließend einen Profiler, der die vorhergesagten Anteile für jede Kategorie anzeigt (ähnlich dem kategorialen Profiler, der die Klassenwahrscheinlichkeiten anzeigt)?
Vielen Dank für jegliche Hinweise oder Beispiele!
Fortgeschrittene statistische ModellierungBetreff: Wie erstellt man lineare oder nichtlineare Modelle mit beschränkten Zielgrößen (Summe der Ausgaben = 1) in JMP?Hallo,
Eine sehr einfache Möglichkeit, das zu erreichen, was Sie suchen, besteht darin, eine nominale Antwortspalte zu erstellen, die dem höchsten y-Wert entspricht, und diese mithilfe einer nominalen logistischen Regression an die x-Werte anzupassen (siehe beigefügte Tabelle).
Erfüllt das Ihre Anforderungen? Könnten Sie mir bitte genauer erläutern, worum es in dem Anwendungsfall geht? Was stellen diese Daten dar und was möchten Sie daraus lernen?
Betreff: Wie erstellt man lineare oder nichtlineare Modelle mit beschränkten Zielgrößen (Summe der Ausgaben = 1) in JMP?Hallo Hadley,
Vielen Dank für Ihre Hilfe. Leider entspricht Ihr Vorschlag nicht ganz meinem konkreten Bedarf.
Mein Ziel: Ich muss Ergebnisse vorhersagen, wobei die Summe gleich 1 sein muss – dies ist üblich bei der Modellierung von Populationsanteilen oder Mischungsformulierungen auf der Grundlage ihrer Eigenschaften.
Meine Lösung: Ich habe eine zentrierte Log-Ratio-Transformation (CLR) manuell implementiert. Der Workflow ist wie folgt:
- Transformiere die Ausgaben in den zentrierten Logarithmusraum.
- Das Modell wird an die transformierten Variablen angepasst.
- Wenden Sie die inverse Transformation an, um sicherzustellen, dass die Nebenbedingung eingehalten wird.
Hier ist der Code für die Transformation:
<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>
Zusatzwunsch: Ich möchte den Profiler auch verwenden, um gestapelte Anteile für jede Ausgabe anzuzeigen – ähnlich wie die nominale logistische Regression gestapelte Wahrscheinlichkeiten für jedes Label anzeigt. Ihre Lösung visualisiert zwar die Stapelung, sagt aber nur die Wahrscheinlichkeit der höchsten Kategorie voraus, anstatt den genauen Anteil jeder Ausgabe zu ermitteln.
Ich habe ein Beispiel der manuellen Transformation als Referenz beigefügt.
Beste grüße,