大家好,
我有一些数据正在执行时间序列分析,我想从周期图中获取峰值的位置(时间序列>保存光谱密度)。 例如,您可以使用 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