Introduction

This document shares the code underlying the results reported in Trémolière & Gosling (2021). Raw data are available in supplementary materials. Any question about this supplementary materials should be sent at .

To reproduce the described analyses you should have:

1. These packages installed and loaded

install.packages(c("knitr", "geepack" ,"gt", "ggplot2", "tidyr", "dplyr", "car", "lavaan", "metafor", "lme4", "lmerTest", "stringr", "ggplot2", "DescTools", "broom")) 
library(knitr);library(geepack); library(gt); library(ggplot2); library(tidyr); library(dplyr);library(car);library(lavaan); library(metafor); library(kableExtra); library(gt);library(lme4);library(lmerTest); library(DescTools);library(stringr); library(broom); library(Hmisc)

2. The datasets of the individual studies loaded

If you want to reproduce our analyses, load the raw data provided in supplementary materials using this code.

Data_Study1_sleep_moral <- read.delim(file.choose())
Data_Study2_sleep_moral <- read.delim(file.choose())
Data_Study3_sleep_moral <- read.delim(file.choose())
Data_Study4_sleep_moral <- read.delim(file.choose())
Data_Study5_sleep_moral <- read.delim(file.choose())
Data_Study6_sleep_moral <- read.delim(file.choose())

Scoring and combining the datasets from primary studies

Data_Study1_Raw <- Data_Study1_sleep_moral %>% 
  dplyr::mutate(
#Check for missing Data
   CCA = case_when(
      is.na(Moral_DIL) | is.na(SleepQualCro) | is.na(SleepQualAcu) | is.na(SleepQuantCro) | 
        is.na(SleepQuantAcu) ~ 0, 
      !is.na(Moral_DIL) & !is.na(SleepQualCro) & !is.na(SleepQualAcu) & !is.na(SleepQuantCro) &
        !is.na(SleepQuantAcu) ~ 1),
#Detect participants failing at attention check
    Attention_check=case_when(
      Tromp == 2  ~ 1,
      Tromp != 2 ~ 0),
    SleepEfficiency.criteria = 1) 

Data_Study2_Raw <- Data_Study2_sleep_moral %>% 
  mutate(
#Check for missing Data
   CCA = case_when(
      is.na(Moral_SCA) | is.na(SleepQualCro) | is.na(SleepQualAcu) | is.na(SleepQuantCro) | 
        is.na(SleepQuantAcu) ~ 0, 
      !is.na(Moral_SCA) & !is.na(SleepQualCro) & !is.na(SleepQualAcu) & !is.na(SleepQuantCro) &
        !is.na(SleepQuantAcu) ~ 1),
#Detect participants failing at attention check
    Attention_check = case_when(
      Tromp == 2  ~ 1,
      Tromp != 2 ~ 0),
    SleepEfficiency.criteria = 1)

Data_Study3_Raw <- Data_Study3_sleep_moral %>% 
  mutate(
#Check for missing Data
   CCA = case_when(
      is.na(Moral_SCA) | is.na(SleepQualCro) | is.na(SleepQualAcu) | is.na(SleepQuantCro) | 
        is.na(SleepQuantAcu) ~ 0, 
      !is.na(Moral_SCA) & !is.na(SleepQualCro) & !is.na(SleepQualAcu) & !is.na(SleepQuantCro) &
        !is.na(SleepQuantAcu) ~ 1),
#Attention check and sleep efficiency criterion set to 1 since there are none in the task
  Attention_check = 1,
    SleepEfficiency.criteria = 1)

Data_Study4_Raw <- Data_Study4_sleep_moral %>%
  mutate(
#Check for missing Data
   CCA = case_when(
      is.na(Moral_DIL) |is.na(Moral_SCA) | is.na(Moral_CAR) | is.na(SleepQualCro) | is.na(SleepQualAcu)  | is.na(SleepQuantCro) | is.na(SleepQuantAcu) ~0,
      !is.na(Moral_DIL) & !is.na(Moral_SCA) & !is.na(Moral_CAR) & !is.na(SleepQualCro)
      & !is.na(SleepQualAcu) & !is.na(SleepQuantCro) & !is.na(SleepQuantAcu) ~1),
#Detect participants failing at attention check
    Attention_check=case_when(
      Tromp == 0  ~ 1,
      Tromp == 1 ~ 0))

