- 阅读权限
- 255
- 威望
- 3 级
- 论坛币
- 10965 个
- 通用积分
- 5.0866
- 学术水平
- 452 点
- 热心指数
- 463 点
- 信用等级
- 347 点
- 经验
- 76409 点
- 帖子
- 1937
- 精华
- 1
- 在线时间
- 3428 小时
- 注册时间
- 2009-5-22
- 最后登录
- 2020-1-26
|
- %macro impute(VarList);
- data _null_;
- call symputx('nobs', nobs);
- if 0 then set have nobs =nobs;
- stop;
- run;
- %do i =1 %to %sysfunc(countw(&varList));
- %let mvar =%scan(&varList, &i);
- data have2;
- do _n_=1 by 1 until(last.&mvar.);
- set have(keep=&mvar);
- by &mvar. notsorted;
- imp ++(&mvar. =0);
- end;
- do _n_=1 by 1 until(last.&mvar.);
- set have(keep=&mvar);
- by &mvar. notsorted;
- &mvar.i =(imp >3);
- output;
- end;
- imp =0;
- keep &mvar. &mvar.i;
- run;
- data have3;
- call streaminit(1234);
- set have2 end=eof;
- array xx[&nobs.,2] _temporary_;
- xx[_n_,1] =&mvar.;
- xx[_n_,2] =&mvar.i;
- if eof then do;
- if xx[1,1] =0 then do;
- %*Fetch 1st non-missing value;
- do i =1 to dim1(xx) by 1;
- if xx[i,1] ^=0 then leave;
- end;
- xx[1,1] =xx[i,1];
- end;
- if xx[&nobs.,1] =0 then do;
- %*Fetch last non-missing value;
- do i =dim1(xx) to 1 by -1;
- if xx[i,1] ^=0 then leave;
- end;
- xx[&nobs.,1] =xx[i,1];
- end;
- do i =1 to dim1(xx);
- if xx[i,1] ^=0 then PreMissing =0;
- if xx[i,1] =0 then do;
- if PreMissing =0 then do;
- PreMissing =1;
- xL=xx[i-1,1];
- %*Fetch next non-missing value;
- do j =i+1 to dim(xx);
- if xx[j,1] ^=0 then leave;
- end;
- xR =xx[j,1];
- xx[i,1] =ifn(rand('table', 0.5) =1, xL, xR);
- end;
- %*impute missing when previous one imputed;
- if PreMissing =1 then xx[i,1] =ifn(rand('table', 0.5) =1, xL, xR);
- end;
- %*Wont impute those >3 consecutive missings;
- &mvar._imp =ifn(xx[i,2]=1, 0, xx[i,1]);
- output;
- end;
- end;
- keep &mvar._imp;
- run;
- %if &i =1 %then%do;
- data have_f;
- merge have;
- run;
- %end;
- data have_f;
- merge have_f have3;
- run;
- %end;
- %mend impute;
- %impute(A1 A2 A3 B1 B2 B3 C1 C2 C3 D1 D2 D3 E1 E2 E3)
- ;
复制代码
|
|