Dot Pattern Similarity Rating Analysis

Published

June 19, 2024

Display code
pacman::p_load(dplyr,purrr,tidyr,ggplot2, here, patchwork, 
  conflicted, jsonlite,stringr, gt, knitr, kableExtra, 
  lubridate,ggh4x, lmerTest)
walk(c("dplyr", "lmerTest"), conflict_prefer_all, quiet = TRUE)
options(digits=2, scipen=999, dplyr.summarise.inform=FALSE)
walk(c("fun_plot"), ~ source(here::here(paste0("R/", .x, ".R"))))
mc24_proto <- read.csv(here("Stimulii","mc24_prototypes.csv")) |> mutate(set=paste0(sbjCode,"_",condit)) 
sbj_cat <- read.csv(here("data","mc24_sbj_cat.csv")) |> mutate(condit=factor(condit,levels=c("low","medium","mixed","high") ))


theme_set(theme_nice_b())

dfiles <- list(path=list.files(here::here("data/dotSim_data"),full.names=TRUE))

d <- map_dfr(dfiles$path, ~read.csv(.x))

d <- map_dfr(dfiles$path, ~{read.csv(.x) |> 
    mutate(sfile=tools::file_path_sans_ext(basename(.x)))}) |> 
  select(-trial_index, -internal_node_id,-trial_type) |>
   mutate(set = paste(str_extract(item_label_1, "^\\d+"),
                     str_extract(item_label_1, "[a-z]+"), sep = "_")) |>
  mutate(pair_label = paste0(item_label_1,"_",item_label_2)) |>
  relocate(sbjCode,date,set,pair_label,trial,item_label_1,item_label_2,response,rt)

setCounts <- d |> 
  pivot_longer(cols=c(item_label_1, item_label_2), names_to="item_label", values_to="item") |> 
  group_by(set) |> summarise(n=n_distinct(sbjCode),resp=mean(response),sd=sd(response)) |> arrange(desc(n))

# length(unique(mc_proto$set)) # 304
setCounts2 <- mc24_proto |> group_by(set) |> 
  slice_head(n=1) |> 
  select(id,file,set) |> 
  left_join(setCounts,by="set") |> 
  mutate(n = ifelse(is.na(n), 0, n), .groups="drop") |> 
  arrange(n) |> ungroup()




gpt_rate <- readRDS(here("llm/first_full_run.rds")) |> select(pair_label,set,gpt4o_rating) 

d <- d |> left_join(gpt_rate,by=c("set","pair_label"))




### By Pair Max/Min
pairCounts <- d |> 
  pivot_longer(cols=c(item_label_1, item_label_2), names_to="item_label", values_to="item") |> 
  group_by(set,item, file,pair_label) |> 
  summarise(n_rating=n(),mean_resp=mean(response)) |> 
  group_by(item,file,set) |> 
  summarise(n_rating=first(n_rating),max_sim=max(mean_resp), min_sim=min(mean_resp)) |> 
  arrange(desc(n_rating),item) |> ungroup() 

max_sim <- sbj_cat |> 
  mutate(item=item_label) |> 
  left_join(pairCounts,by=c("file","item")) |>
  mutate(sim_group = ifelse(max_sim>5.5,"Very Similar",ifelse(max_sim<3.9,"Very Dissimilar","Medium"))) |> 
  mutate(sim_group=factor(sim_group,levels=c("Very Dissimilar","Medium","Very Similar"))) 

cat_sim_test2 <- max_sim |> 
  filter(Phase==2) |> 
  mutate(rate_quartile = as.factor(ntile(max_sim, 4))) |>
  group_by(id,condit) |>
  mutate(agg_corr=mean(Corr)) |>
  group_by(condit) |> 
  mutate(quartile=ntile(agg_corr,4),ms=ntile(agg_corr,2))





### By Pattern Average
patternAvg <- d |> 
  pivot_longer(cols=c(item_label_1, item_label_2), names_to="item_label", values_to="item") |> 
  group_by(item,file) |> 
  summarise(n_rating=n(),resp=mean(response),sd=sd(response),gpt_sim=mean(gpt4o_rating)) |> 
  arrange(desc(n_rating))

cat_sim <- sbj_cat |> 
  mutate(item=item_label) |> 
  left_join(patternAvg,by=c("file","item"))  |> arrange(desc(n_rating)) |>
  #remove rows where n_rating is NA, or less than 4
  filter(!is.na(n_rating),n_rating>=12) |> 
  mutate(sim_group = ifelse(resp>5.5,"Very Similar",ifelse(resp<3.9,"Very Dissimilar","Medium"))) |> 
  mutate(sim_group=factor(sim_group,levels=c("Very Dissimilar","Medium","Very Similar"))) 

cat_sim_test <- cat_sim |> 
  filter(Phase==2) |> 
  mutate(rate_quartile = as.factor(ntile(resp, 4))) |>
  group_by(id,condit) |>
  mutate(agg_corr=mean(Corr)) |>
  group_by(condit) |> 
  mutate(quartile=ntile(agg_corr,4),ms=ntile(agg_corr,2))
Display code
# cat_sim_test |> 
#   group_by(condit,quartile) |> 
#   summarize(mean_resp=mean(resp),mean_corr=mean(Corr),n=n_distinct(file), .groups="drop") 

# cat_sim_test |> 
#   group_by(sbjCode,condit,quartile,rate_quartile) |>
#   summarize(resp=mean(resp),corr=mean(Corr)) |> 
#   mutate(quartile=factor(quartile,levels=c(1,2,3,4))) |> 
#   ggplot(aes(x=quartile,y=corr,fill=condit)) + 
#   stat_bar+
#  # geom_boxplot() +
#   facet_wrap(~rate_quartile) +
#   labs(y="Similarity Rating",x="Performance Quartile")


