2014-10-23 9 views
1

Я ищу способ заполнения пробелов данных в временном ряду, который содержит периодические данные (в данном случае с частотой, равной частоте приливов, поэтому обе полусуточные и частоты пружины/частоты) с использованием MATLAB. Серия данных также содержит шум, который я бы хотел наложить поверх искусственных данных, которые заполняют временной промежуток. У данных есть определенная тенденция, которую я хочу сохранить. В идеале я бы посмотрел на метод, который использует записанные данные по обе стороны от промежутка времени.Заполнение пробелов данных в периодических тайм-серверах в MATLAB

Есть ли способ сделать это в Matlab?

спасибо.

Дональд Джон

+0

Вы говорите о временных промежутках минут порядка (или часов), или вы говорите о нескольких периодах без вести , т. е. в порядке суток? Можете ли вы предоставить некоторые данные или, по крайней мере, график данных, чтобы можно было увидеть пробелы? Как сейчас, ваш вопрос очень широк и неопределенен, что маловероятно, что вы получите полезный ответ на вашу проблему. – Nras

+0

К сожалению, я не могу опубликовать сюжет из-за ограничений на мою учетную запись (связанная с репутацией - первый раз, используя этот форум). Файлы данных слишком велики для публикации здесь, с частотой выборки 5 минут. Тем не менее, не хватает данных за неделю. Если есть что-то еще, я могу добавить, что было бы полезно, пожалуйста, дайте мне знать. – user2653752

+0

Как бы то ни было, я думаю, что это слишком широко, но вы в основном смотрите на определение какой-то модели из ваших существующих данных - что-то вроде суммирования нескольких разных типов периодических вариаций + некоторый долгосрочный тренд + короткий долгосрочный шум. – nkjt

ответ

1

Так что можно сделать, это «угадать» с modelfunction и соответствовать данным по этой модели, используя некоторые оптимизации рутины. Затем внимательно посмотрите на остатки и получите статистику, которая характеризует шум от этих остатков. Затем примените модель и добавьте шум. В Matlab кодекса Ansatz может выглядеть следующим образом:

t_full = linspace(0,4*pi,500); 
t = t_full([1:200, 400:end]); 
f = 2; 
A = 3; 
D = 5; 
periodic_signal = A*sin(t*f) + D; 
trend = 0.2*t; 
noise = randn(size(t)); 
y = periodic_signal + trend + noise; 

% a model for the data -- haha i know the exact model here! 
model = @(par, t) par(1)*sin(t*par(2)) + par(3) + par(4)*t; 
par0 = [2, 2, 2, 2]; % and i can make a good guess for the parameters 
par_opt = nlinfit(t,y, model, par0); % and optimize them 

% now from the residuals (data minus model) one can guess noise 
% characteristics 
residual = y - model(par_opt, t); 

% compare residual with "real noise" (should coincide if optimisation 
% doesnt fail) 
[mean(noise), mean(residual)] % about [0, 0] 
[std(noise), std(residual)] % about [1, 1] 
missing_data = 201:399; 
new_noise = mean(residual) + std(residual)*randn(size(missing_data)); 

% show what is going on 
figure 
plot(t,y,'k.') 
hold on 
plot(t_full, model(par_opt, t_full), 'r-', 'linewidth', 2); 
plot(t_full(missing_data), model(par_opt, t_full(missing_data)) + new_noise, 'r.') 

legend('data', sprintf('y(t) = %.2f*sin(%.2f*t) + %.2f + %.2f*t + e(t)', par_opt), 'reconstructed data') 

Это приводит к следующему графике:

+0

Спасибо, это именно тот тип вещи Я ищу. Я попытаюсь применить что-то похожее на мои данные. В очередной раз благодарим за помощь. – user2653752

+0

Только один вопрос, есть ли что-нибудь подобное, используя интерполяцию или экстраполяцию в качестве отправной точки? – user2653752

+0

@ user2653752 Боюсь, я не понимаю этого вопроса. Но, глядя на ваши данные (кстати, вы должны отредактировать ссылки в вопросе), я чувствую, что этот метод потерпит неудачу, так как поведение с октября по ноябрь сильно отличается от того, что с марта по октябрь. У вас, похоже, нет даже одного полного периода, правильно? Не уверен, что модель сделает это. Может быть, отрезать некоторые данные с самого начала и использовать данные с Sep (или Oct) до Nov может помочь. – Nras