1 Experiment details

2 Set up R environment

library(tidyverse)
library(ggplot2)
library(ggpubr)
library(plyr)
library(magick)
library(rstatix)
library(reshape2)
library(knitr)
library(lme4)

Set the R working drectory to the main experiment directory.

setwd("/Users/adambarnas/Box/MeridianCB")  

3 Format & manipulate raw data files

3.1 Read-in datafiles

Read in the individual subject files (saved automatically on the server as csv files).

tbl_all <- list.files(path = "./data_v2/", pattern = "*.csv", full.names = T) %>% 
    map_df(~read_csv(.))
tbl_all <- data.frame(tbl_all)

Confirm the number of subjects and make sure the sample sizes reflects the number of data files in the data subdirectory.

nrow(tbl_all %>% distinct(workerId,.keep_all = FALSE))
## [1] 88

Define trial conditions by breaking apart the name of the image, given by objs_image column.

tbl_all <- tbl_all %>% 
separate(objs_image,into=c('rectangle_orientation','cue_loc','change_loc','validity','display_num','change_type'))

Rename all the variable values that are now given by the validity variable.

tbl_all <- tbl_all %>% mutate(validity=recode_factor(validity, `V`="valid", `C`="catch", `IS`="invalid_same", `ID`="invalid_different", `objects`="NA"))

Assign the trials to bins based on the trial number.

tbl_all$bin = "filler"
tbl_all[which(tbl_all$trial_number %in% c(1:4)), "bin"] = 0
tbl_all[which(tbl_all$trial_number %in% c(5:27)), "bin"] = 1
tbl_all[which(tbl_all$trial_number %in% c(28:50)), "bin"] = 2
tbl_all[which(tbl_all$trial_number %in% c(51:73)), "bin"] = 3
tbl_all[which(tbl_all$trial_number %in% c(74:96)), "bin"] = 4

tbl_all$bin <- as.numeric(tbl_all$bin)

This chunk will make 2 tables: one contains the number of trials for each individual and the other contains the numer of trials for each individual binned over time. There were 80 target-present trials that were 60% valid (48 trials) and 40% invalid (16 trials for each type). There were also 12 catch trials. The numbers of each trial type were split evenly among the 4 cue locations. The last variable, “sum”, is the total number of trials saved for each participant.

tbl_all_counts <- tbl_all %>%
  group_by(workerId,validity) %>%
  filter(validity=='valid' | validity=='invalid_same' | validity=='invalid_different' | validity=='catch') %>%
  dplyr::summarize(counts = n()) %>%
  spread(validity,counts)
tbl_all_counts$total_sum = rowSums(tbl_all_counts[,c(-1)], na.rm = TRUE)
kable(tbl_all_counts)
workerId valid catch invalid_same invalid_different total_sum
A101TNXQVR2UPO 48 12 16 16 92
A11Q3D9ADJUKHP 48 12 16 16 92
A11SVF9ZNHO1EW 48 12 16 16 92
A11U9MQRLTBD7S 48 12 16 16 92
A16O7CY4VH5BCP 48 12 16 16 92
A16Z47IWMSXYHP 48 12 16 16 92
A17WT0K0HFTW9U 48 12 16 16 92
A19BZSL0LVFBO2 48 12 16 16 92
A19L8SNH73AX1Z 48 12 16 16 92
A1BKF0KULCF6Y6 48 12 16 16 92
A1BVG13MHBM1YD 48 12 16 16 92
A1FYWSPNO7KN1O 48 12 16 16 92
A1L3937MY09J3I 48 12 16 16 92
A1NN3OSYKM7BLG 48 12 16 16 92
A1PUWQYUQRGCO 48 12 16 16 92
A1SISJL5ST2PWH 48 12 16 16 92
A1TARNH07A75CG 48 12 16 16 92
A1TZARLMBLCJ8X 48 12 16 16 92
A1V2H0UF94ATWY 48 12 16 16 92
A1ZE87WEYCA44A 48 12 16 16 92
A2182DBITJFCMZ 48 12 16 16 92
A21D9YDJU8K2QI 48 12 16 16 92
A21TBK48OBJYSX 48 12 16 16 92
A21UA6O7ZFAIQJ 48 12 16 16 92
A220ZCMBT1YMMU 48 12 16 16 92
A222ICMHU5JXLA 48 12 16 16 92
A22JZM6BEETFWF 48 12 16 16 92
A2482SLAY120J2 48 12 16 16 92
A248QG4DPULP46 48 12 16 16 92
A26Z8M2VSEWUU4 48 12 16 16 92
A29YJJRBSB7D8I 48 12 16 16 92
A2APG8MSLJ6G2K 48 12 16 16 92
A2BFHU3EGQES4W 48 12 16 16 92
A2CHD0TNWHFW1R 48 12 16 16 92
A2FGKKWP33DFWS 48 12 16 16 92
A2GOYSTIL3LOV1 48 12 16 16 92
A2ODH6HV36EP88 48 12 16 16 92
A2OVMMDZQ524IL 48 12 16 16 92
A2PIFMM4Q2I9ZS 46 12 16 16 90
A2PSR3CMNR1R9X 48 12 16 16 92
A2VLTSW6CXIUMR 48 12 16 16 92
A2VNSNAN1LZBAM 48 12 16 16 92
A2WC2NO555XU3J 48 12 16 16 92
A32S6A9SWM5Z67 48 12 16 16 92
A36UNYMDBED99W 48 12 16 16 92
A39GADIK8RLMVC 48 12 16 16 92
A3CASN6JG7104 48 12 16 16 92
A3CL8WUGLQHRP 48 12 16 16 92
A3DWL14MDONAJ 48 12 16 16 92
A3E8NUUS90EWXW 48 12 16 16 92
A3EC3OP6U52JYC 48 12 16 16 92
A3FCZNB9E8K3CX 48 12 16 16 92
A3GK90X2QOFR53 48 12 16 16 92
A3H32595TVJ34Q 48 12 16 16 92
A3K2ZXAFZCHYZI 48 12 16 16 92
A3K9GTQBOI7O5A 48 12 16 16 92
A3KF6O09H04SP7 48 12 16 16 92
A3KQXRF52U36P2 48 12 16 16 92
A3L7IWDL0R3KU9 48 12 16 16 92
A3OZB09ZZLZEFQ 48 12 16 16 92
A3QRZPJT2CT2IK 48 12 16 16 92
A3R818WN41K12K 48 12 16 16 92
A3S4M1GQAMPFZB 48 12 16 16 92
A3S9VNTRSE21UI 48 12 16 16 92
A3SG9Z3TANEGBG 48 12 16 16 92
A3SYY5R44RAATE 48 12 16 16 92
A3UDUHUVFKD833 48 12 16 16 92
A4W9APAHFWVLO 48 12 16 16 92
A6EOG99281TB3 48 12 16 16 92
A6JKKANO7F4KD 48 12 16 16 92
A6X1DYS5VCIL6 48 12 16 16 92
AAAHLPAGDOA2U 48 12 16 16 92
AECA0YXYZ6A0K 48 12 16 16 92
AJODPUVR2P18Q 48 12 16 16 92
AK3H5QRAROFGP 48 12 16 16 92
AKVDY8OXNMQED 48 12 16 16 92
ALBIU0ZCAUNON 48 12 16 16 92
AM8OWAW9TUVLN 48 12 16 16 92
ANUT13S1G9RWU 48 12 16 16 92
AQP4PHYDXRBPI 48 12 16 16 92
ARCCEMO6PIE44 48 12 16 16 92
ARLGZWN6W91WD 48 12 16 16 92
ASB6HK1H1EGA2 48 12 16 16 92
ASI2B6A3Y556Z 48 12 16 16 92
AU5BD5NSSES9H 48 12 16 16 92
AURYD2FH3FUOQ 48 12 16 16 92
AXCIG7A957UO6 48 12 16 16 92
AXKVHJHF1EOVT 48 12 16 16 92
tbl_all_counts_bin <- tbl_all %>%
  group_by(workerId,validity,bin) %>%
  filter(validity=='valid' | validity=='invalid_same' | validity=='invalid_different' | validity=='catch') %>%
  dplyr::summarize(counts = n()) %>%
  spread(validity,counts)
tbl_all_counts_bin$sum = rowSums(tbl_all_counts_bin[,c(-1:-2)], na.rm = TRUE)
#kable(tbl_all_counts_bin)

This chunk will also make 2 data tables consisting of the counts of main trials, excuding catch trials, as well as binning them over time.

tbl_all_counts_no_catch <- tbl_all %>%
  group_by(workerId,validity) %>%
  filter(validity=='valid' | validity=='invalid_same' | validity=='invalid_different') %>%
  dplyr::summarize(counts = n()) %>%
  spread(validity,counts)
tbl_all_counts_no_catch$sum = rowSums(tbl_all_counts_no_catch[,c(-1)], na.rm = TRUE)
#kable(tbl_all_counts_no_catch)

tbl_all_counts_no_catch_bin <- tbl_all %>%
  group_by(workerId,validity,bin) %>%
  filter(validity=='valid' | validity=='invalid_same' | validity=='invalid_different') %>%
  dplyr::summarize(counts = n()) %>%
  spread(validity,counts)
tbl_all_counts_no_catch_bin$sum = rowSums(tbl_all_counts_no_catch_bin[,c(-1:-2)], na.rm = TRUE)
#kable(tbl_all_counts_no_catch_bin)

3.2 Analyze accuracy

