Criterios de inclusión

Si vamos un poquito más allá del filtrado incial de la base datos, es probable que en algún momento necesites aplicar otros filtros utilizando criterios propios, es decir, aplicar algún criterio de inclusión. En esta tarea, voy a tomar como criterio de inclusión un buen desempeño en las palabras familiares.

Primero, voy a crear una base de datos que contenga a todos los participantes que quiero excluir, partiendo de la base de datos que creamos en la Parte 1 (data_raw). Para eso, voy a encadenar varias funciones.

data_exclude <- data_raw %>%
  filter(familiarity == "familiar") %>% 
  group_by(id, group) %>% 
  summarise(meanAcc = mean(Acc)) %>% 
  filter(meanAcc < 0.9)

data_exclude
## # A tibble: 4 x 3
## # Groups:   id [4]
##        id group    meanAcc
##     <int> <chr>      <dbl>
## 1 1395086 react      0.892
## 2 1413254 react      0.825
## 3 1467252 react      0.883
## 4 1467598 no_react   0.883

Fijate que la única función nueva que usamos es summarise() para que me muestre el promedio de la Acc de los datos que agrupé con group_by. Esta tabla va a contener, entonces, a aquellos participantes que presenten un promedio menor a 0.9 en las palabras familiares.

En segundo lugar, elimino a estos participantes de mi tabla original.

data <- data_raw %>% 
  filter(!(id %in% data_exclude$id) & !(RT < 200))

Ahora la tabla pasó de llamarse data_raw (datos crudos) a simplemente data, porque ya hice la eliminación de participantes. Esto es algo que uso para diferenciar una tabla de otra.

Otro detalle que añadí en este último filtro es eliminar los RT menores a 200 ms dado que son datos muy rápidos para ser válidos y es probable que sean simplemente errores.

Análisis exploratorio

Finalmente, y para ir analizando algo de todo lo que ordené, vamos a hacer un análisis exploratorio que me permita tener una idea -a grandes rasgos- de cómo dio el experimento.

Generemos una nueva base de datos y pidamos el promedio de la Acc y el promedio de RT junto con su desvío estándar, para todas las combinaciones de condiciones (son tres variables: group, relation y familiarity).

data_condition <- data %>% 
  group_by(group, relation, familiarity) %>% 
  summarise(meanAcc = mean(Acc), 
            meanRT = mean(RT, na.rm = TRUE),
            sd_RT = sd(RT))

data_condition
## # A tibble: 8 x 6
## # Groups:   group, relation [4]
##   group    relation  familiarity meanAcc meanRT sd_RT
##   <chr>    <chr>     <chr>         <dbl>  <dbl> <dbl>
## 1 no_react related   familiar      0.928   850.  323.
## 2 no_react related   new           0.735  1068.  390.
## 3 no_react unrelated familiar      0.957   895.  332.
## 4 no_react unrelated new           0.853  1142.  402.
## 5 react    related   familiar      0.925   843.  274.
## 6 react    related   new           0.731  1045.  370.
## 7 react    unrelated familiar      0.963   887.  293.
## 8 react    unrelated new           0.856  1109.  375.

Guardado

Después de tanto amasar los datos, llegó el momento de guardarlos. Primero va el nombre de la tabla que quiero guardar como archivo csv, y luego, el que quiero que tenga ese archivo.

write.csv(data, file= "data_priming.csv", row.names = F)

Por default se agrega en el archivo csv una columna con el nro de fila. Podés setear row.names a False si querés que esto no suceda.

Bonus track: cambio de tipo de base de datos

Última función del día. Como comenté en la Parte 1, hay veces que los datos no vienen de forma tidy y necesito transformarlos para hacer todas estas cosas divertidas que hicimos recién. También puede ocurrir que para algún análisis en particular necesite los datos de forma no tidy con una columna por sujeto por ejemplo.

Empecemos por trasformar nuestros datos tidy a una forma no tidy. Esto sería análogo a decir que paso de una tabla en disposición longer (más larga) a una tabla en disposición wider (más ancha). Entonces vamos a usar la función pivot_wider(). Si se imaginan la forma de las tablas en cada caso tiene sentido.

Aclaro que ahora los nombres de mis columnas van a provenir de mi variable id (names_from = id) y que los valores que van a tomar esas columnas provienen de mi variable Acc (values_from = Acc):

data_wide <- data %>% 
  select(id, Acc, target, prime, relation) %>% 
  pivot_wider(names_from = id, values_from = Acc)

head(data_wide[,1:8])
## # A tibble: 6 x 8
##   target  prime    relation  `1394643` `1394726` `1395058` `1395064` `1395109`
##   <chr>   <chr>    <chr>         <int>     <int>     <int>     <int>     <int>
## 1 ARDILLA nueces   related           1         1         1         1         1
## 2 ARDILLA clavo    unrelated         1         1         1         1         1
## 3 ARDILLA cuchilla unrelated         1         1         1         1         1
## 4 ARDILLA bosque   related           1         1         1         1         1
## 5 ARDILLA árbol    related           0         1         1         1         0
## 6 ARDILLA jabón    unrelated         1         1         1         1         1

Entonces tengo una columna por participante y una fila por palabra en cada condición. Ya no es más tidy data.

Pero si, en cambio, parto de data que no es tidy y quiero que lo sea, podemos usar pivot_longer(). Nuevamente aclaro que los nombres de las columnas los ponga en una columna llamada id y los valores de las columnas los ponga en una columna llamada Acc. En este caso, agrego el argumento cols para que este intercambio lo haga con todas las columnas menos con las columnas de target, prime y relation (es decir, solo con las columnas que son nombres de participantes):

data_long <- data_wide %>% 
  pivot_longer(cols = c(-target, -prime, -relation), names_to = "id", values_to = "Acc")

¡Espero que te haya servido!