区间预测 | MATLAB实现基于Bootstrap的区间预测

区间预测 | MATLAB实现基于Bootstrap的区间预测

效果一览

1

基本介绍

区间预测 | MATLAB实现基于Bootstrap的区间预测
MATLAB实现基于Bootstrap区间预测(完整源码和数据)
Bootstrap区间预测为您的点预测提供置信区间描述不确定性
采用核心中的Bootstrap区间预测方法,帮您的点预测结果变为区间预测,并提供多种区间预测指标,如pinaw picp等等,提供多个置信区间,如95%、90%、85%、80%等等。
附赠案例数据可直接运行,直接替换excel即可适合新手小白发货后概不退换。

模型描述

Bootstrap是一种基于自助法(bootstrapping)思想的统计学方法,它可以通过从已有数据的样本中随机有放回地抽取多个样本,来生成估计量的分布,从而进行区间估计和假设检验等统计分析。
基于Bootstrap的区间预测的步骤如下:
从原始数据样本中有放回地抽取多个样本(通常抽取的样本数量与原始数据的样本量相同),每个样本包含相同数量的数据点。
对每个样本进行预测,得到针对该样本的预测结果,可以是点预测(如均值、中位数等)或分布预测(如正态分布、t分布等)。
重复步骤1和步骤2多次(通常重复1000次或更多次),得到多个预测结果。
对所有预测结果进行排序,并取出指定置信水平(如95%)对应的上下界,作为区间估计的上下界。
需要注意的是,基于Bootstrap的区间预测假设未来数据与历史数据的分布相同,因此在样本数量较少或数据分布发生变化时可能会产生不准确的预测结果。此外,Bootstrap方法的计算量较大,需要使用计算机进行计算。

程序设计

function [p,stats]=INTERVAL_FUN(x,y,tau,order,Nboot)

warning off
if nargin<3
    error('输入参数不足!');
end
if nargin<4, order=[]; end
if nargin<5, Nboot=200; end

if (tau<=0)|(tau>=1),
    error('分位数必须介于0和1之间!')
end

if size(x,1)~=size(y,1)
    error('样本点数量必须相同!');
end

if numel(y)~=size(y,1)
    error('因变量序列必须为向量!')
end

if size(x,2)==1
    if isempty(order)
        order=1;
    end
    %建立范德蒙德矩阵
    if order>0
        x(:,order+1)=1;
    else
        order=abs(order);
    end
    x(:,order)=x(:,1); 
    for ii=order-1:-1:1
        x(:,ii)=x(:,order).*x(:,ii+1);
    end
elseif isempty(order)
    order=1; 
else
    error('不能同时使用多列输入来指定回归阶数!');
end


pmean=x\y; %最小二乘
% if all(x(:,end)==1)
%     r=y-x*pmean;
%     pmean(end)=pmean(end)+prctile(r,tau*100);
% end

rho=@(r)sum(abs(r.*(tau-(r<0))));

p=fminsearch(@(p)rho(y-x*p),pmean);




if nargout>1
    %采用 Bootstrap方法分析模型的预测误差分布
    
    yfit=x*p;
    resid=y-yfit;
    
    options = optimset('MaxFunEvals',1000,'MaxIter',1000);
    stats.pboot=bootstrp(Nboot,@(bootr)fminsearch(@(p)rho(yfit+bootr-x*p),p,options)', resid);
    stats.pse=std(stats.pboot);
    
    qq=zeros(size(x,1),Nboot);
    for ii=1:Nboot
        qq(:,ii)=x*stats.pboot(ii,:)';
    end
    stats.yfitci=prctile(qq',[2.5 97.5])';
    
end

    for i = 1:size(Lower,2)
        for j = 1:length(Real)
            if Lower(j,i)<=Real(j)&&Upper(j,i)>=Real(j)
                temp(i,:) = temp(i,:)+1;
                count_picp(:,i) = temp(i,:);
            end
        end  
    end
    PICP = count_picp/length(Real);
    mean_PICP = mean(PICP);
end




参考资料

[1] https://blog.csdn.net/kjm13182345320/article/details/127931217
[2] https://blog.csdn.net/kjm13182345320/article/details/127418340

猜你喜欢

转载自blog.csdn.net/kjm13182345320/article/details/131895373