У меня есть вопрос относительно метода findfrequency из пакета прогнозов R . Я использую его для извлечения периода временных рядов, полученных путем выборки синусоидальных функций с очень большим независимым шумом, отобранным из [-n, n]:
n <- 4
var <- seq(from=0,to=50,by=0.1)
noisy_sin <- sin(var)+2*n*runif( length(var))-n
forecast::findfrequency(noisy_sin)
В этом случае findfrequency не может найтиПериод. Однако, если я посмотрю на режимы БПФ этого сигнала, я все еще вижу доминирующий пик, близкий к 9, который является числом повторений сигнала в рассматриваемой области:
plot.ts(abs(fft(noisy_sin))[1:20]
Мы можем видетьдоминирующий выбор в режимах Фурье:
Использование БПФ работает многократно, а поиск часто повторяется неудачно. Это было очень удивительно, поэтому я проверил детали функции findfrequency, чтобы понять, почему она не распознает период. Первоначально функция findfrequency удаляет линейный тренд, который оказывает незначительное влияние в примере, рассмотренном здесь, поскольку в этих временных рядах тренда нет. Впоследствии он определяет функцию спектральной плотности:
noisy_sin <- as.ts( noisy_sin )
spec <- spec.ar(c(na.contiguous( noisy_sin )), plot = TRUE, n.freq = 500)
Что дает нам следующий график спектральной плотности:
Что делаетне имеют четкого локального максимума. В этом случае:
which.max(spec$spec)
возвращает 1 как целую функцию поиска частоты.
Поскольку я новичок в анализе временных рядов, у меня есть пара вопросов: (1) Почему в findfrequencyВы используете функцию спектральной плотности вместо того, чтобы смотреть на нормы коэффициентов БПФ? Я предполагаю, что должна быть причина, но я не смог найти ее в литературе. (2) Почему функция спектральной плотности кажется менее устойчивой по отношению к шуму?
Большое спасибо за помощь!