Regressione segmentataQualcuno sa come eseguire una regressione segmentata e calcolare il punto di interruzione (dove si incontrano le 2 linee) su JMP?
Ri: Regressione segmentataPer coloro che non l'hanno visto, ecco un blog potenzialmente utile scritto dal mio collega @JerryFish su come costruire e manipolare l'adattamento a tratti in JMP (utilizzando la piattaforma non lineare): Soluzioni non lineari a pezzi Parte 3: Utilizzo dell'editor di formule di JMP per risolvere parametri sconosciuti.
Lo inserisco qui poiché si adatta perfettamente a questa discussione.
Ri: Regressione segmentataL'ho provato proprio di recente, per me ha più senso dell'utilità della piattaforma non lineare. Sarei interessato a capire come lo schema di iterazione sta convergendo sulla mia soluzione? Ho provato a scegliere un valore ragionevole di d (il punto di divisione) per i miei dati, e sembrava funzionare meglio quando ho "bloccato" il valore di d e ho ricliccato il pulsante "Vai" nella finestra di dialogo della piattaforma generata dal Piattaforma non lineare lanciata utilizzando:
Nonlinear( Y( :Y ), X( :Ypred ), Newton, Finish );
porzione del codice.
Esiste un modo semplice per modificare questo breve script per chiamare invece una tabella dati? (di inserire manualmente i valori per X e Y)?
Sono sicuro che questa sia una "domanda per principianti JSL", quindi mi scuso in anticipo.....
L'ho preso in modo cloogey e ho copiato e incollato solo quanto segue nel mio datatable salvato con Colonne, {X, Y, Ypred} e i miei dati popolati:
Parameter( {a = 5, b = 45, c = -100, d = 0.109}, a + b * :X + c * (:X - d) * (:X > d) );
Nonlinear( Y( :Y ), X( :Ypred ), Newton, Finish );ed è così che sono arrivato al risultato per i miei dati! Grazie ancora per questo contributo alla comunità.
Ri: Regressione segmentataGrazie, lo proverò!
Ri: Regressione segmentataCome suggerisce Dodo, la regressione a tratti può essere eseguita con la piattaforma non lineare. Di seguito è riportato un esempio basato sull'esempio del bastone rotto sopra.
New Table( "piecewise",
Add Rows( 20 ),
New Column( "X",
Continuous,
Set Values( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] )
),
New Column( "Y",
Numeric,
Set Values( [15, 12, 27, 31, 26, 31, 42, 47, 56, 56, 47, 46, 36, 44, 38, 35, 34, 35, 25, 19] )
),
New Column( "Ypred",
Numeric,
Formula( Parameter( {a = 20, b = 1, c = -10, d = 10}, a + b * :X + c * (:X - d) * (:X > d) ) )
)
);
Nonlinear( Y( :Y ), X( :Ypred ), Newton, Finish );
Ri: Regressione segmentataSe si tratta di una semplice relazione con un bastone rotto, potresti fare qualcosa del genere:
// Create a broken stick relationship with some noise;
x = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];
y = [15, 12, 27, 31, 26, 31, 42, 47, 56, 56, 47, 46, 36, 44, 38, 35, 34, 35, 25, 19];
expr_FX = expr(a + b*x + c*(x-d):*(x>d));
expr_SSE = expr(sum((y-expr_FX)^2));
// Supply a set of starting values;
a = 20; b = 1; c = -10; d = 15;
print("Starting values:");
show(a, b, c, d);
sse = minimize(expr_SSE, {a, b, c, d}, << tolerance(1e-5));
print("Final estimates:");
show(a, b, c, d);
show(eval(expr_FX));
Ho basato quanto sopra sull'esempio dei minimi quadrati nel manuale JMP 10, capitolo 8, sostituendo una relazione con il bastoncino spezzato nell'espressione al modello esponenziale nell'esempio. Il punto di interruzione sarà il parametro d, poiché è il valore x in corrispondenza del quale cambia la pendenza della linea. Nota che quando moltiplichi le due matrici (xd) e (x>d) insieme, avrai bisogno del prodotto per elemento
invece di una semplice moltiplicazione. Probabilmente avrai anche bisogno di un valore iniziale relativamente buono per il punto di interruzione affinché l'espressione converga. In questo esempio, tutto l'output viene scritto nel log.
Presumibilmente questo potrebbe anche essere impostato nella piattaforma non lineare (Analizza | Modellazione | Non lineare), ma non l'ho ancora provato poiché non ho molta familiarità con l'uso delle formule all'interno delle tabelle di dati. Questo aiuta affatto?