Ciao a tutti,
Ho alcuni dati che sto eseguendo un'analisi delle serie temporali su dove vorrei ottenere le posizioni dei picchi dal periodogramma (Serie temporali> Salva densità spettrale). Ad esempio, puoi farlo con la tabella di dati di esempio Air.jmp, inserendo solo una variabile di colonna Y. Puoi inserire la variabile X, Time ID, ma non è necessario.
Ad ogni modo, una volta salvata la densità spettrale, ci sono diverse colonne, :Spectral Density, :Periodogram e :Frequency che sono di interesse, vedi screenshot qui sotto.

Quello che sto cercando di fare è trovare i numeri di riga dei primi 3 o 4 picchi nella colonna :Periodogram: è un po 'più facile da lavorare rispetto alla colonna :Spectral Density (vedi le aree evidenziate in giallo). Una volta che ho quei numeri di riga, posso trovare i valori corrispondenti nelle colonne :Period e :Frequency da riportare come risultato.
Il problema che ho è riuscire a ottenere quegli altri valori che non sono il risultato Col Max(:Periodogram). Posso capirlo bene, ma è più difficile scegliere le altre colonne di interesse. Mi piacerebbe farlo con JSL in modo che l'attività sia automatizzata anziché dover utilizzare lo strumento lazo o qualcosa del genere.
Tutte le idee o suggerimenti sono molto apprezzati.
Grazie!,
DS
Ecco un esempio di un modo per trovare i picchi.
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 )
);
Ecco un'altra opzione 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)))
);CIAO @jthi E @txnelson ,
Grazie a entrambi per il vostro contributo. Ho finito per andare con @jthi perché sembrava funzionare meglio per il tipo di dati con cui ho a che fare, utilizzando i grafici di densità spettrale/tabelle di dati. Apprezzo molto entrambi i tuoi contributi su questo, grazie ancora per un'altra soluzione utile!
DS