[英]SAS Macro Proc Logistic put P-value in a dataset
我已經搜索了很多關於這個主題的論文,但似乎沒有找到我想要的東西。 我是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宏,但我不能讓它工作! 我真的需要幫助,非常感謝你。
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;
然后為每個因變量運行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;
這是一個無宏的方法。 它提前重組數據並by
分組使用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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.