ARIMA模型定阶MATLAB


%%AIC准则定阶
maxLags = 4;
AICSet = zeros(maxLags,maxLags);

parfor i = 1:maxLags%使用并行工具箱进行计算
    for j=1:maxLags
        mdl=arima('ARLags',[1:i],'MALags',[1,j]);
        [EstMdl, EstParamCov, logL, info]=estimate(mdl, pct,'display','off');
        AICSet(i,j)=aicbic(logL,length(info.X));
        
    end
end

在进行完定阶时报错
Nonseasonal moving average lags must be unique, positive integers.
请帮忙

提示是说你的MA阶数不是唯一的正整数。你检查一下代码,确保MA阶数是唯一的正整数。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这篇文章:区间预测 | MATLAB实现ARIMA时间序列预测
  • 除此之外, 这篇博客: 时序预测 | MATLAB实现ARIMA时间序列预测中的 拓展学习 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    > ARIMA模型,差分整合移动平均自回归模型,又称整合移动平均自回归模型(移动也可称作滑动),时间序列预测分析方法之一。
    > ARIMA(p,d,q)中,AR是"自回归",p为自回归项数;MA为"滑动平均",q为滑动平均项数,d为使之成为平稳序列所做的差分次数(阶数)。“差分”一词虽未出现在ARIMA的英文名称中,却是关键步骤。ARIMA(p,d,q)模型是ARMA(p,q)模型的扩展。
    
    • 建模流程

    • 根据时间序列的散点图、自相关函数和偏自相关函数图识别其平稳性。

    • 对非平稳的时间序列数据进行平稳化处理。直到处理后的自相关函数和偏自相关函数的数值非显著非零。

    • 根据所识别出来的特征建立相应的时间序列模型。平稳化处理后,若偏自相关函数是截尾的,而自相关函数是拖尾的,则建立AR模型;若偏自相关函数是拖尾的,而自相关函数是截尾的,则建立MA模型;若偏自相关函数和自相关函数均是拖尾的,则序列适合ARMA模型。

    • 参数估计,检验是否具有统计意义。

    • 假设检验,判断(诊断)残差序列是否为白噪声序列。

    • 利用已通过检验的模型进行预测。

    • 对于任意的q,MA(q)均可以找到一个AR模型与之对应。因此,我们可以得到,时间序列数据归根到底,是可以用统一用AR模型来表示的。
    • 如果只有AR模型,那么一些时间序列必然会需要很高的阶数p来刻画。阶数p,就是待估参数的个数。待估参数越多,需要付出的参数估计代价就越大,所以我们当然希望参数个数越少越好。
    • 因此我们自然希望能够用低阶的MA模型来替换高阶的AR模型;反之亦然。这也可以从自相关系数和偏自相关系数来理解。MA模型的阶数看自相关系数,AR模型的阶数看偏自相关系数。如果自相关系数q阶以后都趋于0,说明是MA(q)模型;这时去看偏自相关系数,必然是无穷阶后都不收敛于0——因为MA模型对应无穷阶的AR模型。同样的,如果偏自相关系数p阶以后都趋于0,说明是AR§模型;这时去看自相关系数,必然是无穷阶后都不收敛于0——因为AR模型对应无穷阶的MA模型。
    • 最后,来说说ARMA模型。当自相关系数和偏自相关系数都没有收敛于0,说明这个时间序列不能纯用低阶的AR模型或者纯用低阶的MA模型来解释,需要低阶的AR和低阶的MA模型混合来解释。也可以换个角度来思考,前面提到,任何一个时间序列都可以用纯粹的AR模型来刻画。但是偏自相关系数无穷阶后都不收敛于0,说明只能用一个高阶的AR来解释。但这样的话,阶数太高,待估参数太多了。
    • 所以我们对这个高阶AR模型做分解,分解出一个低阶的AR模型和另一个特殊的高阶AR模型,其中分解出来的高阶AR模型恰好等价于一个低阶的MA模型。于是我们就可以用低阶的AR模型和低阶的MA模型来描述这个时间序列了,这就是ARMA模型。
  • 以下回答来自chatgpt:

    由于没有具体的错误信息,无法得知具体问题所在,因此无法直接给出解决方案。建议将错误信息提供出来,并参考参考资料中的建模流程,逐步排除可能的问题。需要注意的是,在建模过程中,需要对非平稳的时间序列进行平稳化处理,可以通过差分来实现,同时需要注意模型的选择和参数的估计。以下是建模流程的参考代码:

    % 读取数据
    data = readtable('data.csv');
    y = data.Value;
    
    % 绘制时序图,查看序列的趋势、周期、噪声等特征
    figure;
    plot(y);
    xlabel('Time');
    ylabel('Value');
    title('Time Series Data');
    
    % 计算自相关系数和偏自相关系数,查看平稳性的特征
    [acf, lags] = autocorr(y);
    [pacf, lags] = parcorr(y);
    
    % 绘制自相关函数图和偏自相关函数图
    figure;
    subplot(2,1,1);
    stem(lags, acf);
    xlabel('Lag');
    ylabel('ACF');
    title('Autocorrelation Function');
    subplot(2,1,2);
    stem(lags, pacf);
    xlabel('Lag');
    ylabel('PACF');
    title('Partial Autocorrelation Function');
    
    % 进行差分操作,使序列平稳化
    diff_y = diff(y);
    figure;
    subplot(2,1,1);
    plot(y);
    xlabel('Time');
    ylabel('Value');
    title('Original Time Series Data');
    subplot(2,1,2);
    plot(diff_y);
    xlabel('Time');
    ylabel('Value');
    title('Differenced Time Series Data');
    
    % 识别模型,并进行参数估计
    model = arima('ARLags',1,'MALags',1,'D',1);
    [estmodel, estParamCov, logL, info] = estimate(model, y);
    
    % 检验残差序列是否为白噪声序列
    resid = infer(estmodel, y);
    [h, p, stat] = lbqtest(resid);
    
    % 使用模型进行预测
    [Y, YMSE] = forecast(estmodel, 24);
    UB = Y + 1.96*sqrt(YMSE);
    LB = Y - 1.96*sqrt(YMSE);
    
    % 绘制预测结果图
    figure;
    plot(y,'b');
    hold on;
    forecastDates = (datenum(data.Time(end))+1:datenum(data.Time(end))+24)';
    forecastDates = datetime(forecastDates,'ConvertFrom','datenum');
    plot(forecastDates,Y,'r','LineWidth',2);
    xlabel('Date');
    ylabel('Value');
    title('Forecasted Time Series Data');
    legend('Observed','Forecasted','95% Confidence Interval','Location','NorthWest');
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^