The changing object appeared in four possible locations. A sample image is provided below (Note: (1) the thin border around each obect was not visible to participants and is provided for representational purposes, and (2) only one object appeared at a time.). The following X and Y coordinates (in pixels) were obtained from the Octave/PTB script used to generate the stimuli:

UL: xmin = 22, ymin = 22, xmax, 99, ymax, 99

UR: xmin = 424, ymin = 22, xmax = 501, ymax = 99

LL: xmin = 22, ymin = 424, xmax = 99, ymax = 501

LR: xmin = 424, ymin = 424, xmax = 501, ymax = 501

img <- image_read("/Users/adambarnas/Box/MeridianCB/Object_locs.jpg")
img

The coordinates correspond to the upper-left (UL) and lower-right (LR) points of an object [UL X coor (xmin), UL Y coor (ymin), LR X coor (xmax), and LR Y coor (ymax)]. For instance, the object that appeared in the upperleft had coordinates [22, 22, 99, 99]. Note: these ranges correspond to the size of the image file (a 77x77 pixel square).

Trials are labeled 1 if the X and Y coordinate data fell inside the ranges listed above. Trials are labeled 0 if the X and Y coordinate data fell outside these ranges, and are discarded because this indicates that the subject was not accurate (i.e., one or both of their click coordinates was not within the object boundaries).

tbl_all <- tbl_all %>%
  filter(change_loc == "UL" | change_loc == "UR" | change_loc == "LL" | change_loc == "LR")

tbl_all$click_ACC = "filler"

for (i in 1:length(tbl_all$workerId)){
  if (tbl_all$change_loc[i] == "UL"){
    if ((22 <= tbl_all$x[i] & 99 >= tbl_all$x[i]) && (22 <= tbl_all$y[i] & 99 >= tbl_all$y[i])){
      tbl_all$click_ACC[i] = 1
    } else {
      tbl_all$click_ACC[i] = 0
    }
  } else if (tbl_all$change_loc[i] == "UR"){
    if ((424 <= tbl_all$x[i] & 501 >= tbl_all$x[i]) && (22 <= tbl_all$y[i] & 99 >= tbl_all$y[i])){
      tbl_all$click_ACC[i] = 1
    } else {
      tbl_all$click_ACC[i] = 0
    }
  } else if (tbl_all$change_loc[i] == "LL"){
    if ((22 <= tbl_all$x[i] & 99 >= tbl_all$x[i]) && (424 <= tbl_all$y[i] & 501 >= tbl_all$y[i])){
      tbl_all$click_ACC[i] = 1
    } else {
      tbl_all$click_ACC[i] = 0
    }
  } else if (tbl_all$change_loc[i] == "LR"){
    if ((424 <= tbl_all$x[i] & 501 >= tbl_all$x[i]) && (424 <= tbl_all$y[i] & 501 >= tbl_all$y[i])){
      tbl_all$click_ACC[i] = 1
    } else {
      tbl_all$click_ACC[i] = 0
    }
  }
} 

3.2.1 Accuracy on catch trials

Sum the number of good catch trials (1) to get the total number of accurate catch trials per subject.

tbl_good_catch_acc_all_main_acc_counts <- tbl_all %>%
  filter(validity=='catch')
tbl_good_catch_acc_all_main_acc_counts <- tbl_good_catch_acc_all_main_acc_counts %>%
  group_by(workerId,click_ACC) %>%
  dplyr::summarize(counts = n()) %>%
  spread(click_ACC,counts)
tbl_good_catch_acc_all_main_acc_counts$total = rowSums(tbl_good_catch_acc_all_main_acc_counts[,c(-1)], na.rm = TRUE)
tbl_good_catch_acc_all_main_acc_counts[is.na(tbl_good_catch_acc_all_main_acc_counts)] <- 0
colnames(tbl_good_catch_acc_all_main_acc_counts) <- c("workerId", "inacc_catch", "acc_catch", "total_catch")
kable(tbl_good_catch_acc_all_main_acc_counts)
workerId inacc_catch acc_catch total_catch
A101TNXQVR2UPO 9 3 12
A11Q3D9ADJUKHP 8 4 12
A11SVF9ZNHO1EW 3 9 12
A11U9MQRLTBD7S 10 2 12
A16O7CY4VH5BCP 1 11 12
A16Z47IWMSXYHP 0 12 12
A17WT0K0HFTW9U 1 11 12
A19BZSL0LVFBO2 12 0 12
A19L8SNH73AX1Z 2 10 12
A1BKF0KULCF6Y6 5 7 12
A1BVG13MHBM1YD 0 12 12
A1FYWSPNO7KN1O 0 12 12
A1L3937MY09J3I 5 7 12
A1NN3OSYKM7BLG 12 0 12
A1PUWQYUQRGCO 3 9 12
A1SISJL5ST2PWH 0 12 12
A1TARNH07A75CG 4 8 12
A1TZARLMBLCJ8X 1 11 12
A1V2H0UF94ATWY 0 12 12
A1ZE87WEYCA44A 1 11 12
A2182DBITJFCMZ 4 8 12
A21D9YDJU8K2QI 8 4 12
A21TBK48OBJYSX 0 12 12
A21UA6O7ZFAIQJ 0 12 12
A220ZCMBT1YMMU 0 12 12
A222ICMHU5JXLA 11 1 12
A22JZM6BEETFWF 12 0 12
A2482SLAY120J2 1 11 12
A248QG4DPULP46 0 12 12
A26Z8M2VSEWUU4 1 11 12
A29YJJRBSB7D8I 10 2 12
A2APG8MSLJ6G2K 0 12 12
A2BFHU3EGQES4W 12 0 12
A2CHD0TNWHFW1R 1 11 12
A2FGKKWP33DFWS 0 12 12
A2GOYSTIL3LOV1 0 12 12
A2ODH6HV36EP88 0 12 12
A2OVMMDZQ524IL 9 3 12
A2PIFMM4Q2I9ZS 8 4 12
A2PSR3CMNR1R9X 1 11 12
A2VLTSW6CXIUMR 0 12 12
A2VNSNAN1LZBAM 0 12 12
A2WC2NO555XU3J 0 12 12
A32S6A9SWM5Z67 11 1 12
A36UNYMDBED99W 0 12 12
A39GADIK8RLMVC 0 12 12
A3CASN6JG7104 0 12 12
A3CL8WUGLQHRP 12 0 12
A3DWL14MDONAJ 12 0 12
A3E8NUUS90EWXW 3 9 12
A3EC3OP6U52JYC 1 11 12
A3FCZNB9E8K3CX 0 12 12
A3GK90X2QOFR53 0 12 12
A3H32595TVJ34Q 0 12 12
A3K2ZXAFZCHYZI 1 11 12
A3K9GTQBOI7O5A 1 11 12
A3KF6O09H04SP7 1 11 12
A3KQXRF52U36P2 8 4 12
A3L7IWDL0R3KU9 1 11 12
A3OZB09ZZLZEFQ 12 0 12
A3QRZPJT2CT2IK 1 11 12
A3R818WN41K12K 0 12 12
A3S4M1GQAMPFZB 2 10 12
A3S9VNTRSE21UI 12 0 12
A3SG9Z3TANEGBG 11 1 12
A3SYY5R44RAATE 2 10 12
A3UDUHUVFKD833 0 12 12
A4W9APAHFWVLO 0 12 12
A6EOG99281TB3 12 0 12
A6JKKANO7F4KD 0 12 12
A6X1DYS5VCIL6 12 0 12
AAAHLPAGDOA2U 1 11 12
AECA0YXYZ6A0K 7 5 12
AJODPUVR2P18Q 12 0 12
AK3H5QRAROFGP 0 12 12
AKVDY8OXNMQED 0 12 12
ALBIU0ZCAUNON 1 11 12
AM8OWAW9TUVLN 0 12 12
ANUT13S1G9RWU 0 12 12
AQP4PHYDXRBPI 1 11 12
ARCCEMO6PIE44 0 12 12
ARLGZWN6W91WD 0 12 12
ASB6HK1H1EGA2 9 3 12
ASI2B6A3Y556Z 1 11 12
AU5BD5NSSES9H 9 3 12
AURYD2FH3FUOQ 0 12 12
AXCIG7A957UO6 12 0 12
AXKVHJHF1EOVT 0 12 12

Divide the number of accurate catch trials by the number of total catch trials for each participant. The resulting value will be the subjects catch trial rate. Subjects with a catch rate less than .75 will be discarded.