cat_sim_test |> 
  group_by(sbjCode,condit,quartile,rate_quartile) |>
  summarize(resp=mean(resp),corr=mean(Corr)) |> 
  mutate(quartile=factor(quartile,levels=c(1,2,3,4))) |> 
  ggplot(aes(x=condit,y=corr,fill=rate_quartile)) + 
  stat_bar +
 # geom_boxplot() +
#   facet_wrap(~condit) +
  labs(y="CatLearn Accuracy",x="Training Condition")

Display code
cat_sim_test |> 
  group_by(sbjCode,condit,ms,sim_group) |>
  summarize(resp=mean(resp),corr=mean(Corr)) |> 
  mutate(ms=factor(ms,levels=c(1,2))) |> 
  ggplot(aes(x=condit,y=corr,fill=sim_group)) + 
  stat_bar +
  facet_wrap(~ms) +
  labs(y="CatLearn Accuracy",x="Training Condition")

Using Maximum rather than mean similarity

Display code
cat_sim_test2 |> 
  group_by(sbjCode,condit,quartile,rate_quartile) |>
  summarize(resp=mean(max_sim),corr=mean(Corr)) |> 
  mutate(quartile=factor(quartile,levels=c(1,2,3,4))) |> 
  ggplot(aes(x=condit,y=corr,fill=rate_quartile)) + 
  stat_bar +
 # geom_boxplot() +
#   facet_wrap(~condit) +
  labs(y="CatLearn Accuracy",x="Training Condition")

Display code
cat_sim_test2 |> 
  group_by(sbjCode,condit,ms,sim_group) |>
  summarize(resp=mean(max_sim),corr=mean(Corr)) |> 
  mutate(ms=factor(ms,levels=c(1,2))) |> 
  ggplot(aes(x=condit,y=corr,fill=sim_group)) + 
  stat_bar +
  facet_wrap(~ms) +
  labs(y="CatLearn Accuracy",x="Training Condition")

Correlations with Accuracy in Hu & Nosofsky 2024

Assess # of patterns in various binnings - e.g. quartile, decile

Display code
# bin data by rating (resp) into quartiles
t1 <- cat_sim |> 
  mutate(Quartile = ntile(resp, 4))|>
  group_by(Quartile) |>
  summarize("Avg. Similarity Rating"=mean(resp),sd=sd(resp),n_ratings=n_distinct(file), .groups="drop") 

t2 <- cat_sim |> 
  mutate(Decile = ntile(resp, 10))|>
  group_by(Decile) |>
  summarize("Avg. Similarity Rating"=mean(resp),sd=sd(resp),n_ratings=n_distinct(file), .groups="drop") 


t3 <- cat_sim |> 
  group_by(sim_group) |>
  summarize("Avg. Similarity Rating"=mean(resp),sd=sd(resp),n_ratings=n_distinct(file), .groups="drop") 

t1 |> kbl(caption="Quartiles")
Quartiles
Quartile Avg. Similarity Rating sd n_ratings
1 3.6 0.55 134
2 4.5 0.17 157
3 5.1 0.17 167
4 5.8 0.37 124
Display code
t2 |> kbl(caption="Deciles")
Deciles
Decile Avg. Similarity Rating sd n_ratings
1 3.1 0.45 64
2 3.9 0.13 74
3 4.2 0.08 78
4 4.5 0.08 80
5 4.7 0.07 79
6 5.0 0.06 81
7 5.2 0.07 84
8 5.4 0.06 75
9 5.7 0.09 79
10 6.2 0.33 55
Display code
t3 |> kbl(caption="Extreme Groups")
Extreme Groups
sim_group Avg. Similarity Rating sd n_ratings
Very Dissimilar 3.3 0.49 83
Medium 4.8 0.45 270
Very Similar 5.9 0.36 111
Display code
g1 <- cat_sim_test |> 
  group_by(sbjCode,condit) |>
  summarize(resp=mean(resp)) |> 
  ggplot(aes(x=condit,y=resp)) + 
  #stat_bar + 
  geom_boxplot() +
  labs(y="Similarity Rating",x="2024 - Training Condition")


g2 <- cat_sim_test |> 
  group_by(sbjCode,condit,Category) |>
  summarize(resp=mean(resp)) |> 
  mutate(Category=as.factor(Category)) |> 
  ggplot(aes(x=condit,y=resp,fill=Category)) + 
  geom_boxplot() +
  labs(y="Similarity Rating",x="2024 - Training Condition")



g3 <- cat_sim_test |> 
  group_by(sbjCode,condit,Category,quartile) |>
  summarize(resp=mean(resp)) |> 
  mutate(Category=as.factor(Category),quartile=factor(quartile,levels=c(1,2,3,4))) |> 
  ggplot(aes(x=quartile,y=resp,fill=quartile)) + 
  stat_bar+
 # geom_boxplot() +
  facet_wrap(~condit) +
  labs(y="Similarity Rating",x="Performance Quartile")

(g1/g2/g3) + plot_annotation(title="Similarity Rating breakdowns") +
  plot_layout(heights = c(1,1,2))

Relationship between catLearn accuracy and binnings of similarity rating

  • generally a negative correlation - higher simimlarity rating -> lower accuracy
  • quartiles and deciles are roughly evenly grouped bins, while the extreme similarity grouping has the bulk of the ratings in the medium group

Quartiles and Deciles

Display code
p3 <- cat_sim_test |> 
  mutate(Quartile = as.factor(ntile(resp, 4))) |> 
  ggplot(aes(x=Quartile,y=Corr,fill=Quartile)) + 
  stat_bar + 
  facet_wrap(~Pattern.Type) + 
  labs(y="CatLearn Accuracy", x="Similarity Rating Quartile", title="Effect by Pattern Type",fill="Similarity Rating Quartile")


