library(lme4)
library(lmerTest) # adds p-values to lmer summaries
library(dplyr)
library(purrr)
sim_cols <- c(
"clip_image_similarity", "clip_text_similarity", "clip_multimodal_similarity",
"clip.hf_image_similarity", "cvcl_image_similarity", "cvcl_text_similarity",
"cvcl_multimodal_similarity", "dinov2_image_similarity",
"dino_say_vitb14_image_similarity", "dino_imagenet100_vitb14_image_similarity",
"dinov3.babyview_image_similarity", "dinov3_image_similarity",
"layer1_image_similarity", "layer12_image_similarity"
)
# or: sim_cols <- grep("_similarity$", names(trials_with_effect_vars), value = TRUE)
fit_sim_model <- function(sim_col, data, REML = TRUE) {
data$sim <- data[[sim_col]]
lmer(scale(corrected_target_looking) ~ scale(sim) * scale(age_in_months) +
scale(AoA_Est_target) + scale(MeanSaliencyDiff) +
(scale(sim) | SubjectInfo.subjID) +
(1 | Trials.targetImage) +
(1 | Trials.imagePair),
data = data, REML = REML)
}
run_sim_models <- function(data, sim_cols, REML = TRUE) {
models <- map(set_names(sim_cols), function(col) {
tryCatch(fit_sim_model(col, data, REML),
error = function(e) { message(col, " failed: ", conditionMessage(e)); NULL })
}) |> compact()
summary_tbl <- imap_dfr(models, function(m, col) {
co <- coef(summary(m))
co <- co[grepl("scale\\(sim\\)", rownames(co)), , drop = FALSE]
tibble(
model = col,
term = if_else(grepl(":", rownames(co)), "similarity x age", "similarity"),
estimate = co[, "Estimate"],
se = co[, "Std. Error"],
t = co[, "t value"],
p = co[, "Pr(>|t|)"],
singular = isSingular(m),
AIC = AIC(m),
n = nobs(m)
)
})
list(models = models, summary = summary_tbl)
}
results <- run_sim_models(trials_with_effect_vars, sim_cols)