This document analyses lexical semantic similarity between music-influenced mental content (MIMC) descriptions at the aggregated document level using TF-IDF cosine similarity. Analyses are organised around three research questions:
RQ2 — Genre moderation: Does genre moderate the context effect?
RQ3 — Music vs context: Does music or framing drive greater MIMC convergence?
Note on method: TF-IDF is a bag-of-words method optimised for document-level analysis. Individual short MIMC texts (~10–50 words) produce extremely sparse vectors with minimal lexical overlap; similarity values at that scale would not reflect semantic relationships. This analysis therefore works exclusively with aggregated combMIMC documents (one per clip × context cell, N = 64). Individual- level analysis is handled by MiniLM.
The SC_SX (same clip, same context) condition is unavailable at the TF-IDF level — each cell is one document and cannot be self-paired. RQ3b (combined alignment advantage) is therefore deferred to the MiniLM pipeline.
This document-level lexical analysis complements the MiniLM semantic similarity pipeline; condition categories are identical across both methods to enable direct cross-method comparison.
Setup
Using virtual environment '/Users/hazelaileenvanderwalle/.virtualenvs/r-reticulate' ...
numpy 2.0.2 OK
pandas 2.3.3 OK
scipy 1.13.1 OK
sklearn 1.6.1 OK
matplotlib 3.9.4 OK
seaborn 0.13.2 OK
wordcloud 1.9.6 OK
All package versions OK.
Helper Functions
def sig_marker(p):"""Return significance marker string for a p-value."""if p <0.001: return"***"if p <0.01: return"**"if p <0.05: return"*"return"n.s."def welch_t(g1, g2):"""Welch's t-test returning (t, p, df, mean_diff, ci_low, ci_high).""" n1, n2 =len(g1), len(g2) v1, v2 = g1.var(ddof=1), g2.var(ddof=1) se = np.sqrt(v1/n1 + v2/n2) t = (g1.mean() - g2.mean()) / se df = (v1/n1 + v2/n2)**2/ ((v1/n1)**2/(n1-1) + (v2/n2)**2/(n2-1)) p =2* (1- stats.t.cdf(abs(t), df)) mean_diff =float(g1.mean() - g2.mean()) ci_low = mean_diff -1.96* se ci_high = mean_diff +1.96* sereturnfloat(t), float(p), float(df), mean_diff, ci_low, ci_highdef cohens_d(g1, g2):"""Compute Cohen's d effect size.""" pooled = np.sqrt((g1.std()**2+ g2.std()**2) /2)returnfloat((g1.mean() - g2.mean()) / pooled) if pooled >0else np.nan
Data Preparation
Load Data
Load combMIMC_lvl2a/b.csv — Level 2 preprocessed text data of participants’ MIMC descriptions aggregated into combMIMC documents, generated using NLP-text-prep.qmd.
data_path =f"{base_path}/NLP_outputs/combMIMC_lvl2b.csv"df = pd.read_csv(data_path) # lvl2a = aggressive preprocessing with "thought" stop words removed # lvl2b retains "thought" wordsprint(f"Shape: {df.shape}")
context_word ... text_original
0 bar ... kind of sad melancholy not happy or upbeat emo...
1 bar ... the music felt really 80s and so it was an ima...
2 bar ... i think about an old 80s movie that takes plac...
3 bar ... i could only think about sitting on the couch ...
[4 rows x 7 columns]
TF-IDF Vectorisation
TF-IDF matrix shape: (64, 3315)
-> 64 documents x 3315 terms
Matrix density: 0.0637
Top 20 terms by mean TF-IDF:
like 0.063314
imagine 0.062485
sound 0.051336
scene 0.046185
think 0.044116
make 0.042154
people 0.041130
remind 0.037347
dance 0.036263
character 0.034620
something 0.034355
get 0.033599
feel 0.033350
one 0.032823
thought 0.032441
old 0.032322
start 0.032077
hear 0.031700
go 0.031046
show 0.030752
Cosine Similarity Matrix
Cosine similarity matrix shape: (64, 64)
Value range: [0.0661, 1.0000]
Mean off-diagonal similarity: 0.1428
Extract Similarity Values by Condition
The pairwise matrix is unpacked into a tidy long-format DataFrame. Each row is a unique document pair annotated with condition labels.
Condition
Description
SC_SX
Same clip and same context — combined alignment
SC_dx
Same clip, different context — isolates clip influence
dc_SX_SG
Different clip, same context, same genre — joint context + genre alignment
dc_dx_SG
Both different, same genre
dc_SX_dg
Different clip, same context, different genre — isolates pure context influence
Linear mixed models (LMMs) provide a complementary, model-based approach to the pairwise t-tests above. The outcome is pairwise cosine similarity; fixed effects are context_comb (the context labels from the pair) and genre_comb (the genres of items in the pair); item_i and item_j are included as a random intercept to account for the fact that each individual response appears in multiple pairs.
Three models are fitted in sequence. Model 1 tests main effects of context, genre, and clip — clip is included as both a fixed and random effect to separate clip-specific idiosyncrasies from the genre signal, since genre is fully nested within clip. Model 2 adds mean believability (from the supplementary study) as a covariate at the clip × context cell level (64 unique values, one per clip–context pairing) — this gives genuine within-context variation in believability and avoids the collinearity that would arise from collapsing to context-level means. Model 3 tests the context × genre interaction while retaining clip as a covariate. Model comparisons use likelihood ratio tests (ANOVA on nested models) to determine whether each additional term improves fit.
Following the LMMs, estimated marginal means (emmeans) unpack pairwise context differences while controlling for genre. Finally, a Random Forest classifier and a Linear Discriminant Analysis (LDA) are used to assess how well context condition can be recovered from similarity scores alone.
# Using sum-to-zero (effects) coding so no reference level is used —# each coefficient represents deviation from the grand mean,# anova() gives Type III tests for each level independentlyoptions(contrasts =c("contr.sum", "contr.poly"))# Define similarity pair combination variablessim_df$genre_comb <-paste0(sim_df$genre_i, "_",sim_df$genre_j)sim_df$context_comb <-paste0(sim_df$context_i,"_",sim_df$context_j)sim_df$clip_comb <-paste0(sim_df$clip_i, "_",sim_df$clip_j)cat("genre_comb levels:\n"); print(table(sim_df$genre_comb))
# clip_comb levels levels not pasted as it's quite long# Factor predictors — comb variables as factors for the LMMssim_df$genre_comb <-factor(sim_df$genre_comb)sim_df$context_comb <-factor(sim_df$context_comb)sim_df$clip_comb <-factor(sim_df$clip_comb)sim_df$item_i <-factor(sim_df$item_i)sim_df$item_j <-factor(sim_df$item_j)# Note: combMIMC has no PROLIFIC_PID — item_i/item_j (document indices) used as# random intercepts instead. Each document appears in multiple pairs.cat("\ncontext_comb levels:", nlevels(sim_df$context_comb), "\n")
cat("Rows with NA (unmatched):", sum(is.na(sim_df$believability_pair)), "\n")
Rows with NA (unmatched): 0
LMM Models
`summarise()` has regrouped the output.
ℹ Summaries were computed grouped by context_comb and genre_comb.
ℹ Output is grouped by context_comb.
ℹ Use `summarise(.groups = "drop_last")` to silence this message.
ℹ Use `summarise(.by = c(context_comb, genre_comb))` for per-operation grouping
(`?dplyr::dplyr_by`) instead.
context_comb emmean SE df lower.CL upper.CL
bar_bar nonEst NA NA NA NA
bar_concert 0.150 0.00397 143 0.142 0.158
bar_movie 0.146 0.00397 144 0.138 0.153
bar_videogame 0.139 0.00397 144 0.131 0.147
concert_concert nonEst NA NA NA NA
concert_movie 0.140 0.00397 146 0.132 0.147
concert_videogame 0.133 0.00397 145 0.125 0.141
movie_movie nonEst NA NA NA NA
movie_videogame 0.140 0.00397 145 0.132 0.147
videogame_videogame nonEst NA NA NA NA
Results are averaged over the levels of: genre_comb
Degrees-of-freedom method: kenward-roger
Confidence level used: 0.95
cat("\n———EMMean, genre combos with 95% CI———\n")
———EMMean, genre combos with 95% CI———
emm2_gen <-emmeans(model2, ~ genre_comb)
fixed-effect model matrix is rank deficient so dropping 24 columns / coefficients
NOTE: Results may be misleading due to involvement in interactions
genre_comb emmean SE df lower.CL upper.CL
80s_80s 0.164 0.00695 370 0.151 0.178
80s_Ele 0.137 0.00678 337 0.124 0.150
80s_Jaz 0.157 0.00678 337 0.143 0.170
80s_Met 0.124 0.00678 337 0.111 0.137
Ele_80s nonEst NA NA NA NA
Ele_Ele 0.162 0.00694 372 0.149 0.176
Ele_Jaz 0.133 0.00678 337 0.120 0.146
Ele_Met 0.140 0.00678 338 0.127 0.154
Jaz_80s nonEst NA NA NA NA
Jaz_Ele nonEst NA NA NA NA
Jaz_Jaz 0.177 0.00694 372 0.164 0.191
Jaz_Met 0.122 0.00678 338 0.109 0.135
Met_80s nonEst NA NA NA NA
Met_Ele nonEst NA NA NA NA
Met_Jaz nonEst NA NA NA NA
Met_Met 0.181 0.00694 372 0.167 0.194
Results are averaged over the levels of: context_comb
Degrees-of-freedom method: kenward-roger
Confidence level used: 0.95
cat("\n———EMMean, context × genre cell means with 95% CI———\n")
———EMMean, context × genre cell means with 95% CI———
Warning: Removed 12 rows containing missing values or values outside the scale range
(`geom_line()`).
Removed 24 rows containing missing values or values outside the scale range
(`geom_pointrange()`).
cat("\n———Model 1 vs Model 2 (genre interaction):———\n")
$emmeans
context_comb emmean SE df lower.CL upper.CL t.ratio p.value
bar_bar nonEst NA NA NA NA NA NA
bar_concert 0.150 0.00397 143 0.142 0.158 37.754 <0.0001
bar_movie 0.146 0.00397 144 0.138 0.153 36.617 <0.0001
bar_videogame 0.139 0.00397 144 0.131 0.147 35.000 <0.0001
concert_concert nonEst NA NA NA NA NA NA
concert_movie 0.140 0.00397 146 0.132 0.147 35.140 <0.0001
concert_videogame 0.133 0.00397 145 0.125 0.141 33.541 <0.0001
movie_movie nonEst NA NA NA NA NA NA
movie_videogame 0.140 0.00397 145 0.132 0.147 35.114 <0.0001
videogame_videogame nonEst NA NA NA NA NA NA
Results are averaged over the levels of: genre_comb
Degrees-of-freedom method: kenward-roger
Confidence level used: 0.95
$contrasts
contrast estimate SE df lower.CL
bar_bar - bar_concert nonEst NA NA NA
bar_bar - bar_movie nonEst NA NA NA
bar_bar - bar_videogame nonEst NA NA NA
bar_bar - concert_concert nonEst NA NA NA
bar_bar - concert_movie nonEst NA NA NA
bar_bar - concert_videogame nonEst NA NA NA
bar_bar - movie_movie nonEst NA NA NA
bar_bar - movie_videogame nonEst NA NA NA
bar_bar - videogame_videogame nonEst NA NA NA
bar_concert - bar_movie 0.004519 0.00456 78.7 -0.00881
bar_concert - bar_videogame 0.010946 0.00456 79.0 -0.00238
bar_concert - concert_concert nonEst NA NA NA
bar_concert - concert_movie 0.010387 0.00529 117.0 -0.00495
bar_concert - concert_videogame 0.016742 0.00529 117.2 0.00141
bar_concert - movie_movie nonEst NA NA NA
bar_concert - movie_videogame 0.010489 0.00529 118.5 -0.00484
bar_concert - videogame_videogame nonEst NA NA NA
bar_movie - bar_videogame 0.006428 0.00456 81.4 -0.00689
bar_movie - concert_concert nonEst NA NA NA
bar_movie - concert_movie 0.005868 0.00312 99.1 -0.00320
bar_movie - concert_videogame 0.012223 0.00529 118.3 -0.00311
bar_movie - movie_movie nonEst NA NA NA
bar_movie - movie_videogame 0.005971 0.00529 118.7 -0.00936
bar_movie - videogame_videogame nonEst NA NA NA
bar_videogame - concert_concert nonEst NA NA NA
bar_videogame - concert_movie -0.000559 0.00529 118.3 -0.01589
bar_videogame - concert_videogame 0.005796 0.00312 99.1 -0.00327
bar_videogame - movie_movie nonEst NA NA NA
bar_videogame - movie_videogame -0.000457 0.00312 91.2 -0.00954
bar_videogame - videogame_videogame nonEst NA NA NA
concert_concert - concert_movie nonEst NA NA NA
concert_concert - concert_videogame nonEst NA NA NA
concert_concert - movie_movie nonEst NA NA NA
concert_concert - movie_videogame nonEst NA NA NA
concert_concert - videogame_videogame nonEst NA NA NA
concert_movie - concert_videogame 0.006355 0.00456 81.4 -0.00696
concert_movie - movie_movie nonEst NA NA NA
concert_movie - movie_videogame 0.000103 0.00529 118.7 -0.01523
concert_movie - videogame_videogame nonEst NA NA NA
concert_videogame - movie_movie nonEst NA NA NA
concert_videogame - movie_videogame -0.006253 0.00312 90.8 -0.01533
concert_videogame - videogame_videogame nonEst NA NA NA
movie_movie - movie_videogame nonEst NA NA NA
movie_movie - videogame_videogame nonEst NA NA NA
movie_videogame - videogame_videogame nonEst NA NA NA
upper.CL t.ratio p.value
NA NA NA
NA NA NA
NA NA NA
NA NA NA
NA NA NA
NA NA NA
NA NA NA
NA NA NA
NA NA NA
0.01784 0.991 0.9196
0.02427 2.400 0.1690
NA NA NA
0.02572 1.963 0.3700
0.03208 3.164 0.0238
NA NA NA
0.02582 1.982 0.3588
NA NA NA
0.01974 1.409 0.7215
NA NA NA
0.01493 1.881 0.4197
0.02755 2.310 0.1984
NA NA NA
0.02130 1.128 0.8687
NA NA NA
NA NA NA
0.01477 -0.106 1.0000
0.01486 1.858 0.4339
NA NA NA
0.00862 -0.146 1.0000
NA NA NA
NA NA NA
NA NA NA
NA NA NA
NA NA NA
NA NA NA
0.01967 1.393 0.7309
NA NA NA
0.01543 0.019 1.0000
NA NA NA
NA NA NA
0.00283 -2.005 0.3479
NA NA NA
NA NA NA
NA NA NA
NA NA NA
Results are averaged over the levels of: genre_comb
Degrees-of-freedom method: kenward-roger
Confidence level used: 0.95
Conf-level adjustment: tukey method for comparing a family of 6 estimates
P value adjustment: tukey method for comparing a family of 6 estimates
cat("\n———context × genre cell means (Model 2):———\n")
fixed-effect model matrix is rank deficient so dropping 24 columns / coefficients
genre_comb = 80s_80s:
context_comb emmean SE df lower.CL upper.CL
bar_bar 0.1703 0.01260 362 0.1456 0.195
bar_concert 0.1627 0.00999 351 0.1430 0.182
bar_movie 0.1573 0.00999 362 0.1377 0.177
bar_videogame 0.1518 0.00999 366 0.1322 0.171
concert_concert 0.1649 0.01190 698 0.1416 0.188
concert_movie 0.1624 0.00999 363 0.1428 0.182
concert_videogame 0.1498 0.00999 366 0.1302 0.169
movie_movie 0.1889 0.01190 714 0.1656 0.212
movie_videogame 0.1682 0.00999 364 0.1486 0.188
videogame_videogame 0.1669 0.01190 707 0.1435 0.190
genre_comb = 80s_Ele:
context_comb emmean SE df lower.CL upper.CL
bar_bar 0.1533 0.00999 310 0.1336 0.173
bar_concert 0.1411 0.00999 356 0.1215 0.161
bar_movie 0.1397 0.00999 365 0.1201 0.159
bar_videogame 0.1228 0.00999 368 0.1031 0.142
concert_concert 0.1411 0.00999 356 0.1215 0.161
concert_movie 0.1331 0.00999 365 0.1135 0.153
concert_videogame 0.1254 0.00999 368 0.1057 0.145
movie_movie 0.1442 0.00999 363 0.1246 0.164
movie_videogame 0.1243 0.00999 366 0.1047 0.144
videogame_videogame 0.1443 0.00999 359 0.1246 0.164
genre_comb = 80s_Jaz:
context_comb emmean SE df lower.CL upper.CL
bar_bar 0.1761 0.00999 334 0.1565 0.196
bar_concert 0.1571 0.00999 360 0.1374 0.177
bar_movie 0.1652 0.00999 366 0.1455 0.185
bar_videogame 0.1542 0.00999 369 0.1346 0.174
concert_concert 0.1527 0.00999 360 0.1331 0.172
concert_movie 0.1573 0.00999 366 0.1377 0.177
concert_videogame 0.1437 0.00999 369 0.1241 0.163
movie_movie 0.1625 0.00999 364 0.1429 0.182
movie_videogame 0.1425 0.00999 367 0.1228 0.162
videogame_videogame 0.1536 0.00999 360 0.1340 0.173
genre_comb = 80s_Met:
context_comb emmean SE df lower.CL upper.CL
bar_bar 0.1443 0.00999 346 0.1247 0.164
bar_concert 0.1333 0.00999 363 0.1137 0.153
bar_movie 0.1220 0.00999 368 0.1023 0.142
bar_videogame 0.1045 0.00999 370 0.0848 0.124
concert_concert 0.1420 0.00999 362 0.1224 0.162
concert_movie 0.1208 0.00999 367 0.1012 0.140
concert_videogame 0.1111 0.00999 370 0.0915 0.131
movie_movie 0.1256 0.00999 365 0.1059 0.145
movie_videogame 0.1048 0.00999 367 0.0852 0.124
videogame_videogame 0.1327 0.00999 360 0.1131 0.152
genre_comb = Ele_80s:
context_comb emmean SE df lower.CL upper.CL
bar_bar nonEst NA NA NA NA
bar_concert 0.1414 0.00999 352 0.1218 0.161
bar_movie 0.1346 0.00999 363 0.1150 0.154
bar_videogame 0.1456 0.00999 367 0.1260 0.165
concert_concert nonEst NA NA NA NA
concert_movie 0.1269 0.00999 362 0.1073 0.147
concert_videogame 0.1386 0.00999 366 0.1190 0.158
movie_movie nonEst NA NA NA NA
movie_videogame 0.1482 0.00999 364 0.1285 0.168
videogame_videogame nonEst NA NA NA NA
genre_comb = Ele_Ele:
context_comb emmean SE df lower.CL upper.CL
bar_bar 0.1667 0.01210 603 0.1429 0.190
bar_concert 0.1722 0.00999 357 0.1525 0.192
bar_movie 0.1586 0.00999 365 0.1389 0.178
bar_videogame 0.1567 0.00999 368 0.1371 0.176
concert_concert 0.1751 0.01190 707 0.1518 0.198
concert_movie 0.1538 0.00999 365 0.1342 0.173
concert_videogame 0.1572 0.00999 368 0.1376 0.177
movie_movie 0.1668 0.01190 717 0.1435 0.190
movie_videogame 0.1671 0.00999 365 0.1474 0.187
videogame_videogame 0.1506 0.01190 697 0.1272 0.174
genre_comb = Ele_Jaz:
context_comb emmean SE df lower.CL upper.CL
bar_bar 0.1526 0.00999 334 0.1329 0.172
bar_concert 0.1365 0.00999 360 0.1168 0.156
bar_movie 0.1389 0.00999 366 0.1193 0.159
bar_videogame 0.1299 0.00999 368 0.1103 0.150
concert_concert 0.1294 0.00999 359 0.1098 0.149
concert_movie 0.1272 0.00999 366 0.1075 0.147
concert_videogame 0.1257 0.00999 368 0.1060 0.145
movie_movie 0.1367 0.00999 363 0.1171 0.156
movie_videogame 0.1311 0.00999 365 0.1115 0.151
videogame_videogame 0.1204 0.00999 355 0.1007 0.140
genre_comb = Ele_Met:
context_comb emmean SE df lower.CL upper.CL
bar_bar 0.1432 0.00999 346 0.1235 0.163
bar_concert 0.1430 0.00999 363 0.1234 0.163
bar_movie 0.1339 0.00999 368 0.1142 0.154
bar_videogame 0.1161 0.00999 369 0.0965 0.136
concert_concert 0.1598 0.00999 362 0.1402 0.179
concert_movie 0.1348 0.00999 367 0.1152 0.154
concert_videogame 0.1283 0.00999 369 0.1087 0.148
movie_movie 0.1505 0.00999 364 0.1309 0.170
movie_videogame 0.1451 0.00999 366 0.1254 0.165
videogame_videogame 0.1502 0.00999 355 0.1305 0.170
genre_comb = Jaz_80s:
context_comb emmean SE df lower.CL upper.CL
bar_bar nonEst NA NA NA NA
bar_concert 0.1520 0.00999 352 0.1323 0.172
bar_movie 0.1452 0.00999 363 0.1256 0.165
bar_videogame 0.1570 0.00999 367 0.1373 0.177
concert_concert nonEst NA NA NA NA
concert_movie 0.1359 0.00999 362 0.1163 0.156
concert_videogame 0.1384 0.00999 366 0.1187 0.158
movie_movie nonEst NA NA NA NA
movie_videogame 0.1530 0.00999 362 0.1333 0.173
videogame_videogame nonEst NA NA NA NA
genre_comb = Jaz_Ele:
context_comb emmean SE df lower.CL upper.CL
bar_bar nonEst NA NA NA NA
bar_concert 0.1369 0.00999 357 0.1173 0.157
bar_movie 0.1397 0.00999 366 0.1200 0.159
bar_videogame 0.1255 0.00999 369 0.1059 0.145
concert_concert nonEst NA NA NA NA
concert_movie 0.1202 0.00999 365 0.1006 0.140
concert_videogame 0.1138 0.00999 368 0.0942 0.133
movie_movie nonEst NA NA NA NA
movie_videogame 0.1263 0.00999 364 0.1066 0.146
videogame_videogame nonEst NA NA NA NA
genre_comb = Jaz_Jaz:
context_comb emmean SE df lower.CL upper.CL
bar_bar 0.2020 0.01200 664 0.1785 0.226
bar_concert 0.1832 0.00999 360 0.1635 0.203
bar_movie 0.1962 0.00999 367 0.1766 0.216
bar_videogame 0.1828 0.00999 369 0.1631 0.202
concert_concert 0.1740 0.01190 712 0.1507 0.197
concert_movie 0.1778 0.00999 366 0.1581 0.197
concert_videogame 0.1642 0.00999 368 0.1445 0.184
movie_movie 0.1760 0.01190 717 0.1527 0.199
movie_videogame 0.1726 0.00999 364 0.1529 0.192
videogame_videogame 0.1454 0.01200 665 0.1218 0.169
genre_comb = Jaz_Met:
context_comb emmean SE df lower.CL upper.CL
bar_bar 0.1414 0.00999 346 0.1217 0.161
bar_concert 0.1338 0.00999 362 0.1142 0.153
bar_movie 0.1245 0.00999 367 0.1049 0.144
bar_videogame 0.1037 0.00999 369 0.0841 0.123
concert_concert 0.1473 0.00999 361 0.1277 0.167
concert_movie 0.1202 0.00999 366 0.1005 0.140
concert_videogame 0.0986 0.00999 368 0.0790 0.118
movie_movie 0.1222 0.00999 363 0.1025 0.142
movie_videogame 0.1097 0.00999 364 0.0901 0.129
videogame_videogame 0.1180 0.00999 346 0.0984 0.138
genre_comb = Met_80s:
context_comb emmean SE df lower.CL upper.CL
bar_bar nonEst NA NA NA NA
bar_concert 0.1389 0.00999 351 0.1192 0.159
bar_movie 0.1271 0.00999 362 0.1074 0.147
bar_videogame 0.1349 0.00999 366 0.1153 0.155
concert_concert nonEst NA NA NA NA
concert_movie 0.1279 0.00999 361 0.1082 0.148
concert_videogame 0.1253 0.00999 365 0.1056 0.145
movie_movie nonEst NA NA NA NA
movie_videogame 0.1293 0.00999 360 0.1097 0.149
videogame_videogame nonEst NA NA NA NA
genre_comb = Met_Ele:
context_comb emmean SE df lower.CL upper.CL
bar_bar nonEst NA NA NA NA
bar_concert 0.1386 0.00999 357 0.1190 0.158
bar_movie 0.1401 0.00999 365 0.1205 0.160
bar_videogame 0.1340 0.00999 368 0.1144 0.154
concert_concert nonEst NA NA NA NA
concert_movie 0.1350 0.00999 364 0.1154 0.155
concert_videogame 0.1295 0.00999 367 0.1098 0.149
movie_movie nonEst NA NA NA NA
movie_videogame 0.1311 0.00999 362 0.1115 0.151
videogame_videogame nonEst NA NA NA NA
genre_comb = Met_Jaz:
context_comb emmean SE df lower.CL upper.CL
bar_bar nonEst NA NA NA NA
bar_concert 0.1397 0.00999 360 0.1200 0.159
bar_movie 0.1318 0.00999 367 0.1122 0.151
bar_videogame 0.1281 0.00999 369 0.1085 0.148
concert_concert nonEst NA NA NA NA
concert_movie 0.1298 0.00999 365 0.1102 0.149
concert_videogame 0.1185 0.00999 368 0.0989 0.138
movie_movie nonEst NA NA NA NA
movie_videogame 0.1158 0.00999 363 0.0961 0.135
videogame_videogame nonEst NA NA NA NA
genre_comb = Met_Met:
context_comb emmean SE df lower.CL upper.CL
bar_bar 0.1923 0.01190 689 0.1689 0.216
bar_concert 0.1900 0.00999 362 0.1703 0.210
bar_movie 0.1733 0.00999 367 0.1537 0.193
bar_videogame 0.1776 0.00999 369 0.1580 0.197
concert_concert 0.2105 0.01190 715 0.1873 0.234
concert_movie 0.1710 0.00999 366 0.1513 0.191
concert_videogame 0.1644 0.00999 367 0.1447 0.184
movie_movie 0.1704 0.01190 714 0.1471 0.194
movie_videogame 0.1636 0.00999 363 0.1439 0.183
videogame_videogame 0.1935 0.01220 554 0.1697 0.217
Degrees-of-freedom method: kenward-roger
Confidence level used: 0.95
RQ1 — Does Context Shape MIMC Similarity?
Logic: The clearest test of whether context cues do anything at all is to compare dc_SX_dg (different music, same context label) against dc_dx_dg (everything different — the dissimilarity floor). If context drives convergence, pairs sharing a context label should be more similar than pairs sharing nothing.
An omnibus Kruskal–Wallis test across all five conditions is run first to establish that condition membership explains variation before pairwise tests are interpreted.
Context Effect: Pure isolation (dc_SX_dg) and joint alignment (dc_SX_SG)
The dc_SX_dg condition previously collapsed same-context pairs regardless of whether the two items shared a genre. Splitting by genre gives two distinct tests: dc_SX_dg (different clip, same context, different genre) isolates the pure context effect with genre controlled out; dc_SX_SG (different clip, same context, same genre) captures joint context + genre alignment.
RQ1 — CONTEXT EFFECT (pure isolation: dc_SX_dg vs baseline)
dc_SX_SG (diff clip, same ctx, same genre) M = 0.1656 (N = 96)
dc_dx_dg (baseline) M = 0.1322 (N = 1152)
Mean diff = +0.0334, 95% CI [0.0244, 0.0424]
Welch's t(104.4) = 8.646, p = 0.0000 ***
Cohen's d = 1.016 [note: d benchmarks not appropriate for pairwise data]
Visualisation
RQ2 — Does Genre Moderate the Context Effect?
Logic: Two complementary tests. Framing susceptibility: per genre, how much does sharing a context label raise similarity above the dissimilarity floor? Within-genre clip vs context dominance: within each genre, does clip or context drive more convergence? Model 2 (context × genre interaction) is presented as the model-based complement to these tests.
80S Ctx M=0.1632 Base M=0.1499 Gain=+0.0133 95% CI [0.0015, 0.0251] d=0.523 p=0.0327
ELE Ctx M=0.1480 Base M=0.1426 Gain=+0.0054 95% CI [-0.0096, 0.0204] d=0.166 p=0.4840
JAZ Ctx M=0.1669 Base M=0.1626 Gain=+0.0043 95% CI [-0.0179, 0.0265] d=0.089 p=0.7049
MET Ctx M=0.1841 Base M=0.1692 Gain=+0.0149 95% CI [0.0002, 0.0297] d=0.454 p=0.0537
Genres ranked by framing susceptibility (highest to lowest):
MET Gain=+0.0149 95% CI [0.0002, 0.0297] d=0.454 sig_bonf=n.s.
80S Gain=+0.0133 95% CI [0.0015, 0.0251] d=0.523 sig_bonf=n.s.
ELE Gain=+0.0054 95% CI [-0.0096, 0.0204] d=0.166 sig_bonf=n.s.
JAZ Gain=+0.0043 95% CI [-0.0179, 0.0265] d=0.089 sig_bonf=n.s.
Saved genre framing susceptibility table
RQ3 — Does Music Clip or Context Drive Greater Convergence?
Logic: SC_dx (same clip, different contexts) isolates the music contribution; dc_SX_dg (different clips, same context) isolates the context contribution.
TF-IDF note — SC_SX unavailable: each clip × context cell is a single aggregated document and cannot be self-paired, so SC_SX yields zero pairs. The combined-alignment hypothesis (RQ3b) is therefore a MiniLM-only analysis.
Mean difference = +0.0606, 95% CI [0.0516, 0.0697]
Welch's t(117.8) = 13.127, p = 0.0000 ***
Cohen's d = 1.655 [note: d benchmarks not appropriate for pairwise data]
-> CLIP drives greater MIMC similarity at the document level
RQ3b — Combined Advantage: SC_SX vs Single-Factor Conditions
SKIPPED in TF-IDF — MiniLM only. Each clip × context cell = one document; self-pairing is undefined. SC_SX yields N = 0. Deferred to the MiniLM pipeline.
Mean diff=+0.0606 95% CI [0.0516, 0.0697] CLIP dominant d=1.655 ***
RQ3b — Combined Advantage (SC_SX): SKIPPED — not available at TF-IDF level.
-> Deferred to MiniLM pipeline.
Exploratory Analyses
The analyses below do not map directly onto the three pre-specified research questions. They are retained as descriptive and methodological supplements that may be useful for characterising the data or for future exploratory work.
Word Clouds by Genre × Context
Word size reflects TF-IDF score; darker shading indicates a higher score. Useful for understanding the lexical character of each condition cell.
<wordcloud.wordcloud.WordCloud object at 0x17cbe0280>
<matplotlib.image.AxesImage object at 0x17cbbd790>
(np.float64(-0.5), np.float64(399.5), np.float64(299.5), np.float64(-0.5))
Text(0.5, 1.0, 'BAR')
Text(-0.1, 0.5, '80S')
<wordcloud.wordcloud.WordCloud object at 0x17cbe0220>
<matplotlib.image.AxesImage object at 0x17cbe0280>
(np.float64(-0.5), np.float64(399.5), np.float64(299.5), np.float64(-0.5))
Text(0.5, 1.0, 'CONCERT')
<wordcloud.wordcloud.WordCloud object at 0x17cbe0d90>
<matplotlib.image.AxesImage object at 0x17cbe0220>
(np.float64(-0.5), np.float64(399.5), np.float64(299.5), np.float64(-0.5))
Text(0.5, 1.0, 'MOVIE')
<wordcloud.wordcloud.WordCloud object at 0x17cbe0d00>
<matplotlib.image.AxesImage object at 0x17cbe0d90>
(np.float64(-0.5), np.float64(399.5), np.float64(299.5), np.float64(-0.5))
Text(0.5, 1.0, 'VIDEOGAME')
<wordcloud.wordcloud.WordCloud object at 0x17cbe0b50>
<matplotlib.image.AxesImage object at 0x17cbe0d00>
(np.float64(-0.5), np.float64(399.5), np.float64(299.5), np.float64(-0.5))
Text(-0.1, 0.5, 'ELECTRONIC')
<wordcloud.wordcloud.WordCloud object at 0x17cbe0880>
<matplotlib.image.AxesImage object at 0x17cbe0b50>
(np.float64(-0.5), np.float64(399.5), np.float64(299.5), np.float64(-0.5))
<wordcloud.wordcloud.WordCloud object at 0x17c4a23a0>
<matplotlib.image.AxesImage object at 0x17cbcc7c0>
(np.float64(-0.5), np.float64(399.5), np.float64(299.5), np.float64(-0.5))
<wordcloud.wordcloud.WordCloud object at 0x17cbe0d60>
<matplotlib.image.AxesImage object at 0x17ce57eb0>
(np.float64(-0.5), np.float64(399.5), np.float64(299.5), np.float64(-0.5))
<wordcloud.wordcloud.WordCloud object at 0x17c4a2e20>
<matplotlib.image.AxesImage object at 0x17ce570a0>
(np.float64(-0.5), np.float64(399.5), np.float64(299.5), np.float64(-0.5))
Text(-0.1, 0.5, 'JAZZ')
<wordcloud.wordcloud.WordCloud object at 0x17cbe0dc0>
<matplotlib.image.AxesImage object at 0x17ce57cd0>
(np.float64(-0.5), np.float64(399.5), np.float64(299.5), np.float64(-0.5))
<wordcloud.wordcloud.WordCloud object at 0x17c4a23a0>
<matplotlib.image.AxesImage object at 0x17cbe0dc0>
(np.float64(-0.5), np.float64(399.5), np.float64(299.5), np.float64(-0.5))
<wordcloud.wordcloud.WordCloud object at 0x17ce57f10>
<matplotlib.image.AxesImage object at 0x17ce48eb0>
(np.float64(-0.5), np.float64(399.5), np.float64(299.5), np.float64(-0.5))
<wordcloud.wordcloud.WordCloud object at 0x17c4a2e20>
<matplotlib.image.AxesImage object at 0x17ce48940>
(np.float64(-0.5), np.float64(399.5), np.float64(299.5), np.float64(-0.5))
Text(-0.1, 0.5, 'METAL')
<wordcloud.wordcloud.WordCloud object at 0x17cbe0850>
<matplotlib.image.AxesImage object at 0x17ce48df0>
(np.float64(-0.5), np.float64(399.5), np.float64(299.5), np.float64(-0.5))
<wordcloud.wordcloud.WordCloud object at 0x17c4a23a0>
<matplotlib.image.AxesImage object at 0x17ce43dc0>
(np.float64(-0.5), np.float64(399.5), np.float64(299.5), np.float64(-0.5))
<wordcloud.wordcloud.WordCloud object at 0x17cbe0880>
<matplotlib.image.AxesImage object at 0x17ce43490>
(np.float64(-0.5), np.float64(399.5), np.float64(299.5), np.float64(-0.5))
Tests whether specific context labels or genres differ from each other in how much convergence they produce. Not pre-specified in the hypotheses — retained as descriptive characterisation only.
Text(0.5, 0.98, 'Similarity Matrices: Context and Genre')
Document-Level t-SNE
t-SNE projects the high-dimensional TF-IDF vectors into 2D space. Provides a visual check on whether documents with shared conditions cluster together — useful for data quality and interpretation, but not a hypothesis test.
The following package(s) will be installed:
- renv [1.2.2]
These packages will be installed into "~/Library/Caches/org.R-project.R/R/renv/library/NLP_analyses-89bf1a08/macos/R-4.5/aarch64-apple-darwin20".
# Installing packages --------------------------------------------------------
[32m✔[0m renv 1.2.2 [linked from cache]
Successfully installed 1 package in 3.1 milliseconds.