tbl_all_catch_acc_rate <- (tbl_good_catch_acc_all_main_acc_counts$acc_catch / tbl_good_catch_acc_all_main_acc_counts$total_catch)
tbl_all_catch_acc_rate <- cbind.data.frame(tbl_good_catch_acc_all_main_acc_counts[,1], tbl_all_catch_acc_rate)
colnames(tbl_all_catch_acc_rate) <- c("workerId", "catch_rate")
kable(tbl_all_catch_acc_rate)
workerId catch_rate
A101TNXQVR2UPO 0.2500000
A11Q3D9ADJUKHP 0.3333333
A11SVF9ZNHO1EW 0.7500000
A11U9MQRLTBD7S 0.1666667
A16O7CY4VH5BCP 0.9166667
A16Z47IWMSXYHP 1.0000000
A17WT0K0HFTW9U 0.9166667
A19BZSL0LVFBO2 0.0000000
A19L8SNH73AX1Z 0.8333333
A1BKF0KULCF6Y6 0.5833333
A1BVG13MHBM1YD 1.0000000
A1FYWSPNO7KN1O 1.0000000
A1L3937MY09J3I 0.5833333
A1NN3OSYKM7BLG 0.0000000
A1PUWQYUQRGCO 0.7500000
A1SISJL5ST2PWH 1.0000000
A1TARNH07A75CG 0.6666667
A1TZARLMBLCJ8X 0.9166667
A1V2H0UF94ATWY 1.0000000
A1ZE87WEYCA44A 0.9166667
A2182DBITJFCMZ 0.6666667
A21D9YDJU8K2QI 0.3333333
A21TBK48OBJYSX 1.0000000
A21UA6O7ZFAIQJ 1.0000000
A220ZCMBT1YMMU 1.0000000
A222ICMHU5JXLA 0.0833333
A22JZM6BEETFWF 0.0000000
A2482SLAY120J2 0.9166667
A248QG4DPULP46 1.0000000
A26Z8M2VSEWUU4 0.9166667
A29YJJRBSB7D8I 0.1666667
A2APG8MSLJ6G2K 1.0000000
A2BFHU3EGQES4W 0.0000000
A2CHD0TNWHFW1R 0.9166667
A2FGKKWP33DFWS 1.0000000
A2GOYSTIL3LOV1 1.0000000
A2ODH6HV36EP88 1.0000000
A2OVMMDZQ524IL 0.2500000
A2PIFMM4Q2I9ZS 0.3333333
A2PSR3CMNR1R9X 0.9166667
A2VLTSW6CXIUMR 1.0000000
A2VNSNAN1LZBAM 1.0000000
A2WC2NO555XU3J 1.0000000
A32S6A9SWM5Z67 0.0833333
A36UNYMDBED99W 1.0000000
A39GADIK8RLMVC 1.0000000
A3CASN6JG7104 1.0000000
A3CL8WUGLQHRP 0.0000000
A3DWL14MDONAJ 0.0000000
A3E8NUUS90EWXW 0.7500000
A3EC3OP6U52JYC 0.9166667
A3FCZNB9E8K3CX 1.0000000
A3GK90X2QOFR53 1.0000000
A3H32595TVJ34Q 1.0000000
A3K2ZXAFZCHYZI 0.9166667
A3K9GTQBOI7O5A 0.9166667
A3KF6O09H04SP7 0.9166667
A3KQXRF52U36P2 0.3333333
A3L7IWDL0R3KU9 0.9166667
A3OZB09ZZLZEFQ 0.0000000
A3QRZPJT2CT2IK 0.9166667
A3R818WN41K12K 1.0000000
A3S4M1GQAMPFZB 0.8333333
A3S9VNTRSE21UI 0.0000000
A3SG9Z3TANEGBG 0.0833333
A3SYY5R44RAATE 0.8333333
A3UDUHUVFKD833 1.0000000
A4W9APAHFWVLO 1.0000000
A6EOG99281TB3 0.0000000
A6JKKANO7F4KD 1.0000000
A6X1DYS5VCIL6 0.0000000
AAAHLPAGDOA2U 0.9166667
AECA0YXYZ6A0K 0.4166667
AJODPUVR2P18Q 0.0000000
AK3H5QRAROFGP 1.0000000
AKVDY8OXNMQED 1.0000000
ALBIU0ZCAUNON 0.9166667
AM8OWAW9TUVLN 1.0000000
ANUT13S1G9RWU 1.0000000
AQP4PHYDXRBPI 0.9166667
ARCCEMO6PIE44 1.0000000
ARLGZWN6W91WD 1.0000000
ASB6HK1H1EGA2 0.2500000
ASI2B6A3Y556Z 0.9166667
AU5BD5NSSES9H 0.2500000
AURYD2FH3FUOQ 1.0000000
AXCIG7A957UO6 0.0000000
AXKVHJHF1EOVT 1.0000000

3.2.1.1 Group performance

Plot the group’s overall accuracy on the catch trials.

tbl_all_catch_acc_rate %>% 
  ggbarplot(y = "catch_rate", ylab = "Accuracy", fill = "#f7a800", color = "#f7a800", add = "mean_se", ylim = c(0, 1), xlab = "Group", width = 0.5, label = TRUE, lab.nb.digits = 2, lab.vjust = -2.2, title = "Group Catch Trial Performance")

3.2.1.2 Individual performance

Plot individual subject catch trial performance.

tbl_all_catch_acc_rate %>% 
  ggbarplot(x = "workerId", y = "catch_rate", ylab = "Accuracy", fill = "#f7a800", color = "#f7a800", ylim = c(0, 1), title = "Individual Catch Trial Performance", sort.val = c("asc"), font.xtickslab = 6) + rotate_x_text() + geom_hline(yintercept = .75, linetype = 2)

3.2.1.3 Good vs. Bad catch trial performance

This chunk will categorize subjects with “good” or “bad” catch rates and will create two new dataframes: one for good subjects with a catch rate greater than or equal to .75 and one for bad subjects with a catch rate less than .75. This chunk will also plot the catch rates for both groups.

tbl_all_catch_acc_rate$cat = "filler"
for (i in 1:length(tbl_all_catch_acc_rate$workerId)){
  if (tbl_all_catch_acc_rate$catch_rate[i] >= 0.75){
    tbl_all_catch_acc_rate$cat[i] = "Good"
  } else {
    tbl_all_catch_acc_rate$cat[i] = "Bad"
  }
}

tbl_good_catch_acc_rate <- tbl_all_catch_acc_rate %>%
  filter(catch_rate >= 0.75)
tbl_bad_catch_acc_rate <- tbl_all_catch_acc_rate %>%
  filter(catch_rate < 0.75)

tbl_all_catch_acc_rate %>%
  ggbarplot(x = "cat", y = "catch_rate", ylab = "Accuracy", xlab = "Accuracy Group", add = "mean_se", fill = "#f7a800", color = "#f7a800", ylim = c(0, 1), label = TRUE, lab.nb.digits = 2, lab.vjust = c(-2, -1.2), title = "Catch Performance for Bad and Good Subjects", sort.val = c("asc"))

Independent-samples t-test for good and bad subject catch rates.

tbl_all_catch_acc_rate %>%
  group_by(cat) %>%
  get_summary_stats(catch_rate, type = "mean_se")
## # A tibble: 2 x 5
##   cat   variable       n  mean    se
##   <chr> <chr>      <dbl> <dbl> <dbl>
## 1 Bad   catch_rate    30 0.194 0.04 
## 2 Good  catch_rate    58 0.953 0.009
tbl_all_catch_acc_rate %>% 
  with(t.test(catch_rate ~ cat, var.equal = TRUE))
## 
##  Two Sample t-test
## 
## data:  catch_rate by cat
## t = -24.375, df = 86, p-value < 2.2e-16
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.8199736 -0.6963099
## sample estimates:
##  mean in group Bad mean in group Good 
##          0.1944444          0.9525862

3.2.2 Accuracy on main trials

Select the subjects with good catch trial rates from the original tbl_all.

tbl_good_catch_acc_all_main_acc <- tbl_all[(tbl_all$workerId %in% tbl_good_catch_acc_rate$workerId),]

Verify subject count.

nrow(tbl_good_catch_acc_all_main_acc %>% distinct(workerId,.keep_all = FALSE))
## [1] 58

Generate a new table containing the number of trials for each individual after excluding main trials based on accuracy and another table that is binned.

tbl_good_catch_acc_all_main_acc_counts <- tbl_good_catch_acc_all_main_acc %>%
  group_by(workerId,validity) %>%
  filter((validity=='valid' | validity=='invalid_same' | validity=='invalid_different') & click_ACC == 1) %>%
  dplyr::summarize(counts = n()) %>%
  spread(validity,counts)
tbl_good_catch_acc_all_main_acc_counts$sum = rowSums(tbl_good_catch_acc_all_main_acc_counts[,c(-1)], na.rm = TRUE)
kable(tbl_good_catch_acc_all_main_acc_counts)
workerId valid invalid_same invalid_different sum
A11SVF9ZNHO1EW 45 14 16 75
A16O7CY4VH5BCP 45 13 15 73
A16Z47IWMSXYHP 46 16 15 77
A17WT0K0HFTW9U 46 13 15 74
A19L8SNH73AX1Z 45 16 12 73
A1BVG13MHBM1YD 41 15 15 71
A1FYWSPNO7KN1O 48 16 16 80
A1PUWQYUQRGCO 21 7 6 34
A1SISJL5ST2PWH 46 15 16 77
A1TZARLMBLCJ8X 47 16 16 79
A1V2H0UF94ATWY 48 16 15 79
A1ZE87WEYCA44A 42 13 14 69
A21TBK48OBJYSX 48 15 16 79
A21UA6O7ZFAIQJ 47 16 16 79
A220ZCMBT1YMMU 47 15 15 77
A2482SLAY120J2 41 11 14 66
A248QG4DPULP46 47 15 16 78
A26Z8M2VSEWUU4 46 16 15 77
A2APG8MSLJ6G2K 47 14 14 75
A2CHD0TNWHFW1R 15 1 2 18
A2FGKKWP33DFWS 44 13 15 72
A2GOYSTIL3LOV1 48 15 16 79
A2ODH6HV36EP88 46 16 15 77
A2PSR3CMNR1R9X 47 12 14 73
A2VLTSW6CXIUMR 44 14 15 73
A2VNSNAN1LZBAM 47 15 15 77
A2WC2NO555XU3J 46 16 16 78
A36UNYMDBED99W 47 16 16 79
A39GADIK8RLMVC 48 16 16 80
A3CASN6JG7104 14 7 7 28
A3E8NUUS90EWXW 41 5 5 51
A3EC3OP6U52JYC 44 13 12 69
A3FCZNB9E8K3CX 48 14 14 76
A3GK90X2QOFR53 44 12 10 66
A3H32595TVJ34Q 47 15 15 77
A3K2ZXAFZCHYZI 40 9 9 58
A3K9GTQBOI7O5A 48 15 15 78
A3KF6O09H04SP7 47 16 14 77
A3L7IWDL0R3KU9 43 15 13 71
A3QRZPJT2CT2IK 46 15 16 77
A3R818WN41K12K 48 16 15 79
A3S4M1GQAMPFZB 32 7 9 48
A3SYY5R44RAATE 20 8 8 36
A3UDUHUVFKD833 48 15 15 78
A4W9APAHFWVLO 33 14 12 59
A6JKKANO7F4KD 48 16 16 80
AAAHLPAGDOA2U 48 16 16 80
AK3H5QRAROFGP 46 16 14 76
AKVDY8OXNMQED 44 14 16 74
ALBIU0ZCAUNON 47 16 15 78
AM8OWAW9TUVLN 45 15 16 76
ANUT13S1G9RWU 48 16 16 80
AQP4PHYDXRBPI 46 13 13 72
ARCCEMO6PIE44 45 14 15 74
ARLGZWN6W91WD 45 16 15 76
ASI2B6A3Y556Z 47 15 15 77
AURYD2FH3FUOQ 48 16 16 80
AXKVHJHF1EOVT 43 16 13 72
tbl_good_catch_acc_all_main_acc_counts_bin <- tbl_good_catch_acc_all_main_acc %>%
  group_by(workerId,validity,bin) %>%
  filter((validity=='valid' | validity=='invalid_same' | validity=='invalid_different') & click_ACC == 1) %>%
  dplyr::summarize(counts = n()) %>%
  spread(validity,counts)
