Hola a todos,
Tengo algunos datos de que estoy realizando un análisis de series temporales sobre dónde me gustaría obtener las posiciones de los picos del Periodograma (Serie temporal > Guardar densidad espectral). Por ejemplo, puede hacer esto con la tabla de datos de muestra Air.jmp, poniendo solo una variable de columna Y. Puede poner la variable X, Time ID, pero no es necesario.
De todos modos, una vez que guarde la Densidad espectral, hay varias columnas, :Densidad espectral, :Periodograma y :Frecuencia que son de interés, vea la captura de pantalla a continuación.

Lo que estoy tratando de hacer es encontrar los números de fila de quizás los 3 o 4 picos principales en la columna: Periodograma; es un poco más fácil trabajar con él que con la columna: Densidad espectral (vea las áreas resaltadas en amarillo). Una vez que tengo esos números de fila, puedo encontrar los valores correspondientes en las columnas: Período y: Frecuencia para informar como resultado.
El problema que tengo es poder obtener esos otros valores que no son el resultado de Col Max(:Periodogram). Puedo conseguir eso muy bien, pero es más difícil seleccionar las otras columnas de interés. Me gustaría hacer esto con JSL para que la tarea se automatice en lugar de tener que usar la herramienta Lazo o algo así.
Cualquier idea o sugerencia es muy apreciada.
¡Gracias!,
SD
Aquí hay un ejemplo de una forma de encontrar los picos.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/blood pressure.jmp" );
dt << select where(
Try( :bp 8m[Row() - 1], 999 ) < :bp 8m[Row()] & :bp 8m[Row()] > Try( :bp 8m[Row() + 1], 0 )
);
Aquí hay otra opción usando Dif()
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Time Series/Air.jmp");
ts = dt << Time Series(Y(:Ozone Concentration));
dt1 = ts << Save Spectral Density;
ts << Close Window;
Close(dt, no save);
dt1 << Sort(By(:Period), Replace Table, Order(Ascending));
dt1 << New Column("PeriodogramPeaks", Numeric, Nominal, Formula(
Dif(:Periodogram) > 0 & Dif(:Periodogram, -1) > 0
));
dt1 << New Column("PeakRank", Numeric, Ordinal, Formula(
Col Number(:Periodogram, :PeriodogramPeaks) - Col Rank(:Periodogram, :PeriodogramPeaks) + 1
));
peak_rows = dt1 << Get Rows Where(:PeakRank <= 4 & :PeriodogramPeaks == 1);
dt1 << Select Rows(peak_rows);
dt1 << Markers(16);
gb = dt1 << Graph Builder(
Size(534, 456),
Show Control Panel(0),
Variables(X(:Period), X(:Frequency), Y(:Spectral Density), Y(:Periodogram)),
Elements(Position(1, 1), Line(X, Y, Legend(7)), Points(X, Y, Legend(8))),
Elements(Position(1, 2), Line(X, Y, Legend(5)), Points(X, Y, Legend(6))),
Elements(Position(2, 1), Line(X, Y, Legend(9)), Points(X, Y, Legend(10))),
Elements(Position(2, 2), Line(X, Y, Legend(11)), Points(X, Y, Legend(12)))
);Hola @jthi y @txnelson ,
Gracias a ambos por su entrada. terminé yendo con @jthi porque parecía funcionar mejor para el tipo de datos con los que estoy tratando, utilizando las tablas de datos/gráficos de densidad espectral. Realmente aprecio su aporte en esto, ¡gracias nuevamente por otra solución útil!
SD