1 Set up R environment.

library(tidyverse)
library(ggplot2)
library(ggpubr)
library(plyr)
library(magick)
library(png)
library(EBImage)
library(lme4)
library(lmerTest)

2 Set the R working drectory to the main experiment directory.

setwd("/Users/adambarnas/Box/MetaAwareness/data/")  

3 Read in the individual subject files.

tbl_all <- list.files(path = "./Ma_Recontact", pattern = "*.csv", full.names = T, ignore.case = F) %>%
  map_df(~read.csv(., colClasses=c("gender..m.f."="character")))
tbl_all = subset(tbl_all, select = c(user_resp.keys,user_resp.rt,workerId,image_a))
col_idx <- grep("workerId", names(tbl_all))
tbl_all <- tbl_all[, c(col_idx, (1:ncol(tbl_all))[-col_idx])]
tbl_all <- data.frame(na.omit(tbl_all))
tbl_all <- tbl_all %>%
separate(image_a,into=c('database', 'image', NA), sep = "([\\_\\-])")

4 Compute average likelihood rating.

tbl_all_subj_avg <- tbl_all %>%
  group_by(workerId,image) %>%
  dplyr::summarize(average = mean(user_resp.keys)) %>%
  spread(image,average) %>% 
  mutate(subj_avg = rowMeans(.[-1], na.rm = TRUE))
mean(tbl_all_subj_avg$subj_avg)
## [1] 2.927538
tbl_all_img_avg <- data.frame(img_avg = colMeans(tbl_all_subj_avg[,2:70], na.rm = TRUE))
tbl_all_img_avg <- tibble::rownames_to_column(tbl_all_img_avg, "image")

5 Merge Mudsplash and Meta-Awareness data files.

ma_RTs_raw <- read_csv("Ma_RTs_raw.csv")
ma_RTs_raw <- ma_RTs_raw[, -c(2,3,6:16,18,19)]
ma_RTs_raw <- ma_RTs_raw[(ma_RTs_raw$workerId %in% tbl_all_subj_avg$workerId),]

tbl_all <- tbl_all[order(tbl_all$workerId, tbl_all$image), , drop = FALSE]
ma_RTs_raw <- ma_RTs_raw[order(ma_RTs_raw$workerId, ma_RTs_raw$image), , drop = FALSE]
ma_RTs_raw <- ma_RTs_raw %>%  
    mutate(image = as.character(image))

ma_RTs_likelihood <- left_join(tbl_all, ma_RTs_raw, by = c("workerId", "image"))
colnames(ma_RTs_likelihood)[2] <- "likelihood_rating"
colnames(ma_RTs_likelihood)[3] <- "likelihood_rt"
colnames(ma_RTs_likelihood)[7] <- "detection_rt"
ma_RTs_likelihood <- ma_RTs_likelihood[, c(-4)]
colnames(ma_RTs_likelihood)[5] <- "stim_set"
ma_RTs_likelihood <- ma_RTs_likelihood[,c(1,4,5,6,2,3)]

6 Add change_type to dataframe.

ma_change_type<- read_csv("Ma_change_type.csv")
ma_change_type <- ma_change_type %>%  
    mutate(image = as.character(image))
ma_RTs_likelihood <- left_join(ma_RTs_likelihood, ma_change_type, by = "image")

7 Compute likelihood rating for each image.

ma_RTs_likelihood %>%
  ggbarplot(x = "image", y = "likelihood_rating", ylab = "Likelihood of Detecting Change", title = "All images (30 per subject)", fill = "#f7a800", add = "mean_se", font.xtickslab = 8, sort.val = c("asc")) + rotate_x_text() + theme(legend.position = "none")

ma_RTs_likelihood_no_NA <- ma_RTs_likelihood %>%
  drop_na()

ma_RTs_likelihood_no_NA %>% 
  ggbarplot(x = "image", y = "likelihood_rating", ylab = "Likelihood of Detecting Change", title = "'Correct' images", fill = "#f7a800", add = "mean_se", font.xtickslab = 8, sort.val = c("asc")) + rotate_x_text() + theme(legend.position = "none")

write.csv(ma_RTs_likelihood,'Ma_RTs_likelihood.csv', row.names=FALSE)
write.csv(ma_RTs_likelihood_no_NA,'Ma_RTs_likelihood_no_NA.csv', row.names=FALSE)