p4 <- cat_sim_test |> 
  mutate(Decile = as.factor(ntile(resp, 10))) |> 
  ggplot(aes(x=Decile,y=Corr,fill=Decile)) + 
  stat_bar + 
  facet_wrap(~Pattern.Type) + 
  labs(y="CatLearn Accuracy", x="Similarity Rating Decile", title="Effect by Pattern Type", fill="Similarity Rating Decile")

p5 <- cat_sim_test |> 
  mutate(Quartile = as.factor(ntile(resp, 4))) |> 
  ggplot(aes(x=Quartile,y=Corr,fill=Quartile)) + 
  stat_bar + 
  facet_wrap(~condit) + labs(y="CatLearn Accuracy", x="Similarity Rating Quartile", title="Effect by Training Condition", fill="Similarity Rating Quartile")


p6 <- cat_sim_test |> 
  mutate(Decile = as.factor(ntile(resp, 10))) |> 
  ggplot(aes(x=Decile,y=Corr,fill=Decile)) + 
  stat_bar + 
  facet_wrap(~condit) + labs(y="CatLearn Accuracy", x="Similarity Rating Decile", title="Effect by Training Condition", fill="Similarity Rating Decile")


p7 <- cat_sim_test |> 
  mutate(Quartile = as.factor(ntile(resp, 4))) |> 
  ggplot(aes(x=Quartile,y=Corr,fill=Quartile)) + 
  stat_bar + 
  facet_nested_wrap(~condit+Pattern.Type) + labs(y="CatLearn Accuracy", x="Similarity Rating Quintile", title="Effect by Training Condition and Pattern Type")

p3 + p4
p5 + p6
p7


###
Figure 1: 2024 CatLearn accuracy by different similarity rating groups
Figure 2: 2024 CatLearn accuracy by different similarity rating groups
Figure 3: 2024 CatLearn accuracy by different similarity rating groups

gpt-4o predicted similarities

Display code
cat_sim_gpt <- sbj_cat |> 
  mutate(item=item_label) |> 
  left_join(patternAvg,by=c("file","item"))  |> arrange(desc(n_rating)) |>
  filter(!is.na(n_rating),n_rating>=12) |> 
  mutate(sim_group = ifelse(gpt_sim>5.5,"Very Similar",ifelse(gpt_sim<3.9,"Very Dissimilar","Medium"))) |> 
  mutate(sim_group=factor(sim_group,levels=c("Very Dissimilar","Medium","Very Similar"))) |> 
  filter(!is.na(gpt_sim))
 
cat_sim_test_gpt <- cat_sim_gpt |> 
  filter(Phase==2) |> 
  mutate(rate_quartile = as.factor(ntile(gpt_sim, 4))) |>
  group_by(id,condit) |>
  mutate(agg_corr=mean(Corr)) |>
  group_by(condit) |> 
  mutate(quartile=ntile(agg_corr,4),ms=ntile(agg_corr,2))



p3 <- cat_sim_test_gpt |> 
  mutate(Quartile = as.factor(ntile(gpt_sim, 4))) |> 
  ggplot(aes(x=Quartile,y=Corr,fill=Quartile)) + 
  stat_bar + 
  facet_wrap(~Pattern.Type) + 
  labs(y="CatLearn Accuracy", x="gpt-4o Similarity Rating Quartile", title="Effect by Pattern Type",fill="Similarity Rating Quartile")


p4 <- cat_sim_test_gpt |> 
  mutate(Decile = as.factor(ntile(gpt_sim, 10))) |> 
  ggplot(aes(x=Decile,y=Corr,fill=Decile)) + 
  stat_bar + 
  facet_wrap(~Pattern.Type) + 
  labs(y="CatLearn Accuracy", x="gpt-4o Similarity Rating Decile", title="Effect by Pattern Type", fill="Similarity Rating Decile")





p5 <- cat_sim_test_gpt |> 
  mutate(Quartile = as.factor(ntile(gpt_sim, 4))) |> 
  ggplot(aes(x=Quartile,y=Corr,fill=Quartile)) + 
  stat_bar + 
  facet_wrap(~condit) + labs(y="CatLearn Accuracy", x="gpt-4o Similarity Rating Quartile", title="Effect by Training Condition", fill="Similarity Rating Quartile")


p6 <- cat_sim_test_gpt |> 
  mutate(Decile = as.factor(ntile(gpt_sim, 10))) |> 
  ggplot(aes(x=Decile,y=Corr,fill=Decile)) + 
  stat_bar + 
  facet_wrap(~condit) + labs(y="CatLearn Accuracy", x="gpt-4o Similarity Rating Decile", title="Effect by Training Condition", fill="Similarity Rating Decile")

p7 <- cat_sim_test_gpt |> 
  mutate(Quartile = as.factor(ntile(gpt_sim, 4))) |> 
  ggplot(aes(x=Quartile,y=Corr,fill=Quartile)) + 
  stat_bar + 
  facet_nested_wrap(~condit+Pattern.Type) + labs(y="CatLearn Accuracy", x="gpt-4o Similarity Rating Quintile", title="Effect by Training Condition and Pattern Type")



p3 + p4
p5 + p6
p7


# cat_sim_test_gpt |> 
#   group_by(sbjCode,condit,quartile,rate_quartile) |>
#   summarize(resp=mean(gpt_sim),corr=mean(Corr)) |> 
#   mutate(quartile=factor(quartile,levels=c(1,2,3,4))) |> 
#   ggplot(aes(x=rate_quartile,y=corr,fill=rate_quartile)) + 
#   stat_bar +
#   labs(y="CatLearn Accuracy",x="Training Condition")


p8 <- cat_sim_test_gpt |> 
  group_by(sbjCode,condit,quartile,rate_quartile) |>
  summarize(resp=mean(gpt_sim),corr=mean(Corr)) |> 
  mutate(quartile=factor(quartile,levels=c(1,2,3,4))) |> 
  ggplot(aes(x=condit,y=corr,fill=rate_quartile)) + 
  stat_bar +
 # geom_boxplot() +
