I am interested in "Creating Synthetic Data with SAS/OR", it was posted at SAS support community: https://blogs.sas.com/content/operations/2017/05/17/creating-synthetic-data-sasor/ The method involved in a macro including 3 inner macros, when ran the macro to create synthetic data, a error message came up from the macro for IP step portion, here is the log: 229 *IP Step;
230 %macro IPSTEP(OUTPUTDATA, MOMENTORDER, NUMOBS, MINNUMIPCANDS, MILPMAXTIME,
231 RELOBJGAP);
232 num numSynthObs init &NUMOBS;
233 if (numSynthObs = 0) then numSynthObs = nObs;
234 num momRange {mi in MOM_IDX_SET} = momUb[mi] - momLb[mi];
235 var Assigned {IPCANDS[1]} binary;
236 var ScaledEta {MOM_IDX_SET} >= 0;
237 var MaxError >= 0;
238 minimize IpObj = MaxError;
239 con MaxCon {mi in MOM_IDX_SET}:
240 MaxError >= ScaledEta[mi];
241 con UpperIP {mi in MOM_IDX_SET}:
242 (1/numSynthObs) *
243 sum {ob in IPCANDS[1]} ipObMoms[1,ob,mi]*Assigned[ob] -
244 momRange[mi]*ScaledEta[mi] <= momUb[mi];
245 con LowerIP {mi in MOM_IDX_SET}:
246 (1/numSynthObs) *
247 sum {ob in IPCANDS[1]} ipObMoms[1,ob,mi]*Assigned[ob] +
248 momRange[mi]*ScaledEta[mi] >= momLb[mi];
249 con NumAssigned:
250 sum {ob in IPCANDS[1]} Assigned[ob] = numSynthObs;
251 /* Set an initial solution, then solve */
252 for {i in 1..numSynthObs} Assigned[i] = 1;
253 for {mi in MOM_IDX_SET} ScaledEta[mi] = if momRange[mi] <= 0 then 0
254 else max(((1/numSynthObs) *
255 sum {ob in IPCANDS[1]} ipObMoms[1,ob,mi]*Assigned[ob]
256 - momUb[mi]) / momRange[mi], momLb[mi] - (1/numSynthObs) *
257 sum {ob in IPCANDS[1]} ipObMoms[1,ob,mi]*Assigned[ob])/momRange[mi],0); /**/
258 MaxError = max {mi in MOM_IDX_SET: momRange[mi] > 0} ScaledEta[mi];
259 solve with MILP / maxtime=&MILPMAXTIME relobjgap=&RELOBJGAP
260 heuristics=3 primalin;
261 /* Save selected observations to data set */
262 set FINALOBS = 1..numSynthObs;
263 num finalObsVal {FINALOBS,VARS};
264 num obIdx init 0;
265 for {ob in IPCANDS[1]: Assigned[ob] > 0.5} do;
266 obIdx = obIdx + 1;
267 for {v in VARS}
268 finalObsVal[obIdx,v] = ipObVal[1,ob,varName2varIdx[v]];
269 end;
270 create data &OUTPUTDATA(drop=tmpvar) from [tmpvar]=FINALOBS
271 {j in VARS} <col(j)=finalObsVal[tmpvar,j]>;
272 %mend IPSTEP;
273 %GENDATA(INPUTDATA=OriginalData, METADATA=Metadata, NUMOBS=100,
274 MOMENTORDER=2, MILPMAXTIME=60, RANDSEED=100);
NOTE: Writing HTML Body file: sashtml.htm
NOTE: There were 9 observations read from the data set WORK.METADATA.
NOTE: There were 5039 observations read from the data set WORK.ORIGINALDATA.
Number of IP step candidate observations: 209
NOTE: Line generated by the invoked macro "IPSTEP".
6 ,mi]*Assigned[ob])/momRange[mi],0);
-
22
200
ERROR 22-322: Syntax error, expecting one of the following: ;, !, !!, &, *, **, +, -, .., /, <, <=,
<>, =, >, ><, >=, AND, BY, CROSS, DIFF, ELSE, IN, INTER, NOT, OR, SYMDIFF, TO, UNION,
WITHIN, ^, ^=, |, ||, ~, ~=.
ERROR 200-322: The symbol is not recognized and will be ignored.
NOTE: Problem generation will use 4 threads. I have posted this question to "Programming", here is the link for your reference: https://communities.sas.com/t5/SAS-Programming/Synthetic-data/m-p/717429#M221871 I would appreciate it very much if anyone can help fix the issue. Thank you!
... View more