Data_Study5_Raw <- Data_Study5_sleep_moral %>% 
  mutate(
#Check for missing Data
   CCA = case_when(
      is.na(Moral_DIL) |is.na(Moral_SCA) | is.na(SleepQualCro) | is.na(SleepQualAcu)
        | is.na(SleepQuantCro) | is.na(SleepQuantAcu) ~0, 
      !is.na(Moral_DIL) & !is.na(Moral_SCA) & !is.na(SleepQualCro) & 
        !is.na(SleepQualAcu) & !is.na(SleepQuantCro) & !is.na(SleepQuantAcu) ~1),
#Attention check set to 1 since there are none in the task
   Attention_check = 1)

Data_Study6_Raw <- Data_Study6_sleep_moral %>% 
  mutate(
#Check for missing Data
   CCA=case_when(
      is.na(Moral_DIL) |is.na(Moral_SCA) | is.na(SleepQualCro) | is.na(SleepQualAcu) 
        | is.na(SleepQuantCro) | is.na(SleepQuantAcu) ~0, 
      !is.na(Moral_DIL) & !is.na(Moral_SCA) & !is.na(SleepQualCro) & 
        !is.na(SleepQualAcu) & !is.na(SleepQuantCro) & !is.na(SleepQuantAcu) ~1),
#Detect participants failing at attention check
    Attention_check=case_when(
      Tromp == 1 ~ 1,
      Tromp != 1 ~ 0))

# For each dataset, we select only the required columns, we create an outcome column describing the type of outcome used in the study, we create unique participant identifiers, and we set the minimal duration under which the task could not be correctly performed

Data_MetaS1 <- Data_Study1_Raw %>% 
  dplyr::select(ResponseId, Moral_DIL, SleepQualCro, SleepQualAcu, SleepQuantCro, SleepQuantAcu,
          Age_correct, Attention_check, CCA, Duration, SleepEfficiency.criteria, 
          CRT_TOT, Num_TOT, AOT_TOT, Psych_TOT, Narc_TOT, Mach_TOT) %>% 
  dplyr::mutate(
    Outcome="Dilemmas", Study="1",
    ID=paste0(1:nrow(Data_Study1_Raw), "_S1"),
    ResponseId=as.character(ResponseId),
    Duration.min=200
         )

Data_MetaS2 <- Data_Study2_Raw %>% 
  dplyr::select(ResponseId,Moral_SCA, SleepQualCro, SleepQualAcu, SleepQuantCro, SleepQuantAcu,
         Age_correct, Attention_check, CCA, Duration, SleepEfficiency.criteria,
         CRT_TOT, Num_TOT, AOT_TOT, Psych_TOT, Narc_TOT, Mach_TOT)%>% 
  dplyr::mutate(
    Outcome = "Scale", 
    Study = "2",
    ID = paste0(1:nrow(Data_Study2_Raw), "_S2"),
    ResponseId=as.character(ResponseId),
    Duration.min = 150
    )

Data_MetaS3 <- Data_Study3_Raw %>% 
  dplyr::select(ResponseId,Moral_SCA, SleepQualCro, SleepQualAcu, SleepQuantCro, SleepQuantAcu,
         Age_correct, CCA, Duration, Attention_check, SleepEfficiency.criteria,
         CRT_TOT, Num_TOT, AOT_TOT, Psych_TOT, Narc_TOT, Mach_TOT)%>% 
  dplyr::mutate(
    Outcome = "Scale", Study = "3",
    ID = paste0(1:nrow(Data_Study3_Raw), "_S3"),
    ResponseId=as.character(ResponseId),
    Duration.min = 150
    )

Data_MetaS4.wide <- Data_Study4_Raw %>% 
  dplyr::select(ResponseId,Moral_DIL, Moral_SCA, Moral_CAR, SleepQualCro, SleepQualAcu, SleepQuantCro, SleepQuantAcu, Age_correct, Attention_check, CCA, Duration, SleepEfficiency.criteria)%>% 
  dplyr::mutate(
    Study = "4", 
    ID = paste0(1:nrow(Data_Study4_Raw), "_S4"),
    ResponseId=as.character(ResponseId),
    Duration.min = 200
    )