8 Count number of ratings.

ma_RTs_likelihood_count <- ma_RTs_likelihood_no_NA %>% 
  group_by(workerId,image) %>% 
  dplyr::summarize(counts = n()) %>%
  spread(image,counts) %>%
  mutate(sum = rowSums(.[-1], na.rm = TRUE))
#head(tbl_all_counts,10)

ma_RTs_likelihood_count <- data.frame(count = colSums(ma_RTs_likelihood_count[,2:70], na.rm = TRUE))
ma_RTs_likelihood_count <- tibble::rownames_to_column(ma_RTs_likelihood_count, "image")
ma_RTs_likelihood_count
##       image count
## 1  10504629     9
## 2  10810329     8
## 3   1191801    10
## 4  12115280     8
## 5  12178414     8
## 6  13141692     9
## 7   1383096     9
## 8  13873251    12
## 9  16527526     5
## 10 18169626     6
## 11 18345691     9
## 12 22020472     7
## 13 23024660    10
## 14 23199105     8
## 15 24383097     8
## 16 25107991     8
## 17 27857618    10
## 18  3099758    11
## 19 31236119     9
## 20 32289063     6
## 21 38466626     8
## 22 38546029     5
## 23 42429798     3
## 24  4247084     8
## 25 44993860     7
## 26 45525109     7
## 27 46475259     8
## 28 46635293     5
## 29 48384711     6
## 30 48486405    11
## 31 51537628     7
## 32 51856108     7
## 33 55174490     9
## 34 56835136     7
## 35 57861456     7
## 36 61118260    12
## 37 62096551    10
## 38 62224663     8
## 39 67862299     9
## 40 69128765     4
## 41 70687495     8
## 42 72488522     9
## 43 73637203    10
## 44 74173745     9
## 45 75081153     6
## 46 75958241    10
## 47 77345858     9
## 48 77574131     6
## 49 77793328     9
## 50 79191795     6
## 51 79222679     7
## 52 79241011     8
## 53 79573638     8
## 54  8197559     5
## 55 81993755     1
## 56 83536470     6
## 57 83691215     6
## 58 83785171    10
## 59 85741618     6
## 60 86520382     4
## 61 87983207     3
## 62 88767165     7
## 63 89354846     8
## 64  8974554     9
## 65 90405028    10
## 66 95091295     4
## 67 97475929     3
## 68 98156944     9
## 69 98265889     5

9 Mixed effects model and correlation.

9.1 Raw RT

