如何在SAS中循环执行MMRM模型并获取LSMEAN结果
SAS宏循环实现分组MMRM结果合并
因为SAS中array是数据步内用于处理数据集变量的工具,而你需要的是跨数据集、跨PROC步骤的循环逻辑,宏循环才是正确的选择。以下是实现你需求的完整代码:
/* 1. 创建空的结果数据集(提前定义变量,避免追加时变量不一致)*/ data result; length group_var $20 group_level 8 treatment $20 visit $20 lsmean 8 ci $50; /* 变量定义需匹配%format_result宏的输出字段,可根据实际调整 */ stop; run; /* 2. 定义宏,封装MMRM运行、结果格式化与追加逻辑 */ %macro run_mmrm_by_group(group_vars); /* 拆分传入的分组变量列表 */ %let i=1; %let current_var=%scan(&group_vars.,&i.); %do %while(¤t_var. ne); /* 循环当前分组变量的两个水平:1和2 */ %do level=1 %to 2; /* 运行MMRM模型 */ proc mixed data = have; where ¤t_var. = &level.; class subjid treatment visit; model chg = baseline treatment visit treatment*visit/ ddfm = KR; repeated visit/ subject = subjid type = UN; lsmeans treatment*visit/ cl alpha = 0.05 diff e; /* 原代码中treat是缩写,建议写全避免识别错误 */ ods output lsmeans = lsmeans diffs=diffs; run; /* 调用格式化宏,生成当前分组水平的结果数据集 */ %format_result(lsmeans,diffs,¤t_var._&level.); /* 用带水平的命名避免数据集覆盖 */ /* 将结果追加到总数据集result */ proc append base=result data=¤t_var._&level. force; run; /* 删除临时数据集,释放空间 */ proc datasets lib=work nolist; delete lsmeans diffs ¤t_var._&level.; run; %end; %let i=%eval(&i.+1); %let current_var=%scan(&group_vars.,&i.); %end; %mend run_mmrm_by_group; /* 3. 调用宏,传入需要循环的分组变量 */ %run_mmrm_by_group(age_gr gender_gr bmi_gr);
关键说明:
- 宏循环的适配性:SAS宏可以跨PROC/数据步执行循环,完美适配你多次调用
PROC MIXED并合并结果的需求,这是array无法实现的。 - 临时数据集命名:用
¤t_var._&level.(如age_gr_1、gender_gr_2)作为临时结果集名称,避免不同循环迭代间的数据集覆盖问题。 - PROC APPEND效率:相比数据步
SET语句,PROC APPEND是更高效的追加方式,force参数可自动处理变量类型/长度不一致的情况(建议提前统一变量定义减少隐患)。 - 分组标识补充:建议在
%format_result宏中添加group_var="¤t_var."、group_level=&level.这类变量,让最终的result数据集能清晰区分不同分组的结果。
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

