tdata <- read_csv("exp_data.csv")
## Rows: 111 Columns: 20
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (13): subj_code, desktop_conf, attent_conf, intro_check, structure, fir...
## dbl   (6): condition, red_caused_rating, yellow_caused_rating, red_maintaine...
## dttm  (1): recorded_at
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

Exclude subjects who failed at least one control questions

tdata <- subset(tdata, intro_check == "2: A green ball lies on a brown wooden board. Then a yellow ball falls down onto the wooden board. The green ball then shoots into the air.")

tdata <- subset(tdata, timing_check_correct == "correct")
tdata <- subset(tdata, learning_check_correct == "correct")

1 Subject demographics

# demographics 

min(tdata$age)
## [1] 19
max(tdata$age)
## [1] 76
mean(tdata$age)
## [1] 41.83
sd(tdata$age)
## [1] 13.3038
# 1 = male, 2 = female, 3 = other
table(tdata$gender)
## 
##       1: male     2: female 3: non-binary 
##            55            44             1

1 = male, 2 = female, 3 = non-binary, 4 = prefer not to say

2 Data preparations

Check n in each condition:

table(tdata$structure, tdata$first_object)
##               
##                red yellow
##   irreversible  25     25
##   reversible    25     25

Factorize:

tdata$structure <- factor(tdata$structure, levels = c("irreversible", "reversible"), labels = c("irreversible", "reversible"))

Relabel rating columns for red and yellow entity according to “first object” (so that they are called first_obj_rating and second_obj_rating):

red_first <- subset(tdata, first_object == "red")
colnames(red_first)[10] ="first_caused_rating"
colnames(red_first)[11] ="second_caused_rating"
colnames(red_first)[12] = "first_maintained_rating"
colnames(red_first)[13] = "second_maintained_rating"

yellow_first <- subset(tdata, first_object == "yellow")
colnames(yellow_first)[10] ="second_caused_rating"
colnames(yellow_first)[11] ="first_caused_rating"
colnames(yellow_first)[12] = "second_maintained_rating"
colnames(yellow_first)[13] = "first_maintained_rating"


tdata <- rbind(red_first, yellow_first)

Make a subset containing only the columns relevant for analyses and turn into long format:

# Subset: 
tdata_sub <- subset(tdata, select = c("subj_code","structure","first_caused_rating", "second_caused_rating", "first_maintained_rating", "second_maintained_rating"))

# into long format:
library(tidyr)
tdata_long <- gather(tdata_sub, statement, rating, 3:6)


# factorize entity 
tdata_long$statement <- factor(tdata_long$statement, levels = c("first_caused_rating", "second_caused_rating", "first_maintained_rating", "second_maintained_rating")
                            , labels = c("first \ncaused", "second \ncaused", "first \nmaintained", "second \nmaintained"))
# load stringr library
library(stringr)
 
# Split name column into firstname and last name
tdata_long[c('cause', 'role')] <- str_split_fixed(tdata_long$statement, ' ', 2)


tdata_long$role<- factor(tdata_long$role, levels = c("\ncaused", "\nmaintained")
                            , labels = c("caused", "maintained"))


tdata_long$cause<- factor(tdata_long$cause, levels = c("first", "second")
                            , labels = c("first", "second"))

3 Graphs and summaries

myTheme <- theme(plot.title = element_text(face="bold", size = 22),
        axis.title.x = element_text(size = 20),
        axis.title.y = element_text(size = 20),
        axis.text.x = element_text(size = 14, angle = 0), 
        axis.text.y = element_text(size = 16, angle = 0),
        legend.text = element_text(size = 18),
        legend.title = element_text(face = "bold", size = 18),
        strip.text.x = element_text(size = 18),
        panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(), 
        panel.background = element_blank(), 
        axis.line.x = element_line(colour = "black"), 
        axis.line.y = element_line(colour = "black"),
        axis.text = element_text(colour ="black"), 
        axis.ticks = element_line(colour ="black"))


tdata_sub <- tdata_long


