Set up R environment.
library(tidyverse)
library(ggplot2)
library(ggpubr)
library(plyr)
library(magick)
library(png)
library(EBImage)
library(lme4)
library(lmerTest)
Set the R working drectory to the main experiment directory.
setwd("/Users/adambarnas/Box/MetaAwareness/data/")
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 = "([\\_\\-])")
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")
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")
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)
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
Mixed effects model and correlation.
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")

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")