tbl_good_catch_acc_all_main_acc_counts_bin$sum = rowSums(tbl_good_catch_acc_all_main_acc_counts_bin[,c(-1:-2)], na.rm = TRUE)
#kable(tbl_good_catch_acc_all_main_acc_counts_bin)

Some subjects may have no surviving data for a particular condition. These subjects should be tossed because they have an unequal number of conditions compared to the other subjects.

tbl_good_catch_acc_all_main_acc_NA_conditions_removed <- tbl_good_catch_acc_all_main_acc_counts %>%
  filter(valid!="NA" & invalid_same!="NA" & invalid_different!="NA")

Same table, but binned.

tbl_good_catch_acc_all_main_acc_NA_conditions_removed_bin <- tbl_good_catch_acc_all_main_acc_counts_bin[(tbl_good_catch_acc_all_main_acc_counts_bin$workerId %in% tbl_good_catch_acc_all_main_acc_NA_conditions_removed$workerId),]

Now, let’s get rid of any subjects with NA from tbl_good_catch_acc_all_main_acc and get a count of the number of subjects.

tbl_good_catch_acc_all_main_acc_NA_subjs_removed <- tbl_good_catch_acc_all_main_acc[(tbl_good_catch_acc_all_main_acc$workerId %in% tbl_good_catch_acc_all_main_acc_NA_conditions_removed$workerId),]

nrow(tbl_good_catch_acc_all_main_acc_NA_subjs_removed %>% distinct(workerId,.keep_all = FALSE))
## [1] 58

Get the original number of trials for the relevant subjects.

tbl_good_catch_acc_all_main_acc_counts <- tbl_all_counts_no_catch[(tbl_all_counts_no_catch$workerId %in% tbl_good_catch_acc_all_main_acc_NA_conditions_removed$workerId),]
kable(tbl_good_catch_acc_all_main_acc_counts)
workerId valid invalid_same invalid_different sum
A11SVF9ZNHO1EW 48 16 16 80
A16O7CY4VH5BCP 48 16 16 80
A16Z47IWMSXYHP 48 16 16 80
A17WT0K0HFTW9U 48 16 16 80
A19L8SNH73AX1Z 48 16 16 80
A1BVG13MHBM1YD 48 16 16 80
A1FYWSPNO7KN1O 48 16 16 80
A1PUWQYUQRGCO 48 16 16 80
A1SISJL5ST2PWH 48 16 16 80
A1TZARLMBLCJ8X 48 16 16 80
A1V2H0UF94ATWY 48 16 16 80
A1ZE87WEYCA44A 48 16 16 80
A21TBK48OBJYSX 48 16 16 80
A21UA6O7ZFAIQJ 48 16 16 80
A220ZCMBT1YMMU 48 16 16 80
A2482SLAY120J2 48 16 16 80
A248QG4DPULP46 48 16 16 80
A26Z8M2VSEWUU4 48 16 16 80
A2APG8MSLJ6G2K 48 16 16 80
A2CHD0TNWHFW1R 48 16 16 80
A2FGKKWP33DFWS 48 16 16 80
A2GOYSTIL3LOV1 48 16 16 80
A2ODH6HV36EP88 48 16 16 80
A2PSR3CMNR1R9X 48 16 16 80
A2VLTSW6CXIUMR 48 16 16 80
A2VNSNAN1LZBAM 48 16 16 80
A2WC2NO555XU3J 48 16 16 80
A36UNYMDBED99W 48 16 16 80
A39GADIK8RLMVC 48 16 16 80
A3CASN6JG7104 48 16 16 80
A3E8NUUS90EWXW 48 16 16 80
A3EC3OP6U52JYC 48 16 16 80
A3FCZNB9E8K3CX 48 16 16 80
A3GK90X2QOFR53 48 16 16 80
A3H32595TVJ34Q 48 16 16 80
A3K2ZXAFZCHYZI 48 16 16 80
A3K9GTQBOI7O5A 48 16 16 80
A3KF6O09H04SP7 48 16 16 80
A3L7IWDL0R3KU9 48 16 16 80
A3QRZPJT2CT2IK 48 16 16 80
A3R818WN41K12K 48 16 16 80
A3S4M1GQAMPFZB 48 16 16 80
A3SYY5R44RAATE 48 16 16 80
A3UDUHUVFKD833 48 16 16 80
A4W9APAHFWVLO 48 16 16 80
A6JKKANO7F4KD 48 16 16 80
AAAHLPAGDOA2U 48 16 16 80
AK3H5QRAROFGP 48 16 16 80
AKVDY8OXNMQED 48 16 16 80
ALBIU0ZCAUNON 48 16 16 80
AM8OWAW9TUVLN 48 16 16 80
ANUT13S1G9RWU 48 16 16 80
AQP4PHYDXRBPI 48 16 16 80
ARCCEMO6PIE44 48 16 16 80
ARLGZWN6W91WD 48 16 16 80
ASI2B6A3Y556Z 48 16 16 80
AURYD2FH3FUOQ 48 16 16 80
AXKVHJHF1EOVT 48 16 16 80

3.2.2.1 Group performance

Plot the overall accuracy at the group level.

tbl_overall_good_acc <- (tbl_good_catch_acc_all_main_acc_NA_conditions_removed$sum / tbl_good_catch_acc_all_main_acc_counts$sum)
tbl_overall_good_acc <- cbind.data.frame(tbl_good_catch_acc_all_main_acc_counts[,1], tbl_overall_good_acc)
colnames(tbl_overall_good_acc) <- c("workerId", "main_rate")
kable(tbl_overall_good_acc)
workerId main_rate
A11SVF9ZNHO1EW 0.9375
A16O7CY4VH5BCP 0.9125
A16Z47IWMSXYHP 0.9625
A17WT0K0HFTW9U 0.9250
A19L8SNH73AX1Z 0.9125
A1BVG13MHBM1YD 0.8875
A1FYWSPNO7KN1O 1.0000
A1PUWQYUQRGCO 0.4250
A1SISJL5ST2PWH 0.9625
A1TZARLMBLCJ8X 0.9875
A1V2H0UF94ATWY 0.9875
A1ZE87WEYCA44A 0.8625
A21TBK48OBJYSX 0.9875
A21UA6O7ZFAIQJ 0.9875
A220ZCMBT1YMMU 0.9625
A2482SLAY120J2 0.8250
A248QG4DPULP46 0.9750
A26Z8M2VSEWUU4 0.9625
A2APG8MSLJ6G2K 0.9375
A2CHD0TNWHFW1R 0.2250
A2FGKKWP33DFWS 0.9000
A2GOYSTIL3LOV1 0.9875
A2ODH6HV36EP88 0.9625
A2PSR3CMNR1R9X 0.9125
A2VLTSW6CXIUMR 0.9125
A2VNSNAN1LZBAM 0.9625
A2WC2NO555XU3J 0.9750
A36UNYMDBED99W 0.9875
A39GADIK8RLMVC 1.0000
A3CASN6JG7104 0.3500
A3E8NUUS90EWXW 0.6375
A3EC3OP6U52JYC 0.8625
A3FCZNB9E8K3CX 0.9500
A3GK90X2QOFR53 0.8250
A3H32595TVJ34Q 0.9625
A3K2ZXAFZCHYZI 0.7250
A3K9GTQBOI7O5A 0.9750
A3KF6O09H04SP7 0.9625
A3L7IWDL0R3KU9 0.8875
A3QRZPJT2CT2IK 0.9625
A3R818WN41K12K 0.9875
A3S4M1GQAMPFZB 0.6000
A3SYY5R44RAATE 0.4500
A3UDUHUVFKD833 0.9750
A4W9APAHFWVLO 0.7375
A6JKKANO7F4KD 1.0000
AAAHLPAGDOA2U 1.0000
AK3H5QRAROFGP 0.9500
AKVDY8OXNMQED 0.9250
ALBIU0ZCAUNON 0.9750
AM8OWAW9TUVLN 0.9500
ANUT13S1G9RWU 1.0000
AQP4PHYDXRBPI 0.9000
ARCCEMO6PIE44 0.9250
ARLGZWN6W91WD 0.9500
ASI2B6A3Y556Z 0.9625
AURYD2FH3FUOQ 1.0000
AXKVHJHF1EOVT 0.9000
tbl_overall_good_acc %>% 
  ggbarplot(y = "main_rate", ylab = "Accuracy", fill = "#f7a800", color = "#f7a800", add = "mean_se", ylim = c(0, 1), xlab = "Group", width = 0.5, label = TRUE, lab.nb.digits = 2, lab.vjust = -1.4, title = "Group Main Trial Performance")

