带有 BY 语句的 PROC ARIMA 中的 SAS ODS 三明治生成奇怪的结果
SAS ODS Sandwich in PROC ARIMA with BY statement generate strange results
我正在尝试将一堆平稳性测试导出到 HTML 和 Excel。使用 PROC ARIMA
时,当我尝试将每个部分包装在 "ODS Sandwich" 中时,我遇到了奇怪的行为。看来这是因为在 PROC ARIMA
中使用了 BY var
命令。当不使用 BY
时,我得到 expected/desired ODS
输出。
当我 CLOSE
一个 ODS
"sandwich" 之前的 ARIMA
输出从我尝试将其发送到的文件中删除时。它保存在我打开的后续 ODS
目的地中。结果是最终 ODS
ARIMA
输出丢失,每个文件的命名和位置都不正确。
数据集abc
在底部产生。这是对我来说失败的可重现命令。
/* =========================================== */
/* PROC ARIMA for Stationarity
LEVELS */
/* =========================================== */
ODS _ALL_ CLOSE;
%let pt = 1;
%let ARpt1 = LEVELS;
ODS graphics on / reset= INDEX imagename="&ARpt1.";
filename X_ADF&pt. "&outDir.&ARIMAdir.ARIMA_ADF_&ARpt1..xlsx" ;
filename H_ADF&pt. "&outDir.&ARIMAdir.ARIMA_ADF_&ARpt1..html" ;
filename g_ADF&pt. "&outDir.&ARIMAdir." ;
ods html (id=&pt.) file= H_ADF&pt. gpath = g_ADF&pt.;
ods EXCEL (id=&pt.) file = X_ADF&pt.
options(SHEET_INTERVAL="NONE" /* All tables in one sheet*/
SHEET_NAME ="LEVELS"
EMBEDDED_TITLES="YES");
PROC ARIMA data= abc;
by grp;
TITLE "ARIMA IDENTIFY - U in levels";
identify var= testvar
stationarity = (adf=(3));
ods html (id=&pt.) select StationarityTests SeriesCorrPanel;
ods EXCEL (id=&pt.) select StationarityTests ;
RUN;
/************************************
If I include the CLOSE here
then the ODS files declared above are empty
*********************************/
ODS _ALL_ CLOSE;
/* =========================================== */
/* PROC ARIMA for Stationarity
Differences */
/* =========================================== */
%let pt = 2;
%let ARpt2 = YonY_diff;
ODS graphics on / reset= INDEX imagename="&ARpt2.";
filename X_ADF&pt. "&outDir.&ARIMAdir.ARIMA_ADF_&ARpt2..xlsx" ;
filename H_ADF&pt. "&outDir.&ARIMAdir.ARIMA_ADF_&ARpt2..html" ;
filename g_ADF&pt. "&outDir.&ARIMAdir." ;
ods html (id=&pt.) file = H_ADF&pt. gpath = g_ADF&pt.;
ods EXCEL (id=&pt.) file = X_ADF&pt.
options(SHEET_INTERVAL="NONE" /* All tables in one sheet*/
SHEET_NAME ="Lvl Diff"
EMBEDDED_TITLES="YES");/* Title Put in EXCEL doc */
PROC ARIMA data= abc;
by grp;
TITLE "ARIMA IDENTIFY - First Differences by City";
identify var= testvar(1) stationarity = (adf=(3));
ods html (id=&pt.) select StationarityTests SeriesCorrPanel;
ods EXCEL (id=&pt.) select StationarityTests ;
RUN;
/************************************
If I include the CLOSE here
then the ODS files (html and excel) declared here
are filled with the data from the FIRST proc arima
*********************************/
ODS _ALL_ CLOSE;
谁能告诉我是我的代码有问题,还是 ARIMA
有问题?
**** 此处创建的数据集 abc ****
data a;
u1 = 0.9; a1 = 0;
do i = -50 to 100;
a = rannor( 32565 );
u = u1 + a - .8 * a1;
if i > 0 then output;
a1 = a;
u1 = u;
grp = "a";
end;
run;
data b;
u1 = -0.5; a1 = 0;
do i = -50 to 100;
a = rannor( 876196 );
u = u1 + a - .8 * a1;
if i > 0 then output;
a1 = a;
u1 = u;
grp = "b";
end;
run;
data c;
u1 = 5; a1 = 0.1;
do i = -50 to 100;
a = rannor( 876196 );
u = u1 + a - .8 * a1;
if i > 0 then output;
a1 = a;
u1 = u;
grp = "c";
end;
run;
data abc;
merge a b c;
by grp;
run;
确实是分组处理时QUIT;
的位置问题。这是因为当您使用按组处理时 RUN;
不会执行任何操作(因为 SAS 更愿意在执行任何操作之前了解您想要为每个按组执行的所有操作)。所以你的 ODS HTML CLOSE;
等不会在你认为它们执行时执行。
这是一个说明此问题的标记示例。尝试 运行 不带 QUIT 注释;然后用它,看看区别。
title1 'Simulated IMA(1,1) Series';
data a;
dummy=1;
u1 = 0.9; a1 = 0;
do i = -50 to 100;
a = rannor( 32565 );
u= u1 + a - .8 * a1;
if i > 0 then output;
a1 = a;
u1 = u;
end;
run;
ods html3 file="c:\temp\test.html";
ods excel file="c:\temp\test.xlsx";
proc arima data=a;
by dummy;
identify var=u;
ods html3 select DescStats;
ods excel select SeriesCorrPanel;
run;
*quit;
ods html3 close;
ods excel close;
*Here I put them out to a different file to make more obvious what is happening;
ods html3 file="c:\temp\test1.html";
ods excel file="c:\temp\test1.xlsx";
proc arima data=a;
by dummy;
ods html3 select DescStats;
ods excel select SeriesCorrPanel;
identify var=u(1);
run;
*quit;
ods html3 close;
ods excel close;
quit;
我正在尝试将一堆平稳性测试导出到 HTML 和 Excel。使用 PROC ARIMA
时,当我尝试将每个部分包装在 "ODS Sandwich" 中时,我遇到了奇怪的行为。看来这是因为在 PROC ARIMA
中使用了 BY var
命令。当不使用 BY
时,我得到 expected/desired ODS
输出。
当我 CLOSE
一个 ODS
"sandwich" 之前的 ARIMA
输出从我尝试将其发送到的文件中删除时。它保存在我打开的后续 ODS
目的地中。结果是最终 ODS
ARIMA
输出丢失,每个文件的命名和位置都不正确。
数据集abc
在底部产生。这是对我来说失败的可重现命令。
/* =========================================== */
/* PROC ARIMA for Stationarity
LEVELS */
/* =========================================== */
ODS _ALL_ CLOSE;
%let pt = 1;
%let ARpt1 = LEVELS;
ODS graphics on / reset= INDEX imagename="&ARpt1.";
filename X_ADF&pt. "&outDir.&ARIMAdir.ARIMA_ADF_&ARpt1..xlsx" ;
filename H_ADF&pt. "&outDir.&ARIMAdir.ARIMA_ADF_&ARpt1..html" ;
filename g_ADF&pt. "&outDir.&ARIMAdir." ;
ods html (id=&pt.) file= H_ADF&pt. gpath = g_ADF&pt.;
ods EXCEL (id=&pt.) file = X_ADF&pt.
options(SHEET_INTERVAL="NONE" /* All tables in one sheet*/
SHEET_NAME ="LEVELS"
EMBEDDED_TITLES="YES");
PROC ARIMA data= abc;
by grp;
TITLE "ARIMA IDENTIFY - U in levels";
identify var= testvar
stationarity = (adf=(3));
ods html (id=&pt.) select StationarityTests SeriesCorrPanel;
ods EXCEL (id=&pt.) select StationarityTests ;
RUN;
/************************************
If I include the CLOSE here
then the ODS files declared above are empty
*********************************/
ODS _ALL_ CLOSE;
/* =========================================== */
/* PROC ARIMA for Stationarity
Differences */
/* =========================================== */
%let pt = 2;
%let ARpt2 = YonY_diff;
ODS graphics on / reset= INDEX imagename="&ARpt2.";
filename X_ADF&pt. "&outDir.&ARIMAdir.ARIMA_ADF_&ARpt2..xlsx" ;
filename H_ADF&pt. "&outDir.&ARIMAdir.ARIMA_ADF_&ARpt2..html" ;
filename g_ADF&pt. "&outDir.&ARIMAdir." ;
ods html (id=&pt.) file = H_ADF&pt. gpath = g_ADF&pt.;
ods EXCEL (id=&pt.) file = X_ADF&pt.
options(SHEET_INTERVAL="NONE" /* All tables in one sheet*/
SHEET_NAME ="Lvl Diff"
EMBEDDED_TITLES="YES");/* Title Put in EXCEL doc */
PROC ARIMA data= abc;
by grp;
TITLE "ARIMA IDENTIFY - First Differences by City";
identify var= testvar(1) stationarity = (adf=(3));
ods html (id=&pt.) select StationarityTests SeriesCorrPanel;
ods EXCEL (id=&pt.) select StationarityTests ;
RUN;
/************************************
If I include the CLOSE here
then the ODS files (html and excel) declared here
are filled with the data from the FIRST proc arima
*********************************/
ODS _ALL_ CLOSE;
谁能告诉我是我的代码有问题,还是 ARIMA
有问题?
**** 此处创建的数据集 abc ****
data a;
u1 = 0.9; a1 = 0;
do i = -50 to 100;
a = rannor( 32565 );
u = u1 + a - .8 * a1;
if i > 0 then output;
a1 = a;
u1 = u;
grp = "a";
end;
run;
data b;
u1 = -0.5; a1 = 0;
do i = -50 to 100;
a = rannor( 876196 );
u = u1 + a - .8 * a1;
if i > 0 then output;
a1 = a;
u1 = u;
grp = "b";
end;
run;
data c;
u1 = 5; a1 = 0.1;
do i = -50 to 100;
a = rannor( 876196 );
u = u1 + a - .8 * a1;
if i > 0 then output;
a1 = a;
u1 = u;
grp = "c";
end;
run;
data abc;
merge a b c;
by grp;
run;
确实是分组处理时QUIT;
的位置问题。这是因为当您使用按组处理时 RUN;
不会执行任何操作(因为 SAS 更愿意在执行任何操作之前了解您想要为每个按组执行的所有操作)。所以你的 ODS HTML CLOSE;
等不会在你认为它们执行时执行。
这是一个说明此问题的标记示例。尝试 运行 不带 QUIT 注释;然后用它,看看区别。
title1 'Simulated IMA(1,1) Series';
data a;
dummy=1;
u1 = 0.9; a1 = 0;
do i = -50 to 100;
a = rannor( 32565 );
u= u1 + a - .8 * a1;
if i > 0 then output;
a1 = a;
u1 = u;
end;
run;
ods html3 file="c:\temp\test.html";
ods excel file="c:\temp\test.xlsx";
proc arima data=a;
by dummy;
identify var=u;
ods html3 select DescStats;
ods excel select SeriesCorrPanel;
run;
*quit;
ods html3 close;
ods excel close;
*Here I put them out to a different file to make more obvious what is happening;
ods html3 file="c:\temp\test1.html";
ods excel file="c:\temp\test1.xlsx";
proc arima data=a;
by dummy;
ods html3 select DescStats;
ods excel select SeriesCorrPanel;
identify var=u(1);
run;
*quit;
ods html3 close;
ods excel close;
quit;