Хотя я читаю этот пост, я все еще не знаю, как применить это к моим собственным данным, и надеюсь, что кто-то может мне помочь.
У меня есть следующие данные:
y <- c(11.622967, 12.006081, 11.760928, 12.246830, 12.052126, 12.346154, 12.039262, 12.362163, 12.009269, 11.260743, 10.950483, 10.522091, 9.346292, 7.014578, 6.981853, 7.197708, 7.035624, 6.785289, 7.134426, 8.338514, 8.723832, 10.276473, 10.602792, 11.031908, 11.364901, 11.687638, 11.947783, 12.228909, 11.918379, 12.343574, 12.046851, 12.316508, 12.147746, 12.136446, 11.744371, 8.317413, 8.790837, 10.139807, 7.019035, 7.541484, 7.199672, 9.090377, 7.532161, 8.156842, 9.329572, 9.991522, 10.036448, 10.797905)
t <- 18:65
И теперь я просто хочу соответствовать синусоидальной волне
с четырьмя неизвестными , ω , ϕ и C к нему.
Остальная часть моего кода выглядит следующим образом
res <- nls(y ~ A*sin(omega*t+phi)+C, data=data.frame(t,y), start=list(A=1,omega=1,phi=1,C=1))
co <- coef(res)
fit <- function(x, a, b, c, d) {a*sin(b*x+c)+d}
# Plot result
plot(x=t, y=y)
curve(fit(x, a=co["A"], b=co["omega"], c=co["phi"], d=co["C"]), add=TRUE ,lwd=2, col="steelblue")
Но результат действительно плохой.
Я был бы очень признателен за любую помощь.
Приветствия.
r
regression
fitting
паскаль
источник
источник
Ответы:
Если вы просто хотите получить хорошую оценку и не беспокоитесь о ее стандартной ошибке:ω
(Возможно, более удачное совпадение каким-то образом объясняет выбросы в этой серии, уменьшая их влияние.)
---
Если вы хотите получить представление о неопределенности в , вы можете использовать вероятность профиля ( pdf1 , pdf2)ω - ссылки на получение приблизительных CI или SE по вероятности профиля или их варианты не сложно найти)
(В качестве альтернативы, вы могли бы подать эти оценки в nls ... и начать его уже сходились.)
источник
lm(y~sin(2*pi*t)+cos(2*pi*t)
но это не сработало (cos
термин всегда был 1). Просто из любопытства: что делают первые две строки (я знаю, чтоspectrum
оценивает спектральную плотность)?2*pi*t
spec
в TSA может быть лучше (кажется, у нее больше опций, одна из которых иногда может быть важной), но в этом случае основной пик был точно в том же месте, что и с,spectrum
поэтому я не стал беспокоиться.reslm
к ,reslm <- lm(y ~ cos(2*pi/per*t)+tan(2*pi/per*t))
но это не выглядит правильно. какие-нибудь намеки?Когда я положил , что в
nls
«sstart
список, я получил кривую , которая была гораздо более разумным, хотя он все еще имеет некоторые систематические ошибки.В зависимости от вашей цели с этим набором данных, вы можете попытаться улучшить подбор, добавив дополнительные термины или используя непараметрический подход, такой как гауссовский процесс с периодическим ядром.
Выбор начального значения автоматически
Если вы хотите выбрать доминирующую частоту, вы можете использовать быстрое преобразование Фурье (БПФ). Это выход из моей области знаний, поэтому я позволю другим людям заполнить детали, если они захотят (особенно о шагах 2 и 3), но приведенный
R
ниже код должен работать.Вы также можете составить график,
abs(truncated.fft)
чтобы увидеть, есть ли другие важные частоты, но вам придется немного поэкспериментировать с масштабированием оси x.Кроме того, я считаю, что @Glen_b правильно, что проблема выпуклая, если вы знаете омегу (или, может быть, вам тоже нужно знать фи? Я не уверен). В любом случае, знание начальных значений для других параметров не должно быть столь же важным, как для омеги, если они находятся в правильном поле. Вы могли бы, вероятно, получить приличные оценки других параметров из БПФ, но я не уверен, как это будет работать.
источник
foo.bar
. Это связано с тем, как R определяет методы для классов .В качестве альтернативы тому, что уже было сказано, возможно, стоит отметить, что модель AR (2) из класса моделей ARIMA может использоваться для создания прогнозов с синусоидальной диаграммой.
Panratz (1991) говорит нам следующее о стохастических циклах:
Чтобы увидеть, можно ли
auto.arima()
подобрать такую модель к данным, я использовал функцию из пакета прогноза, чтобы выяснить, будет ли она предлагать модель AR (2). Оказывается, чтоauto.arima()
функция предлагает модель ARMA (2,2); не чистая модель AR (2), но это нормально. Это нормально, потому что модель ARMA (2,2) содержит компонент AR (2), поэтому применяется то же правило (о стохастических циклах). Таким образом, мы все еще можем проверить вышеупомянутое условие, чтобы видеть, будут ли производиться синусоидальные прогнозы.Результаты
auto.arima(y)
показаны ниже.График ниже показывает исходную серию y, соответствие модели ARMA (2,2) и 14 прогнозов вне выборки. Как видно, прогнозы вне выборки следуют синусоидальной схеме.
Имейте в виду две вещи. 1) Это просто очень быстрый анализ (с использованием автоматизированного инструмента), и для правильной обработки необходимо следовать методологии Бокса-Дженкинса. 2) Прогнозы ARIMA хороши при краткосрочном прогнозировании, поэтому вы можете посчитать, что долгосрочные прогнозы по моделям в ответах @David J. Harris и @Glen_b более надежны.
Наконец, надеюсь, это хорошее дополнение к некоторым уже очень информативным ответам.
Ссылка : Прогнозирование с использованием моделей динамической регрессии: Алан Панкрац, 1991 (Джон Уили и сыновья, Нью-Йорк), ISBN 0-471-61528-5
источник
Текущие методы для подгонки синусоидальной кривой к заданному набору данных требуют первого угадывания параметров с последующим интерактивным процессом. Это проблема нелинейной регрессии. Другой метод состоит в преобразовании нелинейной регрессии в линейную регрессию благодаря удобному интегральному уравнению. Тогда нет необходимости в первоначальном предположении и в итеративном процессе: подгонка получается напрямую. В случае функции y = a + r * sin (w * x + phi) или y = a + b * sin (w * x) + c * cos (w * x), см. Стр. 35-36 статьи. "Régression sinusoidale" опубликовано на Scribd: http://www.scribed.com/JJacquelin/documents В случае функции y = a + p * x + r * sin (w * x + phi): стр. 49-51 главы «Смешанные линейные и синусоидальные регрессии». В случае более сложных функций общий процесс объясняется в главе «Обобщенная синусоидальная регрессия», страницы 54–61, после чего следует числовой пример y = r * sin (w * x + phi) + (b / x) + c * ln (x), стр. 62-63
источник
Если вам известна самая низкая и самая высокая точка ваших косинусоидальных данных, вы можете использовать эту простую функцию для вычисления всех косинусных коэффициентов:
Ниже он используется для имитации изменения температуры в течение дня с помощью функции косинуса путем ввода часов и значений температуры для самого низкого и самого теплого часа:
Выход ниже:
источник
Другой вариант - использование универсальной функции optim или nls. Я пробовал оба, ни один из них не является полностью надежным
Следующие функции принимают данные в y и вычисляют параметры.
использование следующее:
Следующий код сравнивает данные
источник