Data_MetaS4 <- Data_MetaS4.wide %>%
  pivot_longer(cols=c("Moral_DIL", "Moral_SCA", "Moral_CAR"), values_to="Moral_TOT",
               names_to="Outcome_transit") %>%
  dplyr::mutate(Outcome=case_when(
           Outcome_transit=="Moral_DIL"~"Dilemmas",
           Outcome_transit=="Moral_SCA"~"Scale",
           Outcome_transit=="Moral_CAR"~"Autonomouscars"))

Data_MetaS5.wide<-Data_Study5_Raw %>% 
  dplyr::select(ResponseId,Moral_DIL, Moral_SCA, SleepQualCro, SleepQualAcu, SleepQuantCro, SleepQuantAcu,Age_correct, CCA, Duration, Attention_check, SleepEfficiency.criteria) %>% 
   dplyr::mutate(Study="5",
         ID=paste0(1:nrow(Data_Study5_Raw), "_S5"),
         ResponseId=as.character(ResponseId),
         Duration.min=150,
         )
  
Data_MetaS5<- Data_MetaS5.wide %>%
  pivot_longer(cols=c("Moral_DIL", "Moral_SCA"), values_to="Moral_TOT", names_to="Outcome_transit") %>%
   dplyr::mutate(Outcome=case_when(
           Outcome_transit=="Moral_DIL"~"Dilemmas",
           Outcome_transit=="Moral_SCA"~"Scale"))

Data_MetaS6.wide<-Data_Study6_Raw %>% 
   dplyr::select(ResponseId,Moral_DIL, Moral_SCA, SleepQualCro, SleepQualAcu, SleepQuantCro, SleepQuantAcu, Age_correct, CCA,Attention_check, Duration, SleepEfficiency.criteria) %>% 
  dplyr::mutate(Study="6",
         ID=paste0(1:nrow(Data_Study6_Raw), "_S6"),
         ResponseId=as.character(ResponseId),
         Duration.min=150
         ) 

Data_MetaS6<- Data_MetaS6.wide %>%
  pivot_longer(cols=c("Moral_DIL", "Moral_SCA"), values_to="Moral_TOT", names_to="Outcome_transit") %>%
   dplyr::mutate(Outcome=case_when(
           Outcome_transit=="Moral_DIL"~"Dilemmas",
           Outcome_transit=="Moral_SCA"~"Scale"))

List of the combined datasets

Wide dataset: 1 row per participant

# we create 3 datasets with one row per participant
# one dataset with all participants
Data_Meta_Raw_transit.wide<- bind_rows(
  Data_MetaS1, Data_MetaS2, Data_MetaS3, Data_MetaS4.wide, Data_MetaS5.wide, Data_MetaS6.wide)

Data_Meta_Raw_transit.wide$Exclusion <- case_when(
  Data_Meta_Raw_transit.wide$CCA == 1 & Data_Meta_Raw_transit.wide$SleepEfficiency.criteria == 1 &
    Data_Meta_Raw_transit.wide$SleepQuantCro >= 2 & Data_Meta_Raw_transit.wide$SleepQuantCro <= 16 &
    Data_Meta_Raw_transit.wide$SleepQuantAcu >= 0 & Data_Meta_Raw_transit.wide$Attention_check == 1 ~ 0,
  Data_Meta_Raw_transit.wide$CCA != 1 | Data_Meta_Raw_transit.wide$SleepEfficiency.criteria == 1 |
    Data_Meta_Raw_transit.wide$SleepQuantCro < 2 | Data_Meta_Raw_transit.wide$SleepQuantCro > 16 |
    Data_Meta_Raw_transit.wide$SleepQuantAcu < 0 | Data_Meta_Raw_transit.wide$Attention_check != 1 ~ 1)

# one dataset with participants who have no missing values 
Data_Meta_Raw.wide_CCA <- filter(Data_Meta_Raw_transit.wide,CCA==1) 
# one dataset with participants who have who have no missing values and correct sleep efficiency ratio  
Data_Meta_Raw.wide_CCA_excl1 <- filter(Data_Meta_Raw.wide_CCA, SleepEfficiency.criteria ==1)
# one dataset with participants who have who have no missing values, correct sleep efficiency ratio and credible sleep quantity
Data_Meta_Raw.wide_CCA_excl2 <- filter(Data_Meta_Raw.wide_CCA_excl1, 
                                       SleepQuantCro >= 2 & SleepQuantCro <= 16 &
                                       SleepQuantAcu >= 0)
