Calcite | Level 5

## Easy way to calculate Cohen's d

I am trying to calculate Cohen's d in SAS. This is such a common statistic, I do not understand why it is not available in SAS.  I can calculate it by hand or using an online calculator like https://www.socscistatistics.com/effectsize/default3.aspx

But I will need to do it 100 times and am certain to make an error copying and pasting data.

I found a macro for calculating effect size but I cannot get it to run.

There must be simple code I can use to do the calculation in the above website within SAS. Any help is appreciated.  Thank you!

1 ACCEPTED SOLUTION

Accepted Solutions
SAS Super FREQ

## Re: Easy way to calculate Cohen's d

I'm not familiar with Cohen's D, but PROC TTEST provides estimates for the difference between group means and for the pooled standard deviation. You can write those statistics to a data set and then use a DATA step to compute the ratio, as follows:

``````ods trace on;
title;
proc ttest data=sashelp.class plots=none;
class Sex;
var Height;
ods select ConfLimits;
ods output ConfLimits=CL;
run;

data CohenD;
set Cl(where=(method="Pooled") rename=(Mean=MeanDiff));
CohenD = MeanDiff / StdDev;
run;

proc print data=CohenD noobs;
var Variable Class Method MeanDiff StdDev CohenD;
run;``````
14 REPLIES 14
Diamond | Level 26

## Re: Easy way to calculate Cohen's d

I do not understand why it is not available in SAS

if you click on the magnifying glass search icon right here in the SAS communities, and type in Cohen's D, you find that you can compute this in SAS, and there is at least one thread marked correct that asks about Cohen's D.

As far a this goes:

But I will need to do it 100 times and am certain to make an error copying and pasting data.

Without much more information and detail, there's really no way to help you. We would need to see (a portion of) the data to see how it is structured, and where the "100 times" comes into play. Please provide a portion of your SAS data set via SAS data step code which you type in yourself or via these instructions, and not in any other format.

--
Paige Miller
Calcite | Level 5

## Re: Easy way to calculate Cohen's d

The thread uses Proc Mixed and I simply do not understand it.  Why is this not part of t-test or GLM? PROC GLM has an effectsize option, but it doesn't report Cohen's d.

I have a dataset with two independent groups. I want an easy way to do this calculation.

Cohen's d = (M2 - M1) SDpooled

SDpooled = √((SD12 + SD22) ⁄ 2)

Can this be done as part of a t-test, means, or GLM PROC?

Here's my means statement which gets me all of the calculations I need to do the procedure by hand. I am fine having to run it separately for each dependent variable:

PROC MEANS DATA=surveydata(where=(Scenario="S1" AND SpeakerGender="F")) ;
CLASS SResponse;
Var Comp OriginalSocial Abrasive GetRequest;
RUN;

Calcite | Level 5

## Re: Easy way to calculate Cohen's d

I see that you asked for my data in a data step. I am really not familiar with the syntax since I upload Excel spreadsheets, but here's my best guess at a simplified version of my data

data surveydata;

input ResponseID SResponse Comp OriginalSocial Abrasive GetRequest SpeakerGender;

datalines;

01 PFF 3.2 5.6 5.0 4 F

02 ISTATE 4.8 2.1 1.0 6 F

03 PFF 3.8 5.9 5.1 4 M

Is that close enough?

Is there a way that SAS can spit out this simple calculation: Cohen's d = (M2 - M1) SDpooled

Here's a macro for doing it, but I am having trouble figuring out how to run the macro.

SAS Super FREQ

## Re: Easy way to calculate Cohen's d

I'm not familiar with Cohen's D, but PROC TTEST provides estimates for the difference between group means and for the pooled standard deviation. You can write those statistics to a data set and then use a DATA step to compute the ratio, as follows:

``````ods trace on;
title;
proc ttest data=sashelp.class plots=none;
class Sex;
var Height;
ods select ConfLimits;
ods output ConfLimits=CL;
run;

data CohenD;
set Cl(where=(method="Pooled") rename=(Mean=MeanDiff));
CohenD = MeanDiff / StdDev;
run;

proc print data=CohenD noobs;
var Variable Class Method MeanDiff StdDev CohenD;
run;``````
Calcite | Level 5

## Re: Easy way to calculate Cohen's d

Thank you so much!!! This is exactly what I needed.
Calcite | Level 5

## Re: Easy way to calculate Cohen's d

Hi, how can I calculate Cohen's d for paired t-test?

Super User

## Re: Easy way to calculate Cohen's d

Make a new variable
diff=after-before;
and use this variable to book in Rick's code .
Calcite | Level 5

## Re: Easy way to calculate Cohen's d

Can I check, is this code correct?

ods trace on;
title;
proc ttest data=wide1 plots=none;
PAIRED pwb4months*pwbbaseline;
ods select ConfLimits;
ods output ConfLimits=CL;
run;

data CohenD;
set Cl (rename=(Mean=MeanDiff));
CohenD = MeanDiff / StdDev;
run;

proc print data=CohenD noobs;
var MeanDiff StdDev CohenD;
run;

Super User

## Re: Easy way to calculate Cohen's d

OK. It looks right.

Also Could try this one :

var Height;
---->
var diff;
Calcite | Level 5

## Re: Easy way to calculate Cohen's d

thank you. 🙂
Calcite | Level 5

## Re: Easy way to calculate Cohen's d

thanks for the solution!

is there any way to request that SAS consider adding this as an option in proc glm or mixed?
Calcite | Level 5

## Re: Easy way to calculate Cohen's d

Hello,  is there a way to compute the 95% CI in the data step for what you have presented?  Thank you.

Super User

## Re: Easy way to calculate Cohen's d

Calcite | Level 5

## Re: Easy way to calculate Cohen's d

Thank you.

I was hoping to include the CI calculation in this presented data step using output data from the proc ttest:

data CohenD;
set Cl (rename=(Mean=MeanDiff));
CohenD = MeanDiff / StdDev;
run;

Discussion stats
• 14 replies
• 9528 views
• 7 likes
• 7 in conversation