#   facet_wrap(~condit) +
  labs(y="CatLearn Accuracy",x="Training Condition")


p9 <- cat_sim_test_gpt |> 
  group_by(sbjCode,condit,ms,sim_group) |>
  summarize(resp=mean(gpt_sim),corr=mean(Corr)) |> 
  mutate(ms=factor(ms,levels=c(1,2))) |> 
  ggplot(aes(x=condit,y=corr,fill=sim_group)) + 
  stat_bar +
  facet_wrap(~ms) +
  labs(y="CatLearn Accuracy",x="Training Condition")

p8 + p9
Figure 4: 2024 CatLearn accuracy by different gpt4-o similarity rating groups
Figure 5: 2024 CatLearn accuracy by different gpt4-o similarity rating groups
Figure 6: 2024 CatLearn accuracy by different gpt4-o similarity rating groups
Figure 7: 2024 CatLearn accuracy by different gpt4-o similarity rating groups



Quartiles and Deciles - using maximum similarity

Display code
p3 <- cat_sim_test2 |> 
  mutate(Quartile = as.factor(ntile(max_sim, 4))) |> 
  ggplot(aes(x=Quartile,y=Corr,fill=Quartile)) + 
  stat_bar + 
  facet_wrap(~Pattern.Type) + 
  labs(y="CatLearn Accuracy", x="Similarity Rating Quartile", title="Effect by Pattern Type",fill="Similarity Rating Quartile")


p4 <- cat_sim_test2 |> 
  mutate(Decile = as.factor(ntile(max_sim, 10))) |> 
  ggplot(aes(x=Decile,y=Corr,fill=Decile)) + 
  stat_bar + 
  facet_wrap(~Pattern.Type) + 
  labs(y="CatLearn Accuracy", x="Similarity Rating Decile", title="Effect by Pattern Type", fill="Similarity Rating Decile")

p5 <- cat_sim_test2 |> 
  mutate(Quartile = as.factor(ntile(max_sim, 4))) |> 
  ggplot(aes(x=Quartile,y=Corr,fill=Quartile)) + 
  stat_bar + 
  facet_wrap(~condit) + labs(y="CatLearn Accuracy", x="Similarity Rating Quartile", title="Effect by Training Condition", fill="Similarity Rating Quartile")


p6 <- cat_sim_test2 |> 
  mutate(Decile = as.factor(ntile(max_sim, 10))) |> 
  ggplot(aes(x=Decile,y=Corr,fill=Decile)) + 
  stat_bar + 
  facet_wrap(~condit) + labs(y="CatLearn Accuracy", x="Similarity Rating Decile", title="Effect by Training Condition", fill="Similarity Rating Decile")


p7 <- cat_sim_test2 |> 
  mutate(Quartile = as.factor(ntile(max_sim, 4))) |> 
  ggplot(aes(x=Quartile,y=Corr,fill=Quartile)) + 
  stat_bar + 
  facet_nested_wrap(~condit+Pattern.Type) + labs(y="CatLearn Accuracy", x="Similarity Rating Quintile", title="Effect by Training Condition and Pattern Type")

p3 + p4
p5 + p6
p7
Figure 8: 2024 CatLearn accuracy by different similarity rating groups
Figure 9: 2024 CatLearn accuracy by different similarity rating groups
Figure 10: 2024 CatLearn accuracy by different similarity rating groups

Extreme similarity rating groups

Display code
p9 <- cat_sim_test |> 
  ggplot(aes(y=Corr,x=Pattern.Type, fill=sim_group)) + 
  stat_bar + labs(title="Group by Pattern Type",y="CatLearn Accuracy", fill="Similarity Rating Group")

p10 <- cat_sim_test |> 
  ggplot(aes(y=Corr,x=condit, fill=sim_group)) + 
  stat_bar + labs(title="Group by Condit",y="CatLearn Accuracy", fill="Similarity Rating Group")

p11 <- cat_sim_test |> 
  ggplot(aes(y=Corr,x=sim_group, fill=sim_group)) + 
  stat_bar + 
  facet_nested_wrap(~condit+Pattern.Type) +
  labs(title="Separate by Condit and Pattern Type",y="CatLearn Accuracy", fill="Similarity Rating Group") +
  theme(axis.text.x = element_text(size=5,angle = 45, hjust = 0.5, vjust = 0.5))


 (p9 / p10)/p11 + plot_annotation(title="CatLearn accuracy by extreme similarity rating groups") +
  plot_layout(heights = c(1,1,2))
Figure 11: 2024 CatLearn accuracy by different similarity rating groups
Display code
# trSim1 <- cat_sim |> filter(Phase==1) |> 
#   group_by(condit,Block) |> 
#   mutate(Quartile = as.factor(ntile(resp, 4))) |> 
#   ggplot(aes(x=Block,y=Corr, fill=Quartile)) + stat_bar+  facet_wrap(~condit)  +
#    labs(x="Training Block", y="CatLearn Accuracy",fill="Similarity Rating Quartile")


# trSim2 <- cat_sim |> filter(Phase==1) |> 
#   group_by(condit,Block) |> 
#   ggplot(aes(x=Block,y=Corr, fill=sim_group)) +
#    stat_bar+  
#    facet_wrap(~condit) +
#   labs(x="Training Block", y="CatLearn Accuracy",fill="Similarity Rating Group")




trSim1 <- cat_sim |> filter(Phase==1) |> 
  group_by(condit,Block) |> 
  mutate(Quartile = as.factor(ntile(resp, 4))) |> 
  ggplot(aes(x=Block,y=Corr, col=Quartile)) + 
    stat_summary(shape=0,geom="point",fun="mean")+
  stat_summary(geom="line",fun="mean")+ 
   facet_wrap(~condit)  +
   labs(x="Training Block", y="CatLearn Accuracy",fill="Similarity Rating Quartile",title = "Training Accuracy by Block and Similarity Quartile")

