Cohen’s d can be converted to a point-biserial correlation if both groups’ sample sizes and the value of Cohen’s d are known. This require two quantities in addition to d, m and h. \(m = n_1 + n_2 - 2\) and \(h = m/n_1 + m/n_2\). The point-biserial is just
\[\frac{d \sqrt{d^2 + h}}{d^2+h}\]
And converting back is a matter of
\[\frac{r \sqrt{h}}{\sqrt{1-r^2}}\]
Various approximations for equal groups are available, like the ones at https://www.escal.site/. Once Cohen’s d is written in terms of a point-biserial, it can be corrected with the classical reliability correction.
rpb2d <- function(r, n1, n2){
m = n1 + n2 - 2
h = m/n1 + m/n2
d = (r * sqrt(h))/sqrt(1 - r^2)
return(d)}
d2rpb <- function(d, n1, n2){
m = n1 + n2 - 2
h = m/n1 + m/n2
rpb = (d * sqrt(d^2 + h))/(d^2 + h)
return(rpb)}
rpb2d(0.5, 100, 100)
## [1] 1.148913
d2rpb(0.5, 100, 100)
## [1] 0.2436851
rpb2d(d2rpb(0.5, 100, 100), 100, 100)
## [1] 0.5
d2rpb(rpb2d(0.5, 100, 100), 100, 100)
## [1] 0.5
If you have a Cohen’s d of 0.75 with a reliability of 0.8, you may want to correct that. You could do
d2rpb(0.75, 50, 50)
## [1] 0.3542429
rpb2d(d2rpb(0.75, 50, 50)/sqrt(0.8), 50, 50)
## [1] 0.8539832
And if you want a function
dCorrected <- function(d, n1, n2, rel){
m = n1 + n2 - 2
h = m/n1 + m/n2
rpb = (d * sqrt(d^2 + h))/(d^2 + h)
corpb = rpb/sqrt(rel)
d = (corpb * sqrt(h))/sqrt(1 - corpb^2)
return(d)}
rpbCorrected <- function(r, n1, n2, rel){
m = n1 + n2 - 2
h = m/n1 + m/n2
corpb = r/sqrt(rel)
return(corpb)}
dCorrected(0.75, 50, 50, 0.80)
## [1] 0.8539832
rpbCorrected(0.5, 50, 50, 0.80)
## [1] 0.559017
sessionInfo()
## R version 4.1.2 (2021-11-01)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 19044)
##
## Matrix products: default
##
## locale:
## [1] LC_COLLATE=English_United States.1252
## [2] LC_CTYPE=English_United States.1252
## [3] LC_MONETARY=English_United States.1252
## [4] LC_NUMERIC=C
## [5] LC_TIME=English_United States.1252
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## loaded via a namespace (and not attached):
## [1] digest_0.6.28 R6_2.5.1 jsonlite_1.7.2 magrittr_2.0.1
## [5] evaluate_0.14 rlang_0.4.12 stringi_1.7.5 jquerylib_0.1.4
## [9] bslib_0.3.1 rmarkdown_2.11 tools_4.1.2 stringr_1.4.0
## [13] xfun_0.27 yaml_2.2.1 fastmap_1.1.0 compiler_4.1.2
## [17] htmltools_0.5.2 knitr_1.36 sass_0.4.0