Dyadic Emotional Intelligence Composition and Cooperation in a Repeated Prisoner’s Dilemma
Data and Replication File
Author
MP
Published
October 26, 2026
1 Data and software
This is the executable replication file for the manuscript analyses. It was rendered with R version 4.5.1 (2025-06-13); all code is shown in collapsible blocks.
1.1 Installation and rendering
Install R (version 4.2 or later). Keep analisi_paper.qmd, DB.csv, and DB_time.csv together in one folder. In an R console, install the required packages once:
# =====================================================# Helper functions# =====================================================round_table <-function(df, digits =3) { df |>mutate(across(where(is.numeric), ~round(.x, digits)))}extract_model_table <-function(model, term_map =NULL, digits =3) { out <- tibble::as_tibble(coef(summary(model)), rownames ="term") stat_col <-intersect(c("z value", "t value"), names(out))[1] p_col <-grep("^Pr\\(", names(out), value =TRUE)[1]if (!"df"%in%names(out)) { out$df <-NA_real_ } out <- out |>transmute( term,estimate = Estimate,std_error =`Std. Error`,statistic = .data[[stat_col]],df = df,p_value = .data[[p_col]] )if (!is.null(term_map)) { out <- out |>mutate(term = dplyr::recode(term, !!!term_map)) }round_table(out, digits = digits)}prop_pair_test <-function(data, group1, group2, alternative ="greater") { x1 <- data |>filter(type_match == group1) |>slice(1) x2 <- data |>filter(type_match == group2) |>slice(1) test <-prop.test(x =c(x1$success, x2$success),n =c(x1$total, x2$total),alternative = alternative,correct =FALSE ) broom::tidy(test) |>transmute(comparison =paste(group1, "vs", group2),alternative = alternative,rate_1 = estimate1,rate_2 = estimate2, statistic,p_value = p.value )}t_pair_test <-function(data, value, group1, group2, alternative ="greater") { x <- data |>filter(type_match == group1) |>pull({{ value }}) y <- data |>filter(type_match == group2) |>pull({{ value }}) test <-t.test(x, y, alternative = alternative) broom::tidy(test) |>transmute(comparison =paste(group1, "vs", group2),alternative = alternative,mean_1 = estimate1,mean_2 = estimate2, statistic,df = parameter,p_value = p.value )}fit_model <-function(formula, data, family =binomial(link ="logit"), nAGQ =10, ...) {tryCatch(glmer( formula,data = data,family = family,nAGQ = nAGQ,control =glmerControl(optimizer ="bobyqa", optCtrl =list(maxfun =2e5)), ... ),error =function(e) {message("Primary glmer fit failed; retrying with nloptwrap. ", conditionMessage(e))tryCatch(glmer( formula,data = data,family = family,nAGQ = nAGQ,control =glmerControl(optimizer ="nloptwrap", calc.derivs =FALSE), ... ),error =function(e2) {message("nloptwrap also failed; retrying with bobyqa. ", conditionMessage(e2))glmer( formula,data = data,family = family,nAGQ = nAGQ,control =glmerControl(optimizer ="bobyqa", optCtrl =list(maxfun =2e5)), ... ) } ) } )}fit_model_lmer <-function(formula, data, ...) {lmer(formula, data = data, REML =FALSE, ...)}mixed_model_information <-function(model, include_residual =FALSE) { variance_components <-as.data.frame(VarCorr(model)) information <-tibble(Statistic =c("Observations","Dyads","Random-intercept variance","Log likelihood","AIC","BIC" ),Value =c(nobs(model),n_distinct(model.frame(model)$pair_id), variance_components$vcov[ variance_components$grp =="pair_id"&is.na(variance_components$var2) ][1],as.numeric(logLik(model)),AIC(model),BIC(model) ) )if (include_residual) { information <-bind_rows( information |>slice_head(n =3),tibble(Statistic ="Residual variance",Value = variance_components$vcov[ variance_components$grp =="Residual" ][1] ), information |>slice(-(1:3)) ) }round_table(information)}lm_model_information <-function(model, dyads) { model_summary <-summary(model)tibble(Statistic =c("Observations","Dyads","R-squared","Adjusted R-squared","Residual standard error","Log likelihood","AIC","BIC" ),Value =c(nobs(model), dyads, model_summary$r.squared, model_summary$adj.r.squared, model_summary$sigma,as.numeric(logLik(model)),AIC(model),BIC(model) ) ) |>round_table()}reg_term_map <-c("type_matchLH"="LH vs HH","type_matchLL"="LL vs HH","round"="Round number","late_round"="Late period","type_matchLH:round"="LH x round number","type_matchLL:round"="LL x round number","type_matchLH:late_round"="LH x late period","type_matchLL:late_round"="LL x late period","msceit_score"="MSCEIT score","matrices_score"="MATRICES score","panas_positive"="PANAS positive","panas_negative"="PANAS negative","age"="Age","genderMaschile"="Male","genderMale"="Male","high_school_mark"="High-school mark","own_type_belief"="Belief own type is high","partner_type_belief"="Belief partner type is high")
1.3 Data files and processing
The replication package contains the two input files used by this document. DB.csv is the analysis dataset of participant-round observations, and DB_time.csv contains the Day-2 page-completion records used for duration statistics.
The following links are embedded in the HTML version of this document.
The raw files are read without alteration. The analysis dataset d below removes exact duplicate rows, standardises names and factor levels, constructs the outcome and covariates used in the models, and carries participant-level fields across the ten repeated-game rows.
Seven participants reported high-school marks outside the admissible Italian 60–100 scale.
The raw responses remain unchanged in DB.csv; the derived analysis variable treats them as missing. Controlled models that include this covariate consequently use 221 participants and 113 dyads (2,210 participant-round observations in the repeated-game models). Treatment-only analyses retain all 228 participants and 114 dyads.
Six participants have missing Day-1 eis_score (SSEIT) records, leaving 222 participants with observed SSEIT scores (N = 222).
Show the R code
invalid_high_school_marks |>arrange(reported_high_school_mark) |>kable(col.names =c("Participant", "Reported high-school mark"),caption =paste("High-school marks outside the admissible 60--100 range","and treated as missing" ) )
High-school marks outside the admissible 60–100 range and treated as missing
Participant
Reported high-school mark
ngx8klzk
8
9keag7qf
15
l67cfgrm
54
qjxe8pjn
110
azszkurg
110
2dyirzxw
111
4uei7g27
603
2 Participant Flow
The study flow is reported as a descriptive record: 269 participants completed Day~1, and 228 completed Day~2 and are retained in the analysis dataset. The difference is 41 participants (15.2% of the Day-1 count).
3 Participant Payments
Show the R code
# FinalResults is displayed only in round 10. At that point player.payoff is# the sum of the selected task payoffs; the application adds a fixed €10# participation payment to this amount.fixed_payment <-10final_payments <- raw |>distinct() |>filter(subsession.round_number ==10) |>distinct(participant.code, .keep_all =TRUE) |>transmute(`Variable earnings`= player.payoff,`Fixed payment`= fixed_payment,`Total payment`= player.payoff + fixed_payment )payment_summary <- final_payments |>pivot_longer(everything(), names_to ="Payment component", values_to ="Euros") |>group_by(`Payment component`) |>summarise(Participants =n(),Mean =mean(Euros),SD =sd(Euros),Minimum =min(Euros),Maximum =max(Euros),.groups ="drop" )payment_summary |>kable(digits =2,caption ="Participant payments, based on the final-round FinalResults payoff" )
Participant payments, based on the final-round FinalResults payoff
Payment component
Participants
Mean
SD
Minimum
Maximum
Fixed payment
228
10.00
0.00
10
10.0
Total payment
228
16.81
3.68
10
23.6
Variable earnings
228
6.81
3.68
0
13.6
The final-round payoff records yield mean total compensation of €16.81 (SD = €3.68; range: €10.00–€23.60).
4 Day 2 Duration
Show the R code
# PageTimes records provide the timestamp at which each page was completed.# Duration is the elapsed time from the participant's first to final recorded# page completion on Day 2.day2_time <- readr::read_csv("DB_time.csv", show_col_types =FALSE)day2_duration <- day2_time |>group_by(participant.code, participant.label, session.code) |>summarise(duration_minutes = (max(epoch_time_completed) -min(epoch_time_completed)) /60,.groups ="drop" )duration_summary <- day2_duration |>summarise(Participants =n(),`Analysis-sample coverage`=100*n() /n_distinct(d$participant_id),Sessions =n_distinct(session.code),`Mean (minutes)`=mean(duration_minutes),`SD (minutes)`=sd(duration_minutes),`Median (minutes)`=median(duration_minutes),`Minimum (minutes)`=min(duration_minutes),`Maximum (minutes)`=max(duration_minutes) )duration_summary |>kable(digits =1,caption ="Day 2 participant duration based on PageTimes records" )
Day 2 participant duration based on PageTimes records
Participants
Analysis-sample coverage
Sessions
Mean (minutes)
SD (minutes)
Median (minutes)
Minimum (minutes)
Maximum (minutes)
220
96.5
11
41
6.7
39.5
28.3
55.1
PageTimes records are available for 220 of the 228 analysis participants (96.5%). Their mean Day 2 elapsed duration was 41.0 minutes (SD = 6.7; median = 39.5; range: 28.3–55.1 minutes).
5 Data Overview
Show the R code
bind_rows(tibble(Statistic =c("Participants","Pairs","Sessions" ),Value =c(n_distinct(d$participant_id),n_distinct(d$pair_id),n_distinct(d$session_id) ) ), d |>distinct(participant_id, type_match) |>count(type_match, name ="Value") |>transmute(Statistic =paste0("Participants (", type_match, ")"), Value )) |>kable()
Statistic
Value
Participants
228
Pairs
114
Sessions
12
Participants (HH)
76
Participants (LH)
76
Participants (LL)
76
5.1 Emotional Intelligence Measures
Day-1 SSEIT scores (eis_score) are missing for 6 of the 228 participants; SSEIT summaries and analyses therefore use the 222 participants with observed scores (N = 222).
# just for internal check, disply MSCEIT socres over time# raw |># group_by(participant.time_started_utc) |># summarise(mean_msceit = mean(player.score, na.rm = TRUE)) |># ggplot(aes(x = participant.time_started_utc, y = mean_msceit)) +# geom_point(size = 2.5, color = line_col_mid) +# labs(# title = "Mean MSCEIT scores by participant start time (for internal check)",# x = "Participant start time (UTC)",# y = "Mean MSCEIT score"# ) +# geom_smooth(method = "loess", color = line_col_dark, se = FALSE, linewidth = 1.1) +# line_theme
5.1.1 Correlation between EI and MSCEIT scores
Show the R code
d |>select(participant_id, eis_score, msceit_score) |>distinct() |>na.omit() -> temp_dfcor.test(temp_df$eis_score, temp_df$msceit_score, use ="complete.obs") |> broom::tidy() |>select(estimate, p.value) |> knitr::kable()
estimate
p.value
0.1985181
0.0029705
5.2 MSCEIT scores and types (sanity check)
Show the R code
# display mean MSCEIT scores by EI type d |>select(participant_id, msceit_score, type_match, player_type) |>distinct() |>group_by(player_type) |>summarise(mean_msceit =mean(msceit_score, na.rm =TRUE), sd =sd(msceit_score, na.rm =TRUE)) |>kable(caption ="Mean MSCEIT scores by EI type")
Mean MSCEIT scores by EI type
player_type
mean_msceit
sd
Low
94.73684
8.233380
High
112.85965
7.879487
Show the R code
wilcox.test( msceit_score ~ player_type,data = d |>select(participant_id, msceit_score, type_match, player_type) |>distinct(),exact =FALSE) |> broom::tidy() |>kable(caption ="Wilcoxon test comparing MSCEIT scores between Low and High EI types")
Wilcoxon test comparing MSCEIT scores between Low and High EI types
statistic
p.value
method
alternative
264
0
Wilcoxon rank sum test with continuity correction
two.sided
Show the R code
# check MSCEIT scores by type match (HH, LH, LL)d |>select(participant_id, msceit_score, type_match, player_type) |>distinct() |>group_by(type_match) |>summarise(mean_msceit =mean(msceit_score, na.rm =TRUE), sd =sd(msceit_score, na.rm =TRUE)) |>kable(caption ="Mean MSCEIT scores by EI matching type")
Mean MSCEIT scores by EI matching type
type_match
mean_msceit
sd
HH
112.92105
7.620609
LH
104.19737
11.631016
LL
94.27632
8.692677
Show the R code
type_match_msceit <- d |>select(participant_id, msceit_score, type_match, player_type) |>distinct()kruskal.test( msceit_score ~ type_match,data = type_match_msceit) |> broom::tidy() |>kable(caption ="Kruskal-Wallis test comparing MSCEIT scores across EI matching types (HH, LH, LL)")
Kruskal-Wallis test comparing MSCEIT scores across EI matching types (HH, LH, LL)
6.1 Hypothesis 1a: Cooperation by Matching Type (HH > LH > LL)
6.1.1 Tests
Show the R code
counts_h1a <- d |>group_by(type_match, pair_id) |>summarise(success =sum(cooperate),total =n(),cooperation_rate = success / total )h1a_overall_counts <- counts_h1a |>group_by(type_match) |>summarise(success =sum(success),total =sum(total),cooperation_rate = success / total )h1a_overall_counts |>kable(caption ="Cooperation rates by EI matching type (HH, LH, LL)")
Cooperation rates by EI matching type (HH, LH, LL)
type_match
success
total
cooperation_rate
HH
371
760
0.4881579
LH
365
760
0.4802632
LL
428
760
0.5631579
Show the R code
bind_rows(prop_pair_test(h1a_overall_counts, "HH", "LH", alternative ="greater"),prop_pair_test(h1a_overall_counts, "HH", "LL", alternative ="greater"),prop_pair_test(h1a_overall_counts, "LH", "LL", alternative ="greater")) |>round_table() |>kable(caption ="Preregistered proportion tests for H1a")
Preregistered proportion tests for H1a
comparison
alternative
rate_1
rate_2
statistic
p_value
HH vs LH
greater
0.488
0.480
0.095
0.379
HH vs LL
greater
0.488
0.563
8.573
0.998
LH vs LL
greater
0.480
0.563
10.464
0.999
Show the R code
# Complementary checks use each pair's cooperation rate as the observation,# avoiding the treatment of repeated decisions from the same pair as independent.counts_h1a |>filter(type_match %in%c("HH", "LH")) |>mutate(type_match =factor(type_match, levels =c("HH", "LH"))) |>wilcox.test(cooperation_rate ~ type_match, data = _, alternative ="greater", exact =FALSE) |> broom::tidy() |>kable(caption ="Wilcoxon test comparing cooperation rates between HH and LH matching types")
Wilcoxon test comparing cooperation rates between HH and LH matching types
statistic
p.value
method
alternative
705.5
0.5703436
Wilcoxon rank sum test with continuity correction
greater
Show the R code
counts_h1a |>filter(type_match %in%c("HH", "LL")) |>mutate(type_match =factor(type_match, levels =c("HH", "LL"))) |>wilcox.test(cooperation_rate ~ type_match, data = _, alternative ="greater", exact =FALSE) |> broom::tidy() |>kable(caption ="Wilcoxon test comparing cooperation rates between HH and LL matching types")
Wilcoxon test comparing cooperation rates between HH and LL matching types
statistic
p.value
method
alternative
621.5
0.8538217
Wilcoxon rank sum test with continuity correction
greater
Show the R code
counts_h1a |>filter(type_match %in%c("LH", "LL")) |>mutate(type_match =factor(type_match, levels =c("LH", "LL"))) |>wilcox.test(cooperation_rate ~ type_match, data = _, alternative ="greater", exact =FALSE) |> broom::tidy() |>kable(caption ="Wilcoxon test comparing cooperation rates between LH and LL matching types")
Wilcoxon test comparing cooperation rates between LH and LL matching types
statistic
p.value
method
alternative
613.5
0.8719926
Wilcoxon rank sum test with continuity correction
greater
Show the R code
# Repeat the directional pair-level comparisons using Welch's t-test.counts_h1a |>filter(type_match %in%c("HH", "LH")) |>mutate(type_match =factor(type_match, levels =c("HH", "LH"))) |>t.test(cooperation_rate ~ type_match, data = _, alternative ="greater") |> broom::tidy() |>kable(caption ="t-test comparing cooperation rates between HH and LH matching types")
t-test comparing cooperation rates between HH and LH matching types
estimate
estimate1
estimate2
statistic
p.value
parameter
conf.low
conf.high
method
alternative
0.0078947
0.4881579
0.4802632
0.118697
0.452922
72.43424
-0.1029246
Inf
Welch Two Sample t-test
greater
Show the R code
counts_h1a |>filter(type_match %in%c("HH", "LL")) |>mutate(type_match =factor(type_match, levels =c("HH", "LL"))) |>t.test(cooperation_rate ~ type_match, data = _, alternative ="greater") |> broom::tidy() |>kable(caption ="t-test comparing cooperation rates between HH and LL matching types")
t-test comparing cooperation rates between HH and LL matching types
estimate
estimate1
estimate2
statistic
p.value
parameter
conf.low
conf.high
method
alternative
-0.075
0.4881579
0.5631579
-1.090905
0.8605635
73.6019
-0.1895256
Inf
Welch Two Sample t-test
greater
Show the R code
counts_h1a |>filter(type_match %in%c("LH", "LL")) |>mutate(type_match =factor(type_match, levels =c("LH", "LL"))) |>t.test(cooperation_rate ~ type_match, data = _, alternative ="greater") |> broom::tidy() |>kable(caption ="t-test comparing cooperation rates between LH and LL matching types")
t-test comparing cooperation rates between LH and LL matching types
estimate
estimate1
estimate2
statistic
p.value
parameter
conf.low
conf.high
method
alternative
-0.0828947
0.4802632
0.5631579
-1.298374
0.9008936
73.59391
-0.1892493
Inf
Welch Two Sample t-test
greater
6.1.1.1 Two-sided 95% confidence intervals for dyad-level mean differences
The preregistered tests above are directional. For the conventional two-sided 95% confidence intervals reported in the manuscript, the same dyad-level Welch tests are repeated below with a two-sided alternative. Differences and interval bounds are expressed in percentage points.
Two-sided 95% confidence intervals for dyad-level cooperation-rate differences
Comparison
Difference (pp)
95% CI lower (pp)
95% CI upper (pp)
t
df
Two-sided p-value
HH minus LH
0.8
-12.5
14.0
0.119
72.434
0.906
HH minus LL
-7.5
-21.2
6.2
-1.091
73.602
0.279
LH minus LL
-8.3
-21.0
4.4
-1.298
73.594
0.198
Note. Each comparison reports the cooperation rates for the two matching conditions named in its caption.
6.1.2 Regression analysis for Hypothesis 1a
Outcome: binary cooperation, coded 1 for Choice A and 0 for Choice B. Both specifications include a dyad random intercept; the controlled model additionally includes the listed covariates.
Preregistered controlled logit model for Hypothesis 1a
Term
Estimate
Std. Error
z
p-value
(Intercept)
0.289
1.310
0.220
0.825
LH vs HH
-0.162
0.395
-0.411
0.681
LL vs HH
0.397
0.415
0.955
0.340
MSCEIT score
0.005
0.007
0.695
0.487
MATRICES score
-0.022
0.015
-1.412
0.158
PANAS positive
-0.024
0.011
-2.195
0.028
PANAS negative
0.026
0.013
1.919
0.055
Age
0.015
0.018
0.827
0.408
Male
-0.262
0.152
-1.724
0.085
High-school mark
-0.003
0.007
-0.390
0.697
Belief own type is high
-0.009
0.004
-2.177
0.029
Belief partner type is high
0.007
0.004
1.588
0.112
Show the R code
mixed_model_information(h1a_model) |>kable(col.names =c("Model statistic", "Value"),align =c("l", "r"),caption ="Model information for the controlled H1a logit model" )
Model information for the controlled H1a logit model
Model statistic
Value
Observations
2210.000
Dyads
113.000
Random-intercept variance
2.504
Log likelihood
-1268.932
AIC
2563.864
BIC
2637.974
Show the R code
car::linearHypothesis(h1a_treatment_model, "type_matchLH = type_matchLL", test ="Chisq") |>as.data.frame() |> tibble::rownames_to_column("Model") |>kable(caption ="Treatment-only linear hypothesis test for LH = LL in the H1a cooperation model")
Treatment-only linear hypothesis test for LH = LL in the H1a cooperation model
Model
Df
Chisq
Pr(>Chisq)
1
NA
NA
NA
2
1
1.623117
0.2026577
6.2 Hypothesis 1b: Cooperation Dynamics (EI and Cooperation Dynamics)
Following the preregistration, cooperation should decline over the finite horizon, but the decline should be weaker in HH than in LH dyads. HH and LH dyads are expected to have similar cooperation in early rounds ((C^-)); by late rounds ((C^+)), cooperation is expected to be lower in LH than in HH dyads. Formally, this verbal prediction implies
# One-sided paired tests of the predicted early-to-late decline within each# matching condition. The same dyads are observed in both periods.for (match inc("HH", "LH", "LL")) {cat("\n\n### Comparing Early vs Late Periods for", match, "Matching Type\n\n") data_subset <- counts_h1b |>filter(type_match == match) |>select(pair_id, late_period, cooperation_rate) |> tidyr::pivot_wider(names_from = late_period, values_from = cooperation_rate) |>drop_na(`Early (1-5)`, `Late (6-10)`)# Wilcoxon signed-rank test wilcox_result <-wilcox.test( data_subset$`Early (1-5)`, data_subset$`Late (6-10)`,alternative ="greater",paired =TRUE,exact =FALSE )print(broom::tidy(wilcox_result) |>kable(caption =paste("Wilcoxon test comparing Early vs Late periods for", match, "matching type")))# Paired t-test t_result <-t.test( data_subset$`Early (1-5)`, data_subset$`Late (6-10)`,alternative ="greater",paired =TRUE )print(broom::tidy(t_result) |>kable(caption =paste("t-test comparing Early vs Late periods for", match, "matching type")))}
6.2.2 Comparing Early vs Late Periods for HH Matching Type
Wilcoxon test comparing Early vs Late periods for HH matching type
statistic
p.value
method
alternative
342.5
0.0034415
Wilcoxon signed rank test with continuity correction
greater
t-test comparing Early vs Late periods for HH matching type
estimate
statistic
p.value
parameter
conf.low
conf.high
method
alternative
0.1184211
3.111106
0.0017907
37
0.0542036
Inf
Paired t-test
greater
6.2.3 Comparing Early vs Late Periods for LH Matching Type
Wilcoxon test comparing Early vs Late periods for LH matching type
statistic
p.value
method
alternative
599
0.0000142
Wilcoxon signed rank test with continuity correction
greater
t-test comparing Early vs Late periods for LH matching type
estimate
statistic
p.value
parameter
conf.low
conf.high
method
alternative
0.15
5.696153
0.0000008
37
0.1055728
Inf
Paired t-test
greater
6.2.4 Comparing Early vs Late Periods for LL Matching Type
Wilcoxon test comparing Early vs Late periods for LL matching type
statistic
p.value
method
alternative
410.5
0.0029493
Wilcoxon signed rank test with continuity correction
greater
t-test comparing Early vs Late periods for LL matching type
estimate
statistic
p.value
parameter
conf.low
conf.high
method
alternative
0.1052632
3.181685
0.0014811
37
0.0494472
Inf
Paired t-test
greater
Show the R code
diff_h1b <- counts_h1b |>select(pair_id, type_match, late_period, cooperation_rate) |> tidyr::pivot_wider(names_from = late_period, values_from = cooperation_rate) |>drop_na(`Early (1-5)`, `Late (6-10)`) |>mutate(decline =`Early (1-5)`-`Late (6-10)`)lh_decline <- diff_h1b |>filter(type_match =="LH") |>pull(decline)hh_decline <- diff_h1b |>filter(type_match =="HH") |>pull(decline)# The directional H1b comparison: the early-to-late decline is larger in LH# than in HH dyads.bind_rows( broom::tidy(wilcox.test( lh_decline, hh_decline,alternative ="greater",exact =FALSE )), broom::tidy(t.test( lh_decline, hh_decline,alternative ="greater" ))) |>select(method, estimate, statistic, p.value, alternative) |>round_table() |>kable(caption ="One-sided tests of whether the cooperation decline is larger in LH than in HH dyads")
One-sided tests of whether the cooperation decline is larger in LH than in HH dyads
method
estimate
statistic
p.value
alternative
Wilcoxon rank sum test with continuity correction
NA
837.000
0.116
greater
Welch Two Sample t-test
0.032
0.682
0.249
greater
6.2.5 Regression analysis for Hypothesis 1b
Outcome: binary cooperation, coded 1 for Choice A and 0 for Choice B. The treatment-only and controlled mixed-effects logit models include matching condition, period, their interaction, and a dyad random intercept. HH in the early period is the reference category.
Note. Points show mean beliefs about partner cooperation in each round by matching type; lines connect round-specific means, and the dashed horizontal line marks the overall mean.
Show the R code
pair_belief_h1c <- d |>group_by(pair_id, type_match) |>summarise(pair_mean_belief =mean(belief_partner_coop, na.rm =TRUE),.groups ="drop" )pair_belief_h1c |>group_by(type_match) |>summarise(mean_pair_belief =mean(pair_mean_belief, na.rm =TRUE),sd_pair_belief =sd(pair_mean_belief, na.rm =TRUE),.groups ="drop" ) |>kable(caption ="Pair-level average beliefs about partner cooperation by matching type")
Pair-level average beliefs about partner cooperation by matching type
type_match
mean_pair_belief
sd_pair_belief
HH
53.26447
21.17572
LH
50.76579
19.58553
LL
56.23816
17.03989
Show the R code
pair_belief_h1c |>filter(type_match %in%c("HH", "LH")) |>mutate(type_match =factor(type_match, levels =c("HH", "LH"))) |>wilcox.test(pair_mean_belief ~ type_match, data = _, alternative ="greater", exact =FALSE) |> broom::tidy() |>kable(caption ="Wilcoxon test comparing pair-level average beliefs between HH and LH matching types")
Wilcoxon test comparing pair-level average beliefs between HH and LH matching types
statistic
p.value
method
alternative
767
0.3219328
Wilcoxon rank sum test with continuity correction
greater
Show the R code
pair_belief_h1c |>filter(type_match %in%c("HH", "LL")) |>mutate(type_match =factor(type_match, levels =c("HH", "LL"))) |>wilcox.test(pair_mean_belief ~ type_match, data = _, alternative ="greater", exact =FALSE) |> broom::tidy() |>kable(caption ="Wilcoxon test comparing pair-level average beliefs between HH and LL matching types")
Wilcoxon test comparing pair-level average beliefs between HH and LL matching types
statistic
p.value
method
alternative
646
0.7866166
Wilcoxon rank sum test with continuity correction
greater
Show the R code
pair_belief_h1c |>filter(type_match %in%c("LH", "LL")) |>mutate(type_match =factor(type_match, levels =c("LH", "LL"))) |>wilcox.test(pair_mean_belief ~ type_match, data = _, alternative ="greater", exact =FALSE) |> broom::tidy() |>kable(caption ="Wilcoxon test comparing pair-level average beliefs between LH and LL matching types")
Wilcoxon test comparing pair-level average beliefs between LH and LL matching types
statistic
p.value
method
alternative
612.5
0.8734337
Wilcoxon rank sum test with continuity correction
greater
Show the R code
pair_belief_h1c |>filter(type_match %in%c("HH", "LH")) |>mutate(type_match =factor(type_match, levels =c("HH", "LH"))) |>t.test(pair_mean_belief ~ type_match, data = _, alternative ="greater") |> broom::tidy() |>kable(caption ="t-test comparing pair-level average beliefs between HH and LH matching types")
t-test comparing pair-level average beliefs between HH and LH matching types
estimate
estimate1
estimate2
statistic
p.value
parameter
conf.low
conf.high
method
alternative
2.498684
53.26447
50.76579
0.533999
0.2974762
73.55358
-5.296078
Inf
Welch Two Sample t-test
greater
Show the R code
pair_belief_h1c |>filter(type_match %in%c("HH", "LL")) |>mutate(type_match =factor(type_match, levels =c("HH", "LL"))) |>t.test(pair_mean_belief ~ type_match, data = _, alternative ="greater") |> broom::tidy() |>kable(caption ="t-test comparing pair-level average beliefs between HH and LL matching types")
t-test comparing pair-level average beliefs between HH and LL matching types
estimate
estimate1
estimate2
statistic
p.value
parameter
conf.low
conf.high
method
alternative
-2.973684
53.26447
56.23816
-0.6744229
0.74888
70.7612
-10.32243
Inf
Welch Two Sample t-test
greater
Show the R code
pair_belief_h1c |>filter(type_match %in%c("LH", "LL")) |>mutate(type_match =factor(type_match, levels =c("LH", "LL"))) |>t.test(pair_mean_belief ~ type_match, data = _, alternative ="greater") |> broom::tidy() |>kable(caption ="t-test comparing pair-level average beliefs between LH and LL matching types")
t-test comparing pair-level average beliefs between LH and LL matching types
estimate
estimate1
estimate2
statistic
p.value
parameter
conf.low
conf.high
method
alternative
-5.472368
50.76579
56.23816
-1.29943
0.9010465
72.61037
-12.48896
Inf
Welch Two Sample t-test
greater
Note. Each observation is a dyad’s mean belief about partner cooperation, averaged across its participants and rounds.
6.3.1 Regression analysis for Hypothesis 1c
Outcome: stated probability (0–100) that the partner chooses A. Both models include a dyad random intercept; the controlled model additionally includes the listed covariates.
Preregistered controlled belief model for Hypothesis 1c
Term
Estimate
Std. Error
t
p-value
(Intercept)
12.334
12.593
0.979
0.327
LH vs HH
-2.312
4.194
-0.551
0.583
LL vs HH
0.052
4.364
0.012
0.990
MSCEIT score
-0.067
0.070
-0.958
0.338
MATRICES score
-0.375
0.146
-2.572
0.010
PANAS positive
0.394
0.104
3.790
0.000
PANAS negative
0.340
0.127
2.682
0.007
Age
0.062
0.182
0.341
0.733
Male
2.053
1.454
1.412
0.158
High-school mark
0.138
0.071
1.958
0.050
Belief own type is high
0.113
0.040
2.836
0.005
Belief partner type is high
0.308
0.040
7.663
0.000
Show the R code
mixed_model_information(h1c_model, include_residual =TRUE) |>kable(col.names =c("Model statistic", "Value"),align =c("l", "r"),caption ="Model information for the controlled H1c belief model" )
Model information for the controlled H1c belief model
Model statistic
Value
Observations
2210.000
Dyads
113.000
Random-intercept variance
296.608
Residual variance
536.694
Log likelihood
-10220.365
AIC
20468.730
BIC
20548.541
Show the R code
car::linearHypothesis(h1c_treatment_model, "type_matchLH = type_matchLL", test ="Chisq") |>as.data.frame() |> tibble::rownames_to_column("Model") |>kable(caption ="Treatment-only linear hypothesis test for LH = LL in the H1c belief model")
Treatment-only linear hypothesis test for LH = LL in the H1c belief model
Model
Df
Chisq
Pr(>Chisq)
1
NA
NA
NA
2
1
1.561976
0.2113761
6.3.2 Continuous-round belief model
Outcome: stated probability (0–100) that the partner chooses A. The models include matching condition, round, their interaction, and a dyad random intercept.
Additional continuous-round belief model for Hypothesis 1c
Term
Estimate
Std. Error
t
p-value
(Intercept)
14.888
12.642
1.178
0.239
LH vs HH
1.981
4.777
0.415
0.679
LL vs HH
-1.266
4.937
-0.257
0.798
Round number
-0.463
0.295
-1.571
0.116
MSCEIT score
-0.067
0.070
-0.965
0.335
MATRICES score
-0.375
0.145
-2.588
0.010
PANAS positive
0.394
0.104
3.810
0.000
PANAS negative
0.341
0.126
2.701
0.007
Age
0.061
0.181
0.339
0.735
Male
2.054
1.448
1.419
0.156
High-school mark
0.139
0.070
1.971
0.049
Belief own type is high
0.113
0.040
2.845
0.004
Belief partner type is high
0.307
0.040
7.696
0.000
LH x round number
-0.782
0.416
-1.879
0.060
LL x round number
0.239
0.420
0.568
0.570
Show the R code
mixed_model_information(h1c_round_model, include_residual =TRUE) |>kable(col.names =c("Model statistic", "Value"),align =c("l", "r"),caption ="Model information for the controlled continuous-round belief model" )
Model information for the controlled continuous-round belief model
Model statistic
Value
Observations
2210.000
Dyads
113.000
Random-intercept variance
296.948
Residual variance
531.346
Log likelihood
-10209.876
AIC
20453.752
BIC
20550.665
6.4 Hypothesis 2: EI and Predictive Inference (Type Detection)
Partner-type accuracy is (^T_i = 100 - |BC_i - T_i|), where (BC_i) is the reported probability that the partner is high EI and (T_i) is the partner’s actual type (100 = high EI; 0 = low EI).
d_own_summary <- d_own_belief |>group_by(player_type) |>summarise(n =n(),mean_accuracy =mean(own_type_accuracy, na.rm =TRUE),median_accuracy =median(own_type_accuracy, na.rm =TRUE),sd_accuracy =sd(own_type_accuracy, na.rm =TRUE),.groups ="drop" )d_own_summary |>round_table() |>kable(col.names =c("Actual EI type", "n", "Mean accuracy", "Median accuracy", "SD"),caption ="Own-type prediction accuracy by actual EI type" )
Own-type prediction accuracy by actual EI type
Actual EI type
n
Mean accuracy
Median accuracy
SD
Low
114
45.053
45.0
20.590
High
114
55.132
58.5
18.841
Own-Type Prediction Accuracy by Actual EI Type
Show the R code
own_accuracy_wilcox <- d_own_belief |>wilcox.test(own_type_accuracy ~ player_type_hl, data = _, exact =FALSE) |> broom::tidy()own_accuracy_wilcox |>kable(caption ="Wilcoxon test: own-type prediction accuracy, comparing actual high and low EI types")
Wilcoxon test: own-type prediction accuracy, comparing actual high and low EI types
statistic
p.value
method
alternative
8592
0.0000257
Wilcoxon rank sum test with continuity correction
two.sided
Own-Type Prediction Accuracy by Actual EI Type
Show the R code
own_accuracy_ttest <- d_own_belief |>t.test(own_type_accuracy ~ player_type_hl, data = _) |> broom::tidy()own_accuracy_ttest |>kable(caption ="t-test: own-type prediction accuracy, comparing actual high and low EI types")
t-test: own-type prediction accuracy, comparing actual high and low EI types
h2_ttest_hh_ll <-t.test(beta ~ matching, data = d_hh_ll, alternative ="greater") |> broom::tidy()h2_ttest_hh_ll |>kable(caption ="t-test: beta HH > beta LL (one-sided)")
t-test: beta HH > beta LL (one-sided)
estimate
estimate1
estimate2
statistic
p.value
parameter
conf.low
conf.high
method
alternative
7.894737
54.07895
46.18421
2.7709
0.0031504
149.3821
3.179041
Inf
Welch Two Sample t-test
greater
6.4.3 Reported probability by actual partner type
Because the accuracy transformation depends on whether the partner is actually high or low EI, the following diagnostic compares the underlying reported probability that the partner is high EI across the two actual partner types.
Show the R code
h2_partner_type_probability <- d_matching |>mutate(actual_partner_type =factor( partner_type_actual,levels =c("high", "low"),labels =c("High EI", "Low EI") ) )h2_partner_type_probability |>group_by(actual_partner_type) |>summarise(n =n(),mean_reported_probability =mean(partner_type_belief),sd_reported_probability =sd(partner_type_belief),.groups ="drop" ) |>round_table() |>kable(col.names =c("Actual partner type", "n", "Mean reported probability", "SD"),caption ="Reported probability that the partner is high EI, by actual partner type" )
Reported probability that the partner is high EI, by actual partner type
Two-sided Welch t-test of reported partner-type probabilities
Mean: high-EI partner
Mean: low-EI partner
Difference (pp)
t
df
p-value
53.342
52.798
0.544
0.223
225.372
0.824
6.4.4 Regression analysis for Hypothesis 2
Outcome: partner-type prediction accuracy. The treatment-only model includes matching condition; the controlled model additionally includes the listed covariates.
Treatment-only regression for Hypothesis 2: partner-type prediction accuracy
Term
Estimate
Std. Error
t
p-value
(Intercept)
54.079
2.117
25.550
0.000
LH vs HH
-3.526
2.993
-1.178
0.240
LL vs HH
-7.895
2.993
-2.637
0.009
Show the R code
h2_treatment_model_rows <-as.integer(rownames(model.frame(h2_treatment_model)))lm_model_information( h2_treatment_model,dyads =n_distinct(d_matching$pair_id[h2_treatment_model_rows])) |>kable(col.names =c("Model statistic", "Value"),align =c("l", "r"),caption ="Model information for the treatment-only H2 linear model" )
Model information for the treatment-only H2 linear model
Regression results for Hypothesis 2: partner-type prediction accuracy
Term
Estimate
Std. Error
t
p-value
(Intercept)
63.022
22.769
2.768
0.006
LH vs HH
-4.699
3.187
-1.474
0.142
LL vs HH
-8.960
3.843
-2.332
0.021
MSCEIT score
-0.070
0.134
-0.523
0.601
MATRICES score
0.081
0.268
0.301
0.764
PANAS positive
-0.173
0.170
-1.015
0.311
PANAS negative
-0.045
0.232
-0.196
0.845
Age
0.107
0.339
0.316
0.752
Male
3.555
2.705
1.314
0.190
High-school mark
0.009
0.120
0.075
0.940
Show the R code
h2_model_rows <-as.integer(rownames(model.frame(h2_model)))lm_model_information( h2_model,dyads =n_distinct(d_matching$pair_id[h2_model_rows])) |>kable(col.names =c("Model statistic", "Value"),align =c("l", "r"),caption ="Model information for the controlled H2 linear model" )
Model information for the controlled H2 linear model
Model statistic
Value
Observations
221.000
Dyads
113.000
R-squared
0.046
Adjusted R-squared
0.005
Residual standard error
17.930
Log likelihood
-946.374
AIC
1914.749
BIC
1952.128
Show the R code
car::linearHypothesis(h2_treatment_model, "matchingLH = matchingLL") |>as.data.frame() |> tibble::rownames_to_column("Model") |>kable(caption ="Treatment-only linear hypothesis test for LH = LL in the partner-type accuracy model")
Treatment-only linear hypothesis test for LH = LL in the partner-type accuracy model
Model
Res.Df
RSS
Df
Sum of Sq
F
Pr(>F)
1
226
77332.89
NA
NA
NA
NA
2
225
76607.74
1
725.1579
2.129818
0.1458526
6.4.5 Robustness to within-dyad dependence
The H2 outcome is observed once per participant, leaving two potentially dependent observations per dyad. The following checks retain the preregistered treatment-only specification but account for this dependence in two ways. The first uses CR1 standard errors clustered by dyad, with inference based on 113 degrees of freedom. The second averages prediction accuracy within dyads and compares HH and LL dyads using the preregistered directional alternative.
Dyad-level one-sided Welch test of HH prediction accuracy exceeding LL
Mean HH
Mean LL
Difference
t
df
p-value
54.079
46.184
7.895
2.922
73.832
0.002
7 Multiple-testing adjustments
7.1 Holm-adjusted robustness check for pairwise tests
The tests reported above retain the preregistered directional comparisons and their original, unadjusted (p)-values. As a robustness check, we additionally apply Holm’s adjustment to the reported pairwise tests within each hypothesis. For H1a, this family comprises the three participant-level proportion tests and the three dyad-level comparisons from each of the Wilcoxon and Welch tests. For H1c and H2, it comprises the three comparisons from each of the Wilcoxon and Welch tests. This table covers the between-condition pairwise comparisons for H1a, H1c, and H2. H1b temporal tests and exploratory belief-dynamics comparisons are assessed separately in the following multiplicity assessment.
The six dyad-level tests (three conditions, each tested with a paired Wilcoxon signed-rank test and a paired t-test) form one family. Both methods address the same set of predicted declines, so they are adjusted together. A dyad’s early and late cooperation rates are paired; the one-sided alternative is early cooperation greater than late cooperation.
Show the R code
m12_within_declines <- purrr::map_dfr(c("HH", "LH", "LL"), function(condition) { periods <- counts_h1b |>filter(type_match == condition) |>select(pair_id, late_period, cooperation_rate) |> tidyr::pivot_wider(names_from = late_period, values_from = cooperation_rate) |> tidyr::drop_na(`Early (1-5)`, `Late (6-10)`) early <- periods$`Early (1-5)` late <- periods$`Late (6-10)`tibble(condition = condition,test =c("Paired Wilcoxon", "Paired t"),dyads =length(early),p_value =c(wilcox.test(early, late, paired =TRUE,alternative ="greater", exact =FALSE)$p.value,t.test(early, late, paired =TRUE, alternative ="greater")$p.value ) )}) |>mutate(p_holm =p.adjust(p_value, method ="holm"))m12_within_declines |>transmute(Condition = condition, Test = test, Dyads = dyads,`Unadjusted p`=m12_format_p(p_value),`Holm p`=m12_adjusted_p(p_holm)) |> knitr::kable(caption ="H1b within-condition declines: one Holm family of six tests")
H1b within-condition declines: one Holm family of six tests
Condition
Test
Dyads
Unadjusted p
Holm p
HH
Paired Wilcoxon
38
.003
.006
HH
Paired t
38
.002
.006
LH
Paired Wilcoxon
38
<.001
<.001
LH
Paired t
38
<.001
<.001
LL
Paired Wilcoxon
38
.003
.006
LL
Paired t
38
.001
.006
7.2.2 H1b: difference in decline between LH and HH
m12_belief_lh <- m12_belief_interactions |>filter(specification =="Treatment only", comparison =="LH vs HH")
8 Appendix: Power and sensitivity analyses
8.1 Dyad-aware reconstruction of the registered calculation
The registered target is reconstructed using 39 dyads per condition as the independent units. Cohen’s (h=.40) is mapped to cooperation probabilities of .50 and approximately .695. With 20 choices per dyad, the variance of the dyad-level cooperation rate is
Power is reported for several intradyad correlations using one-sided (\(\alpha=.05\)) and the conservative Bonferroni benchmark (\(\alpha=.05/3\)) for the three pairwise comparisons of H1a. The realised one-way ANOVA ICC is also reported as a descriptive anchor under the same exchangeable-correlation approximation; it is not used to estimate achieved power.
Maximum intradyad correlation consistent with 80% power
comparison
sig_level
maximum_rho_for_80_percent_power
Single directional comparison
0.050
0.482
Bonferroni benchmark for three comparisons
0.017
0.318
8.2 Post-data dyad-level sensitivity analysis
The realised-sample MDE is calculated from dyad-level cooperation rates, using 38 dyads per condition and 80% power. Results are reported for one-sided () and the Bonferroni benchmark (/3). Cohen’s (d) uses the pooled dyad-level standard deviation; Cohen’s (h) assumes a .50 reference cooperation probability.
This appendix documents the fields in each downloadable input file and the derived variables used in the analyses. DB.csv is the primary analysis file: each row is one participant-round observation. DB_time.csv contains one page-completion record per row.
Show the R code
panas_items <-c("interested", "distressed", "excited", "upset", "strong", "guilty","scared", "hostile", "enthusiastic", "proud", "irritable", "alert","ashamed", "inspired", "nervous", "determined", "attentive","jittery", "active", "afraid")db_field_descriptions <- tibble::tribble(~variable, ~category, ~description,"participant.code", "Identifier", "oTree participant identifier.","participant.label", "Identifier", "Pseudonymous participant label used to link study stages.","session.code", "Identifier", "oTree session identifier.","participant.time_started_utc", "Participation metadata", "UTC timestamp at which the participant started the session.","participant.payoff", "Payment", "Participant-level payoff field in the oTree export.","player.payoff", "Payment", "Player-level payoff accumulated in the oTree export; at round 10 this is the variable component used in the payment summary.","player.code", "Identifier", "Player code stored in the Day-2 application.","player.score", "Emotional intelligence", "MSCEIT overall score imported from Day 1.","player.EI", "Experimental design", "Within-session EI classification: low or high.","player.belief", "Repeated-game belief", "Reported probability, from 0 to 100, that the partner chooses A in the current round.","player.choice", "Repeated-game choice", "Participant's current choice: A (cooperation) or B (defection).","player.other_choice", "Repeated-game outcome", "Partner's realised choice in the current round.","player.payoff_game", "Repeated-game outcome", "Payoff from the current Prisoner's Dilemma round.","player.belief_own_type", "EI-type belief", "Reported probability, from 0 to 100, that the participant belongs to the high-EI half.","player.belief_other_type", "EI-type belief", "Reported probability, from 0 to 100, that the partner belongs to the high-EI half.","player.own_type_EI", "EI-type belief", "Realised own EI classification shown in the export.","player.other_type_EI", "EI-type belief", "Realised partner EI classification shown in the export.","player.age", "Demographics", "Self-reported age in years.","player.gender", "Demographics", "Self-reported gender category.","player.high_school_final_mark", "Demographics", "Raw self-reported final high-school mark; values outside the admissible 60--100 range are retained in DB.csv but treated as missing in the derived analysis variable.","player.degree_course", "Demographics", "Self-reported degree course.","player.cond_A", "Post-game questionnaire", "Hypothetical own choice if the partner had chosen A.","player.cond_B", "Post-game questionnaire", "Hypothetical own choice if the partner had chosen B.","player.other_behavior", "Post-game questionnaire", "Categorical assessment of the partner's overall behaviour.","player.own_behavior", "Post-game questionnaire", "Categorical assessment of own overall behaviour.","group.id_in_subsession", "Identifiers", "oTree group identifier within the round-specific subsession.","subsession.round_number", "Repeated-game design", "Prisoner's Dilemma round number, from 1 to 10.","player.points.Raven", "Cognitive ability", "Number of correct responses in the Raven-based MATRICES task; labelled MATRICES score in this replication file.","player.eis_score", "Emotional intelligence", "SSEIT total score imported from Day 1; missing for 6 participants (N = 222 with observed scores).","type_match", "Experimental design", "Server-assigned EI matching condition: high_high, low_high, or low_low.","group.id", "Identifiers", "Stable dyad identifier reused across all ten rounds.")panas_field_descriptions <-tibble(variable =paste0("player.", panas_items),category ="Current affect (PANAS)",description =paste0("PANAS item response for feeling '", panas_items,"' at the time of reporting (five-point response scale)." ))db_field_descriptions <-bind_rows( db_field_descriptions, panas_field_descriptions)unmapped_db_fields <-setdiff(names(raw), db_field_descriptions$variable)if (length(unmapped_db_fields) >0) {stop("Missing DB.csv codebook entries: ", paste(unmapped_db_fields, collapse =", "))}db_codebook <-tibble(variable =names(raw),stored_type = purrr::map_chr(raw, ~class(.x)[1])) |>left_join(db_field_descriptions, by ="variable") |>select(variable, stored_type, category, description)time_field_descriptions <- tibble::tribble(~variable, ~category, ~description,"participant.code", "Identifier", "oTree participant identifier.","participant.label", "Identifier", "Pseudonymous participant label.","session.code", "Identifier", "oTree session identifier.","session_code_time", "Identifier", "Session identifier recorded in the PageTimes export.","participant_id_in_session", "Identifier", "Numeric participant position within the session.","page_index", "Page metadata", "Sequential index of the recorded page event.","app_name", "Page metadata", "oTree application containing the page.","page_name", "Page metadata", "oTree page name.","round_number", "Page metadata", "Round number associated with the page event, where applicable.","epoch_time_completed", "Timing", "Unix timestamp when the page was completed.","previous_epoch_time_completed", "Timing", "Unix timestamp of the preceding recorded page completion.","time_on_page_sec", "Timing", "Recorded seconds spent on the page.","timeout_happened", "Page metadata", "Indicator that the page timed out.","is_wait_page", "Page metadata", "Indicator that the page was an oTree wait page.","source_file", "Provenance", "Original PageTimes CSV from which the record was assembled.")day2_time_codebook <-tibble(variable =names(day2_time),stored_type = purrr::map_chr(day2_time, ~class(.x)[1])) |>left_join(time_field_descriptions, by ="variable") |>select(variable, stored_type, category, description)derived_field_descriptions <- tibble::tribble(~variable, ~description,"participant_id", "Pseudonymous participant identifier.","session_id", "Session identifier.","pair_id", "Stable dyad identifier.","round", "Repeated-game round number, from 1 to 10.","player_type", "Own EI classification, recoded as Low or High.","type_match", "Dyad EI matching condition, recoded as HH, LH, or LL.","choice", "Raw current-round choice, A or B.","cooperate", "Binary cooperation outcome: 1 for Choice A and 0 for Choice B.","belief_partner_coop", "Reported probability that the partner chooses A in the current round.","msceit_score", "MSCEIT overall score.","eis_score", "SSEIT total score imported from Day 1; missing for 6 participants (N = 222 with observed scores).","matrices_score", "MATRICES score: number of correct responses in the Raven-based cognitive task.","panas_positive", "Sum of the ten positive PANAS items.","panas_negative", "Sum of the ten negative PANAS items.","age", "Self-reported age in years.","gender", "Self-reported gender category.","high_school_mark", "Self-reported final high-school mark, with values outside the admissible 60--100 range recoded as missing.","own_type_belief", "Reported probability of own high-EI classification.","partner_type_belief", "Reported probability of partner high-EI classification.","partner_type_actual", "Partner's realised EI classification.","late_round", "Indicator equal to 1 in rounds 6--10 and 0 in rounds 1--5.","late_period", "Early (rounds 1--5) or Late (rounds 6--10) period factor.")unmapped_derived_fields <-setdiff(names(d), derived_field_descriptions$variable)if (length(unmapped_derived_fields) >0) {stop("Missing derived-data codebook entries: ", paste(unmapped_derived_fields, collapse =", "))}derived_codebook <-tibble(variable =names(d),stored_type = purrr::map_chr(d, ~class(.x)[1])) |>left_join(derived_field_descriptions, by ="variable") |>select(variable, stored_type, description)tibble(Dataset =c("DB.csv", "DB_time.csv", "Derived analysis data `d`"),Rows =c(nrow(raw), nrow(day2_time), nrow(d)),Columns =c(ncol(raw), ncol(day2_time), ncol(d)),Unit =c("Participant-round", "Page completion", "Participant-round")) |>kable(caption ="Overview of replication datasets")
Pseudonymous participant label used to link study stages.
session.code
character
Identifier
oTree session identifier.
participant.time_started_utc
POSIXct
Participation metadata
UTC timestamp at which the participant started the session.
participant.payoff
numeric
Payment
Participant-level payoff field in the oTree export.
player.payoff
numeric
Payment
Player-level payoff accumulated in the oTree export; at round 10 this is the variable component used in the payment summary.
player.code
character
Identifier
Player code stored in the Day-2 application.
player.score
numeric
Emotional intelligence
MSCEIT overall score imported from Day 1.
player.EI
character
Experimental design
Within-session EI classification: low or high.
player.belief
numeric
Repeated-game belief
Reported probability, from 0 to 100, that the partner chooses A in the current round.
player.choice
character
Repeated-game choice
Participant’s current choice: A (cooperation) or B (defection).
player.other_choice
character
Repeated-game outcome
Partner’s realised choice in the current round.
player.payoff_game
numeric
Repeated-game outcome
Payoff from the current Prisoner’s Dilemma round.
player.interested
numeric
Current affect (PANAS)
PANAS item response for feeling ‘interested’ at the time of reporting (five-point response scale).
player.distressed
numeric
Current affect (PANAS)
PANAS item response for feeling ‘distressed’ at the time of reporting (five-point response scale).
player.excited
numeric
Current affect (PANAS)
PANAS item response for feeling ‘excited’ at the time of reporting (five-point response scale).
player.upset
numeric
Current affect (PANAS)
PANAS item response for feeling ‘upset’ at the time of reporting (five-point response scale).
player.strong
numeric
Current affect (PANAS)
PANAS item response for feeling ‘strong’ at the time of reporting (five-point response scale).
player.guilty
numeric
Current affect (PANAS)
PANAS item response for feeling ‘guilty’ at the time of reporting (five-point response scale).
player.scared
numeric
Current affect (PANAS)
PANAS item response for feeling ‘scared’ at the time of reporting (five-point response scale).
player.hostile
numeric
Current affect (PANAS)
PANAS item response for feeling ‘hostile’ at the time of reporting (five-point response scale).
player.enthusiastic
numeric
Current affect (PANAS)
PANAS item response for feeling ‘enthusiastic’ at the time of reporting (five-point response scale).
player.proud
numeric
Current affect (PANAS)
PANAS item response for feeling ‘proud’ at the time of reporting (five-point response scale).
player.irritable
numeric
Current affect (PANAS)
PANAS item response for feeling ‘irritable’ at the time of reporting (five-point response scale).
player.alert
numeric
Current affect (PANAS)
PANAS item response for feeling ‘alert’ at the time of reporting (five-point response scale).
player.ashamed
numeric
Current affect (PANAS)
PANAS item response for feeling ‘ashamed’ at the time of reporting (five-point response scale).
player.inspired
numeric
Current affect (PANAS)
PANAS item response for feeling ‘inspired’ at the time of reporting (five-point response scale).
player.nervous
numeric
Current affect (PANAS)
PANAS item response for feeling ‘nervous’ at the time of reporting (five-point response scale).
player.determined
numeric
Current affect (PANAS)
PANAS item response for feeling ‘determined’ at the time of reporting (five-point response scale).
player.attentive
numeric
Current affect (PANAS)
PANAS item response for feeling ‘attentive’ at the time of reporting (five-point response scale).
player.jittery
numeric
Current affect (PANAS)
PANAS item response for feeling ‘jittery’ at the time of reporting (five-point response scale).
player.active
numeric
Current affect (PANAS)
PANAS item response for feeling ‘active’ at the time of reporting (five-point response scale).
player.afraid
numeric
Current affect (PANAS)
PANAS item response for feeling ‘afraid’ at the time of reporting (five-point response scale).
player.belief_own_type
numeric
EI-type belief
Reported probability, from 0 to 100, that the participant belongs to the high-EI half.
player.belief_other_type
numeric
EI-type belief
Reported probability, from 0 to 100, that the partner belongs to the high-EI half.
player.own_type_EI
character
EI-type belief
Realised own EI classification shown in the export.
player.other_type_EI
character
EI-type belief
Realised partner EI classification shown in the export.
player.age
numeric
Demographics
Self-reported age in years.
player.gender
character
Demographics
Self-reported gender category.
player.high_school_final_mark
numeric
Demographics
Raw self-reported final high-school mark; values outside the admissible 60–100 range are retained in DB.csv but treated as missing in the derived analysis variable.
player.degree_course
character
Demographics
Self-reported degree course.
player.cond_A
character
Post-game questionnaire
Hypothetical own choice if the partner had chosen A.
player.cond_B
character
Post-game questionnaire
Hypothetical own choice if the partner had chosen B.
player.other_behavior
character
Post-game questionnaire
Categorical assessment of the partner’s overall behaviour.
player.own_behavior
character
Post-game questionnaire
Categorical assessment of own overall behaviour.
group.id_in_subsession
numeric
Identifiers
oTree group identifier within the round-specific subsession.
subsession.round_number
numeric
Repeated-game design
Prisoner’s Dilemma round number, from 1 to 10.
player.points.Raven
numeric
Cognitive ability
Number of correct responses in the Raven-based MATRICES task; labelled MATRICES score in this replication file.
player.eis_score
numeric
Emotional intelligence
SSEIT total score imported from Day 1; missing for 6 participants (N = 222 with observed scores).
type_match
character
Experimental design
Server-assigned EI matching condition: high_high, low_high, or low_low.
group.id
character
Identifiers
Stable dyad identifier reused across all ten rounds.