Data Cleaning, Exclusions

Author
Affiliation

John T West

The Pennsylvania State University

Published

March 27, 2024

library(openxlsx)
library(dplyr)
library(tidyr)
library(psych)
library(RColorBrewer)
library(ggeasy)
library(ggrepel)
library(ggplot2)
library(Hmisc)
library(plyr)

Loading in Data

Reading in participant-level data

indi.data = read.xlsx("Participant-Level Data.xlsx")
#indi.data = read.csv("Participant-Level Data.csv")

Renaming Memory Tasks

colnames(indi.data) =  sub("perceptual.", "object.sim.", colnames(indi.data))
colnames(indi.data) =  sub("Perceptual.", "object.sim.", colnames(indi.data))
colnames(indi.data) =  sub("nonsemantic.", "abstract.img.", colnames(indi.data))
colnames(indi.data) =  sub("Nonsemantic.", "abstract.img.", colnames(indi.data))
colnames(indi.data) =  sub("semantic.", "cat.drm.", colnames(indi.data))
colnames(indi.data) =  sub("Semantic.", "cat.drm.", colnames(indi.data))
colnames(indi.data) =  sub("categorical.", "schematic.", colnames(indi.data))
colnames(indi.data) =  sub("Categorical.", "schematic.", colnames(indi.data))

indi.data = dplyr::rename(indi.data, 
                          "object.sim.exclusion.reason" = "per.exclusion.reason",
                          "excluded.from.object.sim" = "excluded.from.perceptual",
                          "abstract.img.exclusion.reason" = "nonsem.exclusion.reason",
                          "excluded.from.abstract.img" = "excluded.from.nonsemantic",
                          "cat.drm.exclusion.reason" = "sem.exclusion.reason", 
                          "excluded.from.cat.drm" = "excluded.from.semantic",
                          "schematic.exclusion.reason" = "cat.exclusion.reason", 
                          "excluded.from.schematic" = "excluded.from.categorical")

Participant Exclusions

Participants who have been using English for less than half of their life

table(indi.data$Late.english.inclusion, indi.data$Group)
         
           OA  YA
  Exclude   2   6
  Include 152 211
indi.data = filter(indi.data, Late.english.inclusion == "Include")

Categorical DRM Exclusions

table(indi.data$excluded.from.cat.drm, indi.data$Group)
          
            OA  YA
  Excluded   2   8
  Included 148 203
table(indi.data$cat.drm.exclusion.reason, indi.data$Group)
                         
                           OA  YA
  Fast Response Exclusion   0   2
  Hit Rate Exclusion        1   6
  Included                148 203
  Nonresponse Exclusion     1   0
# Pie chart

cat.drm.exclusion.pie = indi.data %>%
  select(cat.drm.exclusion.reason) %>%
  filter(!is.na(cat.drm.exclusion.reason)) %>%
  dplyr::count(cat.drm.exclusion.reason, .drop = FALSE)

cat.drm.exclusion.pie$per = cat.drm.exclusion.pie$n / 
  nrow(filter(indi.data, !is.na(cat.drm.exclusion.reason)))

cat.drm.exclusion.pie$cat.drm.exclusion.reason =
  factor(cat.drm.exclusion.pie$cat.drm.exclusion.reason,  
         levels = c("Included",
         "Hit Rate Exclusion",
         "Nonresponse Exclusion", 
         "Fast Response Exclusion"))

cat.drm.exclusion.pie = cat.drm.exclusion.pie %>%
  arrange(desc(cat.drm.exclusion.reason))

cat.drm.exclusion.pie$label = 
  scales::percent(cat.drm.exclusion.pie$per, accuracy = 0.1)

ggplot(data = cat.drm.exclusion.pie) +
  geom_bar(aes(x = "", y = per, fill = cat.drm.exclusion.reason), 
           stat = "identity", width = 1) +
  coord_polar(theta = "y", start = 0) + 
  theme_void() +
  geom_label_repel(aes(x = 1, y = cumsum(per) - per / 2, label = label),
                   nudge_x = 0.5) +
  theme(text = element_text(size = 16, family = "serif"), 
        plot.margin = unit(c(0, 0.5, 0, 0), "cm"), 
        plot.caption.position = "plot",
        plot.caption = element_text(hjust = 0)) + 
  ggtitle("Exclusions for Categorical DRM Task") + 
  ggeasy::easy_center_title() + 
  guides(fill = guide_legend(reverse = FALSE)) + 
  labs(fill = "Exclusion Reason", 
       caption = "Percentages in this and in the other pie charts are based on participants with data \nfor the respective task only.") +
  scale_fill_brewer(palette = "Dark2")