trSim2 <- cat_sim |> filter(Phase==1) |> 
  group_by(condit,Block) |> 
  ggplot(aes(x=Block,y=Corr, col=sim_group)) +
      stat_summary(shape=0,geom="point",fun="mean")+
  stat_summary(geom="line",fun="mean")+ 
   facet_wrap(~condit) +
  labs(x="Training Block", y="CatLearn Accuracy",fill="Similarity Rating Group", title="Training Accuracy by Block and Similarity Extreme similarity Grouping")


trSim1/trSim2
Figure 12: Training accuracy by block and similarity rating
Display code
 trIndv <- cat_sim |> filter(Phase==1, !(sim_group=="Medium")) |> 
  group_by(condit,Block) |> 
  mutate(Quartile = as.factor(ntile(resp, 4))) |> 
  ggplot(aes(x=Block,y=Corr, col=sim_group)) + 
      stat_summary(shape=0,geom="point",fun="mean")+
  stat_summary(geom="line",fun="mean")+ 
   facet_wrap2(~condit+sim_group+sbjCode) +
  labs(x="Training Block", y="CatLearn Accuracy",fill="Similarity Rating Group", title="Training Accuracy by Block and Similarity Extreme similarity Grouping")

trIndv 

#cat_sim |> filter(Phase==1) |> group_by(id) |> summarize(n_sim = n_distinct(sim_group)) |> arrange(desc(n_sim)) |> head(10)

# cat_sim |> filter(Phase==1) |> group_by(id) |> mutate(n_sim = n_distinct(sim_group)) |> filter(n_sim>1)  |> group_by(condit,Block) |> 
#   ggplot(aes(x=Block,y=Corr, col=sim_group)) + 
#       stat_summary(shape=0,geom="point",fun="mean")+
#   stat_summary(geom="line",fun="mean")+ 
#    facet_wrap2(~condit+sbjCode)
Figure 13: Training accuracy by block and similarity rating

Correlations between similarity ratings and CatLearn accuracy

Display code
p1 <- cat_sim_test |> ggplot(aes(x=resp,y=Corr,col=Pattern.Type,fill=Pattern.Type)) + 
  geom_point() + 
  geom_smooth(method = "lm") + 
 labs(y="CatLearn Accuracy", x="Similarity Rating")

p2 <- cat_sim_test |> ggplot(aes(x=resp,y=Corr, col=Pattern.Type,fill=Pattern.Type)) + 
  geom_point() + 
  geom_smooth(method = "lm") + 
  facet_wrap(~condit) + labs(y="CatLearn Accuracy", x="Similarity Rating")


p3 <- cat_sim_test |> 
mutate(Decile = ntile(resp, 10)) |> 
ggplot(aes(x=Decile,y=Corr, col=Pattern.Type,fill=Pattern.Type)) + 
  geom_point() + 
  geom_smooth(method = "lm") + 
 labs(y="CatLearn Accuracy", x="Similarity Rating Decile")


p4 <- cat_sim_test |> 
mutate(Decile = ntile(resp, 10)) |> 
ggplot(aes(x=Decile,y=Corr, col=condit,fill=condit)) + 
  geom_point() + 
  geom_smooth(method = "lm") + 
 labs(y="CatLearn Accuracy", x="Similarity Rating Decile", fill="Training Condition", col="Training Condition")


(p1+p2) / (p3+p4)
Figure 14: Correlations between similarity ratings and CatLearn accuracy
Display code
#cor(cat_sim$resp,cat_sim$Corr)

 m1 <- lmer(Corr ~ resp + (1|sbjCode), data=cat_sim)
 summary(m1)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: Corr ~ resp + (1 | sbjCode)
   Data: cat_sim

REML criterion at convergence: -1609

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-3.792 -0.603  0.101  0.644  3.219 

Random effects:
 Groups   Name        Variance Std.Dev.
 sbjCode  (Intercept) 0.0308   0.175   
 Residual             0.0482   0.220   
Number of obs: 13680, groups:  sbjCode, 303

Fixed effects:
               Estimate  Std. Error          df t value            Pr(>|t|)    
(Intercept)     0.95976     0.02227  3208.81325    43.1 <0.0000000000000002 ***
resp           -0.06268     0.00412 10938.29368   -15.2 <0.0000000000000002 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
     (Intr)
resp -0.888
Display code
  m1 <- lmer(Corr ~ resp + (1|sbjCode), data=cat_sim_test)
 summary(m1)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: Corr ~ resp + (1 | sbjCode)
   Data: cat_sim_test

REML criterion at convergence: 1080

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-3.324 -0.602  0.162  0.643  2.809 

Random effects:
 Groups   Name        Variance Std.Dev.
 sbjCode  (Intercept) 0.0334   0.183   
 Residual             0.0640   0.253   
Number of obs: 4560, groups:  sbjCode, 303

Fixed effects:
              Estimate Std. Error         df t value            Pr(>|t|)    
(Intercept)    1.06110    0.03731 2157.07615    28.4 <0.0000000000000002 ***
resp          -0.07437    0.00743 2805.25185   -10.0 <0.0000000000000002 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
     (Intr)
resp -0.954
Display code
 m1 <- lmer(Corr ~ resp + (1|Pattern.Type) +  (1|sbjCode), data=cat_sim)
 summary(m1)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: Corr ~ resp + (1 | Pattern.Type) + (1 | sbjCode)
   Data: cat_sim

REML criterion at convergence: -2254

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-4.498 -0.561  0.128  0.651  3.023 

Random effects:
 Groups       Name        Variance Std.Dev.
 sbjCode      (Intercept) 0.03085  0.1756  
 Pattern.Type (Intercept) 0.00638  0.0799  
 Residual                 0.04589  0.2142  