library(see)
## first, turn sID into a factor
tdata_sub$subj_code <- factor(tdata_sub$subj_code)

pd <- position_dodge(width = 0.3)

tdata_sub$valueJitter <- jitter(tdata_sub$rating, factor = 0.01, amount = 0.004)

theme_set(theme_light(base_size = 20, base_family = "Poppins"))


g <- ggplot(tdata_sub, aes(x = statement, y = valueJitter)) +
  guides(fill=FALSE)+
  facet_grid( ~ structure,labeller = label_both)+
  scale_y_continuous(limits = c(-0.3, 10.3), breaks=seq(0, 10, 1), expand = c(0,0)) +
  geom_jitter(aes(color = structure), alpha = 0.5, width = 0.15, height = 0.2) +
  stat_summary(aes(y = rating, group=1), fun.data = mean_cl_boot, 
               geom = "errorbar", width = 0, size = 1) +
  stat_summary(aes(y = rating, group=1, color = structure), fun.y=mean, geom="line", 
               shape = 22, size = 1.5, alpha = .7)+
  stat_summary(aes(y = rating, group=1, fill = structure), fun.y=mean, geom="point", 
               color = "black", shape = 22, size = 3, group=1, alpha = 1)+
  stat_summary(aes(y = rating,group=1), fun.y=median, geom="point", color = "black", shape = 3, size = 4, 
               group=1, alpha = 1, position = position_dodge(width = 0.5))+
  labs(x = "Causal statement", y = "Agreement Rating") +
  scale_color_manual(name = "Strength",values=c("#66c2a5", "#e78ac3", "#8da0cb", "#a6d854"))+
  scale_fill_manual(name = "Strength",values=c("#66c2a5", "#e78ac3", "#8da0cb", "#a6d854"))+
  annotate("text", x = 0.5, y = 2, label = c("completely disagree"), angle = 90)+
  annotate("text", x = 0.5, y = 8.2, label = c("completely agree"), angle = 90)+
  theme(legend.position = "none")+
  myTheme+
  theme(panel.grid.major = element_line(color = "lightgrey",
                                        size = 0.5,
                                        linetype = 'dotted'))+
  stat_summary(aes(label=round(after_stat(y),2)), fun.y=mean, geom="text", size=5,
             vjust = -4)
## Warning: The `<scale>` argument of `guides()` cannot be `FALSE`. Use "none" instead as
## of ggplot2 3.3.4.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: The `fun.y` argument of `stat_summary()` is deprecated as of ggplot2 3.3.0.
## ℹ Please use the `fun` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning in stat_summary(aes(y = rating, group = 1, color = structure), fun.y =
## mean, : Ignoring unknown parameters: `shape`
## Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
## ℹ Please use the `linewidth` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
g

#ggsave("results_means_mainDV.svg",width=12,height=5)
#ggsave("results_means_mainDV.pdf",width=12,height=5)

g

library(ggridges)
## Warning: Paket 'ggridges' wurde unter R Version 4.2.3 erstellt
g2 <- ggplot(tdata_long, aes(x = rating, y = statement, fill = structure)) +
  facet_grid( ~ structure,labeller = label_both)+
  scale_x_continuous(breaks = seq(0, 10, 1))+
  geom_density_ridges(alpha = 0.5)+
  scale_fill_manual(values=c("#66c2a5", "#e78ac3", "#8da0cb", "#a6d854"))+
  labs(x = "Agreement Rating", y = "Causal Statement") +
  scale_y_discrete(limits=rev)+
  myTheme+
  theme_light(base_family = "Poppins", base_size = 20)+
  theme(panel.grid = element_blank(), axis.text = element_text(colour ="black"))+
  theme(legend.position="none",
        legend.title=element_blank(),legend.key.width = unit(1.95, 'cm'))+
  theme(axis.text.y = element_text(size = 14, angle = 0))+
  annotate("text", y = 0.5, x = 1, label = c("completely disagree"), angle = 0)+
  annotate("text", y = 0.5, x = 9, label = c("completely agree"), angle = 0)

