⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 setmod.sas

📁 缺失数据的利器
💻 SAS
📖 第 1 页 / 共 2 页
字号:

/* Setmod - IVEware sasmod setup parsing macro */

%macro setmod;

  %if (%bquote(&msg) eq ) %then %do;  /* open log output file */
    %let msg = %str(Can%'t) open log file;
    %if (%sysfunc(filename(logref, &path..log)) eq 0) %then %do;
      %let logfile = %sysfunc(fopen(&logref, o));
      %if (&logfile ne 0) %then %let msg = ;
    %end;
  %end;

  %if (%bquote(&msg) eq ) %then %do;  /* write log introduction */
    %let msg = %str(Can%'t) write log file;
    %let line = %str(                 Iveware Multiple Imputation Regression Program);
    %if (%sysfunc(fput(&logfile, &line)) eq 0) %then %do;
      %if (%sysfunc(fwrite(&logfile)) eq 0) %then %do;
        %let line = %str(             Survey Research Center, Institute for Social Research);
        %let rc = %sysfunc(fput(&logfile, &line));
        %let rc = %sysfunc(fwrite(&logfile));
        %let line = %str(                             University of Michigan);
        %let rc = %sysfunc(fput(&logfile, &line));
        %let rc = %sysfunc(fwrite(&logfile));
        %let line = %str(                        Version 2.0, Copyright (c) 2005);
        %let rc = %sysfunc(fput(&logfile, &line));
        %let rc = %sysfunc(fwrite(&logfile));
        %let rc = %sysfunc(fput(&logfile, ));
        %let rc = %sysfunc(fwrite(&logfile));
        %let line = %sysfunc(date(), weekdate17.), &systime;
        %let rc = %sysfunc(fput(&logfile, %bquote(&line)));
        %let rc = %sysfunc(fwrite(&logfile));
        %let rc = %sysfunc(fput(&logfile, %str(  Process setup)));
        %let rc = %sysfunc(fwrite(&logfile));
        %let msg = ;
      %end;
    %end;
  %end;

  %if (%bquote(&msg) eq ) %then %do;  /* write intermediate setup file */
    %let list = 1;
    %if (&print eq none) %then %let list = 0;
    %let print = ;
    %let lsmeans = 0;
    %let repeated = 0;
    data _null_;
      %if (&list) %then %do;  /* write setup listing introduction */
        file "&path..lst";
        date = date();
        time = time();
        put "IVEware Setup Checker, " date date. ", " time time.;
        put;
        put "Setup listing:";
      %end;
      do while(1);  /* loop through the setup lines */
        %getset;
        file "&path..con";  /* write output file */
        put line;
        if (upcase(scan(line, 1)) eq 'LSMEANS') then call symput('lsmeans', '1');
        if (upcase(scan(line, 1)) eq 'REPEATED') then call symput('repeated', '1');
      end;
    run;
  %end;

  %if (%bquote(&msg) eq ) %then %do;  /* open intermediate setup file */
    %let msg = %str(Can%'t) open intermediate setup file;
    %if (%sysfunc(filename(setref, &path..con)) eq 0) %then %do;
      %if (%sysfunc(fileref(&setref)) eq 0) %then %do;
        %let setfile = %sysfunc(fopen(&setref, i));
        %if (&setfile ne 0) %then %let msg = ;
      %end;
    %end;
  %end;

  %if (%bquote(&msg) eq ) %then %do;  /* open module output file */
    %let msg = %str(Can%'t) open module file;
    %if (%sysfunc(filename(modref, &path..mod)) eq 0) %then %do;
      %let modfile = %sysfunc(fopen(&modref, o));
      %if (&modfile ne 0) %then %let msg = ;
    %end;
  %end;

  %if (%bquote(&msg) eq ) %then %do;  /* process setup file */
    %let key = ;
    %let line = ;
    %let result = ;
    %let response = ;
    %do %while(%bquote(&msg) eq and %bquote(%upcase(&key)) ne RUN);  /* setup line loop */

      %let msg = %str(Can%'t) read setup file;  /* read setup line */
      %if (%sysfunc(fread(&setfile)) eq 0) %then %if (%sysfunc(fget(&setfile, line, 32767)) eq 0) %then %do;
        %let msg = ;

        %let key = %scan(%bquote(&line), 1, %str( =;));  /* get keyword */

        %if (%bquote(%upcase(&key)) eq DATAIN) %then %do;  /* datain file(s) */
          %if (&datain ne ) %then %let msg = Repeated datain statement;
          %else %if (&procid ne ) %then %let msg = Datain must precede procedure;
          %else %do;
            %let count = 100;
            %params;
            %let datain = &result;
            %let nmults = &count;
          %end;
        %end;

        %else %if (%bquote(%upcase(&key)) eq ESTOUT) %then %do;  /* estout file */
          %if (&estout ne ) %then %let msg = Repeated estout statement;
          %else %if (&procid ne ) %then %let msg = Estout must precede procedure;
          %else %do;
            %let count = 1;
            %params;
            %let estout = &result;
          %end;
        %end;

        %else %if (%bquote(%upcase(&key)) eq BY) %then %do;  /* by variable(s) */
          %if (&by ne ) %then %let msg = Repeated by statement;
          %else %if (&procid ne ) %then %let msg = By must precede procedure;
          %else %do;
            %let count = 100;
            %params;
            %let by = &result;
            %let nbys = &count;
          %end;
        %end;

        %else %if (%bquote(%upcase(&key)) eq STRATUM) %then %do;  /* stratum variable */
          %if (&stratum ne ) %then %let msg = Repeated stratum statement;
          %else %if (&procid ne ) %then %let msg = Stratum must precede procedure;
          %else %do;
            %let count = 1;
            %params;
            %let stratum = &result;
          %end;
        %end;

        %else %if (%bquote(%upcase(&key)) eq CLUSTER) %then %do;  /* cluster variable */
          %if (&cluster ne ) %then %let msg = Repeated cluster statement;
          %else %if (&procid ne ) %then %let msg = Cluster must precede procedure;
          %else %do;
            %let count = 1;
            %params;
            %let cluster = &result;
          %end;
        %end;

        %else %if (%bquote(%upcase(&key)) eq WEIGHT) %then %do;  /* weight variable */
          %if (&weight ne ) %then %let msg = Repeated weight statement;
          %else %if (&procid ne ) %then %let msg = Weight must precede procedure;
          %else %do;
            %let count = 1;
            %params;
            %let weight = &result;
          %end;
        %end;

        %else %if (%bquote(%upcase(&key)) eq TITLE) %then %do;  /* title */
          %if (%bquote(&title) ne ) %then %let msg = Repeated title statement;
          %else %if (&procid ne ) %then %let msg = Title must precede procedure;
          %else %do;
            %let title = %qsubstr(%bquote(&line), 7, %length(%bquote(&line)) - 7);
            %let title = %qleft(%bquote(&title));
            %let title = %qtrim(&title);
          %end;
        %end;

        %else %if (%bquote(%upcase(&key)) eq PRINT) %then %do;  /* print */
          %if (%bquote(&print) ne ) %then %let msg = Repeated print statement;
          %else %if (&procid ne ) %then %let msg = Print must precede procedure;
          %else %do;
            %let print = %qsubstr(&line, 7, %length(%bquote(&line)) - 7);
            %let print = %qleft(%bquote(&print));
            %let print = %qtrim(&print);
            %let print = %upcase(%qsubstr(&print, 1, 2));
            %if (&print eq NO) %then %let print = none;
            %else %if (&print eq ST) %then %let print = standard;
            %else %if (&print eq DE or &print eq AL) %then %let print = details;
            %else %let msg = Print parameter not recognized;
          %end;
        %end;

        %else %if (%bquote(%upcase(&key)) eq PROC) %then %do;  /* procedure statement */

          %if (&procid ne ) %then %let msg = Repeated procedure statement;
          %else %if (&datain eq ) %then %let msg = Datain must precede procedure;
          %else %do;  /* check subsequent parameters for "data=" */
            %let quit = false;
            %let begin = 1;
            %let end = %index(&line, %str(/));
            %if (&end eq 0) %then %let end = %length(%bquote(&line));
            %do %until (&quit eq true);
              %let subline = %qsubstr(&line, &begin, &end-&begin+1);
              %let equal = %index(&subline, %str(=));
              %if (&equal eq 0) %then %let quit = true;
              %else %do;
                %let range = %qsubstr(&line, &begin, &equal-&begin+1);
                %let begin = %eval(&equal + 1);
                %let count = 0;
                %do %until(&param eq );
                  %let count = %eval(&count + 1);
                  %let param = %scan(%bquote(&range), &count, %str( =));
                %end;
                %if (&count gt 1) %then %let param = %scan(%bquote(&range), &count-1, %str( =));
                %if (%upcase(&param) eq DATA) %then %do;
                  %let msg = Sasmod %str(doesn%'t) accept proc statement "data=" parameter;
                  %let quit = true;
                %end;
              %end;
            %end;
          %end;

          %if (&msg eq ) %then %do;

            %let procid = %scan(%bquote(&line), 2, %str( ;));  /* get procedure name */

            %if (%bquote(%upcase(&procid)) eq CALIS) %then %do;  /* proc calis */
              %let line = %qsubstr(&line, 1, %length(%bquote(&line)) - 1);
              %let line = %qtrim(&line);
              %let line = %bquote(&line) outest=est1 noprint%str(;);
            %end;

            %else %if (%bquote(%upcase(&procid)) eq CATMOD) %then %do;  /* proc catmod */
              %if (&sysver eq 6.12) %then
                %let msg = Sasmod %str(doesn%'t) support proc catmod in SAS V6.12;
              %else %do;
                %let ods = ods select none%str(;);
                %let rc = %sysfunc(fput(&modfile, %bquote(&ods)));
                %let rc = %sysfunc(fwrite(&modfile));
                %let ods = ods output Estimates = est1%str(;);
                %let rc = %sysfunc(fput(&modfile, %bquote(&ods)));
                %let rc = %sysfunc(fwrite(&modfile));
                %if (&cluster eq and &stratum eq and &weight eq ) %then %do;
                  %let ods = ods output CovB = covb1%str(;);
                  %let rc = %sysfunc(fput(&modfile, %bquote(&ods)));
                  %let rc = %sysfunc(fwrite(&modfile));
                %end;
                %let ods = ods output MaxLikelihood = like1%str(;);
                %let rc = %sysfunc(fput(&modfile, %bquote(&ods)));
                %let rc = %sysfunc(fwrite(&modfile));
              %end;
            %end;

            %else %if (%bquote(%upcase(&procid)) eq GENMOD) %then %do;  /* proc genmod */
              %if (&sysver eq 6.12) %then
                %let msg = Sasmod %str(doesn%'t) support proc genmod in SAS V6.12;
              %else %do;
                %let ods = ods select none%str(;);
                %let rc = %sysfunc(fput(&modfile, %bquote(&ods)));
                %let rc = %sysfunc(fwrite(&modfile));
                %if (&repeated) %then %let ods = ods output GEEEmpPEst = est1%str(;);
                %else %let ods = ods output ParameterEstimates = est1%str(;);
                %let rc = %sysfunc(fput(&modfile, %bquote(&ods)));
                %let rc = %sysfunc(fwrite(&modfile));
                %if (&lsmeans) %then %do;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -