门限回归和门限自回归是对基本的回归和自回归加上一个阈值判断。
下面简单的表述一下公式。
回归模型可以用下述公式表示:
则门限回归可以表示为:
自回归模型可以用下述公式表示:
则门限自回归可以表示为:
计算参数的方法和之前ARMA中类似,根据输入输出和模型通过最优化方法计算。
门限回归代码如下:
clear;close all;clc; a = [0.3 0.5 1 -0.1 -0.8 1]; n=50; y = zeros(n,1); x = rand(n,1); for i=2:n if x(i) <= 0 y(i) = a(1) + a(2)*x(i-1) + a(3)*x(i); else y(i) = a(4) + a(5)*x(i-1) + a(6)*x(i); end end plot(y,'r-o'); %%优化 options.Algorithm = 'levenberg-marquardt'; lb = [];ub = []; par = [rand(6,1);rand(n,1)]; f = @(par) func(par,y); par= lsqnonlin(f,par,lb,ub,options); %执行优化 %%验证 a = par(1:6); x = par(6:end); for i=2:n if x(i) <= 0 y(i) = a(1) + a(2)*x(i-1) + a(3)*x(i); else y(i) = a(4) + a(5)*x(i-1) + a(6)*x(i); end end hold on; plot(y,'g-*'); function re = func(par,y) a = par(1:6); x = par(6:end); re = zeros(length(x),1); for i=2:length(y) if x(i) <= 0 re(i) =y(i)-(a(1) + a(2)*x(i-1) + a(3)*x(i)); else re(i) =y(i)-(a(4) + a(5)*x(i-1) + a(6)*x(i)); end end end
结果如下:
门限自回归代码如下:
clear;close all;clc; b = [0.3 0.5 1 -0.1 -0.8 1]; n=50; e = randn(n,1); y = zeros(n,1); y(1) = rand(1); for i=2:n if y(i-1) <= 0 y(i) = b(1) + b(2)*y(i-1) + b(3)*e(i); else y(i) = b(4) + b(5)*y(i-1) + b(6)*e(i); end end plot(y,'r-o'); %%优化 options.Algorithm = 'levenberg-marquardt'; lb = [];ub = []; par = [rand(6,1);rand(n,1)]; f = @(par) func(par,y); par= lsqnonlin(f,par,lb,ub,options); %执行优化 %%验证 b = par(1:6); e = par(6:end); for i=2:n if y(i-1) <= 0 y(i) = b(1) + b(2)*y(i-1) + b(3)*e(i); else y(i) = b(4) + b(5)*y(i-1) + b(6)*e(i); end end hold on; plot(y,'g-*'); function re = func(par,y) b = par(1:6); e = par(6:end); re = zeros(length(e),1); for i=2:length(y) if y(i-1) <= 0 re(i) =y(i)-(b(1) + b(2)*y(i-1) + b(3)*e(i)); else re(i) =y(i)-(b(4) + b(5)*y(i-1) + b(6)*e(i)); end end end
结果如下:
标签:rand,TAR,0.1,门限,如下,回归,0.3 From: https://www.cnblogs.com/tiandsp/p/17061236.html