g2
## Picking joint bandwidth of 0.946
## Picking joint bandwidth of 0.702

#ggsave("results_dist.svg",width=12,height=5)
#ggsave("results_dist.pdf",width=12,height=5)

4 Analyses

4.1 Mixed ANOVA

library(afex)
## Lade nötiges Paket: lme4
## Lade nötiges Paket: Matrix
## 
## Attache Paket: 'Matrix'
## Die folgenden Objekte sind maskiert von 'package:tidyr':
## 
##     expand, pack, unpack
## Das folgende Objekt ist maskiert 'package:reshape':
## 
##     expand
## ************
## Welcome to afex. For support visit: http://afex.singmann.science/
## - Functions for ANOVAs: aov_car(), aov_ez(), and aov_4()
## - Methods for calculating p-values with mixed(): 'S', 'KR', 'LRT', and 'PB'
## - 'afex_aov' and 'mixed' objects can be passed to emmeans() for follow-up tests
## - NEWS: emmeans() for ANOVA models now uses model = 'multivariate' as default.
## - Get and set global package options with: afex_options()
## - Set orthogonal sum-to-zero contrasts globally: set_sum_contrasts()
## - For example analyses see: browseVignettes("afex")
## ************
## 
## Attache Paket: 'afex'
## Das folgende Objekt ist maskiert 'package:lme4':
## 
##     lmer
library(emmeans)

a1 <- aov_car(rating ~ structure*statement + Error(subj_code/statement), tdata_long, anova_table = list(es = "pes"))
## Contrasts set to contr.sum for the following variables: structure
a1
## Anova Table (Type 3 tests)
## 
## Response: rating
##                Effect           df  MSE          F  pes p.value
## 1           structure        1, 98 9.68  26.61 *** .214   <.001
## 2           statement 2.67, 261.70 9.23 142.29 *** .592   <.001
## 3 structure:statement 2.67, 261.70 9.23  10.65 *** .098   <.001
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '+' 0.1 ' ' 1
## 
## Sphericity correction method: GG

Predicted interaction effect is significant, but other main effects should also be visualized.

Visualize Main effect of structure (causal reversibility):

tdata_sub <- tdata_long


library(see)
## first, turn sID into a factor
tdata_sub$subj_code <- factor(tdata_sub$subj_code)

pd <- position_dodge(width = 0.3)

tdata_sub$valueJitter <- jitter(tdata_sub$rating, factor = 0.01, amount = 0.004)

theme_set(theme_light(base_size = 20, base_family = "Poppins"))


g <- ggplot(tdata_sub, aes(x = structure, y = valueJitter)) +
  guides(fill=FALSE)+
  scale_y_continuous(limits = c(-0.3, 10.3), breaks=seq(0, 10, 1), expand = c(0,0)) +
  geom_jitter(aes(color = structure), alpha = 0.5, width = 0.15, height = 0.2) +
  stat_summary(aes(y = rating, group=1), fun.data = mean_cl_boot, 
               geom = "errorbar", width = 0, size = 1) +
  stat_summary(aes(y = rating, group=1, fill = structure), fun.y=mean, geom="point", 
               color = "black", shape = 22, size = 3, group=1, alpha = 1)+
  stat_summary(aes(y = rating,group=1), fun.y=median, geom="point", color = "black", shape = 3, size = 4, 
               group=1, alpha = 1, position = position_dodge(width = 0.5))+
  labs(x = "Causal Structure", y = "Agreement Rating") +
  scale_color_manual(name = "Strength",values=c("#66c2a5", "#e78ac3", "#8da0cb", "#a6d854"))+
  scale_fill_manual(name = "Strength",values=c("#66c2a5", "#e78ac3", "#8da0cb", "#a6d854"))+
  annotate("text", x = 0.5, y = 2, label = c("completely disagree"), angle = 90)+
  annotate("text", x = 0.5, y = 8.2, label = c("completely agree"), angle = 90)+
  theme(legend.position = "none")+
  myTheme+
  theme(panel.grid.major = element_line(color = "lightgrey",
                                        size = 0.5,
                                        linetype = 'dotted'))+
  stat_summary(aes(label=round(after_stat(y),2)), fun.y=mean, geom="text", size=5,
             vjust = -4)

