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

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: 2911.5
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.5784 -0.3505 -0.1074  0.0895  9.4091 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  image    (Intercept)  0.03974 0.1993  
##  workerId (Intercept)  8.66592 2.9438  
##  Residual             19.00898 4.3599  
## Number of obs: 497, groups:  image, 69; workerId, 21
## 
## Fixed effects:
##                                          Estimate Std. Error       df t value
## (Intercept)                               10.9594     1.5969 257.0589   6.863
## likelihood_rating                         -0.3306     0.3764 366.0773  -0.878
## change_typedisappear                      -0.8664     1.9577 348.9387  -0.443
## change_typemovement                       -1.6663     1.6521 309.7003  -1.009
## change_typereplacement                    -0.1377     2.7861 372.9098  -0.049
## change_typesize                           -2.1998     1.6964 266.2010  -1.297
## likelihood_rating:change_typedisappear     0.1026     0.5128 392.4995   0.200
## likelihood_rating:change_typemovement      0.1451     0.4676 378.9583   0.310
## likelihood_rating:change_typereplacement  -0.1698     0.7707 413.0597  -0.220
## likelihood_rating:change_typesize          0.2051     0.4728 328.2136   0.434
##                                          Pr(>|t|)    
## (Intercept)                              5.03e-11 ***
## likelihood_rating                           0.380    
## change_typedisappear                        0.658    
## change_typemovement                         0.314    
## change_typereplacement                      0.961    
## change_typesize                             0.196    
## likelihood_rating:change_typedisappear      0.841    
## likelihood_rating:change_typemovement       0.756    
## likelihood_rating:change_typereplacement    0.826    
## likelihood_rating:change_typesize           0.665    
## ---
## 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.871                                               
## chng_typdsp          -0.659  0.683                                        
## chng_typmvm          -0.794  0.827  0.632                                 
## chng_typrpl          -0.480  0.498  0.386     0.454                       
## chang_typsz          -0.769  0.802  0.619     0.747     0.442             
## lklhd_rtng:chng_typd  0.618 -0.705 -0.945    -0.594    -0.359    -0.580   
## lklhd_rtng:chng_typm  0.685 -0.782 -0.548    -0.926    -0.392    -0.651   
## lklhd_rtng:chng_typr  0.429 -0.490 -0.342    -0.407    -0.937    -0.397   
## lklhd_rtng:chng_typs  0.674 -0.771 -0.544    -0.658    -0.385    -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.567                                   
## lklhd_rtng:chng_typr  0.350                0.386              
## lklhd_rtng:chng_typs  0.559                0.629              
##                      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.381
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 = 21", add = "reg.line", cor.coef = TRUE, cor.coeff.args = list(method = "pearson", label.x = 1, label.y = 20), conf.int = TRUE, xlim = c(1, 5), ylim = c(5, 25), 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 = 21", add = "reg.line", conf.int = TRUE, xlim = c(1, 5), ylim = c(5, 25), label = "image", font.label = c(5, "plain", "black")) + stat_cor(aes(color = change_type), label.x = 1, label.y = c(17, 19, 21, 23, 25), 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: -620
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.7704 -0.5064 -0.0885  0.2784  5.4220 
## 
## Random effects:
##  Groups   Name        Variance  Std.Dev.
##  image    (Intercept) 0.0006038 0.02457 
##  workerId (Intercept) 0.0139029 0.11791 
##  Residual             0.0125907 0.11221 
## Number of obs: 497, groups:  image, 69; workerId, 21
## 
## Fixed effects:
##                                            Estimate Std. Error         df
## (Intercept)                                0.977676   0.047128 157.456509
## likelihood_rating                         -0.010308   0.010072 427.646935
## change_typedisappear                      -0.006005   0.052618 369.821676
## change_typemovement                       -0.045899   0.044620 343.274822
## change_typereplacement                     0.019359   0.074718 379.028362
## change_typesize                           -0.060649   0.046077 307.635413
## likelihood_rating:change_typedisappear    -0.003802   0.013674 431.003212
## likelihood_rating:change_typemovement      0.003465   0.012480 434.284766
## likelihood_rating:change_typereplacement  -0.009314   0.020501 442.154948
## likelihood_rating:change_typesize          0.003733   0.012695 400.812738
##                                          t value Pr(>|t|)    
## (Intercept)                               20.745   <2e-16 ***
## likelihood_rating                         -1.023    0.307    
## change_typedisappear                      -0.114    0.909    
## change_typemovement                       -1.029    0.304    
## change_typereplacement                     0.259    0.796    
## change_typesize                           -1.316    0.189    
## likelihood_rating:change_typedisappear    -0.278    0.781    
## likelihood_rating:change_typemovement      0.278    0.781    
## likelihood_rating:change_typereplacement  -0.454    0.650    
## likelihood_rating:change_typesize          0.294    0.769    
## ---
## 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.788                                               
## chng_typdsp          -0.601  0.673                                        
## chng_typmvm          -0.723  0.814  0.630                                 
## chng_typrpl          -0.441  0.496  0.388     0.456                       
## chang_typsz          -0.695  0.784  0.615     0.738     0.441             
## lklhd_rtng:chng_typd  0.557 -0.702 -0.934    -0.585    -0.358    -0.569   
## lklhd_rtng:chng_typm  0.620 -0.781 -0.541    -0.912    -0.390    -0.638   
## lklhd_rtng:chng_typr  0.391 -0.494 -0.341    -0.405    -0.923    -0.392   
## lklhd_rtng:chng_typs  0.604 -0.764 -0.535    -0.645    -0.381    -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.566                                   
## lklhd_rtng:chng_typr  0.354                0.389              
## lklhd_rtng:chng_typs  0.556                0.625              
##                      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.381
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 = 21", add = "reg.line", cor.coef = TRUE, cor.coeff.args = list(method = "pearson", label.x = 1, label.y = 1.4), conf.int = TRUE, xlim = c(1, 5), ylim = c(0.75, 1.5), 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 = 21", add = "reg.line", conf.int = TRUE, xlim = c(1, 5), ylim = c(0.75, 1.5), label = "image", font.label = c(5, "plain", "black")) + stat_cor(aes(color = change_type), label.x = 1, label.y = c(1.3, 1.35, 1.4, 1.45, 1.5), method = "pearson")