SAS do loop 用于测试 PROC MIXED 和 saving/appending 输出中的协方差结构
SAS do loop for testing covariance structers in PROC MIXED and saving/appending outputs
我在SAS中做重复测量分析,比较协方差结构信息准则的差异。我不是只做每个单独的分析,而是在寻找一种循环遍历它们并将输出保存到 table.
的方法
这是数据样本;
Data dta;
input A Subject B Y;
datalines;
1 1 1 3
1 1 2 4
1 1 3 7
1 1 4 7
1 2 1 6
1 2 2 5
1 2 3 8
1 2 4 8
2 3 1 1
2 3 2 2
2 3 3 5
2 3 4 10
2 4 1 2
2 4 2 3
2 4 3 6
2 4 4 10
;
run;
ods output InfoCrit = Output;
proc mixed data=dta ic covtest ;
class A Subject B;
model Y = A B A*B/DDFM=BW S;
Repeated B / Subject=subject Type=CS;
run;
我想用 AR(1)、ARH(1)、CS、CSH、HF、TOEP 和 UNR 循环遍历重复测量部分中的 Type=。以下是 Type=CS.
的输出
Neg2LogLike Parms AIC AICC HQIC BIC CAIC
23.3 2 27.3 29.7 24.6 26.1 28.1
我还想为 do 循环的每次迭代添加一个新的类型列;
Type Neg2LogLike Parms AIC AICC HQIC BIC CAIC
CS 23.3 2 27.3 29.7 24.6 26.1 28.1
AR(1) 22.9 2 26.9 29.3 24.2 25.7 27.7
到目前为止,我已经能够使用 ods 输出来保存 table 并且我已经能够手动更改 Type= 并将该输出附加到新的 table 但我一直未能实现 do 循环以使其自动化。
您可以创建一个使用 space 分隔列表并循环遍历它的宏。
%macro outputTypes(types=);
%do i = 1 %to %sysfunc(countw(&types., %str( ) ));
%let this_type = %sysfunc(scan(&types., &i., %str( ) ));
ods output InfoCrit = _output_;
proc mixed data=dta ic covtest ;
class A Subject B;
model Y = A B A*B/DDFM=BW S;
Repeated B / Subject=subject Type=&this_type.;
run;
data output_&i.;
length type .;
set _output_;
type = "&this_type.";
run;
%end;
data all_types;
set output_:;
run;
/* Remove temp data */
proc datasets lib=work nolist;
delete output_:
_output_
;
quit;
%mend;
只需指定您想要的类型,它们将自动放入 proc mixed
:
%outputTypes(types=AR(1) ARH(1) CS CSH HF TOEP UNR);
输出:
type Neg2LogLike Parms AIC AICC HQIC BIC CAIC
AR(1) 22.9 2 26.9 29.3 24.2 25.7 27.7
ARH(1) 15.9 5 25.9 55.9 19.2 22.8 27.8
CS 23.3 2 27.3 29.7 24.6 26.1 28.1
CSH 15.3 5 25.3 55.3 18.6 22.2 27.2
HF 15.3 5 25.3 55.3 18.6 22.2 27.2
TOEP 22.8 4 30.8 44.2 25.4 28.4 32.4
UNR 22.8 4 30.8 44.2 25.4 28.4 32.4
使用 ods select none
来防止写入任何实际的 ODS 图,但仍然允许 ods output
语句起作用。使用 ods select all
重新启用图表。
我在SAS中做重复测量分析,比较协方差结构信息准则的差异。我不是只做每个单独的分析,而是在寻找一种循环遍历它们并将输出保存到 table.
的方法这是数据样本;
Data dta;
input A Subject B Y;
datalines;
1 1 1 3
1 1 2 4
1 1 3 7
1 1 4 7
1 2 1 6
1 2 2 5
1 2 3 8
1 2 4 8
2 3 1 1
2 3 2 2
2 3 3 5
2 3 4 10
2 4 1 2
2 4 2 3
2 4 3 6
2 4 4 10
;
run;
ods output InfoCrit = Output;
proc mixed data=dta ic covtest ;
class A Subject B;
model Y = A B A*B/DDFM=BW S;
Repeated B / Subject=subject Type=CS;
run;
我想用 AR(1)、ARH(1)、CS、CSH、HF、TOEP 和 UNR 循环遍历重复测量部分中的 Type=。以下是 Type=CS.
的输出Neg2LogLike Parms AIC AICC HQIC BIC CAIC
23.3 2 27.3 29.7 24.6 26.1 28.1
我还想为 do 循环的每次迭代添加一个新的类型列;
Type Neg2LogLike Parms AIC AICC HQIC BIC CAIC
CS 23.3 2 27.3 29.7 24.6 26.1 28.1
AR(1) 22.9 2 26.9 29.3 24.2 25.7 27.7
到目前为止,我已经能够使用 ods 输出来保存 table 并且我已经能够手动更改 Type= 并将该输出附加到新的 table 但我一直未能实现 do 循环以使其自动化。
您可以创建一个使用 space 分隔列表并循环遍历它的宏。
%macro outputTypes(types=);
%do i = 1 %to %sysfunc(countw(&types., %str( ) ));
%let this_type = %sysfunc(scan(&types., &i., %str( ) ));
ods output InfoCrit = _output_;
proc mixed data=dta ic covtest ;
class A Subject B;
model Y = A B A*B/DDFM=BW S;
Repeated B / Subject=subject Type=&this_type.;
run;
data output_&i.;
length type .;
set _output_;
type = "&this_type.";
run;
%end;
data all_types;
set output_:;
run;
/* Remove temp data */
proc datasets lib=work nolist;
delete output_:
_output_
;
quit;
%mend;
只需指定您想要的类型,它们将自动放入 proc mixed
:
%outputTypes(types=AR(1) ARH(1) CS CSH HF TOEP UNR);
输出:
type Neg2LogLike Parms AIC AICC HQIC BIC CAIC
AR(1) 22.9 2 26.9 29.3 24.2 25.7 27.7
ARH(1) 15.9 5 25.9 55.9 19.2 22.8 27.8
CS 23.3 2 27.3 29.7 24.6 26.1 28.1
CSH 15.3 5 25.3 55.3 18.6 22.2 27.2
HF 15.3 5 25.3 55.3 18.6 22.2 27.2
TOEP 22.8 4 30.8 44.2 25.4 28.4 32.4
UNR 22.8 4 30.8 44.2 25.4 28.4 32.4
使用 ods select none
来防止写入任何实际的 ODS 图,但仍然允许 ods output
语句起作用。使用 ods select all
重新启用图表。