0

我已经用谷歌搜索了很多关于这个主题的论文,但似乎没有找到我想要的。我是 SAS Macro 的初学者,希望能在这里得到一些帮助。这是我想要的:

我有一个包含 1200 个变量的数据集。我想要一个宏将这 1199 个变量作为 OUTCOME 运行,并将逻辑回归的 P 值存储在数据集中。因变量“性别”也是性格,结果变量也是如此。但我不知道如何将类语句放在宏中。这是我如何将其作为单个过程运行的示例。

 proc logistic data=Baseline_gender ;
 class gender(ref="Male") / param=ref;
 model N284(event='1')=gender ; 
 ods output ParameterEstimates=ok;
 run;

我的想法是创建ODS输出并删除P值以外的不必要变量,并根据模型中的OUTCOME变量名称将它们合并到一个数据集中:例如

 Variable P-value
 A1       0.005
 A2       0.018
 ..       ....

我试图玩一些 proc 宏,但我无法让它工作!!!我真的需要这方面的帮助,非常感谢。

4

3 回答 3

0

这是一种无宏方法。它预先对数据进行重组,并使用 SAS 的by分组。数据以深度格式存储,其中所有结果变量值都存储在一个新变量中。

创建一些示例数据:

data have;
   input 
        outcome1 
        outcome2 
        outcome3 
        gender $;
   datalines;
1 1 1 Male
0 1 1 Male
1 0 1 Female
0 1 0 Male
1 1 0 Female
0 0 0 Female
;
run;

接下来使用数组将数据转换为深度格式:

data trans;
    set have;
    /* Create an array of all the outcome variables */
    array o{*} outcome:;
    /* Loop over the outcome variables */
    do i = 1 to dim(o);
        /* Store the variable name for grouping */
        _NAME_ = vname(o[i]);
        /* Store the outcome value in the  */
        outcome = o[i];
        output;
    end;
    keep _NAME_ outcome gender;
run;
proc sort data = trans;
    by _NAME_;
run;

重用您的后勤程序,但附加by声明:

proc logistic data = trans;
    /* Use the grouping variable to select multiple analyses  */
    by _NAME_;
    class gender(ref = "Male");
    /* Use the new variable for the dependant variable */
    model outcome = gender / noint; 
    ods output ParameterEstimates = ok;
run;
于 2015-02-20T17:56:10.947 回答
0

SRSwift 可能正在做某事(对他的方法知之甚少),但这里有一种使用宏的方法。

首先,计算数据集中变量的数量。通过从表中选择您的表来执行此dictionary.columns操作。这会将变量的数量放入&sqlobs. 现在将字典表中的变量名读入宏变量var1-var&sqlobs

%macro logitall;
proc sql;
create table count as
select name from dictionary.columns
where upcase(libname) = 'WORK'
  and upcase(memname) = 'BASELINE_GENDER'
  and upcase(name) ne 'GENDER'
;

select name into :var1 - :var&sqlobs
from dictionary.columns
where upcase(libname) = 'WORK'
  and upcase(memname) = 'BASELINE_GENDER'
  and upcase(name) ne 'GENDER'
;
quit;

然后为每个因变量运行proclogistic,每次输出一个以因变量命名的数据集。

%do I = 1 %to &sqlobs;
  proc logistic data=Baseline_gender ;
    class gender(ref="Male") / param=ref;
    model &&var&I.(event='1')=gender ; 
    ods output ParameterEstimates=&&var&I.;
  run;
%end;

indsname=现在将所有输出数据集放在一起,使用set 语句中的数据集名称创建一个新变量。

data allvars;
  format indsname dsname varname $25.; 
  set
  %do I = 1 %to &sqlobs;
    &&var&I.
  %end;
  indsname=dsname;
  varname=dsname;
  keep varname ProbChiSq;
  where variable ne 'Intercept';
run;
%mend logitall;

%logitall;
于 2015-02-20T00:13:21.907 回答
0

这是使用宏的另一种方法。首先在全局变量中定义要用作结果的所有变量,然后编写宏脚本。

%let var = var1 var2 var3 ..... var1199;

%macro log_regression;
  %do i=1 %to %eval(%sysfunc(countc(&var., " "))+1);
    %let outcome_var = %scan(&var, &i);
    %put &outcome_var.;

    proc logistic data = baseline_gender desc;
    class gender (ref = "Male") / param = ref;
    model &outcome_var. = gender;
    ods output ParameterEstimates = ParEst_&outcome_var.;
    run;

    %if %sysfunc(exist(univar_result)) %then %do;
      data univar_result;
      set univar_result ParEst_&outcome_var.;
      run;
    %end;
    %else %do;
      data univar_result;
      set ParEst_&outcome_var.;
      run;
    %end;

  %end;
%mend;
于 2016-01-13T18:29:53.760 回答