Différence de lignesSupposons que j'ai deux lignes, distance en fonction du temps pour deux objets en mouvement différents.Les mesures de temps pour l'objet 1 et l'objet 2 se font à des moments arbitraires, c'est-à-dire que les temps mesurés pour l'objet 1 ne sont pas les mêmes que ceux fournis pour l'objet 2.
Existe-t-il un moyen dans Graph Builder de tracer la *différence* entre ces courbes en fonction du temps ?
Modélisation statistique avancéePersonnalisation de masseIngénierie Qualité et ProcédésRe : Différence de lignesEn tant que combinaison des différentes suggestions, vous pouvez également utiliser un simple interpolate() - interpolate() pour calculer la différence, puis utiliser le paramètre lambda du tracé plus lisse pour ajuster la granularité de la courbe.

Open( "$DOWNLOADS/ab.jmp" );
New Column( "diff",
Formula(
rowsA = As Constant( Current Data Table() << get rows where( :Source Table == "a" ) );
rowsB = As Constant( Current Data Table() << get rows where( :Source Table == "b" ) );
xA = As Constant( :time[rowsA] );
xB = As Constant( :time[rowsB] );
posA = As Constant( :position[rowsA] );
posB = As Constant( :position[rowsB] );
If( Min( xA ) <= :time <= Max( xA ) & Min( xB ) <= :time <= Max( xB ),
Interpolate( :time, xA, posA ) - Interpolate( :time, xB, posB ),
.
);
)
);
Graph Builder(
Variables( X( :time ), Y( :diff ), Y( :position ), Overlay( :Source Table ) ),
Elements( Position( 1, 1 ), Points( X, Y, Overlay( 0 ), Legend( 1 ) ), Smoother( X, Y, Overlay( 0 ), Lambda( 0.02 ) ) ),
Elements( Position( 1, 2 ), Points( X, Y ), Smoother( X, Y ) )
);
Re : Différence de lignesEn raison de problèmes de licence bizarres*, je n'ai finalement pu essayer cela qu'aujourd'hui. Cela fonctionne plutôt bien, très élégant !
Deux questions:
- JSL est-il suffisamment puissant pour modifier cette formule à ma place ? Donc tout ce processus pourrait être scripté dans un script .jsl ?
- Je m'attendais à ce que la courbe de différence se mette à jour lorsque j'ai changé le lambda sur le plus lisse, mais ce n'est pas le cas. En regardant plus profondément, je vois que la "Formule d'enregistrement" enregistre en fait les paramètres de spline, sans maintenir une connexion avec les splines réelles utilisées. Je suppose que ce dernier n'est pas raisonnablement possible ?
Merci encore!
****************************************
* J'ai finalement été obligé de mettre à jour mon Mac vers la version 11.6, sans me rendre compte que JMP v14 ne fonctionnerait pas dessus. J'ai donc demandé la v16 via mon entreprise, et il a fallu littéralement des mois après l'obtention d'un bon de commande pour obtenir une licence v16 pour moi. Il y a eu des tonnes d'allers-retours avec les certificats fiscaux, les changements d'adresse et les problèmes de bon de commande. Je ne peux pas dire si le problème venait de la chaîne d'approvisionnement de mon entreprise ou du service commercial de JMP/SAS, mais obtenir une licence si vous avez de l'argent en main ne devrait vraiment pas être si difficile.
Re : Différence de lignesVoici une alternative à faible script utilisant le Enregistrer la formule commande disponible dans le menu du triangle rouge pour un élément Lisser ou Ligne d'ajustement.

En commençant par la table ab.jmp de Craige en utilisant Overlay pour obtenir deux lignes/courbes, utilisez Save Formula pour obtenir une nouvelle colonne avec une formule qui ressemble à :
Si( :Source Table == "a", Spline Eval( ... ), :Source Table == "b", Spline Eval( ... ), . ))
Accédez à l'éditeur de formule pour la nouvelle colonne et modifiez la formule pour soustraire les deux expressions Spline :
Évaluation spline( ... ) - Évaluation spline( ... )
Et utilisez-le comme Y en GB.

