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.
Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!
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.