3.2.2.2 Accuracy over time

tbl_good_no_NA_bin <- tbl_good_catch_acc_all_main_acc_NA_subjs_removed %>%
  group_by(workerId,validity,bin) %>%
  filter(validity=='valid' | validity=='invalid_same' | validity=='invalid_different') %>%
  dplyr::summarize(counts = n()) %>%
  spread(validity,counts)
tbl_good_no_NA_bin$sum = rowSums(tbl_good_no_NA_bin[,c(-1:-2)], na.rm = TRUE)
#head(tbl_good_no_NA_bin,10)

tbl_overall_good_acc_bin <- (tbl_good_catch_acc_all_main_acc_NA_conditions_removed_bin$sum / tbl_good_no_NA_bin$sum)
tbl_overall_good_acc_bin <- cbind.data.frame(tbl_good_no_NA_bin[,1:2], tbl_overall_good_acc_bin)
colnames(tbl_overall_good_acc_bin) <- c("workerId", "bin", "ACC")
tbl_overall_good_acc_bin %>% 
  ggline(y = "ACC", x = "bin", ylab = "Accuracy", fill = "#f7a800", color = "#f7a800", add = "mean_se", ylim = c(0, 1), xlab = " Bin", title = "Group Main Trial Performance Over Time", na.rm = TRUE)

Here are repeated measures ANOVA and post-hoc t-tests for the effect of accuracy over time.

tbl_overall_good_acc_bin %>%
  group_by(bin) %>%
  get_summary_stats(ACC, type = "mean_se")
## # A tibble: 4 x 5
##     bin variable     n  mean    se
##   <dbl> <chr>    <dbl> <dbl> <dbl>
## 1     1 ACC         58 0.902 0.018
## 2     2 ACC         58 0.889 0.023
## 3     3 ACC         58 0.886 0.026
## 4     4 ACC         58 0.877 0.028
aov_acc_time <- aov(ACC ~ bin + Error(factor(workerId)/bin), tbl_overall_good_acc_bin)
summary(aov_acc_time)
## 
## Error: factor(workerId)
##           Df Sum Sq Mean Sq F value Pr(>F)
## Residuals 57  6.337  0.1112               
## 
## Error: factor(workerId):bin
##           Df Sum Sq Mean Sq F value Pr(>F)
## bin        1 0.0178 0.01778   1.034  0.313
## Residuals 57 0.9799 0.01719               
## 
## Error: Within
##            Df Sum Sq  Mean Sq F value Pr(>F)
## Residuals 116 0.4365 0.003763
pwc_acc_time <- tbl_overall_good_acc_bin %>%
  pairwise_t_test(
    ACC ~ bin, paired = TRUE,
    p.adjust.method = "bonferroni"
    )
pwc_acc_time
## # A tibble: 6 x 10
##   .y.   group1 group2    n1    n2 statistic    df     p p.adj p.adj.signif
## * <chr> <chr>  <chr>  <int> <int>     <dbl> <dbl> <dbl> <dbl> <chr>       
## 1 ACC   1      2         58    58     0.771    57 0.444     1 ns          
## 2 ACC   1      3         58    58     0.742    57 0.461     1 ns          
## 3 ACC   1      4         58    58     1.05     57 0.296     1 ns          
## 4 ACC   2      3         58    58     0.260    57 0.796     1 ns          
## 5 ACC   2      4         58    58     0.917    57 0.363     1 ns          
## 6 ACC   3      4         58    58     0.870    57 0.388     1 ns

3.2.2.3 Accuracy by validty

tbl_overall_good_acc_cond <- (tbl_good_catch_acc_all_main_acc_NA_conditions_removed[-1] / tbl_good_catch_acc_all_main_acc_counts[-1])
tbl_overall_good_acc_cond <- cbind.data.frame(tbl_good_catch_acc_all_main_acc_counts[,1], tbl_overall_good_acc_cond)
tbl_overall_good_acc_cond <- gather(tbl_overall_good_acc_cond, validity, acc, valid:invalid_different, factor_key=TRUE)
tbl_overall_good_acc_cond %>%   
  ggbarplot(x = "validity", y = "acc", ylab = "Accuracy", fill = "validity" , color = "validity", palette = c("#0d2240", "#00a8e1", "#f7a800", "#E31818", "#dfdddc"), add = "mean_se", ylim = c(0, 1), na.rm = TRUE, label = TRUE, lab.nb.digits = 2, lab.vjust = c(-1.6, -1.6, -1.6), title = "Group Main Trial Performance By Validity", xlab = "Validity")

Here are repeated measures ANOVA and post-hoc t-tests for the effect of accuracy by validty.

tbl_overall_good_acc_cond %>%
  group_by(validity) %>%
  get_summary_stats(acc, type = "mean_se")
## # A tibble: 3 x 5
##   validity          variable     n  mean    se
##   <fct>             <chr>    <dbl> <dbl> <dbl>
## 1 valid             acc         58 0.904 0.021
## 2 invalid_same      acc         58 0.863 0.026
## 3 invalid_different acc         58 0.864 0.025
aov_acc_validity <- aov(acc ~ validity + Error(factor(workerId)/validity), tbl_overall_good_acc_cond)
summary(aov_acc_validity)
## 
## Error: factor(workerId)
##           Df Sum Sq Mean Sq F value Pr(>F)
## Residuals 57  5.304 0.09305               
## 
## Error: factor(workerId):validity
##            Df Sum Sq Mean Sq F value  Pr(>F)   
## validity    2 0.0643 0.03215   6.168 0.00286 **
## Residuals 114 0.5943 0.00521                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
pwc_acc_validity <- tbl_overall_good_acc_cond %>%
  pairwise_t_test(
    acc ~ validity, paired = TRUE,
    p.adjust.method = "bonferroni"
    )
pwc_acc_validity
## # A tibble: 3 x 10
##   .y.   group1    group2       n1    n2 statistic    df     p p.adj p.adj.signif
## * <chr> <chr>     <chr>     <int> <int>     <dbl> <dbl> <dbl> <dbl> <chr>       
## 1 acc   valid     invalid_…    58    58    2.76      57 0.008 0.023 *           
## 2 acc   valid     invalid_…    58    58    2.87      57 0.006 0.017 *           
## 3 acc   invalid_… invalid_…    58    58   -0.0987    57 0.922 1     ns

3.2.2.4 Individual performance

Plot the performance for each individual subject.

tbl_overall_good_acc %>% 
  ggbarplot(x = "workerId", y = "main_rate", ylab = "Accuracy", fill = "#f7a800", color = "#f7a800", ylim = c(0, 1), title = "Individual Main Trial Performance", sort.val = c("asc"), font.xtickslab = 8) + rotate_x_text() + geom_hline(yintercept = 0, linetype = 2)

3.3 Remove outlier trials

Inspect data for RT outliers. RTs more than 3 SDs from the subject mean will be removed.

tbl_good_catch_acc_all_main_acc_NA_subjs_removed <- tbl_good_catch_acc_all_main_acc_NA_subjs_removed %>%
  filter(validity!='catch')

Convert raw RTs to log-transformed RTs

tbl_good_catch_acc_all_main_acc_NA_subjs_removed$log_rt = log(tbl_good_catch_acc_all_main_acc_NA_subjs_removed$rt)

This chunk will process RTs by coding them as outliers (again, by more than 3 SDs). Two additional columns are added to the data table. First, an “outliers” column is added that labels an RT as an outlier or not (0 = not an outlier, 1 = an outlier that is great than -3 SDs from the mean, 2 = an outlier that is greater than +3 SDs from the mean). Second, a “removed_RT” column is added that contains non-outlier RTs.

Note: code can be changed to allow for replacement of outliers with the cutoff values.

correct.trials <- tbl_good_catch_acc_all_main_acc_NA_subjs_removed[tbl_good_catch_acc_all_main_acc_NA_subjs_removed$click_ACC == 1,]

tbl_good_catch_acc_all_main_acc_NA_subjs_removed <- ddply(correct.trials, .(workerId), function(x){
  m <- mean(x$log_rt)
  s <- sd(x$log_rt)
  upper <- m + 3*s #change to increase or decrease cutoff criteria
  lower <- m - 3*s #change to increase or decrease cutoff criteria
  
  x$outliers <- 0
  x$outliers[x$log_rt > upper] <- 2
  x$outliers[x$log_rt < lower] <- 1
  x$removed_RT <- x$log_rt
  x$removed_RT[x$log_rt > upper]<- NA #replace with upper to replace an outlier with the upper cutoff
  x$removed_RT[x$log_rt < lower]<- NA #replace with lower to replace an outlier with the lower cutoff
  
  x
})

Get trial counts.