Re : Différence de lignesOui, je suis à la retraite et j'apprends beaucoup en répondant aux questions.
@XanGregg pour la suggestion du générateur de graphiques.
Re : Différence de lignesWow, solution impressionnante ! Et très bien documenté, merci !!
La seule chose qui serait préférable serait que JMP fasse cela tout seul sans l'étape de script intermédiaire, mais à part le fait de cliquer sur deux lignes dans Graph Builder et de demander une ligne de différence (ce qui est conceptuellement compliqué d'un modèle mental de- du point de vue de ce qu'il fait), je ne peux pas vraiment imaginer comment cela fonctionnerait.
Merci, Craige!
(ps. Êtes-vous vraiment à la retraite ? Vous faites du support JMP pour le plaisir ?)
Re : Différence de lignesJe pense que ce que vous voulez s'appelle une interpolation linéaire par morceaux. Je ne sais pas quelle plate-forme pourrait produire une formule pour cela, mais vous pouvez faire quelque chose de similaire comme celui-ci. Faites vos propres tests si vous l'utilisez !
dt = Open( "$desktop/ab.jmp" ); // table with unaligned times for a and b measurements
dt << sort( by( time ), replacetable( 1 ) ); // make sure time is ascending
aRows = dt << getrowswhere( SourceTable == "a" ); // get all the a
bRows = dt << getrowswhere( SourceTable == "b" ); // and b row indexes
aTimes = dt:time[aRows]; // get all the a and b times and positions in
aPositions = dt:position[aRows]; // matrices for the interpolate function
bTimes = dt:time[bRows];
bPositions = dt:position[bRows];
apos = Function( {time}, // tiny wrappers for interpolate
Interpolate( time, aTimes, aPositions )
);
bpos = Function( {time},
Interpolate( time, bTimes, bPositions )
);
dtnew = New Table( "new_ab", // new table is similar to old table
New Column( "Source Table", Character( 1 ), "Nominal" ),
New Column( "time", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "position", Numeric, "Continuous", Format( "Best", 12 ) )
);
bigdif = 0; // track the largest difference so it can have a ref line
bigtime = .;
// make a new table covering the range of the data
For( i = min(min(aTimes),min(bTimes))-10, i <= max(max(aTimes),max(bTimes))+10, i += 1,
dtnew << addrows( 1 ); // interpolate a at time i
dtnew:SourceTable = "a";
dtnew:time = i;
dtnew:position = apos( i );
dtnew << addrows( 1 ); // interpolate b at time i
dtnew:SourceTable = "b";
dtnew:time = i;
dtnew:position = bpos( i );
dtnew << addrows( 1 ); // difference at time i
dtnew:SourceTable = "diff";
dtnew:time = i;
dtnew:position = apos( i ) - bpos( i );
If( Abs( dtnew:position ) > bigdif, // capture biggest diff
bigdif = Abs( dtnew:position );
bigtime = i;
);
);
dtnew << Graph Builder(
Size( 518, 448 ),
Show Control Panel( 0 ),
Variables( X( :time ), Y( :position ), Overlay( :Source Table ) ),
Elements( Points( X, Y, Legend( 21 ) ), Smoother( X, Y, Legend( 22 ), Lambda( 0.000001 ) ) ),
SendToReport(
Dispatch( {}, "time", ScaleBox, {Add Ref Line( bigtime, "Solid", "Black", "big=" || Char( bigtime ), 1 )} ),
Dispatch( {}, "Graph Builder", FrameBox, {Marker Size( 2 )} )
)
);Saisir des données comme celle-ci

Et les données interpolées comme celle-ci

Produire un graphique comme celui-ci :
The green curve is blue - red; the ref line is at the first biggest difference.La courbe verte est bleue – rouge ; la ligne de référence est à la première plus grande différence.
S'il s'agissait d'une course, a gagnait en 71 secondes et b perdait en 99 secondes. a était le plus en avance avec 43 secondes (enfin, peut-être. Vous ne pouvez pas être trop sûr de la position de b au temps 43 dans les données originales.)
Vous ne pouvez pas obtenir cela à partir d’un simple ajustement linéaire sur les données d’origine :
Original data with linear fit.Données originales avec ajustement linéaire.
Re : Différence de lignes@Mark_Bailey Si les deux lignes sont linéaires, alors un modèle d'ajustement de la taille prédit par le poids, pour les 2 groupes de sexe, finit par avoir une estimation de terme de -2,079223. Ne serait-ce pas la différence entre les lignes simplifiées en une régression linéaire ?

Re : Différence de lignes
@Mark_Bailey a écrit:
Exactement. La complexité de la courbe ou de la forme dictera la complexité du modèle nécessaire. Pouvez-vous montrer une image d'un tracé des données ? Peut-être existe-t-il un modèle théorique pour de telles données ?
Nous ne pouvons pas vous aider davantage car la prochaine étape est la modélisation, mais il faut savoir quel modèle pour vous aider.
@Mark_Bailey , @Craige_Hales -- Oui, un ajustement linéaire entre les points conviendrait. Je me rends compte que la différence sera quelque peu rebondissante en raison de l'interpolation linéaire, mais ce n'est pas grave, nous examinons simplement des magnitudes approximatives.
Re : Différence de lignesExactement. La complexité de la courbe ou de la forme dictera la complexité du modèle nécessaire. Pouvez-vous montrer une image d'un tracé des données ? Peut-être existe-t-il un modèle théorique pour de telles données ?
Nous ne pouvons pas vous aider davantage car la prochaine étape est la modélisation, mais il faut savoir quel modèle pour vous aider.
Re : Différence de lignesSi vous disposiez de deux tableaux de données, un par objet, avec des colonnes pour le temps et la distance, vous pourriez enregistrer les formules qui prédiraient les positions entre les instants. Soustraire les formules à la fois donnerait une réponse. Je pense que la question de Mark est de savoir si vous pensez qu'un modèle linéaire/quadratique/autre de Fit Model donnerait une estimation suffisamment bonne de la position d'un objet, entre les mesures.
Re : Différence de lignesNon, nous avons juste le JMP v16 de base.
Re : Différence de lignesLa seule façon de comparer les courbes observées à différents moments est de modéliser chacune d'elles et de comparer les modèles à des moments sélectionnés. Le modèle pourrait être aussi simple qu'une interpolation linéaire aussi complexe que n'importe quel type de modèle dans JMP. Avez-vous JMP Pro ? Si tel est le cas, vous pouvez traiter les données comme des « fonctions » et utiliser l'explorateur de données fonctionnelles.
Je n'entrerai pas dans les détails tant que vous ne m'aurez pas confirmé que l'approche générale est logique.