Simulation studies in R – Reproducing MacCullums et al. 2002 “Effects of variable dichotomization”

[en]
I recently came across an excellent paper “On the Practice of Dichotomization of Quantitiative Variables” by MacCallum and colleagues (2002) . As I use ANOVAs a lot in my research, it really got me thinking about the whole issue. Even though I have no great idea for an innovative simulation study, you might have one. If you read through this post, you will notice that it’s really simple – at least the technical part.

I will only explain the two-variable scenario. But the setup is basically the same for more complex, e.g.  two-variable, setups. Let’s start with their small numerical example before turning to the simulation study.

Setting up the packages

As some of you might have noticed I try to be consistent in how I structure the R-skripts. The first step is always to load packages and set up a working directory. As we do not read in any data, the latter is ommitted. However, I want to set a specific seed for the random number generation so that the results are reproducible.

?View Code RSPLUS
require(MASS)
require(corpcor)
set.seed(2901)     #to have reproducible results

Setting up the parameters and generating data

We will use the mvrnormfunktion from the MASS package to simulate the data. This takes three options, the sample size N, the means fof the variables mu,  and a covariance matrix sigma. In case you do not know how to translate a set of correlations between variables into a positive definitive covariance matrix, you will also need the rebuild.cov function from the corpcor packes. With these you can generate a sample of 50 participants with five lines of code.

?View Code RSPLUS
m_x

Inspect the results

I always like names better than subscripts. So this completely unneccessary step.

?View Code RSPLUS
names(temp)

?View Code RSPLUS
temp$X1_d

The statistics can be compared with the following commands.

?View Code RSPLUS
cor.test(X1, Y1)
 
t.test(Y1~temp$X1_d)

If you look at the p-values you will note, that both kinds of tests give you a a significant effect. If you find a seed that does not, please write me about it.

Running their small scale study

First we have to define a function that gives us the count of times where the dichotomized analysis gives us larger estimates for the correlation than the original results, given a specific correlation in the population and a sample size. I called it overshoot, because this is most likely due to sample-bias, as argued in the original paper.

I generated the following mainly by using the “extract function” feature in Rstudio.

?View Code RSPLUS
overshoot

Inspect the results

And here are the results.

[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 4481 4129 3790 3550 3347 3042 2869
[2,] 3359 2402 1642 1087  809  592  416
[3,] 2201 1011  380  141   51   24    5
[4,]  971  154   16    3    1   NA   NA
[5,]   77    1   NA   NA   NA   NA   NA

 

Thanks to the large number of samples (10,000) drawn from the population, the results are very similar to the data published. Hope you liked it.

Reference

MacCallum, R. C., Zhang, S., Preacher, K. J., & Rucker, D. D. (2002). On
the practice of dichotomization of quantitative variables. Psychological
Methods, 7, 19–40.

[/en]

 
[es]

Recientemente me tope con una publicación excelente “On the Practice of Dichotomization of Quantitiative Variables” por  McCallum y colegas (2002). El articulo me llevo a reflexionar mucho sobre este tema ya que utilizo ANOVAs muy a menudo en mis investigaciones.A pesar de que no tengo ideas ingeniosas para un estudio de simulación  innovador, es posible que tu si las tengas.  Al leer esta publicación te darás cuenta que en realidad no es complicado (al menos la parte técnica).

Solo explicare el caso de dos variables. Pero el set-up es el mismo para otros Set-ups mas complejos. Comencemos con su pequeño ejemplo numérico antes de pasar a la simulación del estudio.

Organizando los paquetes

Como algunos ya habrán notado, trato de ser consistente en mi forma de organizar los R-scripts.  El primer paso es siempre cargar los paquetes y armar un directorio. Al no leer ninguna informaron, este ultimo es omitido. Sin embargo quiero establecer una semilla especifica para la generación aleatoria de números de tal manera que los resultados sean reproducibles.

?View Code RSPLUS
require(MASS)
require(corpcor)
set.seed(2901)     #to have reproducible results

Estableciendo los parametros y generando datos

Vamos a usar la mvrnormfunktion del paquete MASS para simular los datos. Esto requiere tres opciones, el tamaño de la muestra N, la media the las variables mu y una matriz de covarianza sigma. En caso de que no sepas como traducir un grupo de correlaciones entre variables para convertirlas en una matriz de covarianza positiva definitiva, necesitaras ademas la funcion rebuild.cov de los paquetes corpcor. Con estos puedes generar muestras de 50 participantes con 5 lineas de codigo.

?View Code RSPLUS
m_x

Inspecciona los resultados

Siempre priorizo los nombres por sobre los índices. Por lo cual este paso es completamente innecesario.

?View Code RSPLUS
names(temp)

?View Code RSPLUS
temp$X1_d

Las estadísticas pueden ser comparadas con los siguientes comandos.

?View Code RSPLUS
cor.test(X1, Y1)
 
t.test(Y1~temp$X1_d)

Si prestas atencions a los dos valores-p, notaras que ambos tipos de test arrojan un efecto significante. Si encuentras una semilla que no lo hace, por favor comunicamelo.

Haciendo su experimento a pequeña escala

Primero debemos definir una función que nos de el numero de veces que el análisis dicotómico nos otorga estimaciones para la correlación mas  grandes que los resultados originales, dada una correlación especifica en la población y la muestra. Yo lo llamo “overshoot” (pasarse), dado que esto se debe muy probablemente a sesgos en la muestra, tal como fue discutido en la publicación original.

Utilizando principalmente la opción  “extract function” de Rstudio, he generado los siguiente:

?View Code RSPLUS
overshoot

Inspeccionar los resultados

He aqui los resultados.

[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 4481 4129 3790 3550 3347 3042 2869
[2,] 3359 2402 1642 1087  809  592  416
[3,] 2201 1011  380  141   51   24    5
[4,]  971  154   16    3    1   NA   NA
[5,]   77    1   NA   NA   NA   NA   NA

Los resultados son muy similares a la información publicada gracias al gran numero de muestras (10,000) extraídas de la población. Espero que esta publicación haya sido de tu agrado.

Referencia

MacCallum, R. C., Zhang, S., Preacher, K. J., & Rucker, D. D. (2002). On
the practice of dichotomization of quantitative variables. Psychological
Methods, 7, 19–40.

[/es]

2 thoughts on “Simulation studies in R – Reproducing MacCullums et al. 2002 “Effects of variable dichotomization”

  1. Pingback: Simulation studies in R – Using all cores and other tips | Sustainable Research

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>