【问题标题】:Filling data gaps in a periodic timeseries in MATLAB在 MATLAB 中填充周期性时间序列中的数据空白
【发布时间】:2014-10-23 12:22:53
【问题描述】:

我正在寻找一种方法来使用 MATLAB 填补包含周期性数据的时间序列中的数据空白(在这种情况下,频率等于潮汐频率,因此包括半昼夜和春季/间歇频率)。数据系列还包含噪声,我想将其叠加在填充时间间隙的人工数据之上。数据有一定的趋势,我想保留。理想情况下,我会研究一种在时间间隔两侧使用记录数据的方法。

在 Matlab 中是否有这样做的?

谢谢。

唐纳德·约翰

【问题讨论】:

  • 您是在谈论订单分钟(或小时)的时间间隔,还是在谈论缺少几个时期,即以天为单位?你能提供一些数据或至少一张数据图,以便人们看到差距吗?就目前而言,您的问题非常广泛和模糊,这使得您不太可能获得对您的问题有帮助的答案。
  • 很遗憾,由于我的帐户限制(与声誉有关 - 第一次使用此论坛),我无法发布情节。数据文件太大,无法在此处发布,采样率为 5 分钟。但是,大约有一周的数据丢失。如果还有什么我可以添加的对您有帮助的,请告诉我。
  • 就目前而言,我认为这太宽泛了,但您基本上是在考虑从现有数据中定义某种模型 - 就像几种不同类型的周期性变化的总和 +一些长期趋势 + 短期噪音。
  • 谢谢。你对我如何定义这样一个模型有什么建议吗?除了发布数据图外,我不确定如何更具体,但目前我无法使用。
  • 您可以将图片上传到任何您喜欢的图片托管商,并将链接放在这里。我们下一个来的人会嵌入它。

标签: matlab time-series trend gaps-in-data


【解决方案1】:

所以可以做的是“猜测”一个模型函数,并使用一些优化例程通过该模型拟合数据。然后仔细查看残差并获得表征残差噪声的统计数据。然后应用模型并添加噪声。在 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')

结果如下图:

【讨论】:

  • 谢谢,这正是我正在寻找的东西。我将尝试应用与我的数据类似的东西。再次感谢您的帮助。
  • 还有一个问题,有没有以插值或外推为起点做类似的事情?
  • @user2653752 恐怕我不明白这个问题。但是查看您的数据(顺便说一句:您应该编辑问题中的链接)我觉得这种方法会失败,因为从 10 月到 11 月的行为与从 3 月到 10 月的行为完全不同。您似乎甚至没有 1 个完整的时期,对?不确定模型是否会成功。也许从一开始就切断一些数据,只使用从 9 月(或 10 月)到 11 月的数据会有所帮助。
  • 对不起,我现在感觉在黑暗中。我认为最好的地方是从你的方法开始。您对行为变化有一定的看法,但可以公平地假设趋势在 10 月之后呈下降趋势,然后叠加在这种下降趋势上的将是潮汐期和噪音。最后做了一点阅读,我遇到了卡尔曼滤波器。卡尔曼滤波器是否有可能完成这项工作?如果卡尔曼滤波器是可能的,我该如何在 MATLAB 中实现卡尔曼滤波器?
猜你喜欢
  • 2021-11-12
  • 2018-07-24
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
  • 2020-05-31
相关资源
最近更新 更多