rm(list = setdiff(ls(), "indi.data"))

# Columns to set as missing when excluded.from.cat.drm is "Exclude"
cat.drm.cols = names(select(indi.data, 
                        cat.drm.CR.Related.DefNew:
                          cat.drm.FA.Unrelated.Rates))

# Replacing semantic values with missing if excluded from semantic
indi.data[is.na(indi.data$excluded.from.cat.drm) | 
            indi.data$excluded.from.cat.drm == "Excluded", cat.drm.cols] = NA

rm(cat.drm.cols)

Object Similarity Exclusions

table(indi.data$excluded.from.object.sim, indi.data$Group)
          
            OA  YA
  Excluded   2   5
  Included 147 205
table(indi.data$object.sim.exclusion.reason, indi.data$Group)
                         
                           OA  YA
  Fast Response Exclusion   0   1
  Hit Rate Exclusion        1   4
  Included                147 205
  Nonresponse Exclusion     1   0
# Pie chart

object.sim.exclusion.pie = indi.data %>%
  select(object.sim.exclusion.reason) %>%
  filter(!is.na(object.sim.exclusion.reason)) %>%
  dplyr::count(object.sim.exclusion.reason, .drop = FALSE)

object.sim.exclusion.pie$per = object.sim.exclusion.pie$n / 
  nrow(filter(indi.data, !is.na(object.sim.exclusion.reason)))

object.sim.exclusion.pie$object.sim.exclusion.reason =
  factor(object.sim.exclusion.pie$object.sim.exclusion.reason,  
         levels = c("Included",
         "Hit Rate Exclusion",
         "Nonresponse Exclusion", 
         "Fast Response Exclusion"))

object.sim.exclusion.pie = object.sim.exclusion.pie %>%
  arrange(desc(object.sim.exclusion.reason))

object.sim.exclusion.pie$label = 
  scales::percent(object.sim.exclusion.pie$per, accuracy = 0.1)

ggplot(data = object.sim.exclusion.pie) +
  geom_bar(aes(x = "", y = per, fill = object.sim.exclusion.reason), 
           stat = "identity", width = 1) +
  coord_polar(theta = "y", start = 0) + 
  theme_void() +
  geom_label_repel(aes(x = 1, y = cumsum(per) - per / 2, label = label),
                   nudge_x = 0.5) +
  theme(text = element_text(size = 16, family = "serif"), 
        plot.margin = unit(c(0, 0.5, 0, 0), "cm")) + 
  ggtitle("Exclusions for Object Similarity Task") + 
  ggeasy::easy_center_title() + 
  guides(fill = guide_legend(reverse = FALSE)) + 
  labs(fill = "Exclusion Reason") +
  scale_fill_brewer(palette = "Dark2")

rm(list = setdiff(ls(), "indi.data"))

# Columns to set as missing when excluded.from.object.sim is "Exclude"
object.sim.cols = names(select(indi.data, 
                        object.sim.CR.Related.DefNew:object.sim.FA.Unrelated.Rates))

# Replacing Object Similarity values with missing if excluded from Object Similarity
indi.data[is.na(indi.data$excluded.from.object.sim) | 
            indi.data$excluded.from.object.sim == "Excluded", object.sim.cols] = NA

rm(object.sim.cols)

Schematic Exclusions

table(indi.data$excluded.from.schematic, indi.data$Group)
          
            OA  YA
  Excluded  46  56
  Included 101 152
table(indi.data$schematic.exclusion.reason, indi.data$Group)
                         
                           OA  YA
  Fast Response Exclusion   0   3
  Hit Rate Exclusion       42  53
  Included                101 152
  Nonresponse Exclusion     4   0
# Pie chart

schematic.exclusion.pie = indi.data %>%
  select(schematic.exclusion.reason) %>%
  filter(!is.na(schematic.exclusion.reason)) %>%
  dplyr::count(schematic.exclusion.reason, .drop = FALSE)

schematic.exclusion.pie$cat = schematic.exclusion.pie$n / 
  nrow(filter(indi.data, !is.na(schematic.exclusion.reason)))

schematic.exclusion.pie$schematic.exclusion.reason =
  factor(schematic.exclusion.pie$schematic.exclusion.reason,  
         levels = c("Included",
         "Hit Rate Exclusion",
         "Nonresponse Exclusion", 
         "Fast Response Exclusion"))

