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: Call for Content

Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!

Submit your idea!

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.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

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