如何通过SPSS宏在GENLIN中执行AIC逐步变量选择?
SPSS GENLIN模块实现基于AIC的逐步变量选择宏方案
需求背景
仅可使用SPSS,无法借助R或Python工具,需在GENLIN模块中通过宏实现基于AIC的逐步变量选择流程,针对二项逻辑回归(广义模型)完成变量缩减,自动筛选出AIC值最低的最优模型。现有全变量GENLIN语法如下:
GENLIN SITIOINYECGLUT2DELT1 (REFERENCE=LAST) WITH DOSIS ARI DHA TOTAL /MODEL DOSIS ARI DHA TOTAL INTERCEPT=YES DISTRIBUTION=BINOMIAL LINK=LOGIT /CRITERIA METHOD=FISHER(1) SCALE=1 COVB=MODEL MAXITERATIONS=100 MAXSTEPHALVING=5 PCONVERGE=1E-006(ABSOLUTE) SINGULAR=1E-012 ANALYSISTYPE=3(WALD) CILEVEL=95 CITYPE=WALD LIKELIHOOD=FULL /MISSING CLASSMISSING=EXCLUDE /PRINT CPS DESCRIPTIVES MODELINFO FIT SUMMARY SOLUTION .
手动逐一移除变量计算AIC效率极低,需实现自动化流程:先构建全变量模型,再逐一移除单个变量计算对应AIC,保留最优模型,重复此过程直至无法得到更低AIC的模型。
实现宏代码
以下SPSS宏可自动执行上述逐步变量选择流程:
DEFINE !StepwiseAIC(DV=!TOKENS(1), IVs=!CMDEND) * 初始化变量列表与最优AIC存储. !LET !CurrentIVs = !IVs !LET !BestAIC = 999999 !LET !BestModelIVs = !CurrentIVs * 循环迭代直至无更优模型. !DO !WHILE (!TRUE) * 运行当前变量集的GENLIN模型并提取AIC. GENLIN !DV (REFERENCE=LAST) WITH !CurrentIVs /MODEL !CurrentIVs INTERCEPT=YES DISTRIBUTION=BINOMIAL LINK=LOGIT /CRITERIA METHOD=FISHER(1) SCALE=1 COVB=MODEL MAXITERATIONS=100 MAXSTEPHALVING=5 PCONVERGE=1E-006(ABSOLUTE) SINGULAR=1E-012 ANALYSISTYPE=3(WALD) CILEVEL=95 CITYPE=WALD LIKELIHOOD=FULL /MISSING CLASSMISSING=EXCLUDE /PRINT FIT SUMMARY. * 从输出中提取AIC值到临时数据集. OMS SELECT TABLES /IF SUBTYPES='Model Fit' /DESTINATION FORMAT=SAV OUTFILE='TempAIC.sav' /TAG='ExtractAIC'. EXECUTE. OMSEND TAG='ExtractAIC'. * 读取当前模型的AIC值. GET FILE='TempAIC.sav'. SELECT IF INDEX(VARNAME, 'AIC')>0. COMPUTE CurrentAIC = VALUE. N OF CASES 1. SAVE OUTFILE='CurrentAIC.sav' /KEEP CurrentAIC. GET FILE='CurrentAIC.sav'. !LET !CurrentAIC = !QUOTE(!STRING(CurrentAIC, F8.2)) * 首次运行时更新最优AIC. !IF (!BestAIC = 999999) !THEN !LET !BestAIC = !CurrentAIC !LET !BestModelIVs = !CurrentIVs !ENDIF * 生成所有移除单个变量后的变量集. !LET !IVList = !CurrentIVs !LET !TempIVs = !NULL !LET !MinAIC = !CurrentAIC !LET !MinIVs = !CurrentIVs !DO !IV !IN !IVList !LET !TempIVs = !REMOVE(!IVList, !IV) * 运行移除单个变量后的模型. GENLIN !DV (REFERENCE=LAST) WITH !TempIVs /MODEL !TempIVs INTERCEPT=YES DISTRIBUTION=BINOMIAL LINK=LOGIT /CRITERIA METHOD=FISHER(1) SCALE=1 COVB=MODEL MAXITERATIONS=100 MAXSTEPHALVING=5 PCONVERGE=1E-006(ABSOLUTE) SINGULAR=1E-012 ANALYSISTYPE=3(WALD) CILEVEL=95 CITYPE=WALD LIKELIHOOD=FULL /MISSING CLASSMISSING=EXCLUDE /PRINT FIT SUMMARY. * 提取该模型的AIC. OMS SELECT TABLES /IF SUBTYPES='Model Fit' /DESTINATION FORMAT=SAV OUTFILE='TempAIC.sav' /TAG='ExtractTempAIC'. EXECUTE. OMSEND TAG='ExtractTempAIC'. GET FILE='TempAIC.sav'. SELECT IF INDEX(VARNAME, 'AIC')>0. COMPUTE TempAIC = VALUE. N OF CASES 1. SAVE OUTFILE='TempAICValue.sav' /KEEP TempAIC. GET FILE='TempAICValue.sav'. !LET !TempAICVal = !QUOTE(!STRING(TempAIC, F8.2)) * 比较AIC,记录最小值对应的变量集. !IF (!TempAICVal < !MinAIC) !THEN !LET !MinAIC = !TempAICVal !LET !MinIVs = !TempIVs !ENDIF !DOEND * 判断是否找到更优模型. !IF (!MinAIC < !BestAIC) !THEN !LET !BestAIC = !MinAIC !LET !BestModelIVs = !MinIVs !LET !CurrentIVs = !MinIVs !ELSE * 无更优模型,终止循环. !BREAK !ENDIF !DOEND * 输出最优模型结果. PRINT / '最优模型变量集: ' !BestModelIVs. PRINT / '最优模型AIC值: ' !BestAIC. EXECUTE. * 运行最优模型并输出完整结果. GENLIN !DV (REFERENCE=LAST) WITH !BestModelIVs /MODEL !BestModelIVs INTERCEPT=YES DISTRIBUTION=BINOMIAL LINK=LOGIT /CRITERIA METHOD=FISHER(1) SCALE=1 COVB=MODEL MAXITERATIONS=100 MAXSTEPHALVING=5 PCONVERGE=1E-006(ABSOLUTE) SINGULAR=1E-012 ANALYSISTYPE=3(WALD) CILEVEL=95 CITYPE=WALD LIKELIHOOD=FULL /MISSING CLASSMISSING=EXCLUDE /PRINT CPS DESCRIPTIVES MODELINFO FIT SUMMARY SOLUTION . * 清理临时文件. DELETE FILE='TempAIC.sav'. DELETE FILE='CurrentAIC.sav'. DELETE FILE='TempAICValue.sav'. !ENDDEFINE.
使用方法
- 将上述宏代码粘贴到SPSS语法编辑器中;
- 调用宏时替换因变量和自变量列表,示例调用:
!StepwiseAIC(DV=SITIOINYECGLUT2DELT1, IVs=DOSIS ARI DHA TOTAL)
- 运行语法,宏会自动执行逐步变量选择流程,最终输出最优模型的完整结果。
注意事项
- 宏依赖OMS功能提取AIC值,确保SPSS的OMS功能正常启用;
- 若变量较多,宏运行时间会相应增加,耐心等待即可;
- 宏默认针对二项逻辑回归(
DISTRIBUTION=BINOMIAL LINK=LOGIT),如需适配其他广义模型,修改GENLIN语句中的分布和链接函数即可。
内容的提问来源于stack exchange,提问作者Jorge A
相关产品推荐
相关产品推荐