Number of obs: 13680, groups:  sbjCode, 303; Pattern.Type, 5

Fixed effects:
               Estimate  Std. Error          df t value             Pr(>|t|)
(Intercept)     0.99368     0.04196     7.49398    23.7          0.000000026
resp           -0.06263     0.00403 11185.52704   -15.5 < 0.0000000000000002
               
(Intercept) ***
resp        ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
     (Intr)
resp -0.461
Display code
  m1 <- lmer(Corr ~ resp + (1|Pattern.Type) +  (1|sbjCode), data=cat_sim_test)
 summary(m1)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: Corr ~ resp + (1 | Pattern.Type) + (1 | sbjCode)
   Data: cat_sim_test

REML criterion at convergence: 768

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-3.810 -0.479  0.173  0.593  2.816 

Random effects:
 Groups       Name        Variance Std.Dev.
 sbjCode      (Intercept) 0.03367  0.1835  
 Pattern.Type (Intercept) 0.00556  0.0746  
 Residual                 0.05925  0.2434  
Number of obs: 4560, groups:  sbjCode, 303; Pattern.Type, 5

Fixed effects:
              Estimate Std. Error         df t value             Pr(>|t|)    
(Intercept)    1.06084    0.04933   18.66372    21.5    0.000000000000013 ***
resp          -0.07432    0.00721 2968.67505   -10.3 < 0.0000000000000002 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
     (Intr)
resp -0.701
Display code
 m1 <- lmer(Corr ~ resp*condit +  (1|sbjCode) + (1+condit|Pattern.Type), data=cat_sim)
 summary(m1)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: Corr ~ resp * condit + (1 | sbjCode) + (1 + condit | Pattern.Type)
   Data: cat_sim

REML criterion at convergence: -2562

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-4.446 -0.556  0.133  0.637  3.038 

Random effects:
 Groups       Name         Variance Std.Dev. Corr             
 sbjCode      (Intercept)  0.01938  0.1392                    
 Pattern.Type (Intercept)  0.01211  0.1100                    
              conditmedium 0.00465  0.0682   -0.81            
              conditmixed  0.00372  0.0610   -0.58  0.95      
              condithigh   0.00800  0.0895   -0.75  0.99  0.98
 Residual                  0.04514  0.2125                    
Number of obs: 13680, groups:  sbjCode, 303; Pattern.Type, 5

Fixed effects:
                     Estimate  Std. Error          df t value     Pr(>|t|)    
(Intercept)           0.99306     0.06355    10.77285   15.63 0.0000000096 ***
resp                 -0.03844     0.00760 10463.25384   -5.06 0.0000004253 ***
conditmedium         -0.01335     0.06354    66.83902   -0.21      0.83427    
conditmixed           0.03641     0.06391   107.52782    0.57      0.57006    
condithigh            0.00155     0.07088    36.96070    0.02      0.98262    
resp:conditmedium    -0.02116     0.01064  9204.92771   -1.99      0.04664 *  
resp:conditmixed     -0.04082     0.01106  9631.85840   -3.69      0.00022 ***
resp:condithigh      -0.04022     0.01117  7914.81902   -3.60      0.00032 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
            (Intr) resp   cndtmd cndtmx cndthg rsp:cndtmd rsp:cndtmx
resp        -0.575                                                  
conditmedim -0.700  0.575                                           
conditmixed -0.589  0.572  0.593                                    
condithigh  -0.686  0.515  0.630  0.608                             
rsp:cndtmdm  0.411 -0.714 -0.797 -0.408 -0.368                      
rsp:cndtmxd  0.395 -0.687 -0.395 -0.829 -0.358  0.491               
rsp:cndthgh  0.391 -0.680 -0.391 -0.396 -0.757  0.486      0.469    
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
Display code
#### 
 
 
 
 
m1 <- lmer(Corr ~ gpt_sim + (1|sbjCode), data=cat_sim)
 summary(m1)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: Corr ~ gpt_sim + (1 | sbjCode)
   Data: cat_sim

REML criterion at convergence: -1380

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-3.778 -0.612  0.109  0.640  3.118 

Random effects:
 Groups   Name        Variance Std.Dev.
 sbjCode  (Intercept) 0.0336   0.183   
 Residual             0.0490   0.221   
Number of obs: 13650, groups:  sbjCode, 303

Fixed effects:
               Estimate  Std. Error          df t value             Pr(>|t|)
(Intercept)     0.73552     0.01907  2112.60525   38.57 < 0.0000000000000002
gpt_sim        -0.01303     0.00269 12156.56017   -4.84            0.0000013
               
(Intercept) ***
gpt_sim     ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
        (Intr)
gpt_sim -0.827
Display code
m1 <- lmer(Corr ~ gpt_sim + (1|sbjCode), data=cat_sim_test)
 summary(m1)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: Corr ~ gpt_sim + (1 | sbjCode)
   Data: cat_sim_test

REML criterion at convergence: 1176

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-3.213 -0.595  0.177  0.620  2.749 

Random effects:
 Groups   Name        Variance Std.Dev.
 sbjCode  (Intercept) 0.0364   0.191   
 Residual             0.0651   0.255   
Number of obs: 4550, groups:  sbjCode, 303

Fixed effects:
              Estimate Std. Error         df t value            Pr(>|t|)    
(Intercept)    0.78289    0.03128 2221.15446    25.0 <0.0000000000000002 ***
gpt_sim       -0.01339    0.00495 3380.29833    -2.7              0.0069 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
        (Intr)
gpt_sim -0.929
Display code
m1 <- lmer(Corr ~ gpt_sim + (1|Pattern.Type) +  (1|sbjCode), data=cat_sim_test)
 summary(m1)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: Corr ~ gpt_sim + (1 | Pattern.Type) + (1 | sbjCode)
   Data: cat_sim_test

