Contributor
Posts: 65

# Calculation of medcouple

I am looking for SAS code to calculate the medcouple, has anyone such knowledge?

https://en.wikipedia.org/wiki/Medcouple

Super User
Posts: 10,623

## Re: Calculation of medcouple

It is my first time to hear this term. I don't know if @Rick_SAS  could write some IML code to make it happen.

Contributor
Posts: 65

## Re: Calculation of medcouple

Unfortunately, I need it in SAS BASE, and not in SAS IML.

SAS Super FREQ
Posts: 4,124

## Re: Calculation of medcouple

I am familiar with this concept, but I do not have any non-IML code to share.

Posts: 1,289

## Re: Calculation of medcouple

Here's the brute force way.  I.e. it doesn't take advantage of the "fast" algorithm in the Wikipedia reference. so it won't scale well against larger datasets.

The example finds the medcouple stat for variable CLOSE in sashelp.stocks for IBM stocks (N=233).  If you have a test data set to confirm correctness of the algorithm, I'd suggest running it.

``````data have (keep=date close);
set sashelp.stocks;
where stock='IBM';
run;

proc means data=have noprint;
output out=median  median=median;
var close;
run;

data vneed (keep=h) / view=vneed;
set have end=end_of_have;
if _n_=1 then set median;

array upper{2000} _temporary_; /* distance of upper obs to median*/
array lower{2000} _temporary_; /* distance of lower obs to median*/

if close>=median then do;
P+1;
upper{p}=close-median;
end;
if close<=median then do;
Q+1;
lower{q}=median-close;
end;

if end_of_have;
do i=1 to P;
do j=1 to Q;
if upper{i}=0 and lower{j}=0 then h=sign(P-1-i-j);
else h= (upper{i}-lower{j})/(upper{i}+lower{j});
output;
end;
end;
run;
proc means data=vneed median; var h;
run;

``````
Discussion stats
• 4 replies
• 145 views
• 0 likes
• 4 in conversation