Col Cumulative Sum sans appeler la valeur de la ligne actuelleBonjour, je suis assez nouveau dans l'écriture de scripts JMP et j'utilise principalement "Edit Formula" pour mon travail. J'ai parcouru les solutions liées à Col Cumulative Sum et je n'en ai pas trouvé une pour mon problème spécifique. La version simplifiée de mon tableau de données est la suivante.
| Rangée | Semaine | Col Cumulative Sum | Mon souhait |
| 1 | 1 | 1 | 0 |
| 2 | 2 | 3 | 1 |
| 3 | 3 | 6 | 3 |
| 4 | 4 | dix | 6 |
| 5 | 5 | 15 | dix |
| 6 | 6 | 21 | 15 |
La formule ci-dessous fonctionne si la valeur actuelle de la ligne « Semaine » est fixe ou si j'ai deux colonnes distinctes « Semaine » et « Mon souhait ».
If( Row() != 1,
Lag( Col Cumulative Sum( :Week ), 1 ),
0
)
Le problème est que la valeur de la "Semaine" de la ligne précédente est fixe mais celle de la ligne actuelle ne l'est pas. Et je n'ai qu'une seule colonne "Semaine" avec laquelle travailler. Je développe une formule qui simule la progression en fonction de la valeur de simulation précédente. Je simule la valeur "Semaine" de la ligne actuelle en fonction de celle de la ligne précédente.
Supposons que je travaille sur la ligne 4 de la colonne « Semaine ». Je souhaite additionner cumulativement toutes les valeurs "Semaine" précédentes sans appeler la valeur "Semaine" actuelle dans la fonction. Sinon, cela crée un problème de référence illégale ou de cyclisme dans mon cas.
J'ai essayé d'utiliser un indice au lieu de lag puisque la fonction lag appelle la valeur "Semaine" de la ligne actuelle. Cela n'a pas fonctionné.
If( Row() != 1,
Col Cumulative Sum( :Week )[Row() - 1],
0
)
J'espère que mon explication était suffisamment claire. Merci d'avance pour votre temps et votre expertise. J'utilise JMP Pro 17.
Automatisation et scriptsModélisation prédictive et apprentissage automatiqueRe : Somme cumulée des colonnes sans appeler la valeur de la ligne actuelleMerci beaucoup. La boucle for semble être la clé ici. Je n'ai pas encore appris les fonctions Eval , Eval Expr et Expr .
Et vous avez raison, mes calculs dans l'exemple étaient erronés.
Re : Somme cumulée des colonnes sans appeler la valeur de la ligne actuelleVoici ma solution, cependant, elle ne correspond pas à la vôtre. Je pense que vos calculs indiqués sont incorrects pour la ligne 3. Consultez mon script, qui inclut votre exemple de tableau de données.
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 : Somme cumulée des colonnes sans appeler la valeur de la ligne actuelleBonjour à nouveau. Je reformule ma question dans l'espoir de pouvoir faire disparaître la frustration.
| Rangée | R | Cas |
| 1 | . | [1, 1, 2, 1] |
| 2 | 1.4 | |
| 3 | 1,67 | |
| 4 | 2.3 | |
J'ai 2 colonnes, R et Cases . Les cas sont calculés en multipliant R de la ligne actuelle par les cas de la ligne précédente. De plus, R doit être modifié (réduit) en fonction de la somme des cas de la ligne précédente.
R (ligne 2) dans la colonne Cas = R (ligne 2) * modificateur
modificateur = 1 - ( ( somme cumulée des cas de la ligne 1 à la ligne précédant la ligne actuelle * 4 ) / Population totale )
La population totale est un paramètre et vaut 100.
Le modificateur résultant est multiplié par les cas de la ligne 1 pour créer des cas dans la ligne 2.
Par exemple, j'attends le R modifié (row2) être 1.12 et les cas (rangée 2) être [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]
Ensuite, je m'attends à ce que le R modifié (row3) soit de 0,71 et que les Cases (row3) soient [0,8, 0,8, 1,6, 0,8]
1,67 * 1 - ( 10,6 * 4 / 100 ) = 0,71
10,6 provient de 5 cas dans la rangée 1 et de 5,6 cas dans la rangée 2.
0,71 * [1,12, 1,12, 2,24, 1,12] = [0,8, 0,8, 1,6, 0,8]
J'ai du mal à obtenir la valeur verte . Ma tentative actuelle d'écriture d'un script JMP est la suivante.
If( Row() == 1,
Matrix( {1, 1, 2, 1} ),
:R * (1 - (Summation( i = 1, N Row() - 1, Sum( :Cases ) ) * 4) / Total Population) * Lag( :Cases, 1 )
)
J'ai essayé Index , Lag , Row() - 1 , Col cumulative sum , Summation , etc. pour obtenir le modificateur, et rien n'a fonctionné. Je reçois principalement soit
1) référencement illégal ou
2) désabonnement
Merci encore pour votre temps et votre expertise.
Re: Somme cumulée des colonnes sans appeler la valeur de la ligne actuelleLe comportement des tables et des feuilles de calcul JMP est totalement différent et cet ancien article pourrait être une bonne lecture. JMP n'est pas une feuille de calcul car il fournit des exemples et des explications. Vous pouvez faire la plupart des choses dans JMP, mais cela peut prendre un certain temps pour comprendre comment les colonnes + lignes se comportent dans JMP par rapport à une cellule unique dans Excel.
Re : Somme cumulée des colonnes sans appeler la valeur de la ligne actuelleJe vais continuer à apprendre JMP. Pour l'instant, je m'en tiendrai à ma feuille de calcul Excel. Merci à tous pour vos réponses.
Sim Cases est une colonne et j'utilise les Sim Cases des lignes précédentes pour créer de nouvelles lignes. Je suppose donc que c'est à la fois une colonne et une variable à l'intérieur de cette même colonne.
Re : Somme cumulée des colonnes sans appeler la valeur de la ligne actuelle"Sim Cases" est-il une matrice ou une colonne dans un tableau de données ?
Je ne comprends pas
Vous semblez rendre votre solution trop complexe.
sim cases = [3,5,2,8];
sum1 = sum(sim cases);
sum2 = sum(([1 1 1 1]*sim cases)[1]);
show(sum1,sum2);
sum1 et sum2 fournissent la même valeur
sum1 = 18;
sum2 = 18;
Je vous encourage à lire le document Découverte de JMP disponible dans le menu déroulant Aide.
Re : Somme cumulée des colonnes sans appeler la valeur de la ligne actuelleOui, au début, j'ai essayé d'émuler dans le tableau de données JMP ce que je fais habituellement dans les feuilles de calcul Excel en séparant les colonnes. J'appellerais alors les valeurs de la ligne précédente d'une colonne différente. Le tableau de données JMP ne se comporte pas comme une feuille de calcul Excel et je rencontre des problèmes cycliques.
Je continue donc de changer de stratégie et ma compréhension actuelle est de conserver chaque variable requise dans une colonne pour éviter les problèmes cycliques.
Re : Somme cumulée des colonnes sans appeler la valeur de la ligne actuelleMerci pour votre suggestion sur l'utilisation de l'indice Index . Je rencontre maintenant le problème "objet non inscriptible".
Mon exemple de semaine était trop simplifié et j'ai une matrice Sim Cases de 4 lignes et 1 colonne à la place de week . Pour la transformer en une valeur numérique résumée, j'ai multiplié la matrice avec [1 1 1 1] et ajouté un indice [ 1 ]. Il a ensuite été suivi de l'indice Index .
Sum( ([1 1 1 1] * :Sim Cases)[1][Index( 1, Row() - 1 )] )
Je pense que la valeur numérique résultante de la matrice 4x1 d'origine n'accepte aucun indice après [ 1 ]. Ou cela pourrait être à nouveau dû à la référence illégale (récursion).
Re : Somme cumulée des colonnes sans appeler la valeur de la ligne actuelleJ'utiliserais des colonnes séparées pour éviter toutes sortes de problèmes, mais je ne suis pas exactement sûr de ce que vous essayez de réaliser car vous disposez de données complètes dans votre exemple. Peut-être quelque chose comme ça si Col Cumulative Sum ne fonctionne pas pour vous (calculez la valeur en utilisant le décalage et la variable)
If(Row() == 1,
val = 0,
val = val + Lag(:Week);
);
val;
Re : Somme cumulée des colonnes sans appeler la valeur de la ligne actuelleSi j'ai bien compris, je pense que cela pourrait être la solution
If( Row() != 1,
Sum( :Week[Index( 1, Row() - 1 )] ),
0
)
Re : Somme cumulée des colonnes sans appeler la valeur de la ligne actuelleAu moment où j'utilise (:Week) dans ma formule, j'obtiens un problème de référence illégale. La ligne actuelle (:Semaine) n'a pas encore été entièrement calculée. Je ne peux que rappeler (:Week) de la ligne précédente en théorie.
Re : Somme cumulée des colonnes sans appeler la valeur de la ligne actuelleVous pouvez déduire la valeur des semaines en cours de la somme cumulée
Col Cumulative Sum(:Week) - :Week

