使用SAS Proc Model按分组导出参数估计值失败的问题求助
解决PROC MODEL中BY GROUP后参数无法全部导出的问题
问题原因
PROC MODEL的outparms=选项默认会覆盖输出数据集,因此当使用BY GROUP时,每个组的参数会依次覆盖前一组的结果,最终只保留最后一组的参数。
解决方案:使用ODS Output捕获所有组参数
最可靠的方法是利用SAS的ODS输出功能,直接捕获每个BY组的参数估计结果,自动追加到同一个数据集中,且会保留group变量用于区分不同组。
修改后的完整代码:
data work.have; input group y1 x1 x2; datalines; 1 10 0.5 25 1 12 0.7 30 1 9 0.6 28 2 8 0.4 35 2 11 0.5 40 2 10 0.45 37 ; run; proc sort data=work.have; by group; run; /* 开启ODS输出,将参数估计结果导出到指定数据集 */ ods output ParameterEstimates=work.all_parms; proc model data=work.have noprint; by group; parms c1=1 c2=1 c3=1; y1 = exp(c1 + c2*x1 + c3/x2); fit y1; run; quit; ods output close; /* 关闭ODS输出,避免后续操作干扰 */ /* 查看最终合并后的参数数据集 */ proc print data=work.all_parms; run;
结果说明
生成的work.all_parms数据集会包含所有组的参数估计值,同时自动携带group变量,以及参数的标准误、t值、p值等统计信息,无需额外处理即可区分不同组的参数。
备选方案:使用APPEND手动合并参数数据集
如果无法使用ODS输出,也可以通过临时数据集+PROC APPEND的方式手动合并,但步骤相对繁琐:
/* 先创建空的参数数据集模板 */ data work.all_parms; length Parameter $32 Estimate StdErr tValue Probt 8; stop; run; proc model data=work.have noprint outparms=work.temp_parm; by group; parms c1=1 c2=1 c3=1; y1 = exp(c1 + c2*x1 + c3/x2); fit y1; /* 每个BY组结束后,将临时参数追加到最终数据集 */ append base=work.all_parms data=work.temp_parm; run; quit; /* 关联原数据集补充group变量 */ proc sql; create table work.all_parms_final as select distinct h.group, p.* from work.have h cross join work.all_parms p order by h.group, p.Parameter; quit;
内容的提问来源于stack exchange,提问作者Onur Alkan
相关产品推荐
相关产品推荐