REML criterion at convergence: 872

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-3.684 -0.481  0.187  0.579  3.031 

Random effects:
 Groups       Name        Variance Std.Dev.
 sbjCode      (Intercept) 0.03674  0.1917  
 Pattern.Type (Intercept) 0.00553  0.0744  
 Residual                 0.06037  0.2457  
Number of obs: 4550, groups:  sbjCode, 303; Pattern.Type, 5

Fixed effects:
              Estimate Std. Error         df t value      Pr(>|t|)    
(Intercept)    0.78242    0.04512   13.20733   17.34 0.00000000018 ***
gpt_sim       -0.01331    0.00481 3525.41251   -2.77        0.0057 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
        (Intr)
gpt_sim -0.625
Display code
m1 <- lmer(Corr ~ gpt_sim+resp + (1|sbjCode), data=cat_sim)
 summary(m1)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: Corr ~ gpt_sim + resp + (1 | sbjCode)
   Data: cat_sim

REML criterion at convergence: -1577

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-3.768 -0.607  0.099  0.641  3.215 

Random effects:
 Groups   Name        Variance Std.Dev.
 sbjCode  (Intercept) 0.0309   0.176   
 Residual             0.0483   0.220   
Number of obs: 13650, groups:  sbjCode, 303

Fixed effects:
               Estimate  Std. Error          df t value            Pr(>|t|)    
(Intercept)     0.97635     0.02506  4065.18342   38.97 <0.0000000000000002 ***
gpt_sim        -0.00392     0.00274 12090.64751   -1.43                0.15    
resp           -0.06133     0.00425 11100.64136  -14.44 <0.0000000000000002 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
        (Intr) gpt_sm
gpt_sim -0.454       
resp    -0.666 -0.230
Display code
m1 <- lmer(Corr ~ gpt_sim + resp + (1|Pattern.Type) +  (1|sbjCode), data=cat_sim_test)
 summary(m1) 
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: Corr ~ gpt_sim + resp + (1 | Pattern.Type) + (1 | sbjCode)
   Data: cat_sim_test

REML criterion at convergence: 784

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-3.798 -0.480  0.173  0.591  2.816 

Random effects:
 Groups       Name        Variance Std.Dev.
 sbjCode      (Intercept) 0.03373  0.1837  
 Pattern.Type (Intercept) 0.00553  0.0744  
 Residual                 0.05935  0.2436  
Number of obs: 4550, groups:  sbjCode, 303; Pattern.Type, 5

Fixed effects:
              Estimate Std. Error         df t value            Pr(>|t|)    
(Intercept)    1.06790    0.05321   25.46820   20.07 <0.0000000000000002 ***
gpt_sim       -0.00158    0.00488 3508.65685   -0.32                0.75    
resp          -0.07385    0.00745 3047.36205   -9.91 <0.0000000000000002 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
        (Intr) gpt_sm
gpt_sim -0.374       
resp    -0.541 -0.244
Display code
#### 
m1 <- lmer(Corr ~ max_sim + (1|sbjCode), data=max_sim)
 summary(m1)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: Corr ~ max_sim + (1 | sbjCode)
   Data: max_sim

REML criterion at convergence: -1577

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-3.783 -0.617  0.090  0.639  3.158 

Random effects:
 Groups   Name        Variance Std.Dev.
 sbjCode  (Intercept) 0.0317   0.178   
 Residual             0.0483   0.220   
Number of obs: 13680, groups:  sbjCode, 303

Fixed effects:
               Estimate  Std. Error          df t value            Pr(>|t|)    
(Intercept)     0.86664     0.01803  2176.76969    48.1 <0.0000000000000002 ***
max_sim        -0.03853     0.00273 13482.31672   -14.1 <0.0000000000000002 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
        (Intr)
max_sim -0.817
Display code
m1 <- lmer(Corr ~ min_sim + (1|sbjCode), data=max_sim)
 summary(m1)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: Corr ~ min_sim + (1 | sbjCode)
   Data: max_sim

REML criterion at convergence: -1471

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-3.775 -0.610  0.108  0.640  3.239 

Random effects:
 Groups   Name        Variance Std.Dev.
 sbjCode  (Intercept) 0.0313   0.177   
 Residual             0.0487   0.221   
Number of obs: 13680, groups:  sbjCode, 303

Fixed effects:
              Estimate Std. Error         df t value            Pr(>|t|)    
(Intercept)    0.83574    0.02115 2301.74622   39.52 <0.0000000000000002 ***
min_sim       -0.04196    0.00439 8103.82237   -9.57 <0.0000000000000002 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
        (Intr)
min_sim -0.872
Display code
m1 <- lmer(Corr ~ min_sim*max_sim + (1|sbjCode), data=max_sim)
 summary(m1) 
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: Corr ~ min_sim * max_sim + (1 | sbjCode)
   Data: max_sim

REML criterion at convergence: -1596

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-3.796 -0.607  0.094  0.643  3.228 

Random effects:
 Groups   Name        Variance Std.Dev.
 sbjCode  (Intercept) 0.0308   0.175   
 Residual             0.0482   0.220   
Number of obs: 13680, groups:  sbjCode, 303

Fixed effects:
                   Estimate  Std. Error          df t value            Pr(>|t|)
(Intercept)         0.84336     0.05402 10858.47183   15.61 <0.0000000000000002
min_sim             0.00634     0.01539 12677.62775    0.41               0.680
max_sim            -0.01533     0.00878 13482.72304   -1.75               0.081
min_sim:max_sim    -0.00553     0.00249 13182.98830   -2.22               0.026
                   
(Intercept)     ***
min_sim            
max_sim         .  
min_sim:max_sim *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
            (Intr) min_sm max_sm