g

Main effect of statement:

tdata_sub <- tdata_long


library(see)
## first, turn sID into a factor
tdata_sub$subj_code <- factor(tdata_sub$subj_code)

pd <- position_dodge(width = 0.3)

tdata_sub$valueJitter <- jitter(tdata_sub$rating, factor = 0.01, amount = 0.004)

theme_set(theme_light(base_size = 20, base_family = "Poppins"))


g <- ggplot(tdata_sub, aes(x = statement, y = valueJitter)) +
  guides(fill=FALSE)+
  scale_y_continuous(limits = c(-0.3, 10.3), breaks=seq(0, 10, 1), expand = c(0,0)) +
  geom_jitter(aes(color = statement), alpha = 0.5, width = 0.15, height = 0.2) +
  stat_summary(aes(y = rating, group=1), fun.data = mean_cl_boot, 
               geom = "errorbar", width = 0, size = 1) +
  #stat_summary(aes(y = rating, group=1, color = structure), fun.y=mean, geom="line", 
   #            shape = 22, size = 1.5, alpha = .7)+
  stat_summary(aes(y = rating, group=1, fill = statement), fun.y=mean, geom="point", 
               color = "black", shape = 22, size = 3, group=1, alpha = 1)+
  stat_summary(aes(y = rating,group=1), fun.y=median, geom="point", color = "black", shape = 3, size = 4, 
               group=1, alpha = 1, position = position_dodge(width = 0.5))+
  labs(x = "Causal statement", y = "Agreement Rating") +
  scale_color_manual(name = "Strength",values=c("#66c2a5", "#e78ac3", "#8da0cb", "#a6d854"))+
  scale_fill_manual(name = "Strength",values=c("#66c2a5", "#e78ac3", "#8da0cb", "#a6d854"))+
  annotate("text", x = 0.5, y = 2, label = c("completely disagree"), angle = 90)+
  annotate("text", x = 0.5, y = 8.2, label = c("completely agree"), angle = 90)+
  theme(legend.position = "none")+
  myTheme+
  theme(panel.grid.major = element_line(color = "lightgrey",
                                        size = 0.5,
                                        linetype = 'dotted'))+
  stat_summary(aes(label=round(after_stat(y),2)), fun.y=mean, geom="text", size=5,
             vjust = -4)

g

4.2 Contrasts

library(lsmeans)
## The 'lsmeans' package is now basically a front end for 'emmeans'.
## Users are encouraged to switch the rest of the way.
## See help('transition') for more information, including how to
## convert old 'lsmeans' objects and scripts to work with 'emmeans'.
# means

ls2 <- lsmeans(a1, c("structure", "statement")) 
ls2
##  structure    statement          lsmean    SE df lower.CL upper.CL
##  irreversible first..caused        9.62 0.131 98    9.361     9.88
##  reversible   first..caused        9.80 0.131 98    9.541    10.06
##  irreversible second..caused       1.16 0.420 98    0.327     1.99
##  reversible   second..caused       1.86 0.420 98    1.027     2.69
##  irreversible first..maintained    6.44 0.508 98    5.431     7.45
##  reversible   first..maintained    7.64 0.508 98    6.631     8.65
##  irreversible second..maintained   3.60 0.485 98    2.638     4.56
##  reversible   second..maintained   7.94 0.485 98    6.978     8.90
## 
## Confidence level used: 0.95
contrasts <- emmeans(a1, ~ statement|structure)
s <- pairs(contrasts, adjust = "none")


