Col Somma cumulativa senza chiamare il valore della riga correnteCiao, sono abbastanza nuovo nella scrittura di script JMP e utilizzo principalmente "Modifica formula" per il mio lavoro. Ho esplorato le soluzioni relative a Col Cumulative Sum e non sono riuscito a trovarne una per il mio problema specifico. La versione semplificata della mia tabella dati è la seguente.
| Riga | Settimana | Col Cumulative Sum | Il mio desiderio |
| 1 | 1 | 1 | 0 |
| 2 | 2 | 3 | 1 |
| 3 | 3 | 6 | 3 |
| 4 | 4 | 10 | 6 |
| 5 | 5 | 15 | 10 |
| 6 | 6 | 21 | 15 |
La formula seguente funziona se il valore della riga corrente di "Settimana" è fisso o se ho due colonne separate "Settimana" e "I miei desideri".
If( Row() != 1,
Lag( Col Cumulative Sum( :Week ), 1 ),
0
)
Il problema è che il valore della "Settimana" della riga precedente è fisso ma quello della riga corrente no. E ho solo una colonna "Settimana" con cui lavorare. Sto sviluppando una formula che simula la progressione in base al valore di simulazione precedente. Sto simulando il valore "Settimana" della riga corrente in base a quello della riga precedente.
Supponiamo che io stia lavorando sulla riga 4 nella colonna "Settimana". Voglio sommare cumulativamente tutti i valori "Settimana" precedenti senza chiamare il valore "Settimana" corrente nella funzione. Altrimenti, nel mio caso crea un riferimento illegale o un problema di ciclismo.
Ho provato a utilizzare l'indice invece del ritardo poiché la funzione lag chiama il valore "Settimana" della riga corrente. Non ha funzionato.
If( Row() != 1,
Col Cumulative Sum( :Week )[Row() - 1],
0
)
Spero che la mia spiegazione sia stata abbastanza chiara. Grazie in anticipo per il vostro tempo e la vostra competenza. Utilizzo JMPPro17.
Automazione e scriptingModellazione predittiva e machine learningRe: Col Cumulative Sum senza chiamare il valore della riga correnteÈ possibile detrarre il valore della settimana corrente dalla somma cumulativa
Col Cumulative Sum(:Week) - :Week

Re: Col Cumulative Sum senza chiamare il valore della riga correnteCiao, ho imparato molto sulla scrittura di script JSL attraverso il forum e guardando i video delle lezioni. Ho una domanda di follow-up riguardante il seguente script. Ho ottenuto gli stessi risultati con la seconda riga. Posso sapere perché sceglieresti la prima riga rispetto alla seconda?
Eval( Eval Expr( casesMatrix = Expr( :cases[i - 1] ) ) )
Eval( casesMatrix = :cases[i - 1] )
Inoltre, esiste un modo per evitare di modificare la colonna "R" e mantenere i valori originali? Voglio che i valori R modificati rimangano all'interno della colonna "Casi" senza apparire da nessuna parte. Ho provato ad assegnare un nome di variabile diverso, "Rx", alla R modificata come di seguito. Tuttavia, questo approccio richiede la creazione di una colonna vuota denominata "Rx" per funzionare.
:Rx [i] = :R[i] * (1 - (Sum( casesMatrix )+casesSum) * 4 / 100);
Molte grazie in anticipo per il vostro tempo e la vostra competenza.
Re: Col Cumulative Sum senza chiamare il valore della riga corrente"Sim Cases" è una matrice o una colonna in una tabella dati?
Non capisco
Sembra che tu stia rendendo la tua soluzione eccessivamente complessa.
sim cases = [3,5,2,8];
sum1 = sum(sim cases);
sum2 = sum(([1 1 1 1]*sim cases)[1]);
show(sum1,sum2);
Sia sum1 che sum2 forniscono lo stesso valore
sum1 = 18;
sum2 = 18;
Ti incoraggio a leggere il documento Discovering JMP disponibile nel menu a discesa Guida.
Re: Col Cumulative Sum senza chiamare il valore della riga correnteEcco la mia soluzione, tuttavia, non corrisponde alla tua soluzione. Credo che i tuoi calcoli mostrati non siano corretti per la riga 3. Vedi il mio script, che include la tabella dei dati di esempio.
Names Default To Here( 1 );
dt = New Table( "Example",
Add Rows( 4 ),
New Column( "R",
Numeric,
"Continuous",
Set Values( [., 1.4, 1.67, 2.3] )
),
New Column( "Cases",
Expression,
"None",
Set Values( {[1, 1, 2, 1], Empty(), Empty(), Empty()} )
)
);
// The calculation script
casesSum = 0;
For(i=2,i<=nrows(dt),i++,
Eval( Eval Expr( casesMatrix = Expr( :cases[i - 1] ) ) );
:R[i] = :R[i] * (1 - (Sum( casesMatrix )+casesSum) * 4 / 100);
:Cases[i] = casesMatrix * :R[i];
casesSum = casesSum + sum(casesMatrix);
);
// Row 3 R does not seem to be correct
// I can not come up with .71, I come up with .96192
show(1.4 * (1 - (5 * 4/100)) );
show(1.67 * (1 - (10.6 * 4/100)) );

