42 views (last 30 days)

Hello, I am pretty new to matlab and so not totally efficient and professional at writing codes on it. I have a panel data of a group of countries and the following I am suppose to perform on each country. Is there a way on matlab like defining a variable with names of countries such that it will be able to implement the code on each country?. Also as you notice from the code I am providing can I define another loop for h =1:4 such that I get the output exactly the same way I get when I cut and paste the same code for each country.

I appreciate any feedback and output thank you

Example of my code :

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% cty 1

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

DM11_cty1=[];

DM21_cty1=[];

for T=1:8%the forcast sample

h=1;

[e1h, e2h,e3h] = forcasterror(h,T,GVARs,Actual,FRWM,FRWMD);

DM1h_cty1=dmtest(e1h,e2h,h);%this is the DM test for h=2 between GVAR and RW

DM2h_cty1=dmtest(e1h,e3h,h);%this is the DM test for h=2 between GVAR and RWD

DM11_cty1=[DM11_cty1 DM1h_cty1];

DM21_cty1=[DM21_cty1 DM2h_cty1];

end

DM12_cty1=[];

DM22_cty1=[];

for T=1:8%the forcast sample

h=2;

[e1h, e2h,e3h] = forcasterror(h,T,GVARs,Actual,FRWM,FRWMD);

DM1h_cty1=dmtest(e1h,e2h,h);%this is the DM test for h=2 between GVAR and RW

DM2h_cty1=dmtest(e1h,e3h,h);%this is the DM test for h=2 between GVAR and RWD

DM12_cty1=[DM12_cty1 DM1h_cty1];

DM22_cty1=[DM22_cty1 DM2h_cty1];

end

DM13_cty1=[];

DM23_cty1=[];

for T=1:8%the forcast sample

h=3;

[e1h, e2h,e3h] = forcasterror(h,T,GVARs,Actual,FRWM,FRWMD);

DM1h_cty1=dmtest(e1h,e2h,h);%this is the DM test for h=2 between GVAR and RW

DM2h_cty1=dmtest(e1h,e3h,h);%this is the DM test for h=2 between GVAR and RWD

DM13_cty1=[DM13_cty1 DM1h_cty1];

DM23_cty1=[DM23_cty1 DM2h_cty1];

end

DM14_cty1=[];

DM24_cty1=[];

for T=1:8%the forcast sample

h=4;

[e1h, e2h,e3h] = forcasterror(h,T,GVARs,Actual,FRWM,FRWMD);

DM1h_cty1=dmtest(e1h,e2h,h);%this is the DM test for h=2 between GVAR and RW

DM2h_cty1=dmtest(e1h,e3h,h);%this is the DM test for h=2 between GVAR and RWD

DM14_cty1=[DM14_cty1 DM1h_cty1];

DM24_cty1=[DM24_cty1 DM2h_cty1];

end

DM1_cty1=[DM11_cty1;DM12_cty1;DM13_cty1;DM14_cty1];

DM2_cty1=[DM21_cty1;DM22_cty1;DM23_cty1;DM24_cty1];

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%cty2

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

DM11_cty2=[];

DM21_cty2=[];

for T=1:8%the forcast sample

h=1;

[e1h, e2h,e3h] = forcasterror(h,T,GVARs,Actual,FRWM,FRWMD);

DM1h_cty2=dmtest(e1h,e2h,h);%this is the DM test for h=2 between GVAR and RW

DM2h_cty2=dmtest(e1h,e3h,h);%this is the DM test for h=2 between GVAR and RWD

DM11_cty2=[DM11_cty2 DM1h_cty2];

DM21_cty2=[DM21_cty2 DM2h_cty2];

end

DM12_cty2=[];

DM22_cty2=[];

for T=1:8%the forcast sample

h=2;

[e1h, e2h,e3h] = forcasterror(h,T,GVARs,Actual,FRWM,FRWMD);

DM1h_cty2=dmtest(e1h,e2h,h);%this is the DM test for h=2 between GVAR and RW

DM2h_cty2=dmtest(e1h,e3h,h);%this is the DM test for h=2 between GVAR and RWD

DM12_cty2=[DM12_cty2 DM1h_cty2];

DM22_cty2=[DM22_cty2 DM2h_cty2];

end

DM13_cty2=[];

DM23_cty2=[];

for T=1:8%the forcast sample

h=3;

[e1h, e2h,e3h] = forcasterror(h,T,GVARs,Actual,FRWM,FRWMD);

DM1h_cty2=dmtest(e1h,e2h,h);%this is the DM test for h=2 between GVAR and RW

DM2h_cty2=dmtest(e1h,e3h,h);%this is the DM test for h=2 between GVAR and RWD

DM13_cty2=[DM13_cty2 DM1h_cty2];

DM23_cty2=[DM23_cty2 DM2h_cty2];

end

DM14_cty2=[];

DM24_cty2=[];

for T=1:8%the forcast sample

h=4;

[e1h, e2h,e3h] = forcasterror(h,T,GVARs,Actual,FRWM,FRWMD);

DM1h_cty2=dmtest(e1h,e2h,h);%this is the DM test for h=2 between GVAR and RW

DM2h_cty2=dmtest(e1h,e3h,h);%this is the DM test for h=2 between GVAR and RWD

DM14_cty2=[DM14_cty2 DM1h_cty2];

DM24_cty2=[DM24_cty2 DM2h_cty2];

end

DM1_cty2=[DM11_cty2;DM12_cty2;DM13_cty2;DM14_cty2];

DM2_cty2=[DM21_cty2;DM22_cty2;DM23_cty2;DM24_cty2];

Les Beckham
on 20 Dec 2020

I suggest using cell arrays. See documentation here: https://www.mathworks.com/help/matlab/ref/cell.html

Replace "_cty1" with {1}, etc.

It looks like your code could also benefit from putting a lot of your data into numeric arrays. DM11 could be DM(1, 1), for example. This should allow you to fold your code up into a nested loop so you don't have to keep copying the code over and over and changing those numbers in the variable names which really should be array indices.

You can also define a cell array to hold the city names. For example cities = {'Amsterdam', 'Beirut', 'Copenhagen', 'Denver'};

Stephen Cobeldick
on 21 Dec 2020

Les Beckham
on 23 Dec 2020

This looks like a much more efficient and maintainable (if you need to add a city, for example), way to code this.

I'm glad I was able to help.

Keep learning! The only stupid question is the one you are too embarrassed to ask.

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!
## 2 Comments

## Direct link to this comment

https://fr.mathworks.com/matlabcentral/answers/698780-how-to-make-my-code-more-concise-and-efficient#comment_1219855

⋮## Direct link to this comment

https://fr.mathworks.com/matlabcentral/answers/698780-how-to-make-my-code-more-concise-and-efficient#comment_1219855

## Direct link to this comment

https://fr.mathworks.com/matlabcentral/answers/698780-how-to-make-my-code-more-concise-and-efficient#comment_1220980

⋮## Direct link to this comment

https://fr.mathworks.com/matlabcentral/answers/698780-how-to-make-my-code-more-concise-and-efficient#comment_1220980

Sign in to comment.