tbl_good_catch_acc_all_main_acc_counts <- tbl_good_catch_acc_all_main_acc_NA_subjs_removed %>%
  group_by(workerId,validity) %>%
  filter(validity=='valid' | validity=='invalid_same' | validity=='invalid_different') %>%
  dplyr::summarize(counts = n()) %>%
  spread(validity,counts)
tbl_good_catch_acc_all_main_acc_counts$sum = rowSums(tbl_good_catch_acc_all_main_acc_counts[,c(-1)], na.rm = TRUE)

Remove outliers.

tbl_good_catch_acc_all_main_acc_NA_subjs_removed_3_SDs_removed <- tbl_good_catch_acc_all_main_acc_NA_subjs_removed[!is.na(tbl_good_catch_acc_all_main_acc_NA_subjs_removed$removed_RT),]

Make a table containing the number of trials for each individual after excluding trials based on accuracy AND outliers.

tbl_good_catch_acc_all_main_acc_NA_subjs_removed_3_SDs_removed_counts <- tbl_good_catch_acc_all_main_acc_NA_subjs_removed_3_SDs_removed %>%
  group_by(workerId,validity) %>%
  filter(validity=='valid' | validity=='invalid_same' | validity=='invalid_different') %>%
  dplyr::summarize(counts = n()) %>%
  spread(validity,counts)
tbl_good_catch_acc_all_main_acc_NA_subjs_removed_3_SDs_removed_counts$sum = rowSums(tbl_good_catch_acc_all_main_acc_NA_subjs_removed_3_SDs_removed_counts[,c(-1)], na.rm = TRUE)
kable(tbl_good_catch_acc_all_main_acc_NA_subjs_removed_3_SDs_removed_counts)
workerId valid invalid_same invalid_different sum
A11SVF9ZNHO1EW 44 14 16 74
A16O7CY4VH5BCP 44 12 15 71
A16Z47IWMSXYHP 46 16 14 76
A17WT0K0HFTW9U 46 13 15 74
A19L8SNH73AX1Z 45 16 12 73
A1BVG13MHBM1YD 40 14 14 68
A1FYWSPNO7KN1O 48 16 16 80
A1PUWQYUQRGCO 20 7 6 33
A1SISJL5ST2PWH 46 15 15 76
A1TZARLMBLCJ8X 47 16 15 78
A1V2H0UF94ATWY 48 16 14 78
A1ZE87WEYCA44A 41 12 14 67
A21TBK48OBJYSX 48 15 16 79
A21UA6O7ZFAIQJ 47 16 16 79
A220ZCMBT1YMMU 47 15 15 77
A2482SLAY120J2 41 11 14 66
A248QG4DPULP46 47 15 16 78
A26Z8M2VSEWUU4 45 16 15 76
A2APG8MSLJ6G2K 47 13 14 74
A2CHD0TNWHFW1R 15 1 2 18
A2FGKKWP33DFWS 44 13 15 72
A2GOYSTIL3LOV1 48 14 16 78
A2ODH6HV36EP88 45 16 15 76
A2PSR3CMNR1R9X 46 12 14 72
A2VLTSW6CXIUMR 44 14 15 73
A2VNSNAN1LZBAM 46 13 15 74
A2WC2NO555XU3J 44 16 16 76
A36UNYMDBED99W 46 16 16 78
A39GADIK8RLMVC 48 15 16 79
A3CASN6JG7104 14 6 7 27
A3E8NUUS90EWXW 41 5 5 51
A3EC3OP6U52JYC 44 13 11 68
A3FCZNB9E8K3CX 47 14 14 75
A3GK90X2QOFR53 44 12 10 66
A3H32595TVJ34Q 46 14 15 75
A3K2ZXAFZCHYZI 39 8 9 56
A3K9GTQBOI7O5A 48 15 14 77
A3KF6O09H04SP7 47 15 14 76
A3L7IWDL0R3KU9 43 15 13 71
A3QRZPJT2CT2IK 46 15 15 76
A3R818WN41K12K 48 15 15 78
A3S4M1GQAMPFZB 31 7 9 47
A3SYY5R44RAATE 20 8 8 36
A3UDUHUVFKD833 47 15 15 77
A4W9APAHFWVLO 32 14 12 58
A6JKKANO7F4KD 48 16 16 80
AAAHLPAGDOA2U 47 16 16 79
AK3H5QRAROFGP 45 16 14 75
AKVDY8OXNMQED 44 14 16 74
ALBIU0ZCAUNON 47 16 15 78
AM8OWAW9TUVLN 45 14 16 75
ANUT13S1G9RWU 48 16 16 80
AQP4PHYDXRBPI 44 13 13 70
ARCCEMO6PIE44 43 14 15 72
ARLGZWN6W91WD 45 15 15 75
ASI2B6A3Y556Z 47 14 15 76
AURYD2FH3FUOQ 47 16 16 79
AXKVHJHF1EOVT 42 16 12 70

What was the percentage of outlier RTs that were removed?

tbl_rts_removed_count <- tbl_good_catch_acc_all_main_acc_counts[-1] - tbl_good_catch_acc_all_main_acc_NA_subjs_removed_3_SDs_removed_counts[-1]
per_RTs_removed <- (sum(tbl_rts_removed_count$sum) / sum(tbl_good_catch_acc_all_main_acc_counts$sum)) * 100
per_RTs_removed
## [1] 1.237564

4 Analyze data

4.1 Summary statistics

Confirm subject count.

nrow(data.frame(tbl_good_catch_acc_all_main_acc_NA_subjs_removed_3_SDs_removed %>% distinct(workerId,.keep_all = FALSE)))
## [1] 58

Get RTs to look for space-based and object-based change blindness effects.

tbl_final <- tbl_good_catch_acc_all_main_acc_NA_subjs_removed_3_SDs_removed %>%
  group_by(workerId,validity) %>%
  filter(validity=='valid' | validity=='invalid_same' | validity=='invalid_different') %>%
  dplyr::summarize(mean_rt = mean(removed_RT, na.rm=TRUE))