# one dataset with participants who have who have no missing values, correct sleep efficiency ratio, credible sleep quantity and correct attentional check
Data_Meta_Raw.wide<-filter(Data_Meta_Raw.wide_CCA_excl2, Attention_check==1) 

Semi-long dataset: 1 row per outcome per participant

# we create a dataset with one row per outcome per participant
# For example, in a study with 3 outcomes, a participants will have 3 rows
Data_Meta_Raw_transit1.Slong<- bind_rows(
  Data_MetaS1, Data_MetaS2, Data_MetaS3, Data_MetaS4, Data_MetaS5, Data_MetaS6)

Data_Meta_Raw_transit.Slong <-Data_Meta_Raw_transit1.Slong %>%
  rowwise() %>% 
  mutate(
    Study.out.delim=paste0(Study,"_", Outcome),
    Moral_tot=sum(Moral_DIL, Moral_SCA, Moral_TOT, na.rm=T))

Data_Meta_Raw.Slong <- filter(Data_Meta_Raw_transit.Slong, 
                              Attention_check==1 & CCA==1 & 
                                SleepEfficiency.criteria ==1 &
                                SleepQuantCro >= 2 & SleepQuantCro <= 16 & SleepQuantAcu >= 0)

Long dataset: 1 row per outcome and per sleep indicator per participant

# we create a dataset with one row per outcome and per sleep indicator per participant
# For example, in a study with 3 outcomes, a participants will have 3*4 = 12 rows since 4 sleep indicators are included in every studies
Data_Meta_Raw.long <- Data_Meta_Raw.Slong %>%
  pivot_longer(cols=starts_with("SleepQu"), values_to="Sleep", names_to="SleepType")

Demographic characteristics of the sample

# we work on raw datasets regardless the missing values or the correctness of the attention check
list_data_demographics <- list(
  Data_Study1_Raw, Data_Study2_Raw, Data_Study3_Raw, Data_Study4_Raw, Data_Study5_Raw, Data_Study6_Raw
)

#  we create a function extracting the total number of participants, the number of participants with no missing value and the participants with a correct attentional check in each study. We also extracted the percentage of female.

DEMOFUNCTION<-function(x){
  N.TOT = nrow(x)
  N.CCA = nrow(x) - nrow(subset(x, CCA==1))
  N.excl.eff = nrow(subset(x, CCA==1)) - nrow(subset(x, CCA == 1 & SleepEfficiency.criteria == 1))
  N.excl.quant = nrow(subset(x, CCA == 1 & SleepEfficiency.criteria == 1)) - nrow(subset(x, CCA == 1 & SleepEfficiency.criteria == 1 & SleepQuantCro >= 2 & SleepQuantCro <= 16 & SleepQuantAcu > 0))
  N.attcheck = nrow(subset(x, CCA == 1 & SleepEfficiency.criteria == 1 & SleepQuantCro >= 2 & SleepQuantCro <= 16 & SleepQuantAcu > 0)) - nrow(subset(x, CCA == 1 & SleepEfficiency.criteria == 1 & 
                               SleepQuantCro >= 2 & SleepQuantCro <= 16 & SleepQuantAcu > 0 &
                               Attention_check == 1))
  N.Analysis = nrow(subset(x, CCA == 1 & SleepEfficiency.criteria == 1 & 
                               SleepQuantCro >= 2 & SleepQuantCro <= 16 & SleepQuantAcu > 0 &
                               Attention_check == 1))
  Perc.Female = 1-nrow(subset(x, Gender == 1))/nrow(x)
  cbind(N.TOT, N.CCA, N.excl.eff, N.excl.quant, N.attcheck, N.Analysis, Perc.Female)
  }

data_demographics<-data.frame(do.call(rbind, lapply(list_data_demographics, DEMOFUNCTION)))

Data_presentation <- data.frame(
  Study=1:6,
  data_demographics) 
  