s
## structure = irreversible:
##  contrast                               estimate    SE df t.ratio p.value
##  first..caused - second..caused             8.46 0.471 98  17.960  <.0001
##  first..caused - first..maintained          3.18 0.513 98   6.202  <.0001
##  first..caused - second..maintained         6.02 0.511 98  11.774  <.0001
##  second..caused - first..maintained        -5.28 0.630 98  -8.386  <.0001
##  second..caused - second..maintained       -2.44 0.645 98  -3.785  0.0003
##  first..maintained - second..maintained     2.84 0.643 98   4.420  <.0001
## 
## structure = reversible:
##  contrast                               estimate    SE df t.ratio p.value
##  first..caused - second..caused             7.94 0.471 98  16.856  <.0001
##  first..caused - first..maintained          2.16 0.513 98   4.213  0.0001
##  first..caused - second..maintained         1.86 0.511 98   3.638  0.0004
##  second..caused - first..maintained        -5.78 0.630 98  -9.180  <.0001
##  second..caused - second..maintained       -6.08 0.645 98  -9.432  <.0001
##  first..maintained - second..maintained    -0.30 0.643 98  -0.467  0.6416
confint(s, level = 0.95)
## structure = irreversible:
##  contrast                               estimate    SE df lower.CL upper.CL
##  first..caused - second..caused             8.46 0.471 98    7.525    9.395
##  first..caused - first..maintained          3.18 0.513 98    2.163    4.197
##  first..caused - second..maintained         6.02 0.511 98    5.005    7.035
##  second..caused - first..maintained        -5.28 0.630 98   -6.530   -4.030
##  second..caused - second..maintained       -2.44 0.645 98   -3.719   -1.161
##  first..maintained - second..maintained     2.84 0.643 98    1.565    4.115
## 
## structure = reversible:
##  contrast                               estimate    SE df lower.CL upper.CL
##  first..caused - second..caused             7.94 0.471 98    7.005    8.875
##  first..caused - first..maintained          2.16 0.513 98    1.143    3.177
##  first..caused - second..maintained         1.86 0.511 98    0.845    2.875
##  second..caused - first..maintained        -5.78 0.630 98   -7.030   -4.530
##  second..caused - second..maintained       -6.08 0.645 98   -7.359   -4.801
##  first..maintained - second..maintained    -0.30 0.643 98   -1.575    0.975
## 
## Confidence level used: 0.95

Planned contrasts in the list above are “first caused - second caused” in each reversibility condition. Both are significant.

Get effect standardized effect sizes for the contrasts

First get the SDs that need to be pooled (and also the correlations between measures for the within-comparisons)

library(dplyr)

tdata_long %>%
  group_by(structure, statement) %>%
  summarise_at(vars(rating), list(name=sd))
## # A tibble: 8 × 3
## # Groups:   structure [2]
##   structure    statement              name
##   <fct>        <fct>                 <dbl>
## 1 irreversible "first \ncaused"      1.12 
## 2 irreversible "second \ncaused"     2.48 
## 3 irreversible "first \nmaintained"  3.74 
## 4 irreversible "second \nmaintained" 3.59 
## 5 reversible   "first \ncaused"      0.670
## 6 reversible   "second \ncaused"     3.39 
## 7 reversible   "first \nmaintained"  3.44 
## 8 reversible   "second \nmaintained" 3.26
library(dplyr)

tdata %>%
  group_by(structure) %>%
  summarize(cor=cor(first_caused_rating, second_caused_rating))
## # A tibble: 2 × 2
##   structure       cor
##   <fct>         <dbl>
## 1 irreversible -0.337
## 2 reversible   -0.219
# using the functions from the MOTE package (see https://matthewbjane.quarto.pub/guide-to-effect-sizes-and-confidence-intervals/Standardized-Mean-Differences.html#sec-repeated-measures-drm)

library(MOTE)
## Warning: Paket 'MOTE' wurde unter R Version 4.2.3 erstellt
# irreversible condition

#structure    statement          lsmean    SE df lower.CL upper.CL
# irreversible first..caused        9.62 0.131 98    9.361     9.88
# irreversible second..caused       1.16 0.420 98    0.327     1.99