kable(tbl_final)
workerId validity mean_rt
A11SVF9ZNHO1EW valid 8.456109
A11SVF9ZNHO1EW invalid_same 8.602598
A11SVF9ZNHO1EW invalid_different 8.648993
A16O7CY4VH5BCP valid 8.649287
A16O7CY4VH5BCP invalid_same 8.706293
A16O7CY4VH5BCP invalid_different 8.674030
A16Z47IWMSXYHP valid 8.959972
A16Z47IWMSXYHP invalid_same 9.197162
A16Z47IWMSXYHP invalid_different 8.839295
A17WT0K0HFTW9U valid 8.494026
A17WT0K0HFTW9U invalid_same 8.709705
A17WT0K0HFTW9U invalid_different 8.751275
A19L8SNH73AX1Z valid 8.659580
A19L8SNH73AX1Z invalid_same 8.620685
A19L8SNH73AX1Z invalid_different 8.790361
A1BVG13MHBM1YD valid 8.504060
A1BVG13MHBM1YD invalid_same 8.486502
A1BVG13MHBM1YD invalid_different 8.470549
A1FYWSPNO7KN1O valid 8.458960
A1FYWSPNO7KN1O invalid_same 8.541877
A1FYWSPNO7KN1O invalid_different 8.508734
A1PUWQYUQRGCO valid 8.998045
A1PUWQYUQRGCO invalid_same 8.965420
A1PUWQYUQRGCO invalid_different 8.957675
A1SISJL5ST2PWH valid 8.322482
A1SISJL5ST2PWH invalid_same 8.332808
A1SISJL5ST2PWH invalid_different 8.323938
A1TZARLMBLCJ8X valid 8.545970
A1TZARLMBLCJ8X invalid_same 8.649315
A1TZARLMBLCJ8X invalid_different 8.670051
A1V2H0UF94ATWY valid 8.448347
A1V2H0UF94ATWY invalid_same 8.706847
A1V2H0UF94ATWY invalid_different 8.832090
A1ZE87WEYCA44A valid 8.466280
A1ZE87WEYCA44A invalid_same 8.644571
A1ZE87WEYCA44A invalid_different 8.563437
A21TBK48OBJYSX valid 8.533446
A21TBK48OBJYSX invalid_same 8.739526
A21TBK48OBJYSX invalid_different 8.708159
A21UA6O7ZFAIQJ valid 8.468815
A21UA6O7ZFAIQJ invalid_same 8.529539
A21UA6O7ZFAIQJ invalid_different 8.541617
A220ZCMBT1YMMU valid 8.882811
A220ZCMBT1YMMU invalid_same 8.838572
A220ZCMBT1YMMU invalid_different 8.932768
A2482SLAY120J2 valid 8.476759
A2482SLAY120J2 invalid_same 8.490232
A2482SLAY120J2 invalid_different 8.541896
A248QG4DPULP46 valid 8.377319
A248QG4DPULP46 invalid_same 8.553648
A248QG4DPULP46 invalid_different 8.633710
A26Z8M2VSEWUU4 valid 8.433100
A26Z8M2VSEWUU4 invalid_same 8.480079
A26Z8M2VSEWUU4 invalid_different 8.465024
A2APG8MSLJ6G2K valid 8.414124
A2APG8MSLJ6G2K invalid_same 8.512980
A2APG8MSLJ6G2K invalid_different 8.611116
A2CHD0TNWHFW1R valid 8.376394
A2CHD0TNWHFW1R invalid_same 8.576405
A2CHD0TNWHFW1R invalid_different 8.572918
A2FGKKWP33DFWS valid 8.751278
A2FGKKWP33DFWS invalid_same 8.731869
A2FGKKWP33DFWS invalid_different 8.866331
A2GOYSTIL3LOV1 valid 8.389103
A2GOYSTIL3LOV1 invalid_same 8.448631
A2GOYSTIL3LOV1 invalid_different 8.487213
A2ODH6HV36EP88 valid 8.446214
A2ODH6HV36EP88 invalid_same 8.472285
A2ODH6HV36EP88 invalid_different 8.472303
A2PSR3CMNR1R9X valid 8.348904
A2PSR3CMNR1R9X invalid_same 8.538455
A2PSR3CMNR1R9X invalid_different 8.488500
A2VLTSW6CXIUMR valid 8.518279
A2VLTSW6CXIUMR invalid_same 8.689178
A2VLTSW6CXIUMR invalid_different 8.661116
A2VNSNAN1LZBAM valid 8.588548
A2VNSNAN1LZBAM invalid_same 8.605652
A2VNSNAN1LZBAM invalid_different 8.605833
A2WC2NO555XU3J valid 8.408541
A2WC2NO555XU3J invalid_same 8.551902
A2WC2NO555XU3J invalid_different 8.537892
A36UNYMDBED99W valid 8.382208
A36UNYMDBED99W invalid_same 8.675847
A36UNYMDBED99W invalid_different 8.665875
A39GADIK8RLMVC valid 8.406123
A39GADIK8RLMVC invalid_same 8.546174
A39GADIK8RLMVC invalid_different 8.544483
A3CASN6JG7104 valid 9.161832
A3CASN6JG7104 invalid_same 9.148440
A3CASN6JG7104 invalid_different 9.114296
A3E8NUUS90EWXW valid 8.851131
A3E8NUUS90EWXW invalid_same 9.034069
A3E8NUUS90EWXW invalid_different 9.151191
A3EC3OP6U52JYC valid 8.393816
A3EC3OP6U52JYC invalid_same 8.455376
A3EC3OP6U52JYC invalid_different 8.445761
A3FCZNB9E8K3CX valid 8.396722
A3FCZNB9E8K3CX invalid_same 8.515996
A3FCZNB9E8K3CX invalid_different 8.451881
A3GK90X2QOFR53 valid 8.377574
A3GK90X2QOFR53 invalid_same 8.438258
A3GK90X2QOFR53 invalid_different 8.457039
A3H32595TVJ34Q valid 8.553053
A3H32595TVJ34Q invalid_same 8.554043
A3H32595TVJ34Q invalid_different 8.586245
A3K2ZXAFZCHYZI valid 8.325395
A3K2ZXAFZCHYZI invalid_same 8.504777
A3K2ZXAFZCHYZI invalid_different 8.471056
A3K9GTQBOI7O5A valid 8.513049
A3K9GTQBOI7O5A invalid_same 8.620528
A3K9GTQBOI7O5A invalid_different 8.509867
A3KF6O09H04SP7 valid 8.427044
A3KF6O09H04SP7 invalid_same 8.444898
A3KF6O09H04SP7 invalid_different 8.447040
A3L7IWDL0R3KU9 valid 8.523349
A3L7IWDL0R3KU9 invalid_same 8.588035
A3L7IWDL0R3KU9 invalid_different 8.578304
A3QRZPJT2CT2IK valid 8.534204
A3QRZPJT2CT2IK invalid_same 8.623755
A3QRZPJT2CT2IK invalid_different 8.700921
A3R818WN41K12K valid 8.780663
A3R818WN41K12K invalid_same 8.808247
A3R818WN41K12K invalid_different 8.813387
A3S4M1GQAMPFZB valid 8.770761
A3S4M1GQAMPFZB invalid_same 8.826467
A3S4M1GQAMPFZB invalid_different 8.927005
A3SYY5R44RAATE valid 8.791925
A3SYY5R44RAATE invalid_same 8.865266
A3SYY5R44RAATE invalid_different 8.935530
A3UDUHUVFKD833 valid 8.436538
A3UDUHUVFKD833 invalid_same 8.568842
A3UDUHUVFKD833 invalid_different 8.628770
A4W9APAHFWVLO valid 8.365902
A4W9APAHFWVLO invalid_same 8.447798
A4W9APAHFWVLO invalid_different 8.514369
A6JKKANO7F4KD valid 8.492934
A6JKKANO7F4KD invalid_same 8.650644
A6JKKANO7F4KD invalid_different 8.675268
AAAHLPAGDOA2U valid 8.547024
AAAHLPAGDOA2U invalid_same 8.539426
AAAHLPAGDOA2U invalid_different 8.569416
AK3H5QRAROFGP valid 8.372745
AK3H5QRAROFGP invalid_same 8.579777
AK3H5QRAROFGP invalid_different 8.742136
AKVDY8OXNMQED valid 8.679495
AKVDY8OXNMQED invalid_same 8.588871
AKVDY8OXNMQED invalid_different 8.684359
ALBIU0ZCAUNON valid 8.436212
ALBIU0ZCAUNON invalid_same 8.605067
ALBIU0ZCAUNON invalid_different 8.681684
AM8OWAW9TUVLN valid 8.436816
AM8OWAW9TUVLN invalid_same 8.521489
AM8OWAW9TUVLN invalid_different 8.520011
ANUT13S1G9RWU valid 8.499569
ANUT13S1G9RWU invalid_same 8.544304
ANUT13S1G9RWU invalid_different 8.569738
AQP4PHYDXRBPI valid 8.573309
AQP4PHYDXRBPI invalid_same 8.676882
AQP4PHYDXRBPI invalid_different 8.644967
ARCCEMO6PIE44 valid 8.348785
ARCCEMO6PIE44 invalid_same 8.381960
ARCCEMO6PIE44 invalid_different 8.352390
ARLGZWN6W91WD valid 8.443314
ARLGZWN6W91WD invalid_same 8.619507
ARLGZWN6W91WD invalid_different 8.516193
ASI2B6A3Y556Z valid 8.420604
ASI2B6A3Y556Z invalid_same 8.674450
ASI2B6A3Y556Z invalid_different 8.674343
AURYD2FH3FUOQ valid 8.558470
AURYD2FH3FUOQ invalid_same 8.714250
AURYD2FH3FUOQ invalid_different 8.708656
AXKVHJHF1EOVT valid 8.626881
AXKVHJHF1EOVT invalid_same 8.639855
AXKVHJHF1EOVT invalid_different 8.586375
tbl_final %>%
  group_by(validity) %>%
  get_summary_stats(mean_rt, type = "mean_se")
## # A tibble: 3 x 5
##   validity          variable     n  mean    se
##   <fct>             <chr>    <dbl> <dbl> <dbl>
## 1 valid             mean_rt     58  8.53 0.024
## 2 invalid_same      mean_rt     58  8.63 0.022
## 3 invalid_different mean_rt     58  8.64 0.023

4.2 Plot

tbl_final %>% 
  ggbarplot(x = "validity", y = "mean_rt", ylab = "Mean log-transformed RT", fill = "validity" , color = "validity", palette = c("#0d2240", "#00a8e1", "#f7a800"), add = "mean_se", ylim = c(8, 9))

4.3 ANOVA and t-tests

Repeated measures ANOVA

aov_rt_validity <- aov(mean_rt ~ validity + Error(factor(workerId)/validity), tbl_final)
summary(aov_rt_validity)
## 
## Error: factor(workerId)
##           Df Sum Sq Mean Sq F value Pr(>F)
## Residuals 57   4.71 0.08263               
## 
## Error: factor(workerId):validity
##            Df Sum Sq Mean Sq F value   Pr(>F)    
## validity    2 0.4005 0.20024   48.65 5.31e-16 ***
## Residuals 114 0.4692 0.00412                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Pairwise comparison. First, space-based attentional selection; Second, object-based attentional selection is second.

tbl_final %>% 
  filter(validity == "valid" | validity == "invalid_same") %>%
  with(t.test(mean_rt~validity,paired=TRUE))
## 
##  Paired t-test
## 
## data:  mean_rt by validity
## t = -8.2597, df = 57, p-value = 2.549e-11
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.11828489 -0.07212303
## sample estimates:
## mean of the differences 
##             -0.09520396
tbl_final %>% 
  filter(validity == "invalid_different" | validity == "invalid_same") %>%
  with(t.test(mean_rt~validity,paired=TRUE))
## 
##  Paired t-test
## 
## data:  mean_rt by validity
## t = -1.1692, df = 57, p-value = 0.2472
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.032708739  0.008593456
## sample estimates:
## mean of the differences 
##             -0.01205764

4.4 Linear modeling

Two chunks will perform linear modeling on RT data as a function of validity. The two chunks differ based on what is the reference group. In the first model, “valid” is the reference group and is contrasted with invalid-same (space-based effect) and invalid different. In the second model, “invalid-same” is the reference group and is contrasted with valid (space-based effect) and invalid-different (object-based effect). Moving forward, subsequent linear models will be strucuted like Model #2 (invalid-same as reference group)

4.4.1 Reference: valid

model_Vref = lmer(removed_RT ~ validity + (1 | workerId), data = tbl_good_catch_acc_all_main_acc_NA_subjs_removed_3_SDs_removed)
summary(model_Vref)
## Linear mixed model fit by REML ['lmerMod']
## Formula: removed_RT ~ validity + (1 | workerId)
##    Data: tbl_good_catch_acc_all_main_acc_NA_subjs_removed_3_SDs_removed
## 
## REML criterion at convergence: -2516.3
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -4.9969 -0.5881 -0.1518  0.4382  8.0074 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  workerId (Intercept) 0.02744  0.1657  
##  Residual             0.02960  0.1720  
## Number of obs: 4070, groups:  workerId, 58
## 
## Fixed effects:
##                           Estimate Std. Error t value
## (Intercept)               8.529371   0.022035  387.07
## validityinvalid_same      0.096252   0.007054   13.64
## validityinvalid_different 0.107542   0.007025   15.31
## 
## Correlation of Fixed Effects:
##             (Intr) vldtynvld_s
## vldtynvld_s -0.076            
## vldtynvld_d -0.077  0.242