schematic.exclusion.pie = schematic.exclusion.pie %>%
  arrange(desc(schematic.exclusion.reason))

schematic.exclusion.pie$label = 
  scales::percent(schematic.exclusion.pie$cat, accuracy = 0.1)

ggplot(data = schematic.exclusion.pie) +
  geom_bar(aes(x = "", y = cat, fill = schematic.exclusion.reason), 
           stat = "identity", width = 1) +
  coord_polar(theta = "y", start = 0) + 
  theme_void() +
  geom_label_repel(aes(x = 1, y = cumsum(cat) - cat / 2, label = label),
                   nudge_x = 0.5) +
  theme(text = element_text(size = 16, family = "serif"), 
        plot.margin = unit(c(0, 0.5, 0, 0), "cm")) + 
  ggtitle("Exclusions for Schematic Task") + 
  ggeasy::easy_center_title() + 
  guides(fill = guide_legend(reverse = FALSE)) + 
  labs(fill = "Exclusion Reason") +
  scale_fill_brewer(palette = "Dark2")

rm(list = setdiff(ls(), "indi.data"))

# Columns to set as missing when excluded.from.schematic is "Exclude"
schematic.cols = names(select(indi.data, 
                        schematic.CR.Related.DefNew:
                          schematic.Miss.Unrelated.Rates))

# Replacing Schematic values with missing if excluded from Schematic
indi.data[is.na(indi.data$excluded.from.schematic) | 
            indi.data$excluded.from.schematic == "Excluded", 
          schematic.cols] = NA

rm(schematic.cols)

Abstract Images Exclusions

table(indi.data$excluded.from.abstract.img, indi.data$Group)
          
            OA  YA
  Excluded   1   9
  Included 150 201
table(indi.data$abstract.img.exclusion.reason, indi.data$Group)
                         
                           OA  YA
  Fast Response Exclusion   0   1
  Hit Rate Exclusion        1   7
  Included                150 201
  Nonresponse Exclusion     0   1
# Pie chart

abstract.img.exclusion.pie = indi.data %>%
  select(abstract.img.exclusion.reason) %>%
  filter(!is.na(abstract.img.exclusion.reason)) %>%
  dplyr::count(abstract.img.exclusion.reason, .drop = FALSE)

abstract.img.exclusion.pie$per = abstract.img.exclusion.pie$n / 
  nrow(filter(indi.data, !is.na(abstract.img.exclusion.reason)))

abstract.img.exclusion.pie$abstract.img.exclusion.reason =
  factor(abstract.img.exclusion.pie$abstract.img.exclusion.reason,  
         levels = c("Included",
         "Hit Rate Exclusion",
         "Nonresponse Exclusion", 
         "Fast Response Exclusion"))

abstract.img.exclusion.pie = abstract.img.exclusion.pie %>%
  arrange(desc(abstract.img.exclusion.reason))

abstract.img.exclusion.pie$label = 
  scales::percent(abstract.img.exclusion.pie$per, accuracy = 0.1)

ggplot(data = abstract.img.exclusion.pie) +
  geom_bar(aes(x = "", y = per, fill = abstract.img.exclusion.reason), 
           stat = "identity", width = 1) +
  coord_polar(theta = "y", start = 0) + 
  theme_void() +
  geom_label_repel(aes(x = 1, y = cumsum(per) - per / 2, label = label),
                   nudge_x = 0.5) +
  theme(text = element_text(size = 16, family = "serif"), 
        plot.margin = unit(c(0, 0.5, 0, 0), "cm")) + 
  ggtitle("Exclusions for Abstract Images Task") + 
  ggeasy::easy_center_title() + 
  guides(fill = guide_legend(reverse = FALSE)) + 
  labs(fill = "Exclusion Reason") +
  scale_fill_brewer(palette = "Dark2")

rm(list = setdiff(ls(), "indi.data"))

# Columns to set as missing when excluded.from.abstract.img is "Exclude"
abstract.img.cols = names(select(indi.data, 
                        abstract.img.CR.Related.DefNew:
                          abstract.img.FA.Unrelated.Rates))

# Replacing Abstract Images values with missing if excluded from Abstract Images
indi.data[is.na(indi.data$excluded.from.abstract.img) | 
            indi.data$excluded.from.abstract.img == "Excluded", 
          abstract.img.cols] = NA

rm(abstract.img.cols)

Saving out cleaned data

save(indi.data, file = "INDI_data.Rdata")