fit_raw <- lmer(detection_rt ~ likelihood_rating * change_type + (1 | workerId) + (1 | image), data=ma_RTs_likelihood_no_NA)
summary(fit_raw)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: detection_rt ~ likelihood_rating * change_type + (1 | workerId) +  
##     (1 | image)
##    Data: ma_RTs_likelihood_no_NA
## 
## REML criterion at convergence: 3021.7
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.6457 -0.3424 -0.1033  0.0961  9.5915 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  image    (Intercept)  0.06219 0.2494  
##  workerId (Intercept)  8.98934 2.9982  
##  Residual             18.20118 4.2663  
## Number of obs: 519, groups:  image, 69; workerId, 22
## 
## Fixed effects:
##                                           Estimate Std. Error        df t value
## (Intercept)                               10.75554    1.56345 262.30245   6.879
## likelihood_rating                         -0.32550    0.36478 363.98232  -0.892
## change_typedisappear                      -0.90942    1.88643 354.29712  -0.482
## change_typemovement                       -1.67431    1.60264 317.00108  -1.045
## change_typereplacement                    -0.59666    2.55696 364.73941  -0.233
## change_typesize                           -2.19554    1.64714 267.29288  -1.333
## likelihood_rating:change_typedisappear     0.11714    0.49475 396.95732   0.237
## likelihood_rating:change_typemovement      0.14855    0.45086 378.79100   0.329
## likelihood_rating:change_typereplacement  -0.05964    0.71820 417.39389  -0.083
## likelihood_rating:change_typesize          0.20576    0.45707 319.21710   0.450
##                                          Pr(>|t|)    
## (Intercept)                               4.4e-11 ***
## likelihood_rating                           0.373    
## change_typedisappear                        0.630    
## change_typemovement                         0.297    
## change_typereplacement                      0.816    
## change_typesize                             0.184    
## likelihood_rating:change_typedisappear      0.813    
## likelihood_rating:change_typemovement       0.742    
## likelihood_rating:change_typereplacement    0.934    
## likelihood_rating:change_typesize           0.653    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##                      (Intr) lklhd_ chng_typd chng_typm chng_typr chng_typs
## liklhd_rtng          -0.869                                               
## chng_typdsp          -0.669  0.696                                        
## chng_typmvm          -0.799  0.835  0.650                                 
## chng_typrpl          -0.513  0.535  0.422     0.495                       
## chang_typsz          -0.773  0.809  0.635     0.759     0.480             
## lklhd_rtng:chng_typd  0.623 -0.712 -0.945    -0.607    -0.392    -0.591   
## lklhd_rtng:chng_typm  0.690 -0.790 -0.565    -0.925    -0.428    -0.662   
## lklhd_rtng:chng_typr  0.450 -0.514 -0.367    -0.435    -0.931    -0.422   
## lklhd_rtng:chng_typs  0.676 -0.775 -0.557    -0.668    -0.419    -0.928   
##                      lklhd_rtng:chng_typd lklhd_rtng:chng_typm
## liklhd_rtng                                                   
## chng_typdsp                                                   
## chng_typmvm                                                   
## chng_typrpl                                                   
## chang_typsz                                                   
## lklhd_rtng:chng_typd                                          
## lklhd_rtng:chng_typm  0.580                                   
## lklhd_rtng:chng_typr  0.374                0.413              
## lklhd_rtng:chng_typs  0.568                0.637              
##                      lklhd_rtng:chng_typr
## liklhd_rtng                              
## chng_typdsp                              
## chng_typmvm                              
## chng_typrpl                              
## chang_typsz                              
## lklhd_rtng:chng_typd                     
## lklhd_rtng:chng_typm                     
## lklhd_rtng:chng_typr                     
## lklhd_rtng:chng_typs  0.404
corr <- ma_RTs_likelihood_no_NA %>% 
  group_by(image) %>% 
  dplyr::summarize(detection_rt = mean(detection_rt), likelihood_rating = mean(likelihood_rating))

corr <- left_join(corr, ma_change_type, by = "image")

corr %>%
  ggscatter(y = "detection_rt", x = "likelihood_rating", ylab = "Raw Change Detection RT (sec)", xlab = "Likelihood of Detecting Change", title = "N = 22", add = "reg.line", cor.coef = TRUE, cor.coeff.args = list(method = "pearson", label.x = 1, label.y = 17.5), conf.int = TRUE, xlim = c(1, 5), ylim = c(5, 17.5), label = "image", font.label = c(5, "plain", "black"))

corr %>%
  ggscatter(y = "detection_rt", x = "likelihood_rating", color = "change_type", palette = c("#0d2240", "#00a8e1", "#f7a800", "#E31818", "#dfdddc"), ylab = "Raw Change Detection RT (sec)", xlab = "Likelihood of Detecting Change", title = "N = 22", add = "reg.line", conf.int = TRUE, xlim = c(1, 5), ylim = c(5, 17.5), label = "image", font.label = c(5, "plain", "black")) + stat_cor(aes(color = change_type), label.x = c(1, 1, 2.5, 2.5, 4), label.y = c(17.5, 16, 17.5, 16, 17.5), method = "pearson")

9.2 Log RT