Re: Col Cumulative Sum senza chiamare il valore della riga correnteHai suggerito che la seconda riga è fantastica. La ragione per cui utilizzo la sintassi che ho usato è solo una vecchia abitudine.
Il modo in cui Rx può essere utilizzato senza creare una colonna vuota è utilizzarlo come riferimento alla variabile di memoria. Ecco il codice per farlo
// The calculation script
casesSum = 0;
For(i=2,i<=nrows(dt),i++,
Eval( casesMatrix = Expr( :cases[i - 1] ) );
Rx = :R[i] * (1 - (Sum( casesMatrix )+casesSum) * 4 / 100);
:Cases[i] = casesMatrix * Rx;
casesSum = casesSum + sum(casesMatrix);
);
Re: Col Cumulative Sum senza chiamare il valore della riga correnteNel momento in cui utilizzo (:Week) nella mia formula ottengo un problema di riferimento non valido. La riga corrente (:Settimana) non è stata ancora completamente calcolata. In teoria posso solo ricordare (:Week) dalla riga precedente.
Re: Col Cumulative Sum senza chiamare il valore della riga correnteUtilizzerei colonne separate per evitare ogni tipo di problema, ma non sono esattamente sicuro di cosa stai cercando di ottenere poiché nel tuo esempio hai dati completi. Forse qualcosa del genere se Col Cumulative Sum non funziona per te (calcola il valore utilizzando Lag e variabile)
If(Row() == 1,
val = 0,
val = val + Lag(:Week);
);
val;
Re: Col Cumulative Sum senza chiamare il valore della riga correnteGrazie per il tuo suggerimento sull'utilizzo del pedice dell'indice . Ora riscontro il problema "oggetto non sottoscrivibile".
Il mio esempio della settimana è stato eccessivamente semplificato e ho una matrice Sim Cases di 4 righe e 1 colonna al posto di week . Per trasformarlo in un valore numerico riassuntivo, ho moltiplicato la matrice per [1 1 1 1] e ho aggiunto un pedice [ 1 ]. Era poi seguito dal pedice dell'indice .
Sum( ([1 1 1 1] * :Sim Cases)[1][Index( 1, Row() - 1 )] )
Penso che il valore numerico risultante dalla matrice 4x1 originale non accetti alcun pedice dopo [ 1 ]. Oppure potrebbe essere di nuovo a causa del riferimento illegale (ricorsione).
Re: Col Cumulative Sum senza chiamare il valore della riga correnteSì, all'inizio ho provato a emulare nella tabella dati JMP ciò che faccio di solito nei fogli di calcolo Excel separando le colonne. Chiamerei quindi i valori della riga precedente di una colonna diversa. La tabella dati JMP non si comporta come un foglio di calcolo Excel e riscontro problemi ciclici.
Quindi, continuo a cambiare strategie e la mia comprensione attuale è di mantenere ogni variabile richiesta in una colonna per evitare problemi ciclici.
Re: Col Cumulative Sum senza chiamare il valore della riga correnteCiao di nuovo. Sto riformulando la mia domanda nella speranza di poter far sparire la frustrazione.
| Riga | R | Casi |
| 1 | . | [1, 1, 2, 1] |
| 2 | 1.4 | |
| 3 | 1.67 | |
| 4 | 2.3 | |
Ho 2 colonne, R e Cases . I casi vengono calcolati moltiplicando R dalla riga corrente per i Casi della riga precedente. Inoltre, R deve essere modificato (ridotto) in base alla somma dei casi della riga precedente.
R (riga2) nella colonna Casi = R (riga2) * modificatore
modificatore = 1 - ( ( somma cumulativa dei casi dalla riga 1 alla riga precedente alla riga corrente * 4 ) / Popolazione totale )
La popolazione totale è un parametro ed è 100.
Il modificatore risultante viene moltiplicato per i casi della riga1 per creare casi nella riga2.
Ad esempio, mi aspetto la R modificata (riga2) essere 1.12 e Casi (riga2) essere [1.12, 1.12, 2.24, 1.12]
1,4 * 1 - ( 5 * 4 / 100 ) = 1,12
1.12 * [1, 1, 2, 1] = [1.12, 1.12, 2.24, 1.12]
Quindi, mi aspetto che R modificato (riga 3) sia 0,71 e Cases (riga 3) sia [0,8, 0,8, 1,6, 0,8]
1,67 * 1 - ( 10,6 * 4 / 100 ) = 0,71
10.6 proviene da 5 casi nella riga 1 e 5.6 casi nella riga 2.
0,71 * [1,12, 1,12, 2,24, 1,12] = [0,8, 0,8, 1,6, 0,8]
Ho un problema nell'ottenere il valore verde . Il mio attuale tentativo di scrivere uno script JMP è il seguente.
If( Row() == 1,
Matrix( {1, 1, 2, 1} ),
:R * (1 - (Summation( i = 1, N Row() - 1, Sum( :Cases ) ) * 4) / Total Population) * Lag( :Cases, 1 )
)
Ho provato Index , Lag , Row() - 1 , Col cumulative sum , Summation , ecc. per ottenere il modificatore e non ha funzionato. Principalmente ottengo entrambi
1) riferimento illegale o
2) non sottoscrivibile
Grazie ancora per il tuo tempo e la tua competenza.
Re: Col Cumulative Sum senza chiamare il valore della riga correnteGrazie mille. Il ciclo for sembra essere la chiave qui. Devo ancora imparare le funzioni Eval , Eval Expr e Expr .
E hai ragione, i miei calcoli nell'esempio erano sbagliati.
Re: Col Cumulative Sum senza chiamare il valore della riga correnteSe ho capito bene, penso che questa potrebbe essere la soluzione
If( Row() != 1,
Sum( :Week[Index( 1, Row() - 1 )] ),
0
)
Re: Col Cumulative Sum senza chiamare il valore della riga correnteContinuerò ad imparare JMP. Per ora mi limiterò al mio foglio di calcolo Excel. Grazie a tutti per le vostre risposte
Sim Cases è una colonna e sto utilizzando Sim Cases delle righe precedenti per creare nuove righe. Quindi immagino che sia sia una colonna che una variabile all'interno della stessa colonna.
Re: Col Somma cumulativa senza chiamare il valore della riga correnteIl comportamento delle tabelle e dei fogli di calcolo JMP è totalmente diverso e questo vecchio post potrebbe essere una buona lettura JMP is Not a Spreadsheet , in quanto fornisce alcuni esempi e spiegazioni. Puoi fare la maggior parte delle cose in JMP, ma potrebbe volerci del tempo per capire come si comportano colonne+righe in JMP rispetto a una singola cella in Excel.
Re: Col Somma Cumulativa senza chiamare il valore della riga correnteQuesto script utilizza la soluzione di txnelson come punto di partenza e vi apporta alcune modifiche. Lo scopo di questo script è semplicemente quello di fornire un esempio per l'apprendimento di altre tecniche (ciclo For Each Row invece del ciclo For, acquisizione dei valori nella matrice da :R e altre modifiche).
Names Default To Here(1);
dt = New Table("Example",
Add Rows(4),
New Column("R", Numeric, "Continuous", Set Values([., 1.4, 1.67, 2.3])),
New Column("Cases", Expression, "None", Set Values({[1, 1, 2, 1], Empty(), Empty(), Empty()}))
);
r_m = :R << Get values;
casesSum = 0;
For Each Row(dt,
If(Row() == 1, Continue()); // skip first row
casesMatrix = Lag(:cases, 1);
r_m[Row()] = r_m[Row()] * (1 - (Sum(casesMatrix) + casesSum) * 4 / 100);
:Cases = casesMatrix * r_m[Row()];
casesSum = casesSum + Sum(casesMatrix);
);