matlab练习程序(门限回归TR与门限自回归TAR)

门限回归和门限自回归是对基本的回归和自回归加上一个阈值判断。

下面简单的表述一下公式。

回归模型可以用下述公式表示:

则门限回归可以表示为:

自回归模型可以用下述公式表示:

则门限自回归可以表示为:

计算参数的方法和之前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

结果如下:

posted @ 2023-01-19 13:54  Dsp Tian  阅读(279)  评论(0编辑  收藏  举报