BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
alicek
Fluorite | Level 6

Hello, 

I have a data set containing X12 specs for about 150 series. I am trying to build a macro do loop that will assign new values to macro variables for the X12 specs as the do loop goes through the series. I keep having issues with how the macro variables used in the X12 speca are resolving.

 

For the record I have tried:

= "&reg";

= (&reg);

=("&reg");

 

%macro doauto;
%do i=1 %to &numauto;

data am;
set qspecauto;
if ct = &i;
call symput ('reg',strip(reg_predefined));
call symput ('acctt', strip(acctt));
run;

data qnsause;
set qnsa;
if strip(acctt)= "&acctt"; /* This resolves fine*/
run;

proc x12 data = QNSAuse date = period interval = qtr outstat = X12Sum;
var NSA;
id;
regression predefined = &reg;/*<----- This has issues*/
automdl;
run;

%end;
%mend doauto;

%doauto;

 

 

 The error in the log is:

MPRINT(DOAUTO): proc x12 data = QNSAuse date = period interval = qtr outstat = X12Sum;
MPRINT(DOAUTO): var NSA;
MPRINT(DOAUTO): id;
SYMBOLGEN: Macro variable REG resolves to td easter
NOTE: Line generated by the invoked macro "DOAUTO".
2 var NSA; id; regression predefined = &reg; automdl; run;
-
79
ERROR 79-322: Expecting a (.

NOTE: Line generated by the invoked macro "DOAUTO".
2 var NSA; id; regression predefined = &reg; automdl; run;
-
76
ERROR 76-322: Syntax error, statement will be ignored.

MPRINT(DOAUTO): regression predefined = td easter;
MPRINT(DOAUTO): automdl;
MPRINT(DOAUTO): run;

1 ACCEPTED SOLUTION

Accepted Solutions
alicek
Fluorite | Level 6

I tried this after I posted and was just coming back to update my question.

 

I ran just the proc x12 with hardcoded &reg ( td easter ) I did get the same error. Ultimately I'm using someone elses old X12 specs to run seasonal adjustment this year. So, instead of using automdl I decided to just specify the arima model that was the final model used last year. The code works this way even in the macro.

 

I can't say why because I don't know enough about X12 but maybe there's an issue with supplying a regression spec if you select automdl or there's an issue with the order in which I specified. Whaterv the issue, I've found a solution that works for me.

 

Thanks for both of your quick replies!

 

Thanks,

Alice

 

View solution in original post

6 REPLIES 6
Reeza
Super User

What does your X12 code look like without macro code and the variables hard coded in? Does that work without errors?

LaurieF
Barite | Level 11

Along with what @Reeza has asked, what does reg contain? Does it potentially contain parentheses?

rogerjdeangelis
Barite | Level 11
Issues with macro vars resolving when used in proc X12 specs

seems to work ok for me

inspired by
https://goo.gl/BCUnos
https://communities.sas.com/t5/SAS-Procedures/Issues-with-macro-vars-resolving-when-used-in-proc-X12-specs/m-p/343462

HAVE
====

Up to 40 obs WORK.HAVE1 total obs=19

Obs    CT    REG_PREDEFINED

  1     1       Alfred
  2     2       Alice
  3     3       Barbara
  4     4       Carol
  5     5       Henry
  6     6       James


Up to 40 obs from have2 total obs=57

Obs    NSA    ACCTT      SALES

  1     14    Alfred      69.0   Model these
  2      2    Alfred      57.0
  3     39    Alfred      61.0

  4     13    Alice       56.5   Model these
  5     70    Alice       92.0
  6     81    Alice       12.0

  7     13    Barbara     65.3  Model these
  8     36    Barbara     49.0
  9     51    Barbara     30.0


WANT (Three datasets WORK.ALICE WORK.ALFRED WORK.BARBARA
========================================================
ALICE

Up to 40 obs from ALICE total obs=1

Obs    _MODEL_    _DEPVAR_    INTERCEPT      SALES

 1      Alice       NSA        65.1136     -0.19527

ALFRED

Up to 40 obs from ALFRED total obs=1

Obs    _MODEL_    _DEPVAR_    INTERCEPT     SALES

 1     Alfred       NSA        -7.26786    0.41071

BARBARA

Up to 40 obs from BARBARA total obs=1

Obs    _MODEL_    _DEPVAR_    INTERCEPT      SALES

 1     Barbara      NSA        84.7342     -1.06863

WORKING CODE
============

   do i=1 to 3;
     dosubl
        set have1;
        if ct=&ct;
        call symputx ("reg",reg_predefined);
        call symputx ("acctt", reg_predefined);
        set have2;
        if acctt= "&acctt";
        proc reg data=qnsause outest = &reg;
        &reg: model nsa=sales  ;
        run;quit;

FULL SOLUTION
=============
*                _                  _       _
 _ __ ___   __ _| | _____        __| | __ _| |_ __ _
| '_ ` _ \ / _` | |/ / _ \_____ / _` |/ _` | __/ _` |
| | | | | | (_| |   <  __/_____| (_| | (_| | || (_| |
|_| |_| |_|\__,_|_|\_\___|      \__,_|\__,_|\__\__,_|

;


proc datasets lib=work kill;
run;quit;

data have1;
  retain ct 0;
  length ct 8 reg_predefined $8;
  set sashelp.class(keep=name rename=name=reg_predefined);
  ct=_n_;
run;quit;

data have2;
  length nsa 8 acctt $8;
  set sashelp.class(keep=name age height
       rename=(age=nsa name=acctt height=sales));
  output;
  nsa=int(100*uniform(5731));sales=int(100*uniform(5732));output;
  nsa=int(100*uniform(5733));sales=int(100*uniform(5734));output;
run;quit;

*          _       _   _
 ___  ___ | |_   _| |_(_) ___  _ __
/ __|/ _ \| | | | | __| |/ _ \| '_ \
\__ \ (_) | | |_| | |_| | (_) | | | |
|___/\___/|_|\__,_|\__|_|\___/|_| |_|

;

%symdel reg acctt/nowarn;
data _null_;

   do i=1 to 3;

     call symputx('ct',put(i,3.));

     rc=dosubl('
       data qspecauto;
          set have1;
          if ct=&ct;
          call symputx ("reg",reg_predefined);
          call symputx ("acctt", reg_predefined);
       run;quit;

       data qnsause;
         set have2;
         if acctt= "&acctt";
       run;quit;
       proc reg data=qnsause outest = &reg(keep=_model_ _depvar_ intercept sales) ;
       &reg: model nsa=sales  ;
       run;quit;
     ');

   end;

run;quit;


1872  %symdel reg acctt/nowarn;
1873  data _null_;
1874     do i=1 to 3;
1875       call symputx('ct',put(i,3.));
1876       rc=dosubl('
1877         data qspecauto;
1878            set have1;
1879            if ct=&ct;
1880            call symputx ("reg",reg_predefined);
1881            call symputx ("acctt", reg_predefined);
1882         run;quit;
1883         data qnsause;
1884           set have2;
1885           if acctt= "&acctt";
1886         run;quit;
1887         proc reg data=qnsause outest = &reg(keep=_model_ _depvar_ intercept sales)
1888         &reg: model nsa=sales  ;
1889         run;quit;
1890       ');
1891     end;
1892  run;

SYMBOLGEN:  Macro variable CT resolves to 1
NOTE: There were 19 observations read from the data set WORK.HAVE1.
NOTE: The data set WORK.QSPECAUTO has 1 observations and 2 variables.
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      user cpu time       0.00 seconds
      system cpu time     0.00 seconds
      memory              1028.06k
      OS Memory           20468.00k
      Timestamp           03/22/2017 07:05:41 PM
      Step Count                        464  Switch Count  0


SYMBOLGEN:  Macro variable ACCTT resolves to Alfred
NOTE: There were 57 observations read from the data set WORK.HAVE2.
NOTE: The data set WORK.QNSAUSE has 3 observations and 3 variables.
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      user cpu time       0.00 seconds
      system cpu time     0.00 seconds
      memory              1028.06k
      OS Memory           20468.00k
      Timestamp           03/22/2017 07:05:41 PM
      Step Count                        464  Switch Count  0


SYMBOLGEN:  Macro variable REG resolves to Alfred
SYMBOLGEN:  Macro variable REG resolves to Alfred
NOTE: The data set WORK.ALFRED has 1 observations and 4 variables.
NOTE: PROCEDURE REG used (Total process time):
      real time           0.09 seconds
      user cpu time       0.00 seconds
      system cpu time     0.04 seconds
      memory              2039.46k
      OS Memory           20980.00k
      Timestamp           03/22/2017 07:05:41 PM
      Step Count                        464  Switch Count  1



alicek
Fluorite | Level 6

I tried this after I posted and was just coming back to update my question.

 

I ran just the proc x12 with hardcoded &reg ( td easter ) I did get the same error. Ultimately I'm using someone elses old X12 specs to run seasonal adjustment this year. So, instead of using automdl I decided to just specify the arima model that was the final model used last year. The code works this way even in the macro.

 

I can't say why because I don't know enough about X12 but maybe there's an issue with supplying a regression spec if you select automdl or there's an issue with the order in which I specified. Whaterv the issue, I've found a solution that works for me.

 

Thanks for both of your quick replies!

 

Thanks,

Alice

 

alicek
Fluorite | Level 6

Even more info on the solution. The value of &reg was "td easter." This is an acceptable spec for regression inder the aictest if you are using Census' Win X-13. I was interpreting that as being an acceptable spec for SAS proc X13 for predefined regression. However, the X13 manual from SAS clearly states https://support.sas.com/documentation/onlinedoc/ets/141/x13.pdf

 

"The predefined regression variables, EASTER, LABOR, SCEASTER, SINCOS, TDSTOCK, and THANK, require extra parameters."

 

"regression predefined=easter(7) easter(14);"

 

This was the real problem. I needed to be more specific about which easter to use.

Reeza
Super User

@alicek Thanks for coming back and posting the answer 🙂

SAS Innovate 2025: Save the Date

 SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!

Save the date!

What is Bayesian Analysis?

Learn the difference between classical and Bayesian statistical approaches and see a few PROC examples to perform Bayesian analysis in this video.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 6 replies
  • 1590 views
  • 1 like
  • 4 in conversation