# [R] Re: point-biserial correlation

Noel Yvonnick noel at univ-lille3.fr
Thu Apr 3 09:28:48 CEST 2003

```Le Lundi 31 Mars 2003 17:23, Bernd Weiss a écrit :
> On 31 Mar 2003 at 15:07, Noel Yvonnick wrote:
>
> [...]
>
> > Note that the point-biserial correlation is nothing but the standard
> > correlation coefficient when one of the variables is dichotomous, so
> > that cor(.) is OK.
>
> Yes, this is a misleading subject.
>
> > The biserial is different and includes a correction for the so-called
> > "point of dichotomy". The following should work (translating a formula
> > found in a psychometric manual) :
>
> [...]
>
> >   # Biserial correlation
> >   # Be cautious in interpreting the sign :
> >   # depends upon the ordering of levels(x)
> >   ((m[1]-m[2])/Sy)*(f[1]*f[2]/dnorm(f[1]-.5))
>
> Thanks a lot for your help. Your code inspired me to do some modifications.
>
> (1) Following a German statistic book (Bortz, Jürgen, 1993: Statistik.
> Heidelberg: Springer) I use the following term "dnorm(qnorm(f[1]))" instead
> of "dnorm(f[1]-.5)".
>
> (2) I added some code for handling NA's.
>
> (3) Finaly, it is now possible to do some significance test for rbis.
>
>
> Bernd
>
>
> # Modification of Noel Yvonnick function for computing biserial
> correlations # x.na: 0/1 variable
> # y.na: continuous variable
> cor.biserial = function(x.na,y.na)
> {
>   x <- x[!is.na(y.na) & !is.na(x.na)]
>   y <- y[!is.na(y.na) & !is.na(x.na)]
>
>   stopifnot(is.factor(x))
>   stopifnot(length(levels(x))==2)
>   stopifnot(length(x)==length(y))
>
>   N = length(y)
>
>   # Success / Failure frequencies
>   n <- table(x)
>   f = table(x)/length(x)
>
>   # Means of success/failure groups on the global score
>   m = tapply(y,x,mean)
>
>   # Variance of the global score
>   Sy = sqrt(var(y)*(N-1)/N)
>
>   # Biserial correlation
>   # Be cautious in interpreting the sign :
>   # depends upon the ordering of levels(x)
>   rbis <- ((m[1]-m[2])/Sy)*(f[1]*f[2]/dnorm(qnorm(f[1])))
>
>   # significance test for rbis
>   rhobis <- sqrt(n[1]*n[2])/(dnorm(qnorm(f[1]))*N*sqrt(N))
>   z <- rbis/rhobis
>   alpha <- ifelse(z<0,pnorm(z),1-pnorm(z))
>
>   return(rbis,rhobis,z,alpha,N)
> }

That's great. I like this spontaneous collaboration ! This is the very spirit
of R and this list. Thank you.

Just in case someone is interested : I am trying to compile as many
psychometric functions I can in a so-called "Psychom" library. It is just a
script for my students at that time, with very simple functions, but maybe
other people could contribute to finalize a formal library ?

http://yvonnick.noel.free.fr/cours/licence/psychometrie/2003/psychom.R

Yvonnick Noel
Dpt. of Psychology
U. of Lille 3
FRANCE

```