Macros SAS宏过程逻辑将P值放入数据集中
我在谷歌上搜索了很多关于这个主题的论文,但似乎没有找到我想要的。我是SAS宏的初学者,希望在这里得到一些帮助。 以下是我想要的: 我有一个包含1200个变量的数据集。我需要一个宏来运行1199个变量作为结果,并将逻辑回归的P值存储在数据集中。此外,因变量“性别”是性格,结果变量也是性格。但我不知道如何将class语句放入宏中。下面是我如何将其作为单个过程运行的示例Macros SAS宏过程逻辑将P值放入数据集中,macros,sas,p-value,Macros,Sas,P Value,我在谷歌上搜索了很多关于这个主题的论文,但似乎没有找到我想要的。我是SAS宏的初学者,希望在这里得到一些帮助。 以下是我想要的: 我有一个包含1200个变量的数据集。我需要一个宏来运行1199个变量作为结果,并将逻辑回归的P值存储在数据集中。此外,因变量“性别”是性格,结果变量也是性格。但我不知道如何将class语句放入宏中。下面是我如何将其作为单个过程运行的示例 proc logistic data=Baseline_gender ; class gender(ref="Male") /
proc logistic data=Baseline_gender ;
class gender(ref="Male") / param=ref;
model N284(event='1')=gender ;
ods output ParameterEstimates=ok;
run;
我的想法是创建ODS输出,删除p值以外的不必要变量,并根据模型中的结果变量名称将它们合并到一个数据集中:例如
Variable P-value
A1 0.005
A2 0.018
.. ....
我试着玩一些程序宏,但我就是不能让它工作!!!
我真的需要这方面的帮助,非常感谢。斯威夫特可能有什么想法(对他的方法了解不够,无法说出),但这里有一种使用宏的方法 首先,计算数据集中变量的数量。通过从
字典.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;
然后对每个因变量运行proc logistic,每次输出以因变量命名的数据集
%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;
现在,将所有输出数据集放在一起,在set语句中使用indsname=
创建一个具有数据集名称的新变量
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;
这里是一个无宏的方法。它预先重新构造数据,并通过分组使用SAS的
。数据以深度格式存储,其中所有结果变量值都存储在一个新变量中
创建一些示例数据:
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;
下面是使用宏的另一种方法。首先在全局变量中定义要用作结果的所有变量,然后编写宏脚本
%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;
你可能想看看这个例子。通过使用model语句上的选项selection=forward maxstep=1 details
,您可以获得一个ODS输出表(EffectNotInModel
),比较每个变量的卡方检验。然后,您可以使用在一个模型语句中传递所有变量。我知道变量列表,但我不知道如何将其应用于引用组的结果。我不知道语法等等。我读过一些文章和宏,但它们没有“类”和参考规范。它们都是关于结果相同但预测因子很多的模型。但在我的例子中,我想用一个预测器来预测你的问题。对不起,我误解了你的问题。我在下面介绍了另一种无宏的方法。你是一个美丽的男人/女人…:你救了我一天!非常感谢你的晶圆厂代码。这就像冠军一样。谢谢你花时间回答我的问题。它确实有效,但我不知道如何将它们放在单个数据集中。但看起来DWal解决了我的问题。输出数据集ok
应该为每个结果变量指定一行。它只是在一个proc logistic
中完成所有处理,而不是多个。