Hi all,
I am using this code written by Rick Wicklin and I got the results of means of all variables. But, I still do not see any output file that contains the winsorized data. Can any one help plz.
%let DSName = sashelp.heart; proc iml; /* SAS/IML module to Winsorize each column of a matrix. Input proportion of observations to Winsorize: prop < 0.5. Ex: y = Winsorize(x, 0.1) computes the two-side 10% Winsorized data */ start Winsorize(x, prop); p = ncol(x); /* number of columns */ w = x; /* copy of x */ do i = 1 to p; z = x[,i]; /* copy i_th column */ n = countn(z); /* count nonmissing values */ k = ceil(prop*n); /* number of obs to trim from each tail */ r = rank(z); /* rank values in i_th column */ /* find target values and obs with smaller/larger values */ lowIdx = loc(r<=k & r^=.); lowVal = z[loc(r=k+1)]; highIdx = loc(r>=n-k+1); highVal = z[loc(r=n-k)]; /* Winsorize (replace) k smallest and k largest values */ w[lowIdx,i] = lowVal; w[highIdx,i] = highVal; end; return(w); finish; /* test the algorithm on numerical vars in a data set */ use &DSName; read all var _NUM_ into X[colname=varNames]; close; winX = Winsorize(X, 0.1);
Check WANT table. P.S. since is a IML question, why not post it at IML forum , Rick is there ?
%let DSName = sashelp.heart;
proc iml;
/* SAS/IML module to Winsorize each column of a matrix.
Input proportion of observations to Winsorize: prop < 0.5.
Ex: y = Winsorize(x, 0.1) computes the two-side 10% Winsorized data */
start Winsorize(x, prop);
p = ncol(x); /* number of columns */
w = x; /* copy of x */
do i = 1 to p;
z = x[,i]; /* copy i_th column */
n = countn(z); /* count nonmissing values */
k = ceil(prop*n); /* number of obs to trim from each tail */
r = rank(z); /* rank values in i_th column */
/* find target values and obs with smaller/larger values */
lowIdx = loc(r<=k & r^=.);
lowVal = z[loc(r=k+1)];
highIdx = loc(r>=n-k+1);
highVal = z[loc(r=n-k)];
/* Winsorize (replace) k smallest and k largest values */
w[lowIdx,i] = lowVal;
w[highIdx,i] = highVal;
end;
return(w);
finish;
/* test the algorithm on numerical vars in a data set */
use &DSName;
read all var _NUM_ into X[colname=varNames];
close;
winX = Winsorize(X, 0.1);
create want from winX[c=varNames];
append from winX;
close;
quit;
I don't believe that code actually writes back to the data set. It defines a function to winsorize and shows how it can be used. You would need to add the code to save it back to a data set.
However, this question was asked at least once if not twice this week, so a quick search within the time frame should get you some generic examples.
https://communities.sas.com/t5/SAS-Programming/winsoring-outliers/m-p/529770#M144807
Check WANT table. P.S. since is a IML question, why not post it at IML forum , Rick is there ?
%let DSName = sashelp.heart;
proc iml;
/* SAS/IML module to Winsorize each column of a matrix.
Input proportion of observations to Winsorize: prop < 0.5.
Ex: y = Winsorize(x, 0.1) computes the two-side 10% Winsorized data */
start Winsorize(x, prop);
p = ncol(x); /* number of columns */
w = x; /* copy of x */
do i = 1 to p;
z = x[,i]; /* copy i_th column */
n = countn(z); /* count nonmissing values */
k = ceil(prop*n); /* number of obs to trim from each tail */
r = rank(z); /* rank values in i_th column */
/* find target values and obs with smaller/larger values */
lowIdx = loc(r<=k & r^=.);
lowVal = z[loc(r=k+1)];
highIdx = loc(r>=n-k+1);
highVal = z[loc(r=n-k)];
/* Winsorize (replace) k smallest and k largest values */
w[lowIdx,i] = lowVal;
w[highIdx,i] = highVal;
end;
return(w);
finish;
/* test the algorithm on numerical vars in a data set */
use &DSName;
read all var _NUM_ into X[colname=varNames];
close;
winX = Winsorize(X, 0.1);
create want from winX[c=varNames];
append from winX;
close;
quit;
And here is my code.
data have;
do i=1 to 100;
a=ceil(ranuni(1)*100);
b=ceil(ranuni(2)*100);
output;
end;
drop i;
run;
%let low=0.05 ;
%let high=0.95 ;
proc iml;
use have;
read all var _num_ into x[c=vname];
close have;
call qntl(q,x,{&low ,&high});
do i=1 to ncol(x);
x[loc(x[,i]<q[1,i]),i]=q[1,i];
x[loc(x[,i]>q[2,i]),i]=q[2,i];
end;
create want from x[c=vname];
append from x;
close want;
quit;
Many thanks.
Available on demand!
Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Select SAS Training centers are offering in-person courses. View upcoming courses for: