Col suma acumulativa sin llamar al valor de la fila actualHola, soy bastante nuevo en la escritura de scripts JMP y uso principalmente "Editar fórmula" para mi trabajo. He estado buscando soluciones relacionadas con Col Cumulative Sum y no pude encontrar una para mi problema específico. La versión simplificada de mi tabla de datos es la siguiente.
| Fila | Semana | Col Cumulative Sum | Mi deseo |
| 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 siguiente fórmula funciona si el valor de la fila actual de "Semana" es fijo o si tengo dos columnas separadas "Semana" y "Mi deseo".
If( Row() != 1,
Lag( Col Cumulative Sum( :Week ), 1 ),
0
)
El problema es que el valor de la "Semana" de la fila anterior es fijo pero el de la fila actual no. Y sólo tengo una columna "Semana" para trabajar. Estoy desarrollando una fórmula que simula la progresión en función del valor de simulación anterior. Estoy simulando el valor "Semana" de la fila actual en función del de la fila anterior.
Supongamos que estoy trabajando en la fila 4 de la columna "Semana". Quiero sumar acumulativamente todos los valores de "Semana" anteriores sin llamar al valor de "Semana" actual en la función. De lo contrario, en mi caso se crea una referencia ilegal o un problema de ciclismo.
Intenté usar subíndice en lugar de retraso ya que la función de retraso llama al valor "Semana" de la fila actual. No funcionó.
If( Row() != 1,
Col Cumulative Sum( :Week )[Row() - 1],
0
)
Espero que mi explicación haya sido lo suficientemente clara. Gracias por su tiempo y experiencia de antemano. Yo uso JMP Pro 17.
Automatización y secuencias de comandosModelado predictivo y aprendizaje automáticoRe: Suma acumulativa de columnas sin llamar al valor de la fila actualPuede deducir el valor de las semanas actuales de la suma acumulada
Col Cumulative Sum(:Week) - :Week

