Comment obtenir des valeurs de position de pointe dans un spectrogramme à l'aide de JSLSalut tout le monde,
J'ai des données sur lesquelles j'effectue une analyse de série chronologique sur laquelle j'aimerais obtenir les positions des pics du périodogramme (Série chronologique> Enregistrer la densité spectrale). Vous pouvez par exemple le faire avec l'exemple de table de données Air.jmp, en ne mettant qu'une variable de colonne Y. Vous pouvez mettre la variable X, Time ID, mais ce n'est pas nécessaire.
Quoi qu'il en soit, une fois que vous avez enregistré la densité spectrale, il y a plusieurs colonnes, :Spectral Density, :Periodogram et :Frequency qui sont intéressantes, voir la capture d'écran ci-dessous.

Ce que j'essaie de faire, c'est de trouver les numéros de ligne des 3 ou 4 pics supérieurs dans la colonne :Periodogram - c'est un peu plus facile à utiliser que la colonne :Spectral Density (voir les zones surlignées en jaune). Une fois que j'ai ces numéros de ligne, je peux trouver les valeurs correspondantes dans les colonnes :Period et :Frequency pour faire rapport en conséquence.
Le problème que j'ai est de pouvoir obtenir ces autres valeurs qui ne sont pas le résultat Col Max(:Periodogram). Je peux très bien comprendre cela, mais il est plus difficile de choisir les autres colonnes d'intérêt. J'aimerais le faire avec JSL pour que la tâche soit automatisée plutôt que d'avoir à utiliser l'outil lasso ou quelque chose comme ça.
Toutes les idées ou suggestions sont très appréciées.
Merci!,
DS
Automatisation et scriptExploration et visualisation des donnéesles fenêtresRe : Comment obtenir des valeurs de position de pointe dans un spectrogramme à l'aide de JSLVoici un exemple d'une façon de trouver les pics.
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 )
);
Re : Comment obtenir des valeurs de position de pointe dans un spectrogramme à l'aide de JSLVoici une autre option utilisant 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)))
);Re : Comment obtenir des valeurs de position de pointe dans un spectrogramme à l'aide de JSLSalut @jthi et @txnelson ,
Merci à vous deux pour votre contribution. j'ai fini par aller avec @jthi La solution car elle semblait mieux fonctionner pour le type de données que je traite, en utilisant les graphiques/tableaux de données de densité spectrale. J'apprécie vraiment vos deux contributions à ce sujet, merci encore pour une autre solution utile !
DS