区间预测 | MATLAB实现基于Bootstrap的区间预测
目录
- 区间预测 | MATLAB实现基于Bootstrap的区间预测
- 效果一览
- 基本介绍
- 模型描述
- 程序设计
- 参考资料
效果一览
基本介绍
区间预测 | MATLAB实现基于Bootstrap的区间预测
MATLAB实现基于Bootstrap区间预测(完整源码和数据)
Bootstrap区间预测为您的点预测提供置信区间描述不确定性
采用核心中的Bootstrap区间预测方法,帮您的点预测结果变为区间预测,并提供多种区间预测指标,如pinaw picp等等,提供多个置信区间,如95%、90%、85%、80%等等。
附赠案例数据可直接运行,直接替换excel即可适合新手小白发货后概不退换。
模型描述
Bootstrap是一种基于自助法(bootstrapping)思想的统计学方法,它可以通过从已有数据的样本中随机有放回地抽取多个样本,来生成估计量的分布,从而进行区间估计和假设检验等统计分析。
基于Bootstrap的区间预测的步骤如下:
从原始数据样本中有放回地抽取多个样本(通常抽取的样本数量与原始数据的样本量相同),每个样本包含相同数量的数据点。
对每个样本进行预测,得到针对该样本的预测结果,可以是点预测(如均值、中位数等)或分布预测(如正态分布、t分布等)。
重复步骤1和步骤2多次(通常重复1000次或更多次),得到多个预测结果。
对所有预测结果进行排序,并取出指定置信水平(如95%)对应的上下界,作为区间估计的上下界。
需要注意的是,基于Bootstrap的区间预测假设未来数据与历史数据的分布相同,因此在样本数量较少或数据分布发生变化时可能会产生不准确的预测结果。此外,Bootstrap方法的计算量较大,需要使用计算机进行计算。
程序设计
-
完整程序和数据获取方式1:私信博主,同等价值程序兑换;
-
完整程序和数据下载方式2(资源处直接下载):MATLAB实现基于Bootstrap的区间预测
-
完整程序和数据下载方式3(订阅《数据处理》专栏,Bootstrap的区间预测数据订阅后私信我获取):MATLAB实现基于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