Aquí hay un ejemplo que encuentra los picos superior e inferior para las ondas sinusoidales.El script primero genera algunos datos de ejemplo y luego busca los picos superior e inferior.

Names Default To Here( 1 );
dt = New Table( "sine", New Column( "x" ), New Column( "y" ) );
For( k = 1, k <= 10, k++,
yfudgepos = Random Uniform( 0, .2 );
yfudgeneg = Random Uniform( 0, .2 );
For( x = 0, x <= 360, x++,
dt << add rows( 1 );
y = Sin( x / 180 * Pi() );
:x[Row()] = x + ((k - 1) * 360);
If( y < -1 * yfudgeneg,
:y[Row()] = y + yfudgeneg
);
If( y > yfudgepos,
:y[Row()] = y - yfudgePos
);
);
);
dt << select where(ismissing(:y));
dt << delete rows;
Graph Builder( Variables( X( :x ), Y( :y ) ), Elements( Points( X, Y, Legend( 3 ) ) ) );
wait(5);
// Find the min and max for each phase in the sine waves
dt << New Column("T or B",character);
// determine the starting direction of the wave
if(dt:y[1]<Y> dt:y[i],
dt:T or B[i] = "Bottom";
direction = "up";
)
);
dt << select where( :T or B != "" );
dtTB = dt << subset( selected columns(0), selected rows(1));</Y>
Debería haber sido más descriptivo en la respuesta anterior.
La capacidad de encontrar los picos y valles de una onda sinusoidal usando JMP no es uno de los análisis integrados de JMP.Sin embargo, al usar el lenguaje de secuencias de comandos (JSL) de JMP, se puede usar una secuencia de comandos para obtener la información que necesita.
Lo primero que necesitaba para comenzar a trabajar en una solución a su pregunta era una tabla de datos de muestra.Sin embargo, JMP proporciona en su instalación, no conozco ninguno de ellos que proporcione los valores de datos para una onda sinusoidal similar a la onda sinusoidal que proporcionó en su pregunta inicial.Por lo tanto, tuve que crear mi propia tabla de datos de muestra.La primera parte de mi script no hace más que crear una tabla de datos de muestra.
Names Default To Here( 1 );
dt = New Table( "sine", New Column( "x" ), New Column( "y" ) );
For( k = 1, k <= 10, k++,
yfudgepos = Random Uniform( 0, .2 );
yfudgeneg = Random Uniform( 0, .2 );
For( x = 0, x <= 360, x++,
dt << add rows( 1 );
y = Sin( x / 180 * Pi() );
:x[Row()] = x + ((k - 1) * 360);
If( y < -1 * yfudgeneg,
:y[Row()] = y + yfudgeneg
);
If( y > yfudgepos,
:y[Row()] = y - yfudgePos
);
);
);
dt << select where(ismissing(:y));
dt << delete rows;Th
Esta parte del script crea la tabla de datos de muestra.No es una tabla de datos de onda sinusoidal perfecta.
Quería que la onda sinusoidal producida tuviera cierta variabilidad para cada onda. Para lograr esto, el código ajusta la ola cada vez que pasa por encima o por debajo de la mitad de la ola. .El resultado final es una onda que tiene diferentes puntos altos máximos y diferentes valores mínimos para cada onda.La tabla de datos resultante final tiene esa variabilidad, pero también crea un pequeño paso en la forma de onda.Si bien la tabla de datos de muestra no es perfecta, es lo suficientemente buena para usar.

Esta es la parte del script que produce los datos para la onda anterior.
Names Default To Here( 1 );
dt = New Table( "sine", New Column( "x" ), New Column( "y" ) );
For( k = 1, k <= 10, k++,
yfudgepos = Random Uniform( 0, .2 );
yfudgeneg = Random Uniform( 0, .2 );
For( x = 0, x <= 360, x++,
dt << add rows( 1 );
y = Sin( x / 180 * Pi() );
:x[Row()] = x + ((k - 1) * 360);
If( y < -1 * yfudgeneg,
:y[Row()] = y + yfudgeneg
);
If( y > yfudgepos,
:y[Row()] = y - yfudgePos
);
);
);
dt << select where(ismissing(:y));
dt << delete rows;
La tabla que produce parece

La tabla de datos que creé tiene dos columnas.Uno llamado X y otro llamado Y Las columnas pueden tener el nombre que uno quiera llamarlas.El script solo tiene que cambiarse para cambiar las referencias a los nombres de las columnas de X e Y por los nombres reales de las columnas.
Volviendo al script real que proporcioné... una vez que se creó la tabla de datos, usé Graph Builder para mostrar los datos en forma gráfica.
Graph Builder( Variables( X( :x ), Y( :y ) ), Elements( Points( X, Y, Legend( 3 ) ) ) );
Esta declaración JSL mostró el gráfico de onda sinusoidal.
La siguiente declaración simplemente detiene la ejecución del script, para permitir ver el gráfico durante 5 segundos, antes de pasar a la búsqueda real de los valores mínimo y máximo en los datos.
Wait( 5 );
El resto del JSL es la parte de trabajo real del código, que primero encuentra el punto máximo y mínimo de cada onda sinusoidal, y luego crea una nueva tabla de datos que contiene solo el
Puntos de datos superior e inferior para cada ola.
// Find the min and max for each phase in the sine waves
dt << New Column("T or B",character);
// determine the starting direction of the wave
if(dt:y[1]<Y> dt:y[i],
dt:T or B[i] = "Bottom";
direction = "up";
)
);
dt << select where( :T or B != "" );
dtTB = dt << subset( selected columns(0), selected rows(1));</Y>
Para aplicar este análisis a sus datos, primero deberá ingresar sus datos en una tabla de datos JMP en una estructura como la tabla de datos de muestra que generé.Luego, suponiendo que su columna de datos se llamara X e Y, solo necesita ejecutar el siguiente script para que use su nueva tabla para analizar los datos y encontrar los valores mínimo y máximo para cada ola.
Names Default To Here( 1 );
dt = Current Data Table();
// Find the min and max for each phase in the sine waves
dt << New Column( "T or B", character );
// determine the starting direction of the wave
If( dt:y[1] < dt:y[2],
direction = "up",
direction = "down"
);
For( i = 1, i <= N Rows( dt ) - 1, i++,
If(
direction == "up" & dt:y[i + 1] < dt:y[i],
Show( i );
dt:T or B[i] = "Top";
direction = "down";,
direction == "down" & dt:y[i + 1] > dt:y[i],
dt:T or B[i] = "Bottom";
direction = "up";
)
);
dt << select where( :T or B != "" );
dtTB = dt << subset( selected columns( 0 ), selected rows( 1 ) );
Hola, tengo algunos datos de movimiento cíclico medidos como ángulo en el tiempo. ¿Hay alguna manera de extraer los valores máximos mínimos y máximos (soy un novato, por lo que es posible una explicación simple, por favor)? Un ejemplo a continuación. Lo he estado haciendo manualmente pero tengo algunos datos con una gran cantidad de picos, por lo que me gustaría una forma más eficiente. Muchas gracias