colnames(Data_presentation)<-c(
  "Study",
  "Total number of participants",
  "Number of participants with missing values",
  "Number of participants with an incorrect sleep efficiency ratio",
  "Number of participants with a uncredible sleep quantity",
  "Number of participants with an incorrect attentional check",
  "Number of participants retained in final analysis",
  "% of female")

gt(Data_presentation)
Study Total number of participants Number of participants with missing values Number of participants with an incorrect sleep efficiency ratio Number of participants with a uncredible sleep quantity Number of participants with an incorrect attentional check Number of participants retained in final analysis % of female
1 124 0 0 0 2 122 0.4032258
2 115 0 0 1 9 105 0.4086957
3 54 1 0 1 0 52 0.8703704
4 123 6 5 1 12 99 0.3658537
5 121 16 0 0 0 105 0.7107438
6 105 2 0 0 4 99 0.7523810

Mean values and SD for each of the independent and dependent variable across studies

MeanFUNCTION <- function(x){
  cbind(
    m.dil=paste0(round(mean(x$Moral_DIL),digits=2), " (", round(sd(x$Moral_DIL),digits=2), ")"), 
    m.sca=paste0(round(mean(x$Moral_SCA),digits=2)," (",round(sd(x$Moral_SCA),digits=2), ")"),
    m.car=paste0(round(mean(x$Moral_CAR),digits=2)," (", round(sd(x$Moral_CAR),digits=2), ")"),
    m.sleepquantcro=paste0(round(mean(x$SleepQuantCro),digits=2)," (", round(sd(x$SleepQuantCro),digits=2), ")"),
    m.sleepquantacu=paste0(round(mean(x$SleepQuantAcu),digits=2)," (", round(sd(x$SleepQuantAcu),digits=2), ")"),
    m.sleepqualcro=paste0(round(mean(x$SleepQualCro),digits=2)," (", round(sd(x$SleepQualCro),digits=2),")"),
    m.sleepqualacu=paste0(round(mean(x$SleepQualAcu),digits=2)," (", round(sd(x$SleepQualAcu),digits=2), ")")
    )
}
MeanFUNCTION2 <- function(x){
  cbind(
     A=min(x$SleepQuantAcu),
     B=min(x$SleepQualCro),
     C=min(x$SleepQualAcu)
  )
}

data_mean <- data.frame(
  cbind(
    Study = 1:6, 
    do.call(rbind, lapply(split(Data_Meta_Raw.wide, Data_Meta_Raw.wide$Study), 
                          MeanFUNCTION))))
colnames(data_mean)<-
  c(
    "Study",
    "Mean score (SD) at sacrificial dilemmas",
    "Mean score (SD) at moral scale",
    "Mean score (SD) at autonomours car dilemmas",
    "Mean quantity (SD) of chronic sleep (hours)",
    "Mean quantity (SD) of acute sleep (hours)",
    "Mean quality (SD) of chronic sleep",
    "Mean quality (SD) of acute sleep")

gt(data_mean)
Study Mean score (SD) at sacrificial dilemmas Mean score (SD) at moral scale Mean score (SD) at autonomours car dilemmas Mean quantity (SD) of chronic sleep (hours) Mean quantity (SD) of acute sleep (hours) Mean quality (SD) of chronic sleep Mean quality (SD) of acute sleep
1 49.81 (29.6) NA (NA) NA (NA) 6.68 (1.32) 6.52 (1.46) 6.19 (2.24) 6.28 (2.52)
2 NA (NA) 34.1 (4.4) NA (NA) 7.02 (0.98) 6.89 (1.27) 6.42 (2.16) 6.84 (2.18)
3 NA (NA) 37.08 (3.98) NA (NA) 7.13 (1.48) 7.29 (1.68) 5.23 (2.06) 5.63 (2.28)
4 58.51 (25.94) 33.55 (4.11) 0.82 (0.19) 7.19 (1.09) 7 (1.32) 14.29 (3.69) 6.77 (2.19)
5 43.05 (23.07) 36.75 (4.38) NA (NA) 8.22 (1.23) 8.21 (1.95) 15.78 (2.84) 17.26 (2.24)
6 34.18 (24.03) 34.81 (3.36) NA (NA) 7.89 (1.05) 7.77 (1.25) 15.89 (2.67) 17.33 (1.83)