4.4.2 Reference: invalid-same

model_ISref = lmer(removed_RT ~ relevel(validity, ref = "invalid_same") + (1 | workerId), data = tbl_good_catch_acc_all_main_acc_NA_subjs_removed_3_SDs_removed)
summary(model_ISref)
## Linear mixed model fit by REML ['lmerMod']
## Formula: removed_RT ~ relevel(validity, ref = "invalid_same") + (1 | workerId)
##    Data: tbl_good_catch_acc_all_main_acc_NA_subjs_removed_3_SDs_removed
## 
## REML criterion at convergence: -2516.3
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -4.9969 -0.5881 -0.1518  0.4382  8.0074 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  workerId (Intercept) 0.02744  0.1657  
##  Residual             0.02960  0.1720  
## Number of obs: 4070, groups:  workerId, 58
## 
## Fixed effects:
##                                                           Estimate Std. Error
## (Intercept)                                               8.625623   0.022620
## relevel(validity, ref = "invalid_same")valid             -0.096252   0.007054
## relevel(validity, ref = "invalid_same")invalid_different  0.011290   0.008667
##                                                          t value
## (Intercept)                                              381.325
## relevel(validity, ref = "invalid_same")valid             -13.644
## relevel(validity, ref = "invalid_same")invalid_different   1.303
## 
## Correlation of Fixed Effects:
##             (Intr) rl(,r="_")
## rlv(,r="_") -0.238           
## rl(,r="_")_ -0.193  0.618

4.5 Individual effects

This chunk will generate separate plots for individual space-based and object-based effects.

effects <- spread(tbl_final, validity, mean_rt)
effects$space_effect <- (effects$invalid_same - effects$valid)
effects$object_effect <- (effects$invalid_different - effects$invalid_same)

effects <- effects %>%
  arrange(space_effect)

effects$space_order <- as.character(effects$workerId)

effects %>%
  ggbarplot(x = "workerId", y = "space_effect", ylab = "Space-based effect (ms)", fill = "#f7a800" , add = "none", sort.val = c("asc"), font.ytickslab = 4, orientation = "horiz") + geom_hline(yintercept = 0, linetype = 1, color = "red", size=1) 

effects %>%
  ggbarplot(x = "workerId", y = "object_effect", ylab = "Object-based effect (ms)", fill = "#f7a800" , add = "none", sort.val = c("asc"), font.ytickslab = 4, orientation = "horiz") + geom_hline(yintercept = 0, linetype = 1, color = "red", size=1) 

After looking at the these plots, the object-based effect of one subject is visibly different than the others. The next bit of code will remove him and the same analyses will be performed on the remaining subjects.

4.6 Analyses without outlier subject

Toss out the subject.

tbl_final_subj_removed <- tbl_final %>% 
  filter(workerId != "A16Z47IWMSXYHP")
tbl_good_catch_acc_all_main_acc_NA_subjs_removed_3_SDs_removed_subj_removed <- tbl_good_catch_acc_all_main_acc_NA_subjs_removed_3_SDs_removed %>%
  filter(workerId != "A16Z47IWMSXYHP")

4.6.1 Summary statistics

Confirm subject count.

nrow(data.frame(tbl_final_subj_removed %>% distinct(workerId,.keep_all = FALSE)))
## [1] 57

Get RTs to look for space-based and object-based change blindness effects.

tbl_final_subj_removed %>%
  group_by(validity) %>%
  get_summary_stats(mean_rt, type = "mean_se")
## # A tibble: 3 x 5
##   validity          variable     n  mean    se
##   <fct>             <chr>    <dbl> <dbl> <dbl>
## 1 valid             mean_rt     57  8.52 0.023
## 2 invalid_same      mean_rt     57  8.62 0.02 
## 3 invalid_different mean_rt     57  8.64 0.023

4.6.2 Plot

tbl_final_subj_removed %>% 
  ggbarplot(x = "validity", y = "mean_rt", ylab = "Mean log-transformed RT", fill = "validity" , color = "validity", palette = c("#0d2240", "#00a8e1", "#f7a800"), add = "mean_se", ylim = c(8, 9))

4.6.3 ANOVA and t-tests

Repeated measures ANOVA

aov_rt_validity_subj_removed <- aov(mean_rt ~ validity + Error(factor(workerId)/validity), tbl_final_subj_removed)
summary(aov_rt_validity_subj_removed)
## 
## Error: factor(workerId)
##           Df Sum Sq Mean Sq F value Pr(>F)
## Residuals 56  4.221 0.07538               
## 
## Error: factor(workerId):validity
##            Df Sum Sq Mean Sq F value Pr(>F)    
## validity    2 0.4051 0.20253   56.94 <2e-16 ***
## Residuals 112 0.3984 0.00356                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Pairwise comparison. First, space-based attentional selection; Second, object-based attentional selection is second.

tbl_final_subj_removed %>% 
  filter(validity == "valid" | validity == "invalid_same") %>%
  with(t.test(mean_rt~validity,paired=TRUE))
## 
##  Paired t-test
## 
## data:  mean_rt by validity
## t = -8.095, df = 56, p-value = 5.395e-11
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.11565621 -0.06976972
## sample estimates:
## mean of the differences 
##             -0.09271296
tbl_final_subj_removed %>% 
  filter(validity == "invalid_different" | validity == "invalid_same") %>%
  with(t.test(mean_rt~validity,paired=TRUE))
## 
##  Paired t-test
## 
## data:  mean_rt by validity
## t = -2.2739, df = 56, p-value = 0.02682
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.034887138 -0.002207979
## sample estimates:
## mean of the differences 
##             -0.01854756

4.6.4 Linear modeling

Two chunks will perform linear modeling on RT data as a function of validity. The two chunks differ based on what is the reference group. In the first model, “valid” is the reference group and is contrasted with invalid-same (space-based effect) and invalid different. In the second model, “invalid-same” is the reference group and is contrasted with valid (space-based effect) and invalid-different (object-based effect). Moving forward, subsequent linear models will be strucuted like Model #2 (invalid-same as reference group)

4.6.4.1 Reference: valid

model_Vref_subj_removed = lmer(removed_RT ~ validity + (1 | workerId), data = tbl_good_catch_acc_all_main_acc_NA_subjs_removed_3_SDs_removed_subj_removed)
summary(model_Vref_subj_removed)
## Linear mixed model fit by REML ['lmerMod']
## Formula: removed_RT ~ validity + (1 | workerId)
##    Data: 
## tbl_good_catch_acc_all_main_acc_NA_subjs_removed_3_SDs_removed_subj_removed
## 
## REML criterion at convergence: -2941.1
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -5.3002 -0.6134 -0.1560  0.4545  7.3100 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  workerId (Intercept) 0.02480  0.1575  
##  Residual             0.02629  0.1621  
## Number of obs: 3994, groups:  workerId, 57
## 
## Fixed effects:
##                           Estimate Std. Error t value
## (Intercept)               8.521789   0.021126  403.39
## validityinvalid_same      0.093279   0.006716   13.89
## validityinvalid_different 0.111663   0.006681   16.71
## 
## Correlation of Fixed Effects:
##             (Intr) vldtynvld_s
## vldtynvld_s -0.075            
## vldtynvld_d -0.076  0.242

4.6.4.2 Reference: invalid-same

model_ISref_subj_removed = lmer(removed_RT ~ relevel(validity, ref = "invalid_same") + (1 | workerId), data = tbl_good_catch_acc_all_main_acc_NA_subjs_removed_3_SDs_removed_subj_removed)
summary(model_ISref_subj_removed)
## Linear mixed model fit by REML ['lmerMod']
## Formula: removed_RT ~ relevel(validity, ref = "invalid_same") + (1 | workerId)
##    Data: 
## tbl_good_catch_acc_all_main_acc_NA_subjs_removed_3_SDs_removed_subj_removed
## 
## REML criterion at convergence: -2941.1
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -5.3002 -0.6134 -0.1560  0.4545  7.3100 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  workerId (Intercept) 0.02480  0.1575  
##  Residual             0.02629  0.1621  
## Number of obs: 3994, groups:  workerId, 57
## 
## Fixed effects:
##                                                           Estimate Std. Error
## (Intercept)                                               8.615068   0.021679
## relevel(validity, ref = "invalid_same")valid             -0.093279   0.006716
## relevel(validity, ref = "invalid_same")invalid_different  0.018384   0.008247
##                                                          t value
## (Intercept)                                              397.389
## relevel(validity, ref = "invalid_same")valid             -13.890
## relevel(validity, ref = "invalid_same")invalid_different   2.229
## 
## Correlation of Fixed Effects:
##             (Intr) rl(,r="_")
## rlv(,r="_") -0.236           
## rl(,r="_")_ -0.192  0.618

5 Save dataframe for individual subject analyses

write.csv(tbl_good_catch_acc_all_main_acc_NA_subjs_removed_3_SDs_removed,'tbl_for_bootstrap_log_rts.csv', row.names=FALSE)
write.csv(tbl_good_catch_acc_all_main_acc_NA_subjs_removed_3_SDs_removed_subj_removed,'tbl_for_bootstrap_log_rts_subj_removed.csv', row.names=FALSE)