stats <- d.dep.t.rm(
  m1 = 9.62,
  m2 = 1.16,
  sd1 = 1.1228608,
  sd2 = 2.4773257,
  n = 50,
  a = 0.05,
  r = -0.3371902
)

stats$estimate
## [1] "$d_{rm}$ = 4.54, 95\\% CI [3.60, 5.46]"
# reversible condition

#structure    statement          lsmean    SE df lower.CL upper.CL
# reversible   first..caused        9.80 0.131 98    9.541    10.06
# reversible   second..caused       1.86 0.420 98    1.027     2.69



stats <- d.dep.t.rm(
  m1 = 9.80,
  m2 = 1.86,
  sd1 = 0.6700594,
  sd2 = 3.3867087,
  n = 50,
  a = 0.05,
  r = -0.2194333    
)

stats$estimate
## [1] "$d_{rm}$ = 3.45, 95\\% CI [2.71, 4.18]"

Now contrast testing the maintainer ratings in each reversibility condition. The code below will produce a long list from which the correct contrast must be looked up.

contrasts <- emmeans(a1, ~ statement*structure)
s <- pairs(contrasts, adjust = "none")


s
##  contrast                                                         estimate
##  first..caused irreversible - second..caused irreversible             8.46
##  first..caused irreversible - first..maintained irreversible          3.18
##  first..caused irreversible - second..maintained irreversible         6.02
##  first..caused irreversible - first..caused reversible               -0.18
##  first..caused irreversible - second..caused reversible               7.76
##  first..caused irreversible - first..maintained reversible            1.98
##  first..caused irreversible - second..maintained reversible           1.68
##  second..caused irreversible - first..maintained irreversible        -5.28
##  second..caused irreversible - second..maintained irreversible       -2.44
##  second..caused irreversible - first..caused reversible              -8.64
##  second..caused irreversible - second..caused reversible             -0.70
##  second..caused irreversible - first..maintained reversible          -6.48
##  second..caused irreversible - second..maintained reversible         -6.78
##  first..maintained irreversible - second..maintained irreversible     2.84
##  first..maintained irreversible - first..caused reversible           -3.36
##  first..maintained irreversible - second..caused reversible           4.58
##  first..maintained irreversible - first..maintained reversible       -1.20
##  first..maintained irreversible - second..maintained reversible      -1.50
##  second..maintained irreversible - first..caused reversible          -6.20
##  second..maintained irreversible - second..caused reversible          1.74
##  second..maintained irreversible - first..maintained reversible      -4.04
##  second..maintained irreversible - second..maintained reversible     -4.34
##  first..caused reversible - second..caused reversible                 7.94
##  first..caused reversible - first..maintained reversible              2.16
##  first..caused reversible - second..maintained reversible             1.86
##  second..caused reversible - first..maintained reversible            -5.78
##  second..caused reversible - second..maintained reversible           -6.08
##  first..maintained reversible - second..maintained reversible        -0.30
##     SE df t.ratio p.value
##  0.471 98  17.960  <.0001
##  0.513 98   6.202  <.0001
##  0.511 98  11.774  <.0001
##  0.185 98  -0.973  0.3328
##  0.440 98  17.656  <.0001
##  0.525 98   3.773  0.0003
##  0.502 98   3.347  0.0012
##  0.630 98  -8.386  <.0001
##  0.645 98  -3.785  0.0003
##  0.440 98 -19.658  <.0001
##  0.593 98  -1.180  0.2410
##  0.659 98  -9.832  <.0001
##  0.641 98 -10.577  <.0001
##  0.643 98   4.420  <.0001
##  0.525 98  -6.402  <.0001
##  0.659 98   6.949  <.0001
##  0.719 98  -1.669  0.0982
##  0.702 98  -2.136  0.0352
##  0.502 98 -12.352  <.0001
##  0.641 98   2.714  0.0078
##  0.702 98  -5.753  <.0001
##  0.685 98  -6.332  <.0001
##  0.471 98  16.856  <.0001
##  0.513 98   4.213  0.0001
##  0.511 98   3.638  0.0004
##  0.630 98  -9.180  <.0001
##  0.645 98  -9.432  <.0001
##  0.643 98  -0.467  0.6416
confint(s, level = 0.95)
##  contrast                                                         estimate
##  first..caused irreversible - second..caused irreversible             8.46
##  first..caused irreversible - first..maintained irreversible          3.18
##  first..caused irreversible - second..maintained irreversible         6.02
##  first..caused irreversible - first..caused reversible               -0.18
##  first..caused irreversible - second..caused reversible               7.76
##  first..caused irreversible - first..maintained reversible            1.98
##  first..caused irreversible - second..maintained reversible           1.68
##  second..caused irreversible - first..maintained irreversible        -5.28
##  second..caused irreversible - second..maintained irreversible       -2.44
##  second..caused irreversible - first..caused reversible              -8.64
##  second..caused irreversible - second..caused reversible             -0.70
##  second..caused irreversible - first..maintained reversible          -6.48
##  second..caused irreversible - second..maintained reversible         -6.78
##  first..maintained irreversible - second..maintained irreversible     2.84
##  first..maintained irreversible - first..caused reversible           -3.36
##  first..maintained irreversible - second..caused reversible           4.58
##  first..maintained irreversible - first..maintained reversible       -1.20
##  first..maintained irreversible - second..maintained reversible      -1.50
##  second..maintained irreversible - first..caused reversible          -6.20
##  second..maintained irreversible - second..caused reversible          1.74
##  second..maintained irreversible - first..maintained reversible      -4.04
##  second..maintained irreversible - second..maintained reversible     -4.34
##  first..caused reversible - second..caused reversible                 7.94
##  first..caused reversible - first..maintained reversible              2.16
##  first..caused reversible - second..maintained reversible             1.86
##  second..caused reversible - first..maintained reversible            -5.78
##  second..caused reversible - second..maintained reversible           -6.08
##  first..maintained reversible - second..maintained reversible        -0.30
##     SE df lower.CL upper.CL
##  0.471 98    7.525    9.395
##  0.513 98    2.163    4.197
##  0.511 98    5.005    7.035
##  0.185 98   -0.547    0.187
##  0.440 98    6.888    8.632
##  0.525 98    0.939    3.021
##  0.502 98    0.684    2.676
##  0.630 98   -6.530   -4.030
##  0.645 98   -3.719   -1.161
##  0.440 98   -9.512   -7.768
##  0.593 98   -1.878    0.478
##  0.659 98   -7.788   -5.172
##  0.641 98   -8.052   -5.508
##  0.643 98    1.565    4.115
##  0.525 98   -4.401   -2.319
##  0.659 98    3.272    5.888
##  0.719 98   -2.626    0.226
##  0.702 98   -2.894   -0.106
##  0.502 98   -7.196   -5.204
##  0.641 98    0.468    3.012
##  0.702 98   -5.434   -2.646
##  0.685 98   -5.700   -2.980
##  0.471 98    7.005    8.875
##  0.513 98    1.143    3.177
##  0.511 98    0.845    2.875
##  0.630 98   -7.030   -4.530
##  0.645 98   -7.359   -4.801
##  0.643 98   -1.575    0.975
## 
## Confidence level used: 0.95

The planned contrast from this list is the one comparing the maintainer ratings between the reversibility conditions: “second..maintained irreversible - second..maintained reversible”, which is significant.

Get effect size

#structure    statement          lsmean    SE df lower.CL upper.CL
#reversible   second..maintained   7.94 0.485 98    6.978     8.90
#irreversible second..maintained   3.60 0.485 98    2.638     4.56

#SDs
#reversible second \nmaintained 3.2602116
#irreversible   second \nmaintained 3.5856858   

stats <- d.ind.t(
  m1 = 7.94,
  m2 = 3.60,
  sd1 = 3.2602116,
  sd2 = 3.5856858,
  n1 = 50,
  n2 = 50,
  a = 0.05
)

stats$estimate
## [1] "$d_s$ = 1.27, 95\\% CI [0.83, 1.69]"