Re: Suma acumulativa de columnas sin llamar al valor de la fila actualHola, he estado aprendiendo mucho sobre cómo escribir scripts JSL a través del foro y viendo videos de conferencias. Tengo una pregunta de seguimiento sobre el siguiente guión. Obtuve los mismos resultados con la segunda línea. ¿Puedo saber por qué elegirías la primera línea en lugar de la segunda?
Eval( Eval Expr( casesMatrix = Expr( :cases[i - 1] ) ) )
Eval( casesMatrix = :cases[i - 1] )
Además, ¿hay alguna manera de evitar modificar la columna "R" y mantener los valores originales? Quiero que los valores R modificados permanezcan dentro de la columna "Casos" sin aparecer en ningún lado. Intenté asignar un nombre de variable diferente, "Rx", a la R modificada como se muestra a continuación. Sin embargo, este enfoque requiere que cree una columna vacía llamada "Rx" para funcionar.
:Rx [i] = :R[i] * (1 - (Sum( casesMatrix )+casesSum) * 4 / 100);
Muchas gracias de antemano por su tiempo y experiencia.
Re: Suma acumulativa de columnas sin llamar al valor de la fila actual¿Es "Sim Cases" una matriz o una columna en una tabla de datos?
No comprendo
Parece que está haciendo que su solución sea demasiado compleja.
sim cases = [3,5,2,8];
sum1 = sum(sim cases);
sum2 = sum(([1 1 1 1]*sim cases)[1]);
show(sum1,sum2);
Tanto suma1 como suma2 proporcionan el mismo valor
sum1 = 18;
sum2 = 18;
Le recomiendo que lea el documento Descubriendo JMP disponible en el menú desplegable Ayuda.
Re: Suma acumulativa de columnas sin llamar al valor de la fila actualAquí está mi solución, sin embargo, no coincide con la suya. Creo que los cálculos que se muestran son incorrectos para la fila 3. Consulte mi guión, que incluye la tabla de datos de muestra.
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: Suma acumulativa de columnas sin llamar al valor de la fila actualSugeriste que la segunda línea es genial. La razón por la que utilicé la sintaxis que utilicé es simplemente un viejo hábito.
La forma en que se puede usar Rx sin crear una columna vacía es usarlo como referencia de variable de memoria. Aquí está el código para hacer eso.
// 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: Suma acumulativa de columnas sin llamar al valor de la fila actualEn el momento en que uso (:Semana) en mi fórmula, aparece un problema de referencia ilegal. La fila actual (:Semana) aún no se ha calculado por completo. En teoría, solo puedo recordar (: Semana) de la fila anterior.
Re: Suma acumulativa de columnas sin llamar al valor de la fila actualSi entiendo bien, creo que esta podría ser la solución.
If( Row() != 1,
Sum( :Week[Index( 1, Row() - 1 )] ),
0
)
Re: Suma acumulativa de columnas sin llamar al valor de la fila actualUsaría columnas separadas para evitar todo tipo de problemas, pero no estoy exactamente seguro de lo que intenta lograr ya que tiene datos completos en su ejemplo. Tal vez algo como esto si Col Cumulative Sum no funciona para usted (calcule el valor usando Lag y variable)
If(Row() == 1,
val = 0,
val = val + Lag(:Week);
);
val;
Re: Suma acumulativa de columnas sin llamar al valor de la fila actualGracias por su sugerencia sobre el uso del subíndice de índice . Ahora me encuentro con el problema "objeto no subscriptible".
Mi ejemplo de semana fue demasiado simplista y tengo una matriz Sim Cases de 4 filas y 1 columna en lugar de semana . Para transformarlo en un valor numérico resumido, multipliqué la matriz por [1 1 1 1] y agregué un subíndice [ 1 ]. Luego fue seguido por el subíndice del índice .
Sum( ([1 1 1 1] * :Sim Cases)[1][Index( 1, Row() - 1 )] )
Creo que el valor numérico resultante de la matriz 4x1 original no acepta ningún subíndice después de [ 1 ]. O podría deberse nuevamente a la referencia ilegal (recursión).
Re: Suma acumulativa de columnas sin llamar al valor de la fila actualSí, al principio intenté emular en la tabla de datos de JMP lo que suelo hacer en las hojas de cálculo de Excel separando columnas. Luego llamaría a los valores de la fila anterior de una columna diferente. La tabla de datos de JMP no se comporta como una hoja de cálculo de Excel y tengo problemas cíclicos.
Entonces, sigo cambiando de estrategia y mi entendimiento actual es mantener cada variable requerida en una columna para evitar problemas cíclicos.
Re: Suma acumulativa de columnas sin llamar al valor de la fila actualHola de nuevo. Estoy reformulando mi pregunta con la esperanza de poder hacer que la frustración desaparezca.
| Fila | R | Casos |
| 1 | . | [1, 1, 2, 1] |
| 2 | 1.4 | |
| 3 | 1,67 | |
| 4 | 2.3 | |
Tengo 2 columnas, R y Casos . Los casos se calculan multiplicando R de la fila actual por los casos de la fila anterior. Además, R debe modificarse (reducirse) en función de la suma de casos de la fila anterior.
R (fila2) en la columna Casos = R (fila2) * modificador
modificador = 1 - ( ( suma acumulada de casos desde la fila 1 hasta la fila anterior a la fila actual * 4 ) / Población total )
La población total es un parámetro y es 100.
El modificador resultante se multiplica con Casos de la fila1 para crear Casos en la fila2.
Por ejemplo, espero la R modificada (fila 2) será 1.12 y Casos (fila 2) será [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]
Entonces, espero que la R modificada (fila 3) sea 0,71 y los Casos (fila 3) sean [0,8, 0,8, 1,6, 0,8]
1,67 * 1 - ( 10,6 * 4 / 100 ) = 0,71
10,6 es de 5 casos en la fila 1 y 5,6 casos en la fila 2.
0,71 * [1,12, 1,12, 2,24, 1,12] = [0,8, 0,8, 1,6, 0,8]
Tengo problemas para obtener el valor verde . Mi intento actual de escribir un script JMP es el siguiente.
If( Row() == 1,
Matrix( {1, 1, 2, 1} ),
:R * (1 - (Summation( i = 1, N Row() - 1, Sum( :Cases ) ) * 4) / Total Population) * Lag( :Cases, 1 )
)
Probé Index , Lag , Row() - 1 , Col acumulative sum , Summation , etc. para obtener el modificador, y nada funcionó. Principalmente obtengo cualquiera de los dos
1) referencias ilegales o
2) no suscriptible
Gracias una vez más por su tiempo y experiencia.
Re: Suma acumulativa de columnas sin llamar al valor de la fila actualMuchas gracias. El bucle for parece ser la clave aquí. Todavía tengo que aprender las funciones Eval , Eval Expr y Expr .
Y tienes razón, mis cálculos en el ejemplo estaban equivocados.
Re: Suma acumulativa de columnas sin llamar al valor de la fila actualSeguiré aprendiendo JMP. Por ahora, me limitaré a mi hoja de cálculo de Excel. Gracias a todos por sus respuestas.
Sim Cases es una columna y estoy usando Sim Cases de filas anteriores para crear nuevas filas. Entonces supongo que es tanto una columna como una variable dentro de esa misma columna.
Re: Suma acumulativa de columnas sin llamar al valor de la fila actualEl comportamiento de las tablas y las hojas de cálculo de JMP es totalmente diferente y esta publicación antigua puede ser una buena lectura JMP no es una hoja de cálculo, ya que proporciona algunos ejemplos y explicaciones. Puede hacer la mayoría de las cosas en JMP, pero puede llevar algo de tiempo comprender cómo se comportan las columnas y las filas en JMP en comparación con las celdas individuales en Excel.
Re: Suma acumulativa de columnas sin llamar al valor de la fila actualEste script utiliza la solución de txnelson como punto de partida y le hace algunas modificaciones. Su propósito es simplemente proporcionar un ejemplo para el aprendizaje del uso de otras técnicas (por cada fila en lugar de un bucle For, obtener valores de la matriz desde :R y otros cambios).
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);
);