Вычислить автокорреляцию временного ряда, созданного из нормального распределения

#matlab #octave #autocorrelation

#matlab #октава #автокорреляция

Вопрос:

Я генерирую временной ряд из нормального распределения, а затем пытаюсь построить автокорреляцию, используя следующий фрагмент кода:

 ts1 = normrnd(0,0.25,1,100);
autocorrelation_ts1 = xcorr(ts1);
  

Я ожидал, что автокорреляция покажет 1 для x = 0 и почти 0 для остальных значений, вместо этого я получаю значение 6 в положении оси 100.

Я думаю, что вопрос относится как к Matlab, так и к Octave, но я не уверен.

автокорреляция

Ответ №1:

Во-первых, ваша вторая строка кода неверна. Я думаю, вы хотели поставить

 autocorrelation_ts1 = xcorr(ts1);
  

Помимо этого, я думаю, что ваше решение правильное. Причина, по которой максимальное значение равно 100, а не 0, заключается в том, что временной сдвиг 0 в автокорреляции фактически происходит на 100-й итерации корреляционной функции. Другими словами, числа на оси X не соответствуют времени.

Чтобы получить время по оси X, измените свой код на

 [autocorrelation_ts1, shifts] = xcorr(ts1);
  

Затем

 plot(shifts, autocorrelation_ts1)
  

Что касается максимального значения, документация matlab для xcorr указывает, что 1 не является максимальным выходным значением функции при вызове без аргумента нормализации. Если вы хотите нормализовать так, чтобы все значения были равны 1 или меньше, используйте

 [autocorrelation_ts1, shifts] = xcorr(ts1, 'normalized');
  

Комментарии:

1. Вторая строка была опечаткой копирования и вставки. Я попытался использовать сдвиги, и теперь автокорреляция сосредоточена вокруг нуля, как вы заявляете. Кажется, что в Octave xcorr отсутствует параметр ‘normalized’, хотя, как вы указываете, это способ решить его в Matlab

2. Ручная нормализация может работать в octave. Перед построением графика: autocorrelation_ts1 = autocorrelation_ts1./max(autocorrelation_ts1);

3. Это работает. Теперь мне интересно, почему автокорреляция кажется статистически ниже при больших задержках / сдвигах. Я бы ожидал, что значение 1 равно 0 и одинаково мало в остальные смены

4. С моей стороны это не так. Возможно, попробуйте очистить свои переменные и запустить код заново с нуля. Может быть просто конкретный случайный временной ряд, с которым вы закончили.

Ответ №2:

В качестве дополнительной ссылки на ответ Скотта, это полный фрагмент кода, включая масштабирование диаграммы stem для отображения до 20 сдвигов / задержек.

 [auto_ts1, lags] = xcorr(ts1);
ts_begin = ceil(size(lags,2)/2);
ts_end = ts_begin   20;
stem(lags(ts_begin:ts_end),auto_ts1(ts_begin:ts_end)/max(auto_ts1), 'linewidth', 4.0, 'filled')