设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1617|回复: 1

SAS对数据缺失值的插补方法

  [复制链接]

22

主题

168

金钱

270

积分

入门用户

发表于 2019-9-19 14:49:05 | 显示全部楼层 |阅读模式


  1. /**读入数据,生成SAS数据集work.Air**/
  2. data Air;
  3.   infile 'E:\data\ch3_air.csv' delimiter=',' firstobs=2;
  4.   informat Ozone best32.;
  5.   informat SolarR best32.;
  6.   informat Temp best32.;
  7.   informat Wind best32.;
  8.   format Ozone best32.;
  9.   format SolarR best32.;
  10.   format Temp best32.;
  11.   format Wind best32.;
  12.   input Ozone SolarR Temp Wind;
  13. run;
  14. proc print data=Air(obs=10);
  15. run;

  16. /**画每个变量的直方图,并查看其总观测数、最小值、下四分位数、
  17.    中位数、上四分位数、最大值、缺失观测数**/
  18. proc univariate data=Air ;
  19.    histogram Ozone / cbarline=grey cfill=ligr;
  20.      inset n nmiss mean std min Q1 median Q3 max /
  21.        header='Descriptive Statistics' pos=ne noframe;
  22.    histogram SolarR / cbarline=grey cfill=ligr;
  23.      inset n nmiss mean std min Q1 median Q3 max /
  24.        header='Descriptive Statistics' pos=ne noframe;
  25.    histogram Wind / cbarline=grey cfill=ligr;
  26.      inset n nmiss mean std min Q1 median Q3 max /
  27.        header='Descriptive Statistics' pos=ne noframe;
  28.    histogram Temp / cbarline=grey cfill=ligr;
  29.      inset n nmiss mean std min Q1 median Q3 max /
  30.        header='Descriptive Statistics' pos=ne noframe;
  31. run;
  32. /*观察到Ozone和SolarR分别有37和7个缺失值*/

  33. /**寻找每个变量的最合适的Box-Cox变换,将其变换为正态分布。
  34.    以便后面的插补程序使用。**/
  35. data Air2;
  36.    set Air;
  37.    const=1;
  38.    /*在数据集Air中加一个值总是等于1的变量const,存为数据集Air2*/
  39. run;
  40. proc transreg data=Air2;
  41.    /*transreg过程可用来选择线性回归中因变量的最佳Box-Cox变换*/
  42.    model BoxCox(Ozone / lambda=-3 to 3 by .1) = identity(const);
  43.    /*以Box-Cox变换后的Ozone为因变量,const为自变量做线性回归,
  44.      选取因变量的最佳变换,使似然函数最大化。
  45.      因为const是常数,在线性回归时会自动去掉,线性回归相当于
  46.        对Box-Cox变换后的Ozone拟合正态分布。
  47.      Box-Cox变换的参数从-3到3、步长为0.1的一系列数中选择*/
  48. run;

  49. proc transreg data=Air2;
  50.    model BoxCox(SolarR / lambda=-3 to 3 by .1) = identity(const);
  51. run;
  52. /*对SolarR变量进行Box-Cox变换的最佳参数值为1*/

  53. proc transreg data=Air2;
  54.    model BoxCox(Wind / lambda=-3 to 3 by .1) = identity(const);
  55. run;
  56. /*对Wind变量进行Box-Cox变换的最佳参数值为2.2*/

  57. proc transreg data=Air2;
  58.    model BoxCox(Temp / lambda=-3 to 3 by .1) = identity(const);
  59. run;
  60. /*对Temp变量进行Box-Cox变换的最佳参数值为0.7*/

  61. /**将Ozone的最小值存入宏变量minOzone,最大值存入宏变量maxOzone;
  62.    将SolarR的最小值存入宏变量minSolarR,最大值存入宏变量maxSolarR**/
  63. proc sql noprint;
  64.   select min(Ozone), max(Ozone), min(SolarR), max(SolarR)
  65.     into :minOzone, :maxOzone, :minSolarR, :maxSolarR
  66.   from Air;
  67. quit;

  68. /**对work.Air数据集进行多重插补**/
  69. proc mi
  70.   data=Air out=mi_Air nimpute=5 round=1
  71.   minimum=&minOzone. &minSolarR. maximum=&maxOzone. &maxSolarR.;
  72.   /*被插补的数据集为Air,插补结果存入数据集work.mi_Air,nimpute=5指定进行5次插补。
  73.     因为存在缺失值的变量Ozone和SolarR的取值均为整数,所以round=1指定插补结果取整数。
  74.     minimum语句说明限定Ozone插补结果的最小值为宏变量minOzone的值,
  75.     SolarR插补结果的最小值为宏变量minSolarR的值。
  76.     maximum语句说明限定Ozone插补结果的最大值为宏变量maxOzone的值,
  77.     SolarR插补结果的最大值为宏变量maxSolarR的值。*/
  78.   Transform boxcox(Ozone/lambda=0.2)
  79.             boxcox(Wind/lambda=2.2)
  80.             boxcox(Temp/lambda=0.7);
  81.   /*根据前面选取最合适的Box-Cox变换的结果,
  82.     在插补时对Ozone变量进行参数为0.2的Box-Cox变换,
  83.     对Wind变量进行参数为2.2的Box-Cox变换,
  84.     对Temp变量进行参数为0.7的Box-Cox变换*/
  85.   var Ozone SolarR Wind Temp;
  86.   /*指明在插补模型中使用所有四个变量*/
  87. run;
  88. /*插补后的数据集work.mi_Air中将包含一个变量_Imputation_,说明是第几次插补的结果。
  89.   对每次插补,该数据集还将给出插补后所有观测的所有变量的值。*/

  90. /**对插补后的数据集work.mi_Air进行综合分析,
  91.    估计Ozone和SolarR这两个变量的总体均值,并得到估计的标准误差**/
  92. proc univariate data=mi_Air;
  93.   var Ozone;
  94.   by _Imputation_;
  95.   /*针对每次插补数据集分别分析Ozone变量*/
  96.   output out=mi_Ozone_results mean=Ozone_mean stderr=Ozone_stderr;
  97.   /*获得每次插补数据集Ozone变量的样本均值及均值的标准误差,
  98.     存入数据集mi_Ozone_results*/
  99. run;
  100. proc mianalyze data=mi_Ozone_results;
  101.   /*综合mi_Ozone_results各次插补数据集的分析结果*/
  102.   modeleffects Ozone_mean;
  103.   /*说明每次插补数据集的参数估计由Ozone_mean变量给出*/
  104.   stderr Ozone_stderr;
  105.   /*说明每次插补数据集的参数估计的标准误差由Ozone_stderr变量给出*/
  106. run;

  107. proc univariate data=mi_Air;
  108.   var SolarR;
  109.   by _Imputation_;
  110.   output out=mi_SolarR_results mean=SolarR_mean stderr=SolarR_stderr;
  111. run;
  112. proc mianalyze data=mi_SolarR_results;
  113.   modeleffects SolarR_mean;
  114.   stderr SolarR_stderr;
  115. run;
复制代码


1.png

224

主题

2万

金钱

3万

积分

专家用户

发表于 2019-9-20 06:35:26 | 显示全部楼层
谢谢你的数据,谢谢你的分享!
大道无痕……
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表