Come creare modelli lineari o non lineari con risposte vincolate (somma degli output = 1) in JMP?Spesso ho bisogno di modellare variabili di risposta continue che rappresentano proporzioni tra categorie, in cui la somma delle risposte per ciascun campione deve essere 1 (ad esempio, P1=10%, P2=25%, P3=35%, P4=30%).
In Python utilizzo un livello di output softmax per applicare il vincolo somma a uno.
- Come posso creare tali modelli in JMP, sia lineari che tramite reti neurali, assicurandomi che la somma delle risposte previste sia uguale a 1?
- Esiste un flusso di lavoro consigliato (ad esempio, regressione logistica multinomiale, reti neurali con funzioni di collegamento appropriate)?
- Infine, posso ottenere un Profiler che visualizzi le proporzioni previste per ciascuna categoria (simile al Profiler categoriale che mostra le probabilità di classe)?
Grazie per qualsiasi consiglio o esempio!
Modellazione statistica avanzataRe: Come creare modelli lineari o non lineari con risposte vincolate (somma degli output = 1) in JMP?CIAO,
Un modo molto semplice per ottenere ciò che stai cercando è creare una colonna di risposta nominale corrispondente al valore y più alto e adattarla alle x utilizzando la regressione logistica nominale (vedi tabella allegata).
Questo fa quello che ti serve? Potresti aiutarmi a capire esattamente qual è il caso d'uso? Cosa rappresentano questi dati e cosa stai cercando di imparare da essi?
Re: Come creare modelli lineari o non lineari con risposte vincolate (somma degli output = 1) in JMP?Ciao Hadley,
Grazie per il tuo aiuto. Purtroppo, il tuo suggerimento non risponde esattamente alla mia esigenza specifica.
Il mio obiettivo: devo prevedere i risultati con un vincolo in cui la somma è uguale a 1: ciò è comune quando si modellano le proporzioni della popolazione o le formulazioni delle miscele in base alle loro proprietà.
La mia soluzione: ho implementato manualmente una trasformazione del rapporto logaritmico centrato (CLR). Il flusso di lavoro è il seguente:
- Trasforma gli output nello spazio logaritmico centrato
- Adatta il modello alle variabili trasformate
- Applicare la trasformazione inversa per garantire che il vincolo sia rispettato
Ecco il codice per la trasformazione:
<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>
Richiesta aggiuntiva: vorrei anche utilizzare il Profiler per visualizzare le proporzioni sovrapposte per ogni output, in modo simile a come Nominal Logistic visualizza le probabilità sovrapposte per ogni etichetta. La tua soluzione gestisce la visualizzazione sovrapposta, ma prevede solo la probabilità della categoria più alta anziché la proporzione esatta di ogni output.
Ho allegato un esempio di trasformazione manuale come riferimento.
Distinti saluti,