Re : Somme cumulée des colonnes sans appeler la valeur de la ligne actuelleBonjour, j'ai beaucoup appris sur l'écriture de scripts JSL grâce au forum et en regardant des vidéos de conférences. J'ai une question complémentaire concernant le script suivant. J'ai obtenu les mêmes résultats avec la deuxième ligne. Puis-je savoir pourquoi vous choisiriez la première ligne plutôt que la seconde ?
Eval( Eval Expr( casesMatrix = Expr( :cases[i - 1] ) ) )
Eval( casesMatrix = :cases[i - 1] )
De plus, existe-t-il un moyen d'éviter de modifier la colonne « R » et de conserver les valeurs d'origine ? Je souhaite que les valeurs R modifiées restent dans la colonne « Cas » sans apparaître nulle part. J'ai essayé d'attribuer un nom de variable différent, "Rx", au R modifié comme ci-dessous. Cependant, cette approche m'oblige à créer une colonne vide nommée "Rx" pour fonctionner.
:Rx [i] = :R[i] * (1 - (Sum( casesMatrix )+casesSum) * 4 / 100);
Un grand merci d'avance pour votre temps et votre expertise.
Re : Somme cumulée des colonnes sans appeler la valeur de la ligne actuelleVous avez suggéré que la 2e ligne est géniale. La raison pour laquelle j'utilise la syntaxe que j'ai utilisée n'est qu'une vieille habitude.
La façon dont Rx peut être utilisé sans créer de colonne vide est de l’utiliser comme référence de variable mémoire. Voici le code pour faire ça
// 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 : Somme cumulative sans appeler la valeur de la ligne actuelleCe script utilise la solution de txnelson comme point de départ et y apporte quelques modifications. Il vise simplement à vous fournir d'autres exemples d'apprentissage utilisant d'autres techniques (utilisation de la boucle For Each Row au lieu d'une boucle For, obtention des valeurs dans la matrice depuis :R et autres modifications).
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);
);