fit_log <- lmer(log10(detection_rt) ~ likelihood_rating * change_type + (1 | workerId) + (1 | image), data=ma_RTs_likelihood_no_NA)
summary(fit_log)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: log10(detection_rt) ~ likelihood_rating * change_type + (1 |  
##     workerId) + (1 | image)
##    Data: ma_RTs_likelihood_no_NA
## 
## REML criterion at convergence: -661.8
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.8302 -0.4985 -0.1124  0.2949  5.4899 
## 
## Random effects:
##  Groups   Name        Variance  Std.Dev.
##  image    (Intercept) 0.0005631 0.02373 
##  workerId (Intercept) 0.0156865 0.12525 
##  Residual             0.0122298 0.11059 
## Number of obs: 519, groups:  image, 69; workerId, 22
## 
## Fixed effects:
##                                            Estimate Std. Error         df
## (Intercept)                                0.964671   0.047044 148.972062
## likelihood_rating                         -0.009584   0.009828 431.804173
## change_typedisappear                      -0.002390   0.050997 376.562909
## change_typemovement                       -0.043619   0.043507 351.468126
## change_typereplacement                     0.001429   0.069105 375.341445
## change_typesize                           -0.060324   0.044983 310.458534
## likelihood_rating:change_typedisappear    -0.004567   0.013281 440.283541
## likelihood_rating:change_typemovement      0.002633   0.012116 441.958341
## likelihood_rating:change_typereplacement  -0.005281   0.019235 456.109715
## likelihood_rating:change_typesize          0.003524   0.012365 399.197798
##                                          t value Pr(>|t|)    
## (Intercept)                               20.506   <2e-16 ***
## likelihood_rating                         -0.975    0.330    
## change_typedisappear                      -0.047    0.963    
## change_typemovement                       -1.003    0.317    
## change_typereplacement                     0.021    0.984    
## change_typesize                           -1.341    0.181    
## likelihood_rating:change_typedisappear    -0.344    0.731    
## likelihood_rating:change_typemovement      0.217    0.828    
## likelihood_rating:change_typereplacement  -0.275    0.784    
## likelihood_rating:change_typesize          0.285    0.776    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##                      (Intr) lklhd_ chng_typd chng_typm chng_typr chng_typs
## liklhd_rtng          -0.775                                               
## chng_typdsp          -0.601  0.686                                        
## chng_typmvm          -0.717  0.823  0.648                                 
## chng_typrpl          -0.462  0.531  0.424     0.495                       
## chang_typsz          -0.689  0.791  0.630     0.750     0.477             
## lklhd_rtng:chng_typd  0.554 -0.709 -0.933    -0.599    -0.390    -0.580   
## lklhd_rtng:chng_typm  0.616 -0.788 -0.559    -0.912    -0.426    -0.649   
## lklhd_rtng:chng_typr  0.403 -0.517 -0.366    -0.433    -0.917    -0.417   
## lklhd_rtng:chng_typs  0.598 -0.768 -0.549    -0.655    -0.414    -0.915   
##                      lklhd_rtng:chng_typd lklhd_rtng:chng_typm
## liklhd_rtng                                                   
## chng_typdsp                                                   
## chng_typmvm                                                   
## chng_typrpl                                                   
## chang_typsz                                                   
## lklhd_rtng:chng_typd                                          
## lklhd_rtng:chng_typm  0.579                                   
## lklhd_rtng:chng_typr  0.378                0.416              
## lklhd_rtng:chng_typs  0.565                0.634              
##                      lklhd_rtng:chng_typr
## liklhd_rtng                              
## chng_typdsp                              
## chng_typmvm                              
## chng_typrpl                              
## chang_typsz                              
## lklhd_rtng:chng_typd                     
## lklhd_rtng:chng_typm                     
## lklhd_rtng:chng_typr                     
## lklhd_rtng:chng_typs  0.404
corr <- ma_RTs_likelihood_no_NA %>% 
  group_by(image) %>% 
  dplyr::summarize(detection_rt = mean(detection_rt), likelihood_rating = mean(likelihood_rating))

corr <- left_join(corr, ma_change_type, by = "image")

corr$log <- log10(corr$detection_rt)

corr %>%
  ggscatter(y = "log", x = "likelihood_rating", ylab = "Log Change Detection RT (sec)", xlab = "Likelihood of Detecting Change", title = "N = 22", add = "reg.line", cor.coef = TRUE, cor.coeff.args = list(method = "pearson", label.x = 1, label.y = 1.25), conf.int = TRUE, xlim = c(1, 5), ylim = c(0.75, 1.3), label = "image", font.label = c(5, "plain", "black"))

corr %>%
  ggscatter(y = "log", x = "likelihood_rating", color = "change_type", palette = c("#0d2240", "#00a8e1", "#f7a800", "#E31818", "#dfdddc"), ylab = "Log Change Detection RT (sec)", xlab = "Likelihood of Detecting Change", title = "N = 22", add = "reg.line", conf.int = TRUE, xlim = c(1, 5), ylim = c(0.75, 1.3), label = "image", font.label = c(5, "plain", "black")) + stat_cor(aes(color = change_type), label.x = c(1, 1, 2.5, 2.5, 4), label.y = c(1.3, 1.25, 1.3, 1.25, 1.3), method = "pearson")