Создание ряда матриц / векторов на основе числа - PullRequest
1 голос
/ 16 июня 2020

У меня есть простой для l oop, который используется для моделирования данных,

for t=2:T;
        Y_star(t,1,b)=[Y_star(t-1,1,b) X_1_star(t-1,1,b) X_2_star(t-1,1,b) 1]*beta(:,i)+w(t-1)*e(t-1,i);
        X_1_star(t,1,b)=Theta(1,1)+Phi(1,:,1)*[X_1_star(t-1,1,b) ; X_2_star(t-1,1,b)]+w(t-1)*v(t-1,1,i);
        X_2_star(t,1,b)=Theta(2,1)+Phi(2,:,1)*[X_1_star(t-1,1,b) ; X_2_star(t-1,1,b)]+w(t-1)*v(t-1,2,i);
end;

Проблема, с которой я сталкиваюсь, это нормально, когда у меня есть две переменные X, однако я хотел бы напишите код, чтобы я мог увеличивать количество переменных, которые нужно изменять каждый раз, скажем, 4.

В этом случае мне понадобятся X_1_star, X_2_star, X_3_star и X_4_star.

Я могу обрабатывать коэффициенты Phi и Theta, а также w, v и e, однако я изо всех сил пытаюсь создать матрицы для X.

Любые идеи были бы замечательными, я пробовал хранение матриц внутри ячеек, но я изо всех сил пытался заставить это работать.

Следуя комментариям, вот простой пример

%% Простой пример% ----------- -------------------------------------------------- ------------%

Phi = [0.9954    0.0195;
       0.0012    0.9567];  
Theta= [0.007;0.051];
beta = [0.06;-0.10;1.66;-0.88];
N = 1;      
e = rand(370,1);
v = randn(370,2);
t = 371;
T = 371;
yy = rand(370,1);
X_1 = rand(370,1);
X_2 = rand(370,1);
B=50;
Y_star=zeros(T,N,B);
X_1_star=zeros(T,N,B);
X_2_star=zeros(T,N,B);
for b=1:B;
    Y_star(1,:,b)=yy(1,:);
    X_1_star(1,:,b)=X_1(1,:);
    X_2_star(1,:,b)=X_2(1,:);
    w=randn(T-1,1);
    for t=2:T;
        for i=1:N;
            Y_star(t,i,b)=[Y_star(t-1,i,b) X_1_star(t-1,i,b) ...
                X_2_star(t-1,i,b) 1]*beta(:,i)+w(t-1)*e(t-1,i);
            X_1_star(t,i,b)=Theta(1,i)+Phi(1,:,i)*[X_1_star(t-1,i,b) ; ...
                X_2_star(t-1,i,b)]+w(t-1)*v(t-1,1,i);
            X_2_star(t,i,b)=Theta(2,i)+Phi(2,:,i)*[X_1_star(t-1,i,b) ; ...
                X_2_star(t-1,i,b)]+w(t-1)*v(t-1,2,i);
        end;
    end;
    disp(b);
end;

В идеале я делаю то же самое, но не зависим от записи X_1 и X_2, так как я хотел бы иногда увеличить это значение до большее количество.

Я попытался изменить форму в соответствии с предложением сообщества, но не уверен, как это будет или могло бы работать в этом примере.

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Я думаю, что это просто проблема матричной алгебры.

С переменными X кажется, что вы моделируете небольшую модель VAR.

Вместо динамических c матриц, как в ответе выше, я думаю, что было бы разумнее моделировать данные x как большую матрицу вместо векторов.

Вот простой пример,

Во-первых, я покажу вам случай с двумя переменными, как в используемом вами методе, так и путем совместного моделирования данных ...

Затем я показываю с помощью случая с тремя переменными, как расширить это ...

Все, что вам нужно сделать, это взять размер бета-матрицы (или альфа), поскольку я предполагаю, что они определяются до матрицы ...

%Simulating a small VAR model 
%% 2 - variable case 
rng('default')
b = [0.4 0.5;0.6 0.07];  
a = [0.1 0.2];
v=randn(100,2);
x1 = zeros(100,1);
x2 = zeros(100,1);
xm=zeros(100,2);

T=100;
for t=2:T;
    x1(t)=a(1)+b(1,:)*[x1(t-1) ; x2(t-1)]+v(t-1,1); 
    x2(t)=a(2)+b(2,:)*[x1(t-1) ; x2(t-1)]+v(t-1,2);
end;

for t=2:T;
    xm(t,:)=a+xm(t-1,:)*b'+v(t-1,:)
end;

[xm x1 x2]

%% 3 - variable case 

rng('default')
b = [0.4 0.5 0.1;0.6 0.07 0.1; 0.3 0.4 0.7];  
a = [0.1 0.2 0.3];
v=randn(100,size(b,2));
xm=zeros(100,size(b,2));
for t=2:T;
    xm(t,:)=a+xm(t-1,:)*b'+v(t-1,:)
end;
0 голосов
/ 17 июня 2020

Я обычно нахожу структурные массивы более полезными для такого рода динамических c индексации (когда вы не знаете, сколько у вас будет X_1_star, X_2_star ...)

Я не попробуйте воспроизвести весь пример, но это может go что-то вроде этого, если вы пытаетесь добраться до X_4_star:

...
nX=4;
for i=1:N
    Y_star(t,i,b)=[Y_star(t-1,i,b) X_1_star(t-1,i,b) ...
                X_2_star(t-1,i,b) 1]*beta(:,i)+w(t-1)*e(t-1,i);
    for n=1:nX
        X(n).star(t,i,b)=...
    end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...