diferencia de lineasSupongamos que tengo dos líneas, distancia versus tiempo para dos objetos en movimiento diferentes.Las mediciones de tiempo para el objeto 1 y el objeto 2 son en tiempos arbitrarios, es decir, los tiempos medidos para el objeto 1 no son los mismos tiempos que los previstos para el objeto 2.
¿Hay alguna forma en Graph Builder de trazar la *diferencia* entre esas curvas frente al tiempo?
Modelado estadístico avanzadoLa personalización en masaIngeniería de Calidad y ProcesosRe: diferencia de lineasComo combinación de las diferentes sugerencias, también puede usar una simple interpolación() - interpolación() para calcular la diferencia y luego usar la configuración lambda del gráfico más suave para ajustar la granularidad de la curva.

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: diferencia de lineasDebido a algunos problemas extraños de licencia* finalmente pude probar esto hoy. Funciona bastante bien, muy elegante!
Dos preguntas:
- ¿JSL es lo suficientemente potente como para hacer que esa fórmula cambie por mí? ¿Entonces todo ese proceso podría escribirse en un script .jsl?
- Esperaba que la curva de diferencia se actualizara cuando cambié la lambda a una más suave, pero no es así. Mirando más profundamente, veo que "Guardar fórmula" en realidad guarda los parámetros de spline, no mantiene una conexión con las splines reales que se están utilizando. ¿Supongo que esto último no es razonablemente posible?
¡Gracias de nuevo!
****************************************
* Finalmente me vi obligado a actualizar mi Mac a 11.6, sin darme cuenta de que JMP v14 no funcionaría en él. Así que solicité la versión 16 a través de mi empresa y, literalmente, me tomó meses después de obtener una orden de compra obtener una licencia v16 para mí. Hubo toneladas de idas y venidas con certificados de impuestos, cambios de dirección y problemas de órdenes de compra. No puedo decir si el problema fue la cadena de suministro de mi empresa o el departamento de ventas de JMP/SAS, pero obtener una licencia si tienes dinero en la mano no debería ser tan difícil.
Re: diferencia de lineasAquí hay una alternativa de scripting bajo usando el Guardar fórmula comando disponible en el menú del triángulo rojo para un elemento Más suave o Línea de ajuste.

Comenzando con la tabla ab.jmp de Craige usando Superposición para obtener dos líneas/curvas, use Guardar fórmula para obtener una nueva columna con una fórmula similar a la siguiente:
If(: Tabla de origen == "a", Evaluación de spline (...), : Tabla de origen == "b", Evaluación de spline (...), . ))
Vaya al Editor de fórmulas para la nueva columna y cambie la fórmula para restar las dos expresiones Spline:
Evaluación de spline(...) - Evaluación de spline(...)
Y úsalo como Y en GB.

Re: diferencia de lineasSí, jubilado y aprendo mucho respondiendo preguntas.
@XanGregg por la sugerencia del creador de gráficos.
Re: diferencia de lineas¡Vaya, solución impresionante! Y muy bien documentado, ¡¡gracias!!
Lo único mejor sería si JMP hiciera esto por sí solo sin el paso de secuencia de comandos intermedio, pero aparte de hacer clic con la tecla Mayús y hacer clic en dos líneas en Graph Builder y solicitar una línea de diferencia (lo cual es conceptualmente complicado desde un modelo mental de punto de vista de qué está haciendo), realmente no puedo imaginar cómo funcionaría eso.
¡Gracias Craige!
(PD. ¿Estás realmente jubilado? ¿Haces soporte JMP por diversión?)
Re: diferencia de lineasCreo que lo que quieres se llama interpolación lineal por partes. No estoy seguro de qué plataforma podría producir una fórmula para eso, pero puedes hacer algo similar como esto. ¡Haz tus propias pruebas si usas esto!
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 )} )
)
);Ingrese datos como este

Y los datos interpolados como este

Produciendo un gráfico como este:
The green curve is blue - red; the ref line is at the first biggest difference.La curva verde es azul - roja; la línea de árbitro está en la primera diferencia más grande.
Si esto fuera una carrera, a ganó en 71 segundos yb perdió en 99 segundos. a estaba más adelantado con 43 segundos (bueno, tal vez. No se puede estar muy seguro acerca de la posición de b en el momento 43 en los datos originales).
No se puede obtener eso mediante un simple ajuste lineal de los datos originales:
Original data with linear fit.Datos originales con ajuste lineal.
Re: diferencia de lineas@Mark_Bailey Si las dos líneas son lineales, entonces un modelo de ajuste de altura predicho por peso, para los dos grupos de sexo, terminará teniendo un término estimado de -2,079223. ¿No sería esa la diferencia entre las líneas cuando se simplifica a una regresión lineal?

Re: diferencia de lineas
@Mark_Bailey escribió:
Exactamente. La complejidad de la curva o forma dictará la complejidad del modelo necesario. ¿Puedes mostrar una imagen de un gráfico de los datos? ¿Quizás exista un modelo teórico para tales datos?
No podemos ayudarte más porque el siguiente paso es el modelado, pero tenemos que saber qué modelo para poder ayudarte.
@Mark_Bailey , @Craige_Hales -- Sí, un ajuste lineal entre puntos estaría bien. Me doy cuenta de que la diferencia será algo pronunciada debido a la interpolación lineal, pero está bien, solo estamos viendo magnitudes aproximadas.
Re: diferencia de lineasExactamente. La complejidad de la curva o forma dictará la complejidad del modelo necesario. ¿Puedes mostrar una imagen de un gráfico de los datos? ¿Quizás exista un modelo teórico para tales datos?
No podemos ayudarte más porque el siguiente paso es el modelado, pero tenemos que saber qué modelo para poder ayudarte.
Re: diferencia de lineasSi tuviera un par de tablas de datos, una por objeto, con columnas para tiempo y distancia, podría guardar las fórmulas que predecirían posiciones entre momentos. Restar las fórmulas a la vez daría una respuesta. Creo que la pregunta de Mark es si cree que un modelo lineal/cuadrático/otro de Fit Model daría una estimación suficientemente buena de la posición de un objeto, entre mediciones.
Re: diferencia de lineasNo, solo tenemos el JMP v16 básico.
Re: diferencia de lineasLa única forma de comparar las curvas observadas en diferentes momentos es modelar cada una y comparar los modelos en momentos seleccionados. El modelo podría ser tan simple como una interpolación lineal y tan complejo como cualquier tipo de modelo en JMP. ¿Tienes JMP Pro? Si es así, puede tratar los datos como "funciones" y utilizar Functional Data Explorer.
No entraré en detalles hasta que usted me diga que el enfoque general tiene sentido.