大家好,
我有一些數據正在執行時間序列分析,我想從周期圖中獲取峰值的位置(時間序列>保存光譜密度)。 例如,您可以使用 Air.jmp 示例數據表執行此操作,僅放入 Y 列變量。 您可以放入 X、時間 ID 變量,但這不是必需的。
不管怎樣,一旦你保存了頻譜密度,就會有幾列感興趣::頻譜密度、:週期圖和:頻率,請參見下面的屏幕截圖。

我想做的是找到 :Periodogram 列中可能前 3 或 4 個峰值的行號——它比 :Spectral Density 列更容易使用(請參見黃色突出顯示的區域)。 一旦獲得這些行號,我就可以在 :Period 和 :Frequency 列中找到相應的值來報告結果。
我遇到的問題是能夠獲取不是 Col Max(:Periodogram) 結果的其他值。 我可以很好地理解這一點,但很難選出其他感興趣的列。 我想使用 JSL 來執行此操作,以便任務自動化,而不必使用套索工具或類似工具。
非常感謝任何想法或建議。
謝謝!,
DS
以下是查找峰值的一種方法的示例。
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 )
);
這是使用 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)))
);你好@jthi和@tx尼爾森,
謝謝你們的意見。 我最終去了@jthi的解決方案,因為它似乎更適合我正在處理的數據類型,使用譜密度圖/數據表。 我非常感謝您對此的貢獻,再次感謝您提供另一個有用的解決方案!
DS