使用SAS Proc GLM生成缺失因变量预测失败问题咨询
解决SAS Proc GLM中因变量缺失观测的预测值生成问题
我明白你遇到的问题了——明明所有预测变量都没有缺失,但Proc GLM的output语句就是没生成因变量缺失观测的预测值。这其实是Proc GLM的默认行为导致的:
默认情况下,Proc GLM会自动剔除任何因变量(dv)存在缺失值的观测,不管你的预测变量是否完整。这些被剔除的观测不会参与模型拟合,自然也不会出现在output生成的testx数据集中。
下面给你两种可靠的解决方法,都能帮你得到所有观测(包括dv缺失的)的预测值:
方法1:使用Proc GLM + Proc Score
先拟合模型并保存模型信息,再用Proc Score对全量观测生成预测值:
/* 第一步:拟合模型并保存模型参数到数据集 */ proc glm data=test outmodel=glmmodel; class a; model dv = a b c / solution; run; quit; /* 第二步:对原始数据集的所有观测生成预测值 */ proc score data=test score=glmmodel out=testx predicted=pred; var b c; /* 这里填写所有连续型预测变量,分类变量a会由模型自动处理 */ run;
执行完这段代码后,testx就会包含test中的所有观测,包括dv缺失的那些,对应的pred列就是预测结果。
方法2:使用Proc GLM + Proc PLM(推荐,SAS 9.2及以上版本支持)
Proc PLM是SAS专门用于模型后续应用的过程,操作更直观:
/* 第一步:拟合模型并保存到itemstore */ proc glm data=test; class a; model dv = a b c / solution; store glmmodel; /* 将模型保存为itemstore格式 */ run; quit; /* 第二步:调用保存的模型,对全量观测生成预测值 */ proc plm restore=glmmodel; score data=test out=testx predicted=pred; run;
这个方法的优势是itemstore会保存更完整的模型信息,后续如果需要做其他分析(比如预测区间、残差分析)也更方便。
为什么原来的代码不行?
再强调一下:你的原始代码中,proc glm在拟合阶段就把dv缺失的观测过滤掉了,output语句只能输出那些参与了模型拟合的观测,所以自然看不到dv缺失行的预测值。而上面的两种方法都是先基于有效观测拟合模型,再把模型应用到所有观测上,完美解决了这个问题。
内容的提问来源于stack exchange,提问作者DJohnson




