limpia.vd.fnc

Copia, Pega y Adapta:

datos.limpios=limpia.vd.fnc(datos.apilados, vd='tr',

que.factor='condicion', que.corte=2.5, accuracy=T,

que.min=200, que.max=2000)

OBJETIVO

Lleva a cabo la limpieza de una variable numérica definida por el usuario para cada condición experimental en cada participante del experimento.

Esta limpieza se lleva a cabo rutinariamente en los diseños de medidas repetidas donde uno o varios grupos de participantes son sometidos a un número variable de items a través de J x K condiciones experimentales de medidas repetidas.

En general el procedimiento consiste en hacer valor perdido (NA) a toda observación que este fuera del intervalo definido por +- 2 desviaciones típicas alrededor de la media.

limpia.vd.fnc

Para demostrar su uso generaremos unos datos simulados relativos a un experimento de medidas repetidas con 30 sujetos en un diseño factorial 2 x 2 con 20 items por condición experimental . Por simplicidad vamos a generar la matriz de datos asumiendo una matriz de varianzas y covarianzas de los 80 items diagonal, obviamente incorrecta dado que pretendemos simular un experimento donde 30 participantes responden a esos 80 estímulos.

set.seed(20)

La línea anterior garantiza la replicabilidad exacta de la muestra que vamos a genera.

datos=data.frame(mvrnorm(30,mu=rep(c(1,-1,-1,1),each=20), Sigma=diag(80)))

dim(datos)

[1] 30 80

Necesitamos cambiar el nombre de las variables desde los valores por defecto generados por el simulador (X1 a X80) a los nuevos nombres item1 hasta item80. Para ello utilizaremos la función crea.nombre.item.fnc.

datos=crea.nombre.item.fnc(datos)

Ahora debemos definir el diseño de medidas repetidas de nuestro experimento para poder posteriormente apilar los datos y crear así una matriz de datos donde las 80 columnas de nuestros 30 sujetos ocupen una sola columna.

fac.intra=list(mrA=c('a1','a2'), mrB=c('b1','b2'))

dat.ap=apila.los.datos.fnc(datos, fac.intra=fac.intra, col.empieza.item=1,

n.item=80)

head(dat.ap)

vd item sujeto mrA mrB condicion

1 2.8907067 item1 suj1 a1 b1 a1.b1

2 0.4603383 item1 suj2 a1 b1 a1.b1

3 0.3369298 item1 suj3 a1 b1 a1.b1

4 2.7724457 item1 suj4 a1 b1 a1.b1

5 0.3696207 item1 suj5 a1 b1 a1.b1

6 2.2580499 item1 suj6 a1 b1 a1.b1

Podemos solicitar ahora un histograma de la variable vd en todas las condiciones experimentales. Este histograma es muy importante para poder definir algunos argumentos obligatorios de la función de limpieza.

histograma.fnc(dat.ap, que.factor='mrA:mrB', check=T)

Con el argumento check verdadero (T) obligamos a la superposición de los histogramas de las cuatro condiciones experimentales en una sola pantalla gráfica.

Tal y como podemos ver en el histograma previo a la limpieza de la figura inferior izquierda, tenemos valores muy alejados en la curva inferior. Por ello podemos iniciar nuestra limpieza indicando a la función que no permita ningún valor inferior a -2.5.

dat.cl=limpia.vd.fnc(dat.ap, que.factor='condicion', que.min=-2.5)

En la llamada a la función se han omitido los argumentos: vd porque existe una variable con ese nombre en los datos a limpiar, que.corte porque por defecto se delimita el intervalo a +- 2 desviaciones típicas alrededor de cada media en cada condición experimental en cada sujeto. Se ha omitido además el argumento Z (por defecto es T) debido a que se desea el intervalo alrededor de la media y no del mad alrededor de la mediana (Z=F). Por último no se ha incluido el argumento que.max porque se quiere que sea la propia función la que determine el corte adecuado para los valores mas elevados. En el caso de que la función no consiguiese eliminar valores intolerables para el contexto de investigación debería incluirse el agumento que.max con dicho valor de corte.

limpia.vd.fnc

En el histograma de la izquierda vemos que hay valores claramente alejados en las colas. Como hemos indicado en el argumento que.min el valor 2.5 podemos observar en el histograma de la derecha que no existe obviamente ningún valor inferior.

Para entender claramente en que ha consistido el procedimiento de limpieza vamos a investigar en profundidad un determinado valor de un sujeto que haya resultado eliminado aunque aparentemente ese valor parezca muy aceptable.

Para ello seleccionamos de la base de datos todos aquellos registros que hayan sido eliminados por el procedimiento anterior (valor NA en los datos limpios dat.cl)

indice=is.na(dat.cl$vd)

Ahora utilzaremos ese índice como localizador de filas de la matriz limpia y sin limpiar.


head(dat.cl[indice,])

vd item sujeto mrA mrB condicion

10 NA item1 suj10 a1 b1 a1.b1

43 NA item2 suj13 a1 b1 a1.b1

81 NA item3 suj21 a1 b1 a1.b1


head(dat.ap[indice,])

vd item sujeto mrA mrB condicion

10 -1.2847970 item1 suj10 a1 b1 a1.b1

43 -0.5664992 item2 suj13 a1 b1 a1.b1

81 -1.8294145 item3 suj21 a1 b1 a1.b1

Vemos que el valor -1.28 de la condición a1.b1 ha sido eliminado en el sujeto 10. Aparentemente es un valor que aunque negativo no llama especialmente la atención. Para comprender porque ha sido eliminado por el procedimiento de limpieza debemos extraer al sujeto 10 de la base de datos y solicitar un histograma de sus 80 valores de respuesta.

suj10a=subset(dat.ap, sujeto=='suj10')

histograma.fnc(suj10a, que.factor='mrA:mrB', check=T)

suj10b=subset(dat.cl, sujeto=='suj10')

histograma.fnc(suj10b, que.factor='mrA:mrB', check=T)

La conclusión esta clara. El valor -1.2 para ese sujeto es una valor claramente alejado de la media de la condición a1.b1 a la que pertenece (histograma de color negro). En el histograma de la derecha (datos límpios) puedes ver como al eliminar ese valor la distribución de dicha condición tiene una apariencia mucho mas aceptable.