min_sim     -0.943              
max_sim     -0.913  0.875       
mn_sm:mx_sm  0.903 -0.955 -0.946
Display code
m1 <- lmer(Corr ~ max_sim + (1|Pattern.Type) +  (1|sbjCode), data=max_sim)
 summary(m1)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: Corr ~ max_sim + (1 | Pattern.Type) + (1 | sbjCode)
   Data: max_sim

REML criterion at convergence: -2220

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-4.487 -0.567  0.124  0.644  3.065 

Random effects:
 Groups       Name        Variance Std.Dev.
 sbjCode      (Intercept) 0.03178  0.1783  
 Pattern.Type (Intercept) 0.00638  0.0799  
 Residual                 0.04597  0.2144  
Number of obs: 13680, groups:  sbjCode, 303; Pattern.Type, 5

Fixed effects:
               Estimate  Std. Error          df t value             Pr(>|t|)
(Intercept)     0.90048     0.03995     6.16526    22.5           0.00000037
max_sim        -0.03848     0.00267 13516.96672   -14.4 < 0.0000000000000002
               
(Intercept) ***
max_sim     ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
        (Intr)
max_sim -0.360
Display code
m1 <- lmer(Corr ~ max_sim*condit +  (1|sbjCode) + (1+condit|Pattern.Type), data=max_sim)
 summary(m1)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [
lmerModLmerTest]
Formula: Corr ~ max_sim * condit + (1 | sbjCode) + (1 + condit | Pattern.Type)
   Data: max_sim

REML criterion at convergence: -2521

Scaled residuals: 
   Min     1Q Median     3Q    Max 
-4.449 -0.549  0.137  0.638  3.082 

Random effects:
 Groups       Name         Variance Std.Dev. Corr             
 sbjCode      (Intercept)  0.02027  0.1424                    
 Pattern.Type (Intercept)  0.01211  0.1101                    
              conditmedium 0.00465  0.0682   -0.81            
              conditmixed  0.00372  0.0610   -0.58  0.95      
              condithigh   0.00800  0.0895   -0.75  0.99  0.98
 Residual                  0.04522  0.2127                    
Number of obs: 13680, groups:  sbjCode, 303; Pattern.Type, 5

Fixed effects:
                         Estimate   Std. Error           df t value   Pr(>|t|)
(Intercept)              0.945214     0.058255     7.603924   16.23 0.00000036
max_sim                 -0.025390     0.004823 13443.252505   -5.26 0.00000014
conditmedium            -0.043595     0.054085    35.295765   -0.81      0.426
conditmixed              0.000154     0.053421    53.004265    0.00      0.998
condithigh              -0.106490     0.061516    21.045398   -1.73      0.098
max_sim:conditmedium    -0.012581     0.007046 13013.931274   -1.79      0.074
max_sim:conditmixed     -0.030383     0.007302 13313.959983   -4.16 0.00003191
max_sim:condithigh      -0.015719     0.007433 12610.398445   -2.11      0.034
                        
(Intercept)          ***
max_sim              ***
conditmedium            
conditmixed             
condithigh           .  
max_sim:conditmedium .  
max_sim:conditmixed  ***
max_sim:condithigh   *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Correlation of Fixed Effects:
             (Intr) max_sm cndtmd cndtmx cndthg mx_sm:cndtmd mx_sm:cndtmx
max_sim      -0.447                                                      
conditmedim  -0.693  0.481                                               
conditmixed  -0.561  0.487  0.609                                        
condithigh   -0.682  0.423  0.659  0.630                                 
mx_sm:cndtmd  0.306 -0.684 -0.699 -0.333 -0.290                          
mx_sm:cndtmx  0.295 -0.660 -0.318 -0.739 -0.278  0.452                   
mx_sm:cndth   0.290 -0.649 -0.312 -0.315 -0.654  0.444        0.429      
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
Display code
# m1 <- lmer(Corr ~ sim_group +  (1|sbjCode), data=cat_sim)
# summary(m1)

# m1 <- lmer(Corr ~ sim_group*condit +  (1|sbjCode), data=cat_sim)
# summary(m1)

# m1 <- lmer(Corr ~ sim_group*condit*Pattern.Type +  (1|sbjCode), data=cat_sim)
# summary(m1)
Display code
cat_sim_test |> 
  mutate(Quartile = as.factor(ntile(resp, 4))) |> group_by(condit) |> summarise(mean_rating=mean(resp),mean_acc=mean(Corr))
# A tibble: 4 × 3
  condit mean_rating mean_acc
  <fct>        <dbl>    <dbl>
1 low           4.81    0.814
2 medium        4.71    0.711
3 mixed         4.81    0.710
4 high          4.86    0.581
Display code
cat_sim_test |> 
  mutate(Quartile = as.factor(ntile(resp, 4))) |> group_by(condit,Pattern.Type) |> summarise(mean_rating=mean(resp),mean_acc=mean(Corr))
# A tibble: 20 × 4
# Groups:   condit [4]
   condit Pattern.Type mean_rating mean_acc
   <fct>  <chr>              <dbl>    <dbl>
 1 low    new_high            4.81    0.637
 2 low    new_low             4.81    0.873
 3 low    new_med             4.81    0.771
 4 low    old                 4.81    0.860
 5 low    prototype           4.81    0.926
 6 medium new_high            4.71    0.631
 7 medium new_low             4.71    0.745
 8 medium new_med             4.71    0.692
 9 medium old                 4.71    0.698
10 medium prototype           4.71    0.791
11 mixed  new_high            4.81    0.593
12 mixed  new_low             4.81    0.760
13 mixed  new_med             4.81    0.696
14 mixed  old                 4.81    0.697
15 mixed  prototype           4.81    0.806
16 high   new_high            4.86    0.512
17 high   new_low             4.86    0.637
18 high   new_med             4.86    0.587
19 high   old                 4.86    0.532
20 high   prototype           4.86    0.636