Report - Heroic Suffering

Jean Monéger, Chido Dzumbunu, Roger Giner-Sorolla
16/07/2026

Visit project site

▲ Top

About

This document reports the results of a survey on occupational heroism that was conducted with 1200 UK residents (representative sampling on Prolific). The main problematic of our study is as follow:

Given that perceived heroism is positively correlated with perceived victimisation of the workers; the differences between “victim” status and “hero” status is not a matter of suffering, but a matter of courage within suffering — it is not about whether one suffer or not, but whether they do it courageously

In this study, by courageously, we mean “choosing the pain when a way out to preserve oneself is offered”. In other words, the difference between heroes and victims is the agency in choosing to suffer because the mission requires it.

We experimentally manipulated how three target occupations were framed: nurses, soldiers, and underwater welders. Participants were randomly assigned to one of these three target occupations. Two aspects of the occupations’ presentations were randomly manipulated:

  • Suffering of the workers (3 levels): participants were randomly assigned to a description of the workers as not suffering, physically suffering, or psychologically suffering from the hardships of their occupations.
  • Courage of the workers (2 levels): participants were randomly assigned to a description of the workers as prioritising the mission over their own health by refusing leaves when offered; or prioritising their health over their mission by taking the offered leaves.

We registered the following hypotheses (see https://osf.io/ktcrn/overview):

  • H1a: Individuals described as physically suffering (vs not suffering) will be perceived more as victims.

  • H1b: Individuals described as physically suffering (vs not suffering) will be perceived more as heroes.

  • H2a: Individuals described as psychologically suffering (vs not suffering) will be perceived more as victims.

  • H2b: Individuals described as psychologically suffering (vs not suffering) will be perceived more as heroes.

  • H3a: Individuals described as courageous (vs not courageous) will be perceived less as victims (The effect of courage will be tested both across all conditions of suffering (omnibus), and within the control “No suffering” condition)

  • H3b: Individuals described as courageous (vs not courageous) will be perceived more as heroes (The effect of courage will be tested both across all conditions of suffering (omnibus), and within the control “No suffering” condition)

  • H4a: The positive effect of courageous descriptions on Heroism will be stronger when workers are described as physically suffering (vs not suffering).

  • H4b: The negative effect of courageous descriptions on Victim perception will be stronger when workers are described as physically suffering (vs not suffering).

H5a: The positive effect of courageous descriptions on Heroism will be stronger when workers are described as psychologically suffering (vs not suffering).

  • H5b: The negative effect of courageous descriptions on Victim perception will be stronger when workers are described as psychologically suffering (vs not suffering).

In addition, we included measures of the perception that workers are 1) more likely to endure suffering for the sake of their mission, 2) more perceived as victimised, 3) more perceived as likely to be vulnerable (Assumption of vulnerability, see Womick et al., 2026). The following hypotheses were registered:

  • H6: Participants in the courage (vs no courage) condition will perceive workers as more likely to endure suffering

  • H7a: Participants in the courage (vs no courage) condition will perceive workers as more likely to endure suffering, and this effect will be larger in the high physical suffering condition (vs low suffering condition)

  • H7b: Participants in the courage (vs no courage) condition will perceive workers as more likely to endure suffering, and this effect will be larger in the high psychological suffering condition (vs low suffering condition)

  • H8a: participants in the physical suffering (vs no suffering) condition will perceived workers as more victimised.

  • H8b: participants in the psychological suffering (vs no suffering) condition will perceived workers as more victimised.

  • H9a: participants in the physical suffering (vs no suffering) condition will be perceived as more likely to be vulnerable

  • H9b: participants in the psychological suffering (vs no suffering) condition will be perceived as more likely to be vulnerable

Regarding points H8 and H9, we did not have predictions regarding how courage might moderate these effects.


R session Environment

Toggle details regarding my R environment: packages and machine

Loading packages:

if(!require("dplyr")) install.packages("dplyr") # mainly for datawrangling and plots
## Warning: package 'dplyr' was built under R version 4.5.2
if(!require("tidyr")) install.packages("tidyr") #idem
if(!require("stringr")) install.packages("stringr") 
if(!require("ggplot2")) install.packages("ggplot2") #plots
if(!require("car")) install.packages("car")
if(!require("psych")) install.packages("psych")
if(!require("lavaan")) install.packages("lavaan") # For SEM in psychometrics
if(!require("gt")) install.packages("gt") # Neat tables
if(!require("kableExtra")) install.packages("kableExtra") #idem
if(!require("emmeans")) install.packages("emmeans") #for explring interactions
if(!require("MASS")) install.packages("MASS") # # robustness checks using rlm as registed
if(!require("PerformanceAnalytics")) install.packages("PerformanceAnalytics") # I like their correlation matrixes
if(!require("interactions")) install.packages("interactions") # Interactions between two numeric predictors
if(!require("effectsize")) install.packages("effectsize") # Tables at the end, cohens_d

if(!require("RColorBrewer")) install.packages("RColorBrewer") # Tables at the end, cohens_d

My work environment is the following:

sessionInfo()
## R version 4.5.1 (2025-06-13)
## Platform: aarch64-apple-darwin20
## Running under: macOS Sonoma 14.7.1
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRblas.0.dylib 
## LAPACK: /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.12.1
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## time zone: Europe/London
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] RColorBrewer_1.1-3         effectsize_1.0.1          
##  [3] interactions_1.2.0         PerformanceAnalytics_2.0.8
##  [5] xts_0.14.1                 zoo_1.8-14                
##  [7] MASS_7.3-65                emmeans_1.11.2-8          
##  [9] kableExtra_1.4.0           gt_1.1.0                  
## [11] lavaan_0.6-20              psych_2.5.6               
## [13] car_3.1-3                  carData_3.0-5             
## [15] ggplot2_4.0.0              stringr_1.5.2             
## [17] tidyr_1.3.1                dplyr_1.2.1               
## 
## loaded via a namespace (and not attached):
##  [1] tidyselect_1.2.1    viridisLite_0.4.2   farver_2.1.2       
##  [4] S7_0.2.0            fastmap_1.2.0       TH.data_1.1-4      
##  [7] bayestestR_0.17.0   jtools_2.3.0        digest_0.6.37      
## [10] estimability_1.5.1  lifecycle_1.0.5     survival_3.8-3     
## [13] magrittr_2.0.4      compiler_4.5.1      rlang_1.2.0        
## [16] sass_0.4.10         tools_4.5.1         yaml_2.3.10        
## [19] knitr_1.50          mnormt_2.1.1        xml2_1.4.0         
## [22] multcomp_1.4-28     abind_1.4-8         withr_3.0.2        
## [25] purrr_1.1.0         datawizard_1.2.0    grid_4.5.1         
## [28] stats4_4.5.1        xtable_1.8-4        future_1.67.0      
## [31] globals_0.18.0      scales_1.4.0        insight_1.4.2      
## [34] cli_3.6.5           mvtnorm_1.3-3       rmarkdown_2.29     
## [37] generics_0.1.4      rstudioapi_0.17.1   parameters_0.28.2  
## [40] cachem_1.1.0        pander_0.6.6        splines_4.5.1      
## [43] parallel_4.5.1      vctrs_0.7.3         Matrix_1.7-3       
## [46] sandwich_3.1-1      jsonlite_2.0.0      Formula_1.2-5      
## [49] listenv_0.9.1       systemfonts_1.2.3   jquerylib_0.1.4    
## [52] parallelly_1.45.1   glue_1.8.0          codetools_0.2-20   
## [55] stringi_1.8.7       gtable_0.3.6        quadprog_1.5-8     
## [58] broom.mixed_0.2.9.6 tibble_3.3.0        pillar_1.11.1      
## [61] furrr_0.3.1         htmltools_0.5.8.1   R6_2.6.1           
## [64] textshaping_1.0.3   evaluate_1.0.5      pbivnorm_0.6.0     
## [67] lattice_0.22-7      backports_1.5.0     broom_1.0.13       
## [70] bslib_0.9.0         Rcpp_1.1.1          svglite_2.2.1      
## [73] coda_0.19-4.1       nlme_3.1-168        xfun_0.53          
## [76] fs_1.6.6            forcats_1.0.0       pkgconfig_2.0.3

The report is structured as follow:

  • Data wrangling

  • Demographics

  • Measurement model

  • Descriptive statistics

  • Manipulation checks

  • Main analyses

  • Additional exploratory analyses


Data wrangling

Below, you will find codes that allows us to go from the chaotic qualtrics output to a neat clean data file. Note that the initial data set (raw data) will not be shared publicly as it contains Prolific ID that are identifying.

Set<- read.csv("~/Downloads/Chido+Project+-+Final_May+12,+2026_07.38.csv", comment.char="#") #Original raw file

Set<- Set[-c(1:2),] # remove two useless first lines describing what the columns are
Set <- subset(Set, Set$Age != "") # Trick to exclude all participants who did not complete the full survey

Proli<-read.csv("~/Downloads/prolific_demographic_export_69f9fc6e04141695c663d20b.csv") # This is the data file from prolific that contains info about all participants who participated, we're specially interested in the "status" column that tells us who whas approved, rejected, timed-out, or returned their submissions. Using it, we can remove all rows of the original raw file that are associated with timed-out participants, or returned complete surveys.


table(Proli$Status)
## 
##  APPROVED  REJECTED  RETURNED TIMED-OUT 
##      1201         7        29        10
Approved <- subset(Proli, Proli$Status == "APPROVED")

# IDs in A but not in B
A_ID_not_in_B <- setdiff(Approved$Participant.id, Set$PROLIFIC_PID)

# IDs in B but not in A
B_ID_not_in_A <- setdiff(Set$PROLIFIC_PID, Approved$Participant.id)
Set <- Set[(Set$PROLIFIC_PID %in% Approved$Participant.id), ]


Demog<- Set[,c(69:80)] # We save the demographics in a df
Comments <- Set[, c(144,112, 80)] # We save the comments (feedback on the survey) in a df (available on request but not very interesting)
#colnames(Set)
Set<- Set[,-c(1:29, 31:34, 46:49, 69:80, 144:148, 155, 112)] # Those are our columns of interest

# I anonymise the Set DF:

Set$PROLIFIC_PID <- "#########"

# I save the DF to csv, those will be shared publicly:

write.csv(Set, "Data_ChidoProject.csv", row.names = F)
write.csv(Demog, "CleanData_ChidoProject_DEMOGRAPHICS.csv", row.names = F)

We can now wrangle the data to have a structured final dataframe.

We align all conditions in the same dataframe so that there is one column per outcomes, instead of one column per outcome per occupation as it is the case in the raw data set.

Nurse<- subset(Set,
               Set$Subcond == "N_MS_C_O1"|
                 Set$Subcond == "N_MS_NC_O1"|
                 Set$Subcond == "N_NS_C_O1"|
                 Set$Subcond == "N_NS_NC_O1"|
                 Set$Subcond == "N_PS_C_O1"|
                 Set$Subcond == "N_PS_NC_O1"
)

## Welders set
Welder<- subset(Set,
                Set$Subcond == "W_MS_C_O1"|
                  Set$Subcond == "W_MS_NC_O1"|
                  Set$Subcond == "W_NS_C_O1"|
                  Set$Subcond == "W_NS_NC_O1"|
                  Set$Subcond == "W_PS_C_O1"|
                  Set$Subcond == "W_PS_NC_O1"
)
# Soldiers set
Soldier<- subset(Set,
                 Set$Subcond == "S_MS_C_O1"|
                   Set$Subcond == "S_MS_NC_O1"|
                   Set$Subcond == "S_NS_C_O1"|
                   Set$Subcond == "S_NS_NC_O1"|
                   Set$Subcond == "S_PS_C_O1"|
                   Set$Subcond == "S_PS_NC_O1"
)



# Let's rearrange data


Nurse<-Nurse[!sapply(Nurse, function(x) all(x == ""))]
Welder<-Welder[!sapply(Welder, function(x) all(x == ""))]
Soldier<-Soldier[!sapply(Soldier, function(x) all(x == ""))]


Nurse <- Nurse[, !grepl("_Check$", names(Nurse))]
Welder <- Welder[, !grepl("_Check$", names(Welder))]
Soldier <- Soldier[, !grepl("_Check$", names(Soldier))]

#colnames(Nurse)
colnames(Welder) <- colnames(Nurse)
colnames(Soldier) <- colnames(Nurse)


LongDF <- rbind(Nurse, Welder)
LongDF <- rbind(LongDF, Soldier)

We name the conditions, We recode the values of the survey (i.e., ‘completely agree’ –> 7), We remove the attention checks

# Code conditions
LongDF$Suffering <- ifelse(grepl("_MS_", LongDF$Subcond), "Psych_Suff",
                           ifelse(grepl("_PS_", LongDF$Subcond), "Phys_suff", "No_Suff")) # Code for a new column: Risk condition ; if Condition contans Phys, it means "Physical", else it means "Psychological"


LongDF$Courage <- ifelse(grepl("_C_", LongDF$Subcond), "Courageous", "Non_Courageous") # Same for motivation

LongDF$Job <- ifelse(grepl("N_", LongDF$Subcond), "Nurses",
                     ifelse(grepl("W_", LongDF$Subcond), "Welder", "Soldier"))

# Recode values



agree7 <- c(
  "Strongly disagree"             = 1,
  "Moderately disagree"           = 2,
  "Slightly disagree"             = 3,
  "Neither disagree, nor agree"   = 4,
  "Slightly agree"                = 5,
  "Moderately agree"              = 6,
  "Strongly agree"                = 7
)

likely7 <- c(
  "Extremely unlikely"                 = 1,
  "Moderately unlikely"                = 2,
  "Slightly unlikely"             = 3,
  "Neither likely nor unlikely"  = 4,
  "Slightly likely"               = 5,
  "Moderately likely"                  = 6,
  "Extremely likely"                   = 7
)


intensity7 <- c(
  "Not at all"   = 1,
  "Very little"  = 2,
  "A little"     = 3,
  "Somewhat"     = 4,
  "Quite a bit"  = 5,
  "A lot"        = 6,
  "Very much"    = 7
)

aov <- c(
  "not at all vulnerable" =1,
  "2" = 2,
  "3" = 3,
  "4" = 4,
  "5" = 5,
  "6" = 6,
  "completely vulnerable" = 7
)

agree <- c(
  "1 - Strongly disagree" =1,
  "2" = 2,
  "3" = 3,
  "4" = 4,
  "5" = 5,
  "6" = 6,
  "7 - Strongly agree" = 7
)


valence5 <- c(
  "Very negative"      = 1,
  "Quite negative"            = 2,
  "Somewhat negative"     = 3,
  "Neutral"  = 4,
  "Somewhat positive"     = 5,
  "Quite positive"      = 6,
  "Very positive" = 7
)

#------------------------------------------------------------
# 2) Identify column groups by name (using your Weld names)
#    We only target cols 2:41, but naming groups is clearer & safer.
#------------------------------------------------------------

agree_cols <- c(
  "ManipCheck_N_help", "ManipCheck_N_brave", "ManipCheck_N_courageous",
  "ManipCheck_N_risk", "ManipCheck_N_physsuff", "ManipCheck_N_psychsuff",
  "HeroVictim_N_1", "HeroVictim_N_2"
)

likely_cols <- c("Endure_S_N_1","Endure_S_N_2","Endure_S_N_3",
                 "Endure_S_N_4", "Endure_S_N_5", "Endure_S_N_6")


intensity_cols <- c("Victim_G_N_1",            "Victim_G_N_2"   ,         "Victim_G_N_3"     ,
                    "Victim_S_N_1"   ,         "Victim_S_N_2"      ,      "Victim_S_N_3", "Victim_S_N_4" )

aov_cols <- c("AoV_n_1", "AoV_n_2", "AoV_n_3")

# Valence item
valence_cols <- c("Attitude_N")


#------------------------------------------------------------
# 3) Apply mappings to your stacked data (called `stacked`)
#    We leave identifying/meta columns alone: dataset, prolID, gender*, age, Q52, Attentive, Cond
#------------------------------------------------------------

na_empty <- function(x) {
  x <- if (is.character(x)) str_trim(x) else x
  ifelse(is.character(x) & x == "", NA, x)
}

map_to_num <- function(x, key) {
  x <- na_empty(x)
  # exact match after trimming
  out <- unname(key[ match(x, names(key)) ])
  # if x is already numeric-like (e.g., "5"), keep it
  suppressWarnings({
    out_numlike <- as.numeric(x)
  })
  out[is.na(out) & !is.na(out_numlike)] <- out_numlike[is.na(out) & !is.na(out_numlike)]
  as.numeric(out)
}
LongDF_num <- LongDF %>%
  dplyr::mutate(
    # scales
    across(all_of(agree_cols),    ~ map_to_num(.x, agree)),
    across(all_of(likely_cols),   ~ map_to_num(.x, likely7)),
    across(all_of(intensity_cols),~ map_to_num(.x, intensity7)),
    across(all_of(valence_cols),  ~ map_to_num(.x, valence5)),
    across(all_of(aov_cols), ~ map_to_num(.x, aov)),
  )

# Reverse items: 


# Remove Attention checks
LongDF_num$Endure_S_N_5 <- 8 - LongDF_num$Endure_S_N_5
LongDF_num$Victim_S_N_1 <- 8- LongDF_num$Victim_S_N_1

# Endure_S_N_6 -> 3
# Victim_S_N_4 -> A lot
#LongDF_num <- LongDF_num[, -c(12, 19)]
LongDF_num <- LongDF_num[, -c(6, 13)]

Please note: because of an unknown reason one participant more was included in the study, resulting in a sample size of 1201. I am going to try to investigate this issue in more details.

Demographics

####
# Demographics
paste0("Mean age in the sample is ", round(mean(as.numeric(Demog$Age)),2), ", SD = ", round(sd(as.numeric(Demog$Age)),2))
## [1] "Mean age in the sample is 46.03, SD = 15.95"
## Gender

Demog %>% dplyr::group_by(Gender) %>% dplyr::summarise(N=n()) %>%
  ggplot(aes(x=Gender,y=N,fill=Gender))+
  geom_bar(stat = 'identity',color='black')+
  scale_y_continuous(labels = scales::comma_format(accuracy = 2))+
  geom_text(aes(label=N),vjust=-0.25,fontface='bold')+
  theme_bw()+
  theme(axis.text = element_text(color='black',face='bold'),
        axis.title = element_text(color='black',face='bold'),
        legend.text = element_text(color='black',face='bold'),
        legend.title = element_text(color='black',face='bold')) +
  ggtitle("Gender distribution")

## Occupations
#colnames(Set)

jobs <- unlist(Demog[, 4:10])           # Make a long list of all jobs that were named

jobs <- jobs[jobs != ""]     # Remove empty strings

job_df <- as.data.frame(table(jobs))
colnames(job_df) <- c("Job", "Count")

ggplot(job_df, aes(x = Job, y = Count, fill = Job)) +
  geom_bar(stat = 'identity',color='black')+
  scale_y_continuous(labels = scales::comma_format(accuracy = 2))+
  geom_text(aes(label=Count),vjust=-0.25,fontface='bold')+
  theme_bw()+
  theme(axis.text = element_text(color='black',face='bold'),
        axis.title = element_text(color='black',face='bold'),
        legend.text = element_text(color='black',face='bold'),
        legend.title = element_text(color='black',face='bold')) +
  ggtitle("Job distribution")

Measurement model

In this section, as registered, we will 1) check the internal consistency by assessing McDonald’s Omegas for each subscale; 2) assess loadings of each items on their factor; 3) in the case of victimisation which is measured at two levels of specificity (general and specific), we will assess if both factors loads on a second order factor > .5 to justify concatening the two measures into one GLOBAL VICTIMISATION measure (given a good measurement model as indicated by TLI > .9, CFI > .9, RMSEA < .08 and SMRM < .08 –> See registration for details).

# Define items per construct (uncomment 1st line and comment 2nd to include Single item)
#gratitude_items <- grep("SpecGrat|Single|Support_Gov", names(stacked_num), value = TRUE)
victim_items    <- grep("Victim_G|Victim_S", names(LongDF_num), value = TRUE)
endure_items <- grep("Endure_", names(LongDF_num), value = TRUE)
AoV_items <-  grep("AoV_", names(LongDF_num), value = TRUE)

# Store all subscales in a named list for looping
scales <- list(
  Victimhood = victim_items,
  Endure = endure_items,
  AoV = AoV_items
)




for (scale_name in names(scales)) {
  vars <- LongDF_num[scales[[scale_name]]]

  if (ncol(vars) < 2) {
    message("Skipping ", scale_name, ": only ", ncol(vars), " item(s).")
    next
  }
  mean_name <- paste0(scale_name, "_mean")
  LongDF_num[[mean_name]] <- rowMeans(vars, na.rm = TRUE)
  cat("Stored ", mean_name, " (mean of ", ncol(vars), " items)\n", sep = "")

}
## Stored Victimhood_mean (mean of 6 items)
## Stored Endure_mean (mean of 5 items)
## Stored AoV_mean (mean of 3 items)
scales <- list(
  Victim_G = grep("Victim_G_", names(LongDF_num), value = TRUE),
  Victim_S = grep("Victim_S_", names(LongDF_num), value = TRUE),

  Endure = grep("Endure_S", names(LongDF_num), value = TRUE),
  AoV = grep("AoV_n", names(LongDF_num), value = TRUE)
)

sapply(scales, length)
## Victim_G Victim_S   Endure      AoV 
##        3        3        5        3
# keep only scales that have 2+ items
scales_2plus <- Filter(function(v) length(v) >= 2, scales)

reliability_results <- lapply(scales_2plus, function(items) {
  df_subset <- LongDF_num[, items, drop = FALSE]         # keep as data.frame
  df_subset <- df_subset[complete.cases(df_subset), , drop = FALSE]
  if (nrow(df_subset) < 2) return(NULL)                   # optional guard
  psych::omega(df_subset, nfactors = 1, plot = FALSE)
})

omega_values <- sapply(reliability_results, function(res) res$omega.tot)

omega_summary <- tibble(
  Scale = names(omega_values),
  Omega_total = round(omega_values, 2)
)

omega_summary %>%
  gt() %>%
  tab_header("McDonald's ω (Total) by Subscale") %>%
  fmt_number(columns = "Omega_total", decimals = 2)
McDonald's ω (Total) by Subscale
Scale Omega_total
Victim_G 0.90
Victim_S 0.71
Endure 0.90
AoV 0.81
victim_items    <- grep("Victim_G|Victim_S", names(LongDF_num), value = TRUE)


for (scale_name in names(scales)) {
  vars <- LongDF_num[scales[[scale_name]]]

  if (ncol(vars) < 2) {
    message("Skipping ", scale_name, ": only ", ncol(vars), " item(s).")
    next
  }
  mean_name <- paste0(scale_name, "_mean")
  LongDF_num[[mean_name]] <- rowMeans(vars, na.rm = TRUE)
  cat("Stored ", mean_name, " (mean of ", ncol(vars), " items)\n", sep = "")

}
## Stored Victim_G_mean (mean of 3 items)
## Stored Victim_S_mean (mean of 3 items)
## Stored Endure_mean (mean of 5 items)
## Stored AoV_mean (mean of 3 items)
#### ####
#### SupportExploit
items_ <- scales[["victim_items"]]      # or scales$Gratitude
# 2) subset your data
Subdf    <- LongDF_num[, victim_items]
# 3) get the Pearson R matrix and run ML‐FA with oblimin
Mat_cor <- cor(Subdf, use = "pairwise.complete.obs")
Res_fa  <- fa(r       = Mat_cor,
              nfactors = 2,
              n.obs    = nrow(Subdf),
              fm       = "ml",
              rotate   = "oblimin")

# 4) print out the loadings
print(Res_fa$loadings, cutoff = .30)
## 
## Loadings:
##              ML2    ML1   
## Victim_G_N_1  0.835       
## Victim_G_N_2  0.900       
## Victim_G_N_3  0.855       
## Victim_S_N_1              
## Victim_S_N_2         1.007
## Victim_S_N_3         0.558
## 
##                  ML2   ML1
## SS loadings    2.264 1.410
## Proportion Var 0.377 0.235
## Cumulative Var 0.377 0.612

In an Exploratory Factor Analysis (vs in the SEM), the first item of specific victimisation does not come out and we might want to exclude it from the sample.

==> After running the analyses, with and without this item: it does not change any decision, except the role of attitude on victimisation which comes out a significant when we exclude the item (p = .002) but not when we keep all items. ==> Excluding the item, victimisation omega goes from .71 to .78.

colnames(LongDF_num)
LongDF_num<- LongDF_num[, -c(9,32,33,34,35)]
# Define items per construct (uncomment 1st line and comment 2nd to include Single item)
#gratitude_items <- grep("SpecGrat|Single|Support_Gov", names(stacked_num), value = TRUE)
victim_items    <- grep("Victim_G|Victim_S", names(LongDF_num), value = TRUE)
endure_items <- grep("Endure_", names(LongDF_num), value = TRUE)
AoV_items <-  grep("AoV_", names(LongDF_num), value = TRUE)

# Store all subscales in a named list for looping
scales <- list(
  Victimhood = victim_items,
  Endure = endure_items,
  AoV = AoV_items
)




for (scale_name in names(scales)) {
  vars <- LongDF_num[scales[[scale_name]]]

  if (ncol(vars) < 2) {
    message("Skipping ", scale_name, ": only ", ncol(vars), " item(s).")
    next
  }
  mean_name <- paste0(scale_name, "_mean")
  LongDF_num[[mean_name]] <- rowMeans(vars, na.rm = TRUE)
  cat("Stored ", mean_name, " (mean of ", ncol(vars), " items)\n", sep = "")

}



scales <- list(
  Victim_G = grep("Victim_G_", names(LongDF_num), value = TRUE),
  Victim_S = grep("Victim_S_", names(LongDF_num), value = TRUE),

  Endure = grep("Endure_S", names(LongDF_num), value = TRUE),
  AoV = grep("AoV_n", names(LongDF_num), value = TRUE)
)

sapply(scales, length)


# keep only scales that have 2+ items
scales_2plus <- Filter(function(v) length(v) >= 2, scales)

reliability_results <- lapply(scales_2plus, function(items) {
  df_subset <- LongDF_num[, items, drop = FALSE]         # keep as data.frame
  df_subset <- df_subset[complete.cases(df_subset), , drop = FALSE]
  if (nrow(df_subset) < 2) return(NULL)                   # optional guard
  psych::omega(df_subset, nfactors = 1, plot = FALSE)
})

omega_values <- sapply(reliability_results, function(res) res$omega.tot)

omega_summary <- tibble(
  Scale = names(omega_values),
  Omega_total = round(omega_values, 2)
)

omega_summary %>%
  gt() %>%
  tab_header("McDonald's ω (Total) by Subscale") %>%
  fmt_number(columns = "Omega_total", decimals = 2)



victim_items    <- grep("Victim_G|Victim_S", names(LongDF_num), value = TRUE)


for (scale_name in names(scales)) {
  vars <- LongDF_num[scales[[scale_name]]]

  if (ncol(vars) < 2) {
    message("Skipping ", scale_name, ": only ", ncol(vars), " item(s).")
    next
  }
  mean_name <- paste0(scale_name, "_mean")
  LongDF_num[[mean_name]] <- rowMeans(vars, na.rm = TRUE)
  cat("Stored ", mean_name, " (mean of ", ncol(vars), " items)\n", sep = "")

}

==> All subscales are internally consistent, all omegas > .7


We then proceed to the SEM using lavaan.

We’ll be attentive to: - The fitness of the model: CFI > .9? TLI > .9? RMSEA < .08? SRMR < .08? - The loadings associated with each item. Items with loadings < .3 should be considered for deletion. - The loadings associated with the factors of Victim_G and Victim_S on the second-order factor of Victim. If both are > .5, and the model has satisfying fitness (see first point), we will average the two subscales.

Our measurement model is as follow:

model_measurement <- paste0(

# ========= VICTIM =========

“GenVict =~ Victim_G_N_1 + Victim_G_N_2 + Victim_G_N_3”,

“SpecVict =~ Victim_S_N_1 + Victim_S_N_2 + Victim_S_N_3”,

# ========= ENDURE =========

“Endure =~ Endure_S_N_1 + Endure_S_N_2 + Endure_S_N_3 + Endure_S_N_4 + Endure_S_N_5”,

# ========= AoV =========

“AoV =~ AoV_n_1 + AoV_n_2+AoV_n_3”,

# ========= SECOND-ORDER CONSTRUCTS =========

“Vict =~ GenVict + SpecVict”

)

In clearer words: We have three items that measure general-level victimisation, three items that measure specific-level victimisation, five items that measures perceived endurance of suffering, three items that measures assumptions of vulnerability, and there is a second order factor Victimisation that is measured by the general-level victimisation factor and the specific-level victimisation.

We will assess standardised loadings to see how well the items saturate their factors. Usually, a loading > .3 is considered acceptable (that’s also what we registered).

# ----- measurement model -----
model_measurement <- paste0(
  # ========= VICTIM =========
  "GenVict =~ Victim_G_N_1 + Victim_G_N_2 + Victim_G_N_3\n",
  "SpecVict =~ Victim_S_N_1 + Victim_S_N_2 + Victim_S_N_3\n",
#  "SpecVict =~ Victim_S_N_2 + Victim_S_N_3\n", # Eliminating S_N_1 because of EFA
  # ========= ENDURE =========
  "Endure  =~ Endure_S_N_1 + Endure_S_N_2 + Endure_S_N_3 + Endure_S_N_4 + Endure_S_N_5\n",

  # ========= AoV =========
  "AoV =~ AoV_n_1 + AoV_n_2+AoV_n_3\n",

  # ========= SECOND-ORDER CONSTRUCTS =========
  "Vict  =~ GenVict + SpecVict\n"
)



fit <- cfa(
  model = model_measurement,
  data  = LongDF_num,
  estimator = "MLR",     # robust SEs; good default for Likert-ish items
  missing = "fiml", # There's no missing anyway so does not matter
  std.lv = TRUE          # makes higher-order identification usually less annoying / must investigate
)

summary(fit, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-20 ended normally after 73 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        47
## 
##   Number of observations                          1201
##   Number of missing patterns                         4
## 
## Model Test User Model:
##                                               Standard      Scaled
##   Test Statistic                               482.581     394.836
##   Degrees of freedom                                72          72
##   P-value (Chi-square)                           0.000       0.000
##   Scaling correction factor                                  1.222
##     Yuan-Bentler correction (Mplus variant)                       
## 
## Model Test Baseline Model:
## 
##   Test statistic                              9910.432    6864.197
##   Degrees of freedom                                91          91
##   P-value                                        0.000       0.000
##   Scaling correction factor                                  1.444
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.958       0.952
##   Tucker-Lewis Index (TLI)                       0.947       0.940
##                                                                   
##   Robust Comparative Fit Index (CFI)                         0.960
##   Robust Tucker-Lewis Index (TLI)                            0.949
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)             -25544.744  -25544.744
##   Scaling correction factor                                  1.615
##       for the MLR correction                                      
##   Loglikelihood unrestricted model (H1)     -25303.453  -25303.453
##   Scaling correction factor                                  1.377
##       for the MLR correction                                      
##                                                                   
##   Akaike (AIC)                               51183.487   51183.487
##   Bayesian (BIC)                             51422.760   51422.760
##   Sample-size adjusted Bayesian (SABIC)      51273.470   51273.470
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.069       0.061
##   90 Percent confidence interval - lower         0.063       0.056
##   90 Percent confidence interval - upper         0.075       0.066
##   P-value H_0: RMSEA <= 0.050                    0.000       0.000
##   P-value H_0: RMSEA >= 0.080                    0.001       0.000
##                                                                   
##   Robust RMSEA                                               0.068
##   90 Percent confidence interval - lower                     0.061
##   90 Percent confidence interval - upper                     0.074
##   P-value H_0: Robust RMSEA <= 0.050                         0.000
##   P-value H_0: Robust RMSEA >= 0.080                         0.001
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.046       0.046
## 
## Parameter Estimates:
## 
##   Standard errors                             Sandwich
##   Information bread                           Observed
##   Observed information based on                Hessian
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   GenVict =~                                                            
##     Victim_G_N_1      0.385    0.094    4.089    0.000    1.252    0.788
##     Victim_G_N_2      0.477    0.116    4.100    0.000    1.550    0.918
##     Victim_G_N_3      0.469    0.115    4.080    0.000    1.526    0.882
##   SpecVict =~                                                           
##     Victim_S_N_1      0.361    0.038    9.576    0.000    0.470    0.331
##     Victim_S_N_2      0.976    0.047   20.764    0.000    1.268    0.867
##     Victim_S_N_3      0.767    0.037   20.827    0.000    0.996    0.729
##   Endure =~                                                             
##     Endure_S_N_1      1.089    0.048   22.864    0.000    1.089    0.883
##     Endure_S_N_2      1.101    0.048   23.035    0.000    1.101    0.816
##     Endure_S_N_3      1.071    0.046   23.202    0.000    1.071    0.843
##     Endure_S_N_4      1.168    0.044   26.437    0.000    1.168    0.911
##     Endure_S_N_5      0.871    0.054   16.242    0.000    0.871    0.521
##   AoV =~                                                                
##     AoV_n_1           0.623    0.043   14.391    0.000    0.623    0.478
##     AoV_n_2           1.487    0.034   43.228    0.000    1.487    0.925
##     AoV_n_3           1.400    0.040   35.057    0.000    1.400    0.837
##   Vict =~                                                               
##     GenVict           3.094    0.834    3.712    0.000    0.952    0.952
##     SpecVict          0.830    0.062   13.475    0.000    0.639    0.639
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   Endure ~~                                                             
##     AoV               0.090    0.032    2.787    0.005    0.090    0.090
##     Vict              0.124    0.034    3.602    0.000    0.124    0.124
##   AoV ~~                                                                
##     Vict              0.782    0.025   31.347    0.000    0.782    0.782
## 
## Intercepts:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .Victim_G_N_1      3.208    0.046   69.974    0.000    3.208    2.019
##    .Victim_G_N_2      3.933    0.049   80.747    0.000    3.933    2.330
##    .Victim_G_N_3      3.961    0.050   79.293    0.000    3.961    2.288
##    .Victim_S_N_1      4.206    0.041  102.842    0.000    4.206    2.968
##    .Victim_S_N_2      5.141    0.042  121.900    0.000    5.141    3.517
##    .Victim_S_N_3      5.433    0.039  137.840    0.000    5.433    3.977
##    .Endure_S_N_1      6.017    0.036  169.024    0.000    6.017    4.877
##    .Endure_S_N_2      5.838    0.039  150.044    0.000    5.838    4.330
##    .Endure_S_N_3      5.826    0.037  158.915    0.000    5.826    4.586
##    .Endure_S_N_4      5.853    0.037  158.248    0.000    5.853    4.566
##    .Endure_S_N_5      4.934    0.048  102.175    0.000    4.934    2.948
##    .AoV_n_1           5.458    0.038  145.090    0.000    5.458    4.186
##    .AoV_n_2           4.638    0.046   99.887    0.000    4.638    2.883
##    .AoV_n_3           4.085    0.048   84.569    0.000    4.085    2.441
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .Victim_G_N_1      0.957    0.070   13.701    0.000    0.957    0.379
##    .Victim_G_N_2      0.448    0.044   10.165    0.000    0.448    0.157
##    .Victim_G_N_3      0.667    0.056   12.000    0.000    0.667    0.223
##    .Victim_S_N_1      1.788    0.072   24.673    0.000    1.788    0.890
##    .Victim_S_N_2      0.529    0.089    5.973    0.000    0.529    0.248
##    .Victim_S_N_3      0.873    0.076   11.465    0.000    0.873    0.468
##    .Endure_S_N_1      0.336    0.048    7.019    0.000    0.336    0.221
##    .Endure_S_N_2      0.606    0.080    7.607    0.000    0.606    0.334
##    .Endure_S_N_3      0.466    0.045   10.399    0.000    0.466    0.289
##    .Endure_S_N_4      0.279    0.030    9.408    0.000    0.279    0.170
##    .Endure_S_N_5      2.042    0.112   18.203    0.000    2.042    0.729
##    .AoV_n_1           1.312    0.062   21.240    0.000    1.312    0.772
##    .AoV_n_2           0.375    0.056    6.719    0.000    0.375    0.145
##    .AoV_n_3           0.839    0.081   10.368    0.000    0.839    0.300
##    .GenVict           1.000                               0.095    0.095
##    .SpecVict          1.000                               0.592    0.592
##     Endure            1.000                               1.000    1.000
##     AoV               1.000                               1.000    1.000
##     Vict              1.000                               1.000    1.000

As indicated by the model: - TLI = 0.940 -> Check - CFI = 0.952 -> Check - RMSEA = 0.061 -> Check - SRMR = 0.046 -> Check

The model looks strong enough. Our data structure appears to be supported (i.e., the data fits this structure)

Looking at standardised loadings: all items have loadings > .3 on their hypothetical factor ==> That’s good.

Moreover, because both general- and specific-level victimisation factors have loadings > .5 on a second order Global victimisation factor, we can concatenate them into a single measure. Exploratory analyses might analyse each dimension separately.

Below is a visual representation of our measurement model:

semPlot::semPaths(
  fit,
  what = "std",
  whatLabels = "std",
  layout = "tree2",
  style = "lisrel",
  residuals = FALSE,
  intercepts = FALSE,
  nCharNodes = 0
)
## Registered S3 method overwritten by 'lme4':
##   method           from
##   na.action.merMod car

Some descriptives

Below are some table describing our scores:

Table 1 - means and SD of our measures
variables <- names(LongDF_num)[c(15:23, 31:35)]
#variables <- names(LongDF_num)[c(14:22, 30:34)]

Table1 <- data.frame(
  Variable = variables,
  N = sapply(LongDF_num[variables], function(x) sum(!is.na(x))),
  Mean = sapply(LongDF_num[variables], mean, na.rm = TRUE),
  SD = sapply(LongDF_num[variables], sd, na.rm = TRUE)
)

Table1$Mean <- round(Table1$Mean, 2)
Table1$SD <- round(Table1$SD, 2)

rownames(Table1) <- NULL

Table1
Table 2 - means and SD of our measures, broken down by courage level
courage_levels <- sort(unique(LongDF_num$Courage[!is.na(LongDF_num$Courage)]))

Table2 <- data.frame()

for (courage_level in courage_levels) {
  
  rows_to_keep <- LongDF_num$Courage == courage_level
  
  temporary_table <- data.frame(
    Courage = courage_level,
    Variable = variables,
    N = sapply(LongDF_num[rows_to_keep, variables], function(x) sum(!is.na(x))),
    Mean = sapply(LongDF_num[rows_to_keep, variables], mean, na.rm = TRUE),
    SD = sapply(LongDF_num[rows_to_keep, variables], sd, na.rm = TRUE)
  )
  
  Table2 <- rbind(Table2, temporary_table)
}

Table2$Mean <- round(Table2$Mean, 2)
Table2$SD <- round(Table2$SD, 2)

rownames(Table2) <- NULL

Table2
Table 3 - means and SD of our measures, broken down by Suffering level
suffering_levels <- sort(unique(LongDF_num$Suffering[!is.na(LongDF_num$Suffering)]))

Table3 <- data.frame()

for (suffering_level in suffering_levels) {
  
  rows_to_keep <- LongDF_num$Suffering == suffering_level
  
  temporary_table <- data.frame(
    Suffering = suffering_level,
    Variable = variables,
    N = sapply(LongDF_num[rows_to_keep, variables], function(x) sum(!is.na(x))),
    Mean = sapply(LongDF_num[rows_to_keep, variables], mean, na.rm = TRUE),
    SD = sapply(LongDF_num[rows_to_keep, variables], sd, na.rm = TRUE)
  )
  
  Table3 <- rbind(Table3, temporary_table)
}

Table3$Mean <- round(Table3$Mean, 2)
Table3$SD <- round(Table3$SD, 2)

rownames(Table3) <- NULL

Table3
Table 4 - means and SD of our measures, broken down by courage x suffering levels
courage_levels <- sort(unique(LongDF_num$Courage[!is.na(LongDF_num$Courage)]))
suffering_levels <- sort(unique(LongDF_num$Suffering[!is.na(LongDF_num$Suffering)]))

Table4 <- data.frame()

for (courage_level in courage_levels) {
  
  for (suffering_level in suffering_levels) {
    
    rows_to_keep <- LongDF_num$Courage == courage_level &
      LongDF_num$Suffering == suffering_level
    
    temporary_table <- data.frame(
      Courage = courage_level,
      Suffering = suffering_level,
      Variable = variables,
      N = sapply(LongDF_num[rows_to_keep, variables], function(x) sum(!is.na(x))),
      Mean = sapply(LongDF_num[rows_to_keep, variables], mean, na.rm = TRUE),
      SD = sapply(LongDF_num[rows_to_keep, variables], sd, na.rm = TRUE)
    )
    
    Table4 <- rbind(Table4, temporary_table)
  }
}

Table4$Mean <- round(Table4$Mean, 2)
Table4$SD <- round(Table4$SD, 2)

rownames(Table4) <- NULL

Table4

Manipulation checks

Near the end of the survey, we integrated some manipulation checks. Manipulation checks are questions designed to assess if the manipulation, at least, can influence a simple measure that is assumed to be as conceptually close as possible to the concept we are trying to manipulate.

Our manipulation checks were single items:

In your own personal opinion, to what extent do you agree with the following statements:

  • [Nurses/Soldiers/Underwater welders] help people ==> Basic check for hypothesised underlying structure of heroism —- See previous studies of this project
  • [Nurses/Soldiers/Underwater welders] are brave ==> Manip check for the manipulation of courage
  • [Nurses/Soldiers/Underwater welders] are courageous ==> Manip check for the manipulation of courage
  • [Nurses/Soldiers/Underwater welders] are exposed to risk ==> Basic check for hypothesised underlying structure of heroism —- See previous studies of this project
  • [Nurses/Soldiers/Underwater welders] suffer physically from their occupation ==> Manip check for the manipulation of suffering
  • [Nurses/Soldiers/Underwater welders] suffer psychologically from their occupation ==> Manip check for the manipulation of suffering

Does the courage manipulation influence perceived bravery and perceived courage?

Anova(lm(LongDF_num$ManipCheck_N_courageous ~ LongDF_num$Courage), type = "III")
Anova(lm(LongDF_num$ManipCheck_N_brave ~ LongDF_num$Courage), type = "III")

This is a red flag: our manipulation of courage did NOT influence single item measures of perceived courage (p > .05). It however did influence perceived bravery, but the effect appears barely significant (which is unusual for a manipulation check).

(example of reporting: ’our manipulation of courage did not influence our manipulation check regarding perceived courage, F(1, 1199) = 3.41, p = .065.)


Does the suffering manipulation influence perceived physical suffering and psychological suffering?

# Suffering manip
## Is physical suffering significantly larger in the phys suffering condition vs others
Anova(MC1<-lm(ManipCheck_N_physsuff ~ Suffering, data = LongDF_num), type = "III")
emmeans(MC1, pairwise ~ Suffering)
## $emmeans
##  Suffering  emmean     SE   df lower.CL upper.CL
##  No_Suff      5.31 0.0537 1198     5.20     5.41
##  Phys_suff    6.21 0.0537 1198     6.11     6.32
##  Psych_Suff   5.94 0.0535 1198     5.84     6.05
## 
## Confidence level used: 0.95 
## 
## $contrasts
##  contrast               estimate     SE   df t.ratio p.value
##  No_Suff - Phys_suff      -0.906 0.0759 1198 -11.925  <.0001
##  No_Suff - Psych_Suff     -0.635 0.0758 1198  -8.382  <.0001
##  Phys_suff - Psych_Suff    0.270 0.0758 1198   3.563  0.0011
## 
## P value adjustment: tukey method for comparing a family of 3 estimates
## Is psych suffering significantly larger in the psych suffering condition vs others
Anova(MC2<-lm(LongDF_num$ManipCheck_N_psychsuff ~ LongDF_num$Suffering), type = "III")
emmeans(MC2, pairwise ~ Suffering,  adjust = "none")
## $emmeans
##  Suffering  emmean     SE   df lower.CL upper.CL
##  No_Suff      5.06 0.0580 1198     4.94     5.17
##  Phys_suff    5.82 0.0581 1198     5.71     5.94
##  Psych_Suff   6.05 0.0578 1198     5.94     6.17
## 
## Confidence level used: 0.95 
## 
## $contrasts
##  contrast               estimate     SE   df t.ratio p.value
##  No_Suff - Phys_suff      -0.765 0.0820 1198  -9.319  <.0001
##  No_Suff - Psych_Suff     -0.997 0.0819 1198 -12.177  <.0001
##  Phys_suff - Psych_Suff   -0.233 0.0819 1198  -2.839  0.0046

Yes, and Yes. This time, effects are quite large, as expected from manipulation checks. I used emmeans to decompose the effect to compare levels of the IV 2-by-2 (i.e., compare directly no suffering vs physical suffering, and no suffering to psychological suffering).

We can see spill-over here: the physical suffering condition also influenced perception of psychological suffering; and the manipulation of psychological suffeirng influenced perception of physical suffering. Oh well.

Suggestion of writing:

‘Suffering manipulation successfully influenced perceived physical suffering, F(2, 1198) = 75.00, p < .001. Specifically, participants in the control condition (M = 5.06, SD = 1.36) evaluated workers as suffering physically significantly less than participants in the physical suffering condition (M = 6.21, SD = 0.87), t(1198) = -11.93, p < .001)’

(the means and SD are from the table in the section titled some descriptives above, see table 3).


Conclusion: the courage manipulation might not do what we thought it should do. The suffering condition behaves as expected, but there is some spill-over (could have been expected): someone described as physically suffering is also seen as psychologically suffeirng, and vice-versa. I don’t think it’s a problem, but it’s worth noting - in people’s mind, physical and psychological are not distinguished neatly. In itself, it is a finding I suppose.


Main hypotheses

In this section, we will test each hypothesis. We follow this structure:

  • Main model: DV ~ Courage * Suffering + Job_condition (in human language: testing the effect of courage, suffering, their interaction on the DV while accounting for the effect of the job condition on the DV (i.e., using job as a covariate))

In just this simple model, we can test hypotheses 1 to 5.

  • Running simple diagnostics of the model (homoscedasticity, normality of residuals’ distributions)

  • Computing a robust version of the model using robust regressions: less sensitive to assumptions violations. Just to check if things change drastically between the two types of regression.

  • Model 2 using Job as a moderator of each effect rather than a simple covariate: DV ~ Courage * Suffering + Courage:Job_condition + Suffering:Job_condition + Job_condition – in human language: the effect of courage, suffering, their interaction, the interaction between job and courage, and the interaction between suffering and job, and the main effect of job on the DV

  • Model 3 adding attitude to the main model to assess Halo effect: DV ~ Courage * Suffering + Job_condition + Attitude

  • Model 4 adding attitude to model 2 for the same reasons: DV ~ Courage * Suffering + Courage:Job_condition + Suffering:Job_condition + Job + Attitude

  • Assessing how the Halo effect drive Heroism by comparing Model 1 to Model 3, and Model 2 to Model 4 using anova.

We then repeat these steps for each outcomes: Heroism rating, Victim rating, Victimisation score, Perceived endurance, and Assumptions of vulnerability.


Heroism perception

Model 1: DV ~ Courage * Suffering + Job_condition

The default contrast associated with the suffering condition is a treatment contrast; and it’s exactly what we want (see registration)

levels(as.factor(LongDF_num$Suffering))
## [1] "No_Suff"    "Phys_suff"  "Psych_Suff"
contrasts(as.factor(LongDF_num$Suffering)) ## 
##            Phys_suff Psych_Suff
## No_Suff            0          0
## Phys_suff          1          0
## Psych_Suff         0          1

Courage will be sum-to-zero coded though (that way, any effect is estimated across the courage conditions, rather than in the control condition of courage, see registration for details):

LongDF_num$Courage_Dummy <- ifelse(LongDF_num$Courage == "Courageous", 0.5, -0.5)

We can run our models:

summary(mod1<-lm(HeroVictim_N_1 ~ Job + Suffering*Courage_Dummy, data = LongDF_num)) # 
## 
## Call:
## lm(formula = HeroVictim_N_1 ~ Job + Suffering * Courage_Dummy, 
##     data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.2008 -0.7014  0.3291  0.8816  1.9604 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        6.09684    0.08563  71.198  < 2e-16 ***
## JobSoldier                        -0.56145    0.09404  -5.971 3.12e-09 ***
## JobWelder                         -0.95308    0.09422 -10.116  < 2e-16 ***
## SufferingPhys_suff                 0.11975    0.09439   1.269    0.205    
## SufferingPsych_Suff                0.09377    0.09421   0.995    0.320    
## Courage_Dummy                      0.20840    0.13340   1.562    0.119    
## SufferingPhys_suff:Courage_Dummy  -0.17683    0.18877  -0.937    0.349    
## SufferingPsych_Suff:Courage_Dummy -0.06394    0.18842  -0.339    0.734    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.334 on 1193 degrees of freedom
## Multiple R-squared:  0.0837, Adjusted R-squared:  0.07833 
## F-statistic: 15.57 on 7 and 1193 DF,  p-value: < 2.2e-16
#summary(rlm(HeroVictim_N_1 ~ Job + Suffering*Courage_Dummy, data = LongDF_num)) # 

Except an effect where Nurses Heroism > Soldier heroism > Welders heroism — i’m afraid there’s nothing to see here.

H1b: Individuals described as physically suffering (vs not suffering) will be perceived more as heroes Nope… –> b = 0.12, t(1193) = 1.269, p = .21 (check the line SufferingPhys_suff in output)

H2b: Individuals described as psychologically suffering (vs not suffering) will be perceived more as heroes Nope… –> b = 0.094, t(1193) = 0.995, p = 0.320 (check the line SufferingPsych_Suff in output)

H3b: Individuals described as courageous (vs not courageous) will be perceived more as heroes* Nope –> Within the no suffering: Courage_Dummy, b = 0.21, t(1193) = 1.562, p = 0.12 (check the line Courage_Dummy in output)

For H3, we also registered testing Omnibus (across all suffering conditions). To obtain the marginal effect of Courage averaged across all suffering conditions, we use the emmeans package to estimate the Courage effect at each level of Suffering and then average these effects using equal weights.

Because we plan balanced cell sizes, the choice between equal and proportional weights should make negligible difference.

iv_slopes <-emmeans::emtrends(mod1, specs = "Suffering", var = "Courage_Dummy")
emmeans(iv_slopes, specs = ~ 1, weights = "equal")
##  1       Courage_Dummy.trend    SE   df lower.CL upper.CL
##  overall               0.128 0.077 1193  -0.0229    0.279
## 
## Results are averaged over the levels of: Job, Courage_Dummy, Suffering 
## Confidence level used: 0.95

Nope –> across conditions, it is not significant, as indicated by 95%CI including 0.

H4a: The positive effect of courageous descriptions on Heroism will be stronger when workers are described as physically suffering (vs not suffering). Nope –> SufferingPhys_suff:Courage_Dummy - b = -0.17683, t(1193) = -0.937, p = 0.349

H5a: The positive effect of courageous descriptions on Heroism will be stronger when workers are described as psychologically suffering (vs not suffering). Nope –> SufferingPsych_Suff:Courage_Dummy b = -0.06394, t(1193) = -0.339, p = 0.734

Conclusion on main model for Heroism perception: Heroism perception across target occupations were not different depending on the experimental conditions.

Model 2: job as a moderator?

We can move to our second model, accounting for occupation type:

### Model 2: Target outcome ~ Suffering * Courage + Occupation:Suffering + Occupation:Courage + Occupation
summary(mod2 <-lm(HeroVictim_N_1 ~ Suffering*Courage_Dummy + Suffering:Job + Courage_Dummy:Job + Job, data = LongDF_num)) 
## 
## Call:
## lm(formula = HeroVictim_N_1 ~ Suffering * Courage_Dummy + Suffering:Job + 
##     Courage_Dummy:Job + Job, data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.2334 -0.6877  0.3240  0.8975  1.9757 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        6.05147    0.11457  52.821  < 2e-16 ***
## SufferingPhys_suff                 0.14373    0.16293   0.882  0.37788    
## SufferingPsych_Suff                0.20414    0.16173   1.262  0.20710    
## Courage_Dummy                      0.10215    0.17154   0.596  0.55162    
## JobSoldier                        -0.50934    0.16293  -3.126  0.00181 ** 
## JobWelder                         -0.86704    0.16356  -5.301 1.37e-07 ***
## SufferingPhys_suff:Courage_Dummy  -0.17863    0.18907  -0.945  0.34496    
## SufferingPsych_Suff:Courage_Dummy -0.06433    0.18872  -0.341  0.73325    
## SufferingPhys_suff:JobSoldier     -0.02432    0.23107  -0.105  0.91620    
## SufferingPsych_Suff:JobSoldier    -0.13027    0.23022  -0.566  0.57159    
## SufferingPhys_suff:JobWelder      -0.05050    0.23151  -0.218  0.82738    
## SufferingPsych_Suff:JobWelder     -0.20481    0.23088  -0.887  0.37521    
## Courage_Dummy:JobSoldier           0.10548    0.18837   0.560  0.57563    
## Courage_Dummy:JobWelder            0.21805    0.18874   1.155  0.24821    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.336 on 1187 degrees of freedom
## Multiple R-squared:  0.08542,    Adjusted R-squared:  0.0754 
## F-statistic: 8.528 on 13 and 1187 DF,  p-value: < 2.2e-16

This models gives us the slope difference for each level of suffering between Nurses (0) and Welders (1) and Nurses (0) and (Soldiers).

For interpreting how job influence slope, it is more useful to use Anova(Mod2). That way we can just bypass any interpretation if the overall moderation is null. If it ain’t – then dig in.

Anova(mod2, type = "III")

Ok, so – nothing of interest is happening here. There is no Job x Condition interaction. Only the same main job effect.

A bit of color for this dull report:

emm_JS <- emmeans(
  mod2,
  ~ Job * Suffering | Courage_Dummy,
  at = list(Courage_Dummy = c(-0.5, 0.5))
)

emm_JS_df <- as.data.frame(emm_JS)

emm_JS_df$Job <- factor(
  emm_JS_df$Job,
  levels = c("Nurses", "Soldier", "Welder")
)

emm_JS_df$Suffering <- factor(
  emm_JS_df$Suffering,
  levels = c("No_Suff", "Phys_suff", "Psych_Suff"),
  labels = c("No suffering", "Physical", "Psychological")
)

emm_JS_df$Courage_Label <- ifelse(
  emm_JS_df$Courage_Dummy == -0.5,
  "Non-courageous",
  "Courageous"
)

ggplot(
  emm_JS_df,
  aes(
    x = Suffering,
    y = emmean,
    fill = Job
  )
) +
  geom_col(
    position = position_dodge(width = 0.80),
    width = 0.70,
    color = "black"
  ) +
  geom_errorbar(
    aes(
      ymin = lower.CL,
      ymax = upper.CL
    ),
    position = position_dodge(width = 0.80),
    width = 0.20
  ) +
  facet_wrap(~ Courage_Label) +
  labs(
    x = "Suffering condition",
    y = "Estimated marginal mean",
    fill = "Job"
  ) +
  theme_classic(base_size = 14)

Model 3: Attitude as a covariate

Then model 3, adds attitude to model 1:

summary(mod3 <-lm(HeroVictim_N_1 ~ Suffering*Courage_Dummy + Job + Attitude_N, data = LongDF_num)) # Provides intercept (No suffering) vs each other level.
## 
## Call:
## lm(formula = HeroVictim_N_1 ~ Suffering * Courage_Dummy + Job + 
##     Attitude_N, data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.0547 -0.5568  0.2687  0.4609  3.3499 
## 
## Coefficients:
##                                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        0.587939   0.194140   3.028  0.00251 ** 
## SufferingPhys_suff                 0.038286   0.071237   0.537  0.59105    
## SufferingPsych_Suff                0.025115   0.071088   0.353  0.72393    
## Courage_Dummy                     -0.011251   0.100871  -0.112  0.91121    
## JobSoldier                         0.141103   0.074667   1.890  0.05903 .  
## JobWelder                         -0.528234   0.072447  -7.291 5.58e-13 ***
## Attitude_N                         0.850971   0.028281  30.090  < 2e-16 ***
## SufferingPhys_suff:Courage_Dummy   0.009738   0.142504   0.068  0.94553    
## SufferingPsych_Suff:Courage_Dummy  0.037439   0.142143   0.263  0.79229    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.006 on 1192 degrees of freedom
## Multiple R-squared:  0.4792, Adjusted R-squared:  0.4757 
## F-statistic: 137.1 on 8 and 1192 DF,  p-value: < 2.2e-16

Attitude is definitely correlated with perceived heroism, p < .001 – but nothing new.

Model 4: job as moderator + attitude as covariate

Model 4, adds attitude to model 2:

summary(mod4 <-lm(HeroVictim_N_1 ~ Suffering*Courage_Dummy + Suffering:Job + Courage_Dummy:Job + Job+ Attitude_N, data = LongDF_num)) # Provides intercept (No suffering) vs each other level.
## 
## Call:
## lm(formula = HeroVictim_N_1 ~ Suffering * Courage_Dummy + Suffering:Job + 
##     Courage_Dummy:Job + Job + Attitude_N, data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.0185 -0.5787  0.2351  0.5352  3.3303 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        0.51842    0.20354   2.547 0.010991 *  
## SufferingPhys_suff                 0.09642    0.12288   0.785 0.432780    
## SufferingPsych_Suff                0.13262    0.12198   1.087 0.277158    
## Courage_Dummy                      0.05161    0.12937   0.399 0.689994    
## JobSoldier                         0.26294    0.12553   2.095 0.036419 *  
## JobWelder                         -0.48040    0.12401  -3.874 0.000113 ***
## Attitude_N                         0.85317    0.02842  30.023  < 2e-16 ***
## SufferingPhys_suff:Courage_Dummy   0.01054    0.14272   0.074 0.941125    
## SufferingPsych_Suff:Courage_Dummy  0.03742    0.14235   0.263 0.792680    
## SufferingPhys_suff:JobSoldier     -0.16177    0.17431  -0.928 0.353562    
## SufferingPsych_Suff:JobSoldier    -0.19828    0.17362  -1.142 0.253683    
## SufferingPhys_suff:JobWelder      -0.01367    0.17459  -0.078 0.937593    
## SufferingPsych_Suff:JobWelder     -0.12718    0.17413  -0.730 0.465283    
## Courage_Dummy:JobSoldier          -0.10792    0.14223  -0.759 0.448154    
## Courage_Dummy:JobWelder           -0.08326    0.14268  -0.584 0.559650    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.008 on 1186 degrees of freedom
## Multiple R-squared:  0.4804, Adjusted R-squared:  0.4742 
## F-statistic: 78.31 on 14 and 1186 DF,  p-value: < 2.2e-16

Model comparisons

We will assess if the effects of our manipulations observed in the model hold true when accounting for attitude as a covariate (i.e., Suffering and Courage main effects in model 3 and 4).

To account for the possible effect of attitude (i.e., Halo effect), we will compare a model accounting for attitude as a covariate to a model not accounting for attitude as a covariate in an ANOVA (i.e., we will compare Model 1 to Model 3; and Model 2 to Model 4) and evaluate which model provides the best fit with the data.

anova(mod1, mod3)
anova(mod2, mod4)

As could be expected, accounting for attitude reduce error. In model 1 vs 3, the residual sum of squares (RSS) is 2122 vs 1206.6 – that’s a HUGE difference, as indicated by the F value, F(1, 1186) = 905.38, p < .0001 Same-ish for model 2 vs 4.

Diagnostics
Toggle details regarding diagnostic and robustness checks

Let’s assess homoscedasticity and normality of residuals for the main model:

plot(mod1)

the importan plots to look at are:

  • QQ plot: must be a straight line… not looking good
  • fitted vs residuals: must be horizontal with noise dispersed randomly across the plot… meh.

Let’s run a robust model to assess if it changes any decision:

summary(rlm(HeroVictim_N_1 ~ Job + Suffering*Courage_Dummy, data = LongDF_num)) # 
## 
## Call: rlm(formula = HeroVictim_N_1 ~ Job + Suffering * Courage_Dummy, 
##     data = LongDF_num)
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.2912 -0.8690  0.1400  0.8061  1.8545 
## 
## Coefficients:
##                                   Value    Std. Error t value 
## (Intercept)                         6.1923   0.0792    78.2147
## JobSoldier                         -0.4529   0.0869    -5.2096
## JobWelder                          -0.9261   0.0871   -10.6319
## SufferingPhys_suff                  0.1001   0.0873     1.1472
## SufferingPsych_Suff                 0.0656   0.0871     0.7534
## Courage_Dummy                       0.2413   0.1233     1.9562
## SufferingPhys_suff:Courage_Dummy   -0.2390   0.1745    -1.3694
## SufferingPsych_Suff:Courage_Dummy  -0.1132   0.1742    -0.6500
## 
## Residual standard error: 1.246 on 1193 degrees of freedom

Comparing the betas (Value in rlm) and t-values does not result in decision change… effect of courage appears slightly closer to the target, but not quite (generally, a t becomes significant when > 1.96).


Now, we can do the same for each remaining outcomes.

Other outcomes

Victim perception

This is a single item measure: to what extent do you consider [Nurses/Soldiers/Welders] to be victims

Model 1: DV ~ Courage * Suffering + Job_condition

summary(mod1<-lm(HeroVictim_N_2 ~ Job + Suffering*Courage_Dummy, data = LongDF_num)) # 
## 
## Call:
## lm(formula = HeroVictim_N_2 ~ Job + Suffering * Courage_Dummy, 
##     data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.1859 -1.1859 -0.0383  1.0570  4.0130 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        3.50862    0.09955  35.243  < 2e-16 ***
## JobSoldier                        -0.49598    0.10932  -4.537 6.29e-06 ***
## JobWelder                         -0.79034    0.10953  -7.215 9.54e-13 ***
## SufferingPhys_suff                 0.53885    0.10973   4.911 1.03e-06 ***
## SufferingPsych_Suff                0.45221    0.10952   4.129 3.90e-05 ***
## Courage_Dummy                     -0.05135    0.15508  -0.331    0.741    
## SufferingPhys_suff:Courage_Dummy   0.32823    0.21946   1.496    0.135    
## SufferingPsych_Suff:Courage_Dummy  0.01571    0.21905   0.072    0.943    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.551 on 1193 degrees of freedom
## Multiple R-squared:  0.06582,    Adjusted R-squared:  0.06034 
## F-statistic: 12.01 on 7 and 1193 DF,  p-value: 7.161e-15

H1a: Individuals described as physically suffering (vs not suffering) will be perceived more as victims YES –> b = 0.54, t(1193) = 4.91, p < .001 (check the line SufferingPhys_suff in output)

H2a: Individuals described as psychologically suffering (vs not suffering) will be perceived more as victims YES –> (check the line SufferingPsych_Suff in output)

H3a: Individuals described as courageous (vs not courageous) will be perceived more as victims* Nope –> (check the line Courage_Dummy in output)

For H3, we also registered testing Omnibus (across all suffering conditions). To obtain the marginal effect of Courage averaged across all suffering conditions, we use the emmeans package to estimate the Courage effect at each level of Suffering and then average these effects using equal weights.

Because we plan balanced cell sizes, the choice between equal and proportional weights should make negligible difference.

iv_slopes <-emmeans::emtrends(mod1, specs = "Suffering", var = "Courage_Dummy")
emmeans(iv_slopes, specs = ~ 1, weights = "equal")
##  1       Courage_Dummy.trend     SE   df lower.CL upper.CL
##  overall              0.0633 0.0895 1193   -0.112    0.239
## 
## Results are averaged over the levels of: Job, Courage_Dummy, Suffering 
## Confidence level used: 0.95

Nope –> across conditions, it is not significant, as indicated by 95%CI including 0.

H4b: H4b: The negative effect of courageous descriptions on Victim perception will be stronger when workers are described as physically suffering (vs not suffering).
Nope –> see SufferingPhys_suff:Courage_Dummy

H5b: The negative effect of courageous descriptions on Victim perception will be stronger when workers are described as psychologically suffering (vs not suffering).
Nope –> seeSufferingPsych_Suff:Courage_Dummy

Conclusion on main model for Victim perception: Workers described as physically or psychologically suffering were perceived as significantly more victims than workers described as not suffering.

Model 2: job as a moderator?

We can move to our second model, accounting for occupation type:

### Model 2: Target outcome ~ Suffering * Courage + Occupation:Suffering + Occupation:Courage + Occupation
summary(mod2 <-lm(HeroVictim_N_2 ~ Suffering*Courage_Dummy + Suffering:Job + Courage_Dummy:Job + Job, data = LongDF_num)) 
## 
## Call:
## lm(formula = HeroVictim_N_2 ~ Suffering * Courage_Dummy + Suffering:Job + 
##     Courage_Dummy:Job + Job, data = LongDF_num)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -3.110 -1.212 -0.053  1.075  3.993 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        3.58824    0.13319  26.941  < 2e-16 ***
## SufferingPhys_suff                 0.39020    0.18942   2.060  0.03962 *  
## SufferingPsych_Suff                0.36050    0.18802   1.917  0.05543 .  
## Courage_Dummy                     -0.06437    0.19942  -0.323  0.74693    
## JobSoldier                        -0.55799    0.18942  -2.946  0.00328 ** 
## JobWelder                         -0.97044    0.19015  -5.104 3.88e-07 ***
## SufferingPhys_suff:Courage_Dummy   0.32829    0.21981   1.494  0.13557    
## SufferingPsych_Suff:Courage_Dummy  0.01697    0.21940   0.077  0.93836    
## SufferingPhys_suff:JobSoldier      0.14958    0.26863   0.557  0.57776    
## SufferingPsych_Suff:JobSoldier     0.03759    0.26764   0.140  0.88832    
## SufferingPhys_suff:JobWelder       0.29956    0.26914   1.113  0.26594    
## SufferingPsych_Suff:JobWelder      0.24049    0.26841   0.896  0.37045    
## Courage_Dummy:JobSoldier           0.10984    0.21900   0.502  0.61607    
## Courage_Dummy:JobWelder           -0.07302    0.21942  -0.333  0.73934    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.553 on 1187 degrees of freedom
## Multiple R-squared:  0.06758,    Adjusted R-squared:  0.05737 
## F-statistic: 6.618 on 13 and 1187 DF,  p-value: 2.471e-12

Well look at that. When using job as a moderator, while the effect of physical suffering remains significant, the effect of psych suffering was cancelled out. Why? Because when we take into consideration that the effect of psychological suffering may be dependent on the type of occupation, then the effect of psych suffering across occupations is reduced, because it was ‘hiding’ variance explained by a job x suffering interaction. Note that there are NO significant interaction here, but that’s an explanation of why main effect disappeared.

Anova(mod2, type = "III")

A bit of color for this dull report:

emm_JS <- emmeans(
  mod2,
  ~ Job * Suffering | Courage_Dummy,
  at = list(Courage_Dummy = c(-0.5, 0.5))
)

emm_JS_df <- as.data.frame(emm_JS)

emm_JS_df$Job <- factor(
  emm_JS_df$Job,
  levels = c("Nurses", "Soldier", "Welder")
)

emm_JS_df$Suffering <- factor(
  emm_JS_df$Suffering,
  levels = c("No_Suff", "Phys_suff", "Psych_Suff"),
  labels = c("No suffering", "Physical", "Psychological")
)

emm_JS_df$Courage_Label <- ifelse(
  emm_JS_df$Courage_Dummy == -0.5,
  "Non-courageous",
  "Courageous"
)

ggplot(
  emm_JS_df,
  aes(
    x = Suffering,
    y = emmean,
    fill = Job
  )
) +
  geom_col(
    position = position_dodge(width = 0.80),
    width = 0.70,
    color = "black"
  ) +
  geom_errorbar(
    aes(
      ymin = lower.CL,
      ymax = upper.CL
    ),
    position = position_dodge(width = 0.80),
    width = 0.20
  ) +
  facet_wrap(~ Courage_Label) +
  labs(
    x = "Suffering condition",
    y = "Estimated marginal mean",
    fill = "Job"
  ) +
  theme_classic(base_size = 14)

Model 3: Attitude as a covariate

Then model 3, adds attitude to model 1:

summary(mod3 <-lm(HeroVictim_N_2 ~ Suffering*Courage_Dummy + Job + Attitude_N, data = LongDF_num)) # Provides intercept (No suffering) vs each other level.
## 
## Call:
## lm(formula = HeroVictim_N_2 ~ Suffering * Courage_Dummy + Job + 
##     Attitude_N, data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.1607 -1.1874 -0.0701  1.0801  4.0880 
## 
## Coefficients:
##                                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        3.905650   0.299140  13.056  < 2e-16 ***
## SufferingPhys_suff                 0.544723   0.109765   4.963 7.96e-07 ***
## SufferingPsych_Suff                0.457159   0.109535   4.174 3.22e-05 ***
## Courage_Dummy                     -0.035515   0.155427  -0.229    0.819    
## JobSoldier                        -0.546618   0.115050  -4.751 2.27e-06 ***
## JobWelder                         -0.820955   0.111630  -7.354 3.56e-13 ***
## Attitude_N                        -0.061330   0.043577  -1.407    0.160    
## SufferingPhys_suff:Courage_Dummy   0.314786   0.219577   1.434    0.152    
## SufferingPsych_Suff:Courage_Dummy  0.008402   0.219021   0.038    0.969    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.55 on 1192 degrees of freedom
## Multiple R-squared:  0.06737,    Adjusted R-squared:  0.06111 
## F-statistic: 10.76 on 8 and 1192 DF,  p-value: 1.036e-14

Attitude has nothing to do with perception of victimhood, p = 0.160

Model 4: job as moderator + attitude as covariate

Model 4, adds attitude to model 2:

summary(mod4 <-lm(HeroVictim_N_2 ~ Suffering*Courage_Dummy + Suffering:Job + Courage_Dummy:Job + Job+ Attitude_N, data = LongDF_num)) # Provides intercept (No suffering) vs each other level.
## 
## Call:
## lm(formula = HeroVictim_N_2 ~ Suffering * Courage_Dummy + Suffering:Job + 
##     Courage_Dummy:Job + Job + Attitude_N, data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.0789 -1.2696 -0.0776  1.1029  4.0237 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        3.98135    0.31367  12.693  < 2e-16 ***
## SufferingPhys_suff                 0.39356    0.18936   2.078  0.03789 *  
## SufferingPsych_Suff                0.36558    0.18798   1.945  0.05204 .  
## Courage_Dummy                     -0.06078    0.19936  -0.305  0.76053    
## JobSoldier                        -0.61286    0.19345  -3.168  0.00157 ** 
## JobWelder                         -0.99791    0.19111  -5.222 2.09e-07 ***
## Attitude_N                        -0.06062    0.04379  -1.384  0.16657    
## SufferingPhys_suff:Courage_Dummy   0.31485    0.21994   1.432  0.15255    
## SufferingPsych_Suff:Courage_Dummy  0.00974    0.21938   0.044  0.96460    
## SufferingPhys_suff:JobSoldier      0.15934    0.26862   0.593  0.55317    
## SufferingPsych_Suff:JobSoldier     0.04242    0.26756   0.159  0.87404    
## SufferingPhys_suff:JobWelder       0.29694    0.26905   1.104  0.26996    
## SufferingPsych_Suff:JobWelder      0.23498    0.26834   0.876  0.38139    
## Courage_Dummy:JobSoldier           0.12500    0.21919   0.570  0.56858    
## Courage_Dummy:JobWelder           -0.05162    0.21988  -0.235  0.81444    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.553 on 1186 degrees of freedom
## Multiple R-squared:  0.06909,    Adjusted R-squared:  0.0581 
## F-statistic: 6.287 on 14 and 1186 DF,  p-value: 2.868e-12

Model comparisons

We will assess if the effects of our manipulations observed in the model hold true when accounting for attitude as a covariate (i.e., Suffering and Courage main effects in model 3 and 4).

To account for the possible effect of attitude (i.e., Halo effect), we will compare a model accounting for attitude as a covariate to a model not accounting for attitude as a covariate in an ANOVA (i.e., we will compare Model 1 to Model 3; and Model 2 to Model 4) and evaluate which model provides the best fit with the data.

anova(mod1, mod3)
anova(mod2, mod4)

As could be expected, accounting for attitude reduce error.

Diagnostics
Toggle details regarding diagnostic and robustness checks

Let’s assess homoscedasticity and normality of residuals for the main model:

plot(mod1)

the importan plots to look at are:

  • QQ plot: must be a straight line… not looking good
  • fitted vs residuals: must be horizontal with noise dispersed randomly across the plot… meh.

Let’s run a robust model to assess if it changes any decision:

summary(rlm(HeroVictim_N_2 ~ Job + Suffering*Courage_Dummy, data = LongDF_num)) # 
## 
## Call: rlm(formula = HeroVictim_N_2 ~ Job + Suffering * Courage_Dummy, 
##     data = LongDF_num)
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -3.21559 -1.14863  0.03151  1.09809  4.08952 
## 
## Coefficients:
##                                   Value   Std. Error t value
## (Intercept)                        3.4820  0.1043    33.3831
## JobSoldier                        -0.5425  0.1145    -4.7363
## JobWelder                         -0.8173  0.1148    -7.1220
## SufferingPhys_suff                 0.5644  0.1150     4.9090
## SufferingPsych_Suff                0.4519  0.1147     3.9385
## Courage_Dummy                     -0.0580  0.1625    -0.3570
## SufferingPhys_suff:Courage_Dummy   0.3965  0.2299     1.7243
## SufferingPsych_Suff:Courage_Dummy -0.0060  0.2295    -0.0263
## 
## Residual standard error: 1.665 on 1193 degrees of freedom

Comparing the betas (Value in rlm) and t-values does not result in decision change.

Victimisation

This is a global score of victimisation that concatenates a general-level measure of victimisation (targeting perception that workers are victimised, exploited, unfairly treated) and a specific measure of victimisation wich targets the need to protect the workers, and do more for their health. Rationale for concatenating the two measures is provided in the registration. See also section measurement model of the present report.

Model 1: DV ~ Courage * Suffering + Job_condition

LongDF_num$GlobalVict <- (LongDF_num$Victim_G_mean + LongDF_num$Victim_S_mean)/2 # Compute mean between specific and general levels measure of victimization
summary(mod1<-lm(GlobalVict ~ Job + Suffering*Courage_Dummy, data = LongDF_num)) # 
## 
## Call:
## lm(formula = GlobalVict ~ Job + Suffering * Courage_Dummy, data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.7063 -0.7223 -0.0291  0.7705  2.9305 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        4.53770    0.06641  68.333  < 2e-16 ***
## JobSoldier                        -0.81007    0.07292 -11.109  < 2e-16 ***
## JobWelder                         -0.83707    0.07306 -11.457  < 2e-16 ***
## SufferingPhys_suff                 0.51882    0.07319   7.088 2.32e-12 ***
## SufferingPsych_Suff                0.44397    0.07306   6.077 1.64e-09 ***
## Courage_Dummy                      0.01714    0.10345   0.166    0.868    
## SufferingPhys_suff:Courage_Dummy   0.01673    0.14639   0.114    0.909    
## SufferingPsych_Suff:Courage_Dummy -0.11864    0.14611  -0.812    0.417    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.034 on 1193 degrees of freedom
## Multiple R-squared:  0.1614, Adjusted R-squared:  0.1565 
## F-statistic:  32.8 on 7 and 1193 DF,  p-value: < 2.2e-16

H8a: participants in the physical suffering (vs no suffering) condition will perceived workers as more victimised. ==> Yes indeed

H8b: participants in the psychological suffering (vs no suffering) condition will perceived workers as more victimised. ==> Yes indeed

Conclusion on main model for Victimisation: As predicted, we see workers physically or psychologically suffering described as being signicantly more victimised and needing protection

Model 2: job as a moderator?

We can move to our second model, accounting for occupation type:

### Model 2: Target outcome ~ Suffering * Courage + Occupation:Suffering + Occupation:Courage + Occupation
summary(mod2 <-lm(GlobalVict ~ Suffering*Courage_Dummy + Suffering:Job + Courage_Dummy:Job + Job, data = LongDF_num)) 
## 
## Call:
## lm(formula = GlobalVict ~ Suffering * Courage_Dummy + Suffering:Job + 
##     Courage_Dummy:Job + Job, data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.7204 -0.7249  0.0228  0.7721  2.8494 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        4.56005    0.08882  51.343  < 2e-16 ***
## SufferingPhys_suff                 0.49005    0.12631   3.880  0.00011 ***
## SufferingPsych_Suff                0.40537    0.12538   3.233  0.00126 ** 
## Courage_Dummy                     -0.02375    0.13298  -0.179  0.85831    
## JobSoldier                        -0.76166    0.12631  -6.030 2.19e-09 ***
## JobWelder                         -0.95431    0.12680  -7.526 1.03e-13 ***
## SufferingPhys_suff:Courage_Dummy   0.01637    0.14658   0.112  0.91107    
## SufferingPsych_Suff:Courage_Dummy -0.11805    0.14630  -0.807  0.41989    
## SufferingPhys_suff:JobSoldier     -0.09065    0.17913  -0.506  0.61293    
## SufferingPsych_Suff:JobSoldier    -0.05433    0.17847  -0.304  0.76085    
## SufferingPhys_suff:JobWelder       0.17844    0.17947   0.994  0.32031    
## SufferingPsych_Suff:JobWelder      0.17262    0.17899   0.964  0.33501    
## Courage_Dummy:JobSoldier           0.06157    0.14603   0.422  0.67338    
## Courage_Dummy:JobWelder            0.06197    0.14632   0.424  0.67199    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.036 on 1187 degrees of freedom
## Multiple R-squared:  0.1635, Adjusted R-squared:  0.1543 
## F-statistic: 17.85 on 13 and 1187 DF,  p-value: < 2.2e-16

Nothing new here.

A bit of color for this dull report:

emm_JS <- emmeans(
  mod2,
  ~ Job * Suffering | Courage_Dummy,
  at = list(Courage_Dummy = c(-0.5, 0.5))
)

emm_JS_df <- as.data.frame(emm_JS)

emm_JS_df$Job <- factor(
  emm_JS_df$Job,
  levels = c("Nurses", "Soldier", "Welder")
)

emm_JS_df$Suffering <- factor(
  emm_JS_df$Suffering,
  levels = c("No_Suff", "Phys_suff", "Psych_Suff"),
  labels = c("No suffering", "Physical", "Psychological")
)

emm_JS_df$Courage_Label <- ifelse(
  emm_JS_df$Courage_Dummy == -0.5,
  "Non-courageous",
  "Courageous"
)

ggplot(
  emm_JS_df,
  aes(
    x = Suffering,
    y = emmean,
    fill = Job
  )
) +
  geom_col(
    position = position_dodge(width = 0.80),
    width = 0.70,
    color = "black"
  ) +
  geom_errorbar(
    aes(
      ymin = lower.CL,
      ymax = upper.CL
    ),
    position = position_dodge(width = 0.80),
    width = 0.20
  ) +
  facet_wrap(~ Courage_Label) +
  labs(
    x = "Suffering condition",
    y = "Estimated marginal mean",
    fill = "Job"
  ) +
  theme_classic(base_size = 14)

Model 3: Attitude as a covariate

Then model 3, adds attitude to model 1:

summary(mod3 <-lm(GlobalVict ~ Suffering*Courage_Dummy + Job + Attitude_N, data = LongDF_num)) # Provides intercept (No suffering) vs each other level.
## 
## Call:
## lm(formula = GlobalVict ~ Suffering * Courage_Dummy + Job + Attitude_N, 
##     data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.6350 -0.7228  0.0125  0.7580  3.0122 
## 
## Coefficients:
##                                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        4.239993   0.199493  21.254  < 2e-16 ***
## SufferingPhys_suff                 0.514423   0.073201   7.028 3.53e-12 ***
## SufferingPsych_Suff                0.440261   0.073048   6.027 2.22e-09 ***
## Courage_Dummy                      0.005271   0.103652   0.051    0.959    
## JobSoldier                        -0.772102   0.076725 -10.063  < 2e-16 ***
## JobWelder                         -0.814110   0.074445 -10.936  < 2e-16 ***
## Attitude_N                         0.045987   0.029061   1.582    0.114    
## SufferingPhys_suff:Courage_Dummy   0.026812   0.146433   0.183    0.855    
## SufferingPsych_Suff:Courage_Dummy -0.113159   0.146062  -0.775    0.439    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.034 on 1192 degrees of freedom
## Multiple R-squared:  0.1632, Adjusted R-squared:  0.1576 
## F-statistic: 29.05 on 8 and 1192 DF,  p-value: < 2.2e-16

Excluding Victim_SN1: Attitude influences victimisation Without item exclusion: Attitude has no effect on victimisation.

Model 4: job as moderator + attitude as covariate

Model 4, adds attitude to model 2:

summary(mod4 <-lm(GlobalVict ~ Suffering*Courage_Dummy + Suffering:Job + Courage_Dummy:Job + Job+ Attitude_N, data = LongDF_num)) # Provides intercept (No suffering) vs each other level.
## 
## Call:
## lm(formula = GlobalVict ~ Suffering * Courage_Dummy + Suffering:Job + 
##     Courage_Dummy:Job + Job + Attitude_N, data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.6443 -0.7366  0.0061  0.7505  2.9817 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        4.25565    0.20911  20.352  < 2e-16 ***
## SufferingPhys_suff                 0.48745    0.12624   3.861 0.000119 ***
## SufferingPsych_Suff                0.40144    0.12532   3.203 0.001394 ** 
## Courage_Dummy                     -0.02653    0.13290  -0.200 0.841837    
## JobSoldier                        -0.71917    0.12896  -5.577 3.04e-08 ***
## JobWelder                         -0.93303    0.12740  -7.324 4.45e-13 ***
## Attitude_N                         0.04694    0.02919   1.608 0.108157    
## SufferingPhys_suff:Courage_Dummy   0.02678    0.14662   0.183 0.855093    
## SufferingPsych_Suff:Courage_Dummy -0.11245    0.14625  -0.769 0.442093    
## SufferingPhys_suff:JobSoldier     -0.09821    0.17907  -0.548 0.583506    
## SufferingPsych_Suff:JobSoldier    -0.05807    0.17837  -0.326 0.744791    
## SufferingPhys_suff:JobWelder       0.18046    0.17936   1.006 0.314540    
## SufferingPsych_Suff:JobWelder      0.17690    0.17889   0.989 0.322927    
## Courage_Dummy:JobSoldier           0.04983    0.14612   0.341 0.733148    
## Courage_Dummy:JobWelder            0.04539    0.14658   0.310 0.756869    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.035 on 1186 degrees of freedom
## Multiple R-squared:  0.1653, Adjusted R-squared:  0.1555 
## F-statistic: 16.78 on 14 and 1186 DF,  p-value: < 2.2e-16

Model comparisons

We will assess if the effects of our manipulations observed in the model hold true when accounting for attitude as a covariate (i.e., Suffering and Courage main effects in model 3 and 4).

To account for the possible effect of attitude (i.e., Halo effect), we will compare a model accounting for attitude as a covariate to a model not accounting for attitude as a covariate in an ANOVA (i.e., we will compare Model 1 to Model 3; and Model 2 to Model 4) and evaluate which model provides the best fit with the data.

anova(mod1, mod3)
anova(mod2, mod4)

Removing Victim_SN1: Attitude does influence model fit p = .002 With all Victimisation items: Attitude does not add anything to the model.

Diagnostics
Toggle details regarding diagnostic and robustness checks

Let’s assess homoscedasticity and normality of residuals for the main model:

plot(mod1)

the importan plots to look at are:

  • QQ plot: must be a straight line.
  • fitted vs residuals: must be horizontal with noise dispersed randomly across the plot.

Let’s run a robust model to assess if it changes any decision:

summary(rlm(GlobalVict ~ Job + Suffering*Courage_Dummy, data = LongDF_num)) # 
## 
## Call: rlm(formula = GlobalVict ~ Job + Suffering * Courage_Dummy, data = LongDF_num)
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -3.76149 -0.73940 -0.02965  0.75008  2.94658 
## 
## Coefficients:
##                                   Value    Std. Error t value 
## (Intercept)                         4.5548   0.0678    67.2155
## JobSoldier                         -0.8439   0.0744   -11.3398
## JobWelder                          -0.8676   0.0746   -11.6370
## SufferingPhys_suff                  0.5473   0.0747     7.3278
## SufferingPsych_Suff                 0.4619   0.0746     6.1962
## Courage_Dummy                       0.0183   0.1056     0.1729
## SufferingPhys_suff:Courage_Dummy   -0.0036   0.1494    -0.0243
## SufferingPsych_Suff:Courage_Dummy  -0.1513   0.1491    -1.0146
## 
## Residual standard error: 1.111 on 1193 degrees of freedom

Comparing the betas (Value in rlm) and t-values does not result in decision change.

Enduring pain

Our measure of willingness to endure pain is a 5 items scale which targets the perception that, when work gets tough and health becomes a concern for workers, the target occupation would still get through their day and get the job done.

Model 1: DV ~ Courage * Suffering + Job_condition

summary(mod1<-lm(Endure_mean ~ Job + Suffering*Courage_Dummy, data = LongDF_num)) # 
## 
## Call:
## lm(formula = Endure_mean ~ Job + Suffering * Courage_Dummy, data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.1984 -0.5131  0.1886  0.6726  2.0228 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        5.81874    0.06646  87.549  < 2e-16 ***
## JobSoldier                         0.24788    0.07299   3.396 0.000706 ***
## JobWelder                         -0.38626    0.07313  -5.282 1.52e-07 ***
## SufferingPhys_suff                -0.08732    0.07326  -1.192 0.233512    
## SufferingPsych_Suff               -0.15048    0.07312  -2.058 0.039806 *  
## Courage_Dummy                      0.66350    0.10353   6.408 2.11e-10 ***
## SufferingPhys_suff:Courage_Dummy   0.07238    0.14651   0.494 0.621384    
## SufferingPsych_Suff:Courage_Dummy  0.15897    0.14624   1.087 0.277218    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.035 on 1193 degrees of freedom
## Multiple R-squared:  0.1649, Adjusted R-squared:   0.16 
## F-statistic: 33.66 on 7 and 1193 DF,  p-value: < 2.2e-16

H6: Participants in the courage (vs no courage) condition will perceive workers as more likely to endure suffering ==> Yes! People described as more courageous do perceive participants as more likely to endure suffering. This is interesting.

H7a: Participants in the courage (vs no courage) condition will perceive workers as more likely to endure suffering, and this effect will be larger in the high physical suffering condition (vs low suffering condition) ==> Nope… no interaction with suffering.

H7b: Participants in the courage (vs no courage) condition will perceive workers as more likely to endure suffering, and this effect will be larger in the high psychological suffering condition (vs low suffering condition) ==> Nope… no interaction with suffering.

Exploratory note: We can note a small effect of psychological suffering on the perception of enduring, such that participant in the psychological suffering condition thinks that the workers are LESS likely to endure suffering than participants in the control condition — the effect is small

Conclusion on main model for Enduring pains: As predicted, Courageous workers are seen as more likely to endure pain. However, this was not qualified by suffering. Nevertheless, the effect of the courage manipulation is consistent with the idea that we did manipulate courage in the sense of prioriting mission over the self, but that might not be what participants understand to be courage or bravery.

Model 2: job as a moderator?

We can move to our second model, accounting for occupation type:

### Model 2: Target outcome ~ Suffering * Courage + Occupation:Suffering + Occupation:Courage + Occupation
summary(mod2 <-lm(Endure_mean ~ Suffering*Courage_Dummy + Suffering:Job + Courage_Dummy:Job + Job, data = LongDF_num)) 
## 
## Call:
## lm(formula = Endure_mean ~ Suffering * Courage_Dummy + Suffering:Job + 
##     Courage_Dummy:Job + Job, data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.1534 -0.5392  0.1600  0.7423  2.2537 
## 
## Coefficients:
##                                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        5.748529   0.087693  65.553  < 2e-16 ***
## SufferingPhys_suff                -0.037043   0.124716  -0.297  0.76651    
## SufferingPsych_Suff                0.006747   0.123792   0.055  0.95654    
## Courage_Dummy                      0.388110   0.131302   2.956  0.00318 ** 
## JobSoldier                         0.364556   0.124716   2.923  0.00353 ** 
## JobWelder                         -0.289231   0.125196  -2.310  0.02105 *  
## SufferingPhys_suff:Courage_Dummy   0.067383   0.144725   0.466  0.64159    
## SufferingPsych_Suff:Courage_Dummy  0.157657   0.144453   1.091  0.27531    
## SufferingPhys_suff:JobSoldier     -0.144269   0.176867  -0.816  0.41484    
## SufferingPsych_Suff:JobSoldier    -0.201931   0.176217  -1.146  0.25206    
## SufferingPhys_suff:JobWelder      -0.011742   0.177206  -0.066  0.94718    
## SufferingPsych_Suff:JobWelder     -0.272911   0.176725  -1.544  0.12279    
## Courage_Dummy:JobSoldier           0.092583   0.144189   0.642  0.52093    
## Courage_Dummy:JobWelder            0.747995   0.144468   5.178 2.64e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.023 on 1187 degrees of freedom
## Multiple R-squared:  0.1893, Adjusted R-squared:  0.1804 
## F-statistic: 21.32 on 13 and 1187 DF,  p-value: < 2.2e-16

Again, the effect of courage. There appears to be an interaction with occupations where nurses vs welders differ in their sensitivity to the courage manipulation… let’s see:

emm_JS <- emmeans(
  mod2,
  ~ Job * Suffering | Courage_Dummy,
  at = list(Courage_Dummy = c(-0.5, 0.5))
)

emm_JS_df <- as.data.frame(emm_JS)

emm_JS_df$Job <- factor(
  emm_JS_df$Job,
  levels = c("Nurses", "Soldier", "Welder")
)

emm_JS_df$Suffering <- factor(
  emm_JS_df$Suffering,
  levels = c("No_Suff", "Phys_suff", "Psych_Suff"),
  labels = c("No suffering", "Physical", "Psychological")
)

emm_JS_df$Courage_Label <- ifelse(
  emm_JS_df$Courage_Dummy == -0.5,
  "Non-courageous",
  "Courageous"
)

ggplot(
  emm_JS_df,
  aes(
    x = Suffering,
    y = emmean,
    fill = Job
  )
) +
  geom_col(
    position = position_dodge(width = 0.80),
    width = 0.70,
    color = "black"
  ) +
  geom_errorbar(
    aes(
      ymin = lower.CL,
      ymax = upper.CL
    ),
    position = position_dodge(width = 0.80),
    width = 0.20
  ) +
  facet_wrap(~ Courage_Label) +
  labs(
    x = "Suffering condition",
    y = "Estimated marginal mean",
    fill = "Job"
  ) +
  theme_classic(base_size = 14)

By the naked eye, i would assume that the effect of courage on enduring pain is larger for welders than nurses. Let’s statistically test that:

emm_JS <- emmeans(
  mod2,
  ~ Job * Suffering | Courage_Dummy,
  at = list(Courage_Dummy = c(-0.5, 0.5))
)

emm_JS
## Courage_Dummy = -0.5:
##  Job     Suffering  emmean    SE   df lower.CL upper.CL
##  Nurses  No_Suff      5.55 0.110 1187     5.34     5.77
##  Soldier No_Suff      5.87 0.110 1187     5.66     6.09
##  Welder  No_Suff      4.89 0.111 1187     4.67     5.11
##  Nurses  Phys_suff    5.48 0.110 1187     5.27     5.70
##  Soldier Phys_suff    5.66 0.111 1187     5.44     5.88
##  Welder  Phys_suff    4.81 0.111 1187     4.59     5.03
##  Nurses  Psych_Suff   5.48 0.109 1187     5.27     5.70
##  Soldier Psych_Suff   5.60 0.111 1187     5.38     5.82
##  Welder  Psych_Suff   4.55 0.110 1187     4.33     4.76
## 
## Courage_Dummy =  0.5:
##  Job     Suffering  emmean    SE   df lower.CL upper.CL
##  Nurses  No_Suff      5.94 0.110 1187     5.73     6.16
##  Soldier No_Suff      6.35 0.111 1187     6.14     6.57
##  Welder  No_Suff      6.03 0.112 1187     5.81     6.25
##  Nurses  Phys_suff    5.94 0.111 1187     5.72     6.16
##  Soldier Phys_suff    6.21 0.110 1187     5.99     6.42
##  Welder  Phys_suff    6.01 0.110 1187     5.80     6.23
##  Nurses  Psych_Suff   6.03 0.109 1187     5.81     6.24
##  Soldier Psych_Suff   6.24 0.110 1187     6.02     6.45
##  Welder  Psych_Suff   5.84 0.112 1187     5.62     6.06
## 
## Confidence level used: 0.95
pairs(
  emm_JS,
  by = c("Suffering")
)
## Suffering = No_Suff:
##  contrast                                                 estimate    SE   df
##  (Nurses Courage_Dummy-0.5) - (Soldier Courage_Dummy-0.5)  -0.3183 0.144 1187
##  (Nurses Courage_Dummy-0.5) - (Welder Courage_Dummy-0.5)    0.6632 0.144 1187
##  (Nurses Courage_Dummy-0.5) - Nurses Courage_Dummy0.5      -0.3881 0.131 1187
##  (Nurses Courage_Dummy-0.5) - Soldier Courage_Dummy0.5     -0.7990 0.167 1187
##  (Nurses Courage_Dummy-0.5) - Welder Courage_Dummy0.5      -0.4729 0.167 1187
##  (Soldier Courage_Dummy-0.5) - (Welder Courage_Dummy-0.5)   0.9815 0.145 1187
##  (Soldier Courage_Dummy-0.5) - Nurses Courage_Dummy0.5     -0.0698 0.166 1187
##  (Soldier Courage_Dummy-0.5) - Soldier Courage_Dummy0.5    -0.4807 0.132 1187
##  (Soldier Courage_Dummy-0.5) - Welder Courage_Dummy0.5     -0.1546 0.168 1187
##  (Welder Courage_Dummy-0.5) - Nurses Courage_Dummy0.5      -1.0513 0.167 1187
##  (Welder Courage_Dummy-0.5) - Soldier Courage_Dummy0.5     -1.4622 0.168 1187
##  (Welder Courage_Dummy-0.5) - Welder Courage_Dummy0.5      -1.1361 0.133 1187
##  Nurses Courage_Dummy0.5 - Soldier Courage_Dummy0.5        -0.4108 0.144 1187
##  Nurses Courage_Dummy0.5 - Welder Courage_Dummy0.5         -0.0848 0.145 1187
##  Soldier Courage_Dummy0.5 - Welder Courage_Dummy0.5         0.3261 0.146 1187
##  t.ratio p.value
##   -2.211  0.2331
##    4.593  0.0001
##   -2.956  0.0374
##   -4.792  <.0001
##   -2.828  0.0538
##    6.768  <.0001
##   -0.420  0.9983
##   -3.638  0.0039
##   -0.922  0.9409
##   -6.308  <.0001
##   -8.722  <.0001
##   -8.567  <.0001
##   -2.849  0.0507
##   -0.586  0.9920
##    2.240  0.2202
## 
## Suffering = Phys_suff:
##  contrast                                                 estimate    SE   df
##  (Nurses Courage_Dummy-0.5) - (Soldier Courage_Dummy-0.5)  -0.1740 0.145 1187
##  (Nurses Courage_Dummy-0.5) - (Welder Courage_Dummy-0.5)    0.6750 0.145 1187
##  (Nurses Courage_Dummy-0.5) - Nurses Courage_Dummy0.5      -0.4555 0.132 1187
##  (Nurses Courage_Dummy-0.5) - Soldier Courage_Dummy0.5     -0.7221 0.167 1187
##  (Nurses Courage_Dummy-0.5) - Welder Courage_Dummy0.5      -0.5285 0.167 1187
##  (Soldier Courage_Dummy-0.5) - (Welder Courage_Dummy-0.5)   0.8490 0.145 1187
##  (Soldier Courage_Dummy-0.5) - Nurses Courage_Dummy0.5     -0.2815 0.168 1187
##  (Soldier Courage_Dummy-0.5) - Soldier Courage_Dummy0.5    -0.5481 0.132 1187
##  (Soldier Courage_Dummy-0.5) - Welder Courage_Dummy0.5     -0.3545 0.167 1187
##  (Welder Courage_Dummy-0.5) - Nurses Courage_Dummy0.5      -1.1305 0.168 1187
##  (Welder Courage_Dummy-0.5) - Soldier Courage_Dummy0.5     -1.3970 0.167 1187
##  (Welder Courage_Dummy-0.5) - Welder Courage_Dummy0.5      -1.2035 0.132 1187
##  Nurses Courage_Dummy0.5 - Soldier Courage_Dummy0.5        -0.2666 0.145 1187
##  Nurses Courage_Dummy0.5 - Welder Courage_Dummy0.5         -0.0730 0.145 1187
##  Soldier Courage_Dummy0.5 - Welder Courage_Dummy0.5         0.1936 0.145 1187
##  t.ratio p.value
##   -1.203  0.8356
##    4.664  0.0001
##   -3.453  0.0076
##   -4.332  0.0002
##   -3.171  0.0194
##    5.849  <.0001
##   -1.678  0.5468
##   -4.147  0.0005
##   -2.121  0.2771
##   -6.739  <.0001
##   -8.357  <.0001
##   -9.100  <.0001
##   -1.843  0.4385
##   -0.505  0.9960
##    1.338  0.7635
## 
## Suffering = Psych_Suff:
##  contrast                                                 estimate    SE   df
##  (Nurses Courage_Dummy-0.5) - (Soldier Courage_Dummy-0.5)  -0.1163 0.144 1187
##  (Nurses Courage_Dummy-0.5) - (Welder Courage_Dummy-0.5)    0.9361 0.144 1187
##  (Nurses Courage_Dummy-0.5) - Nurses Courage_Dummy0.5      -0.5458 0.131 1187
##  (Nurses Courage_Dummy-0.5) - Soldier Courage_Dummy0.5     -0.7547 0.166 1187
##  (Nurses Courage_Dummy-0.5) - Welder Courage_Dummy0.5      -0.3576 0.167 1187
##  (Soldier Courage_Dummy-0.5) - (Welder Courage_Dummy-0.5)   1.0525 0.145 1187
##  (Soldier Courage_Dummy-0.5) - Nurses Courage_Dummy0.5     -0.4294 0.167 1187
##  (Soldier Courage_Dummy-0.5) - Soldier Courage_Dummy0.5    -0.6384 0.132 1187
##  (Soldier Courage_Dummy-0.5) - Welder Courage_Dummy0.5     -0.2413 0.168 1187
##  (Welder Courage_Dummy-0.5) - Nurses Courage_Dummy0.5      -1.4819 0.166 1187
##  (Welder Courage_Dummy-0.5) - Soldier Courage_Dummy0.5     -1.6908 0.167 1187
##  (Welder Courage_Dummy-0.5) - Welder Courage_Dummy0.5      -1.2938 0.132 1187
##  Nurses Courage_Dummy0.5 - Soldier Courage_Dummy0.5        -0.2089 0.144 1187
##  Nurses Courage_Dummy0.5 - Welder Courage_Dummy0.5          0.1881 0.145 1187
##  Soldier Courage_Dummy0.5 - Welder Courage_Dummy0.5         0.3971 0.145 1187
##  t.ratio p.value
##   -0.809  0.9660
##    6.513  <.0001
##   -4.165  0.0005
##   -4.557  0.0001
##   -2.146  0.2647
##    7.261  <.0001
##   -2.576  0.1039
##   -4.834  <.0001
##   -1.435  0.7057
##   -8.922  <.0001
##  -10.154  <.0001
##   -9.775  <.0001
##   -1.452  0.6948
##    1.302  0.7842
##    2.734  0.0694
## 
## P value adjustment: tukey method for comparing a family of 6 estimates
emcatcat <- emmeans(mod2, ~ Courage_Dummy*Job)
contrast(emcatcat, "revpairwise",by="Job")
## Job = Nurses:
##  contrast                               estimate    SE   df t.ratio p.value
##  Courage_Dummy0.5 - (Courage_Dummy-0.5)    0.463 0.102 1187   4.562  <.0001
## 
## Job = Soldier:
##  contrast                               estimate    SE   df t.ratio p.value
##  Courage_Dummy0.5 - (Courage_Dummy-0.5)    0.556 0.102 1187   5.427  <.0001
## 
## Job = Welder:
##  contrast                               estimate    SE   df t.ratio p.value
##  Courage_Dummy0.5 - (Courage_Dummy-0.5)    1.211 0.103 1187  11.783  <.0001
## 
## Results are averaged over the levels of: Suffering
courage_effects <-contrast(emcatcat, "revpairwise",by="Job")

Ok, so yes, the effect of welders is sizable. The other effects are still there though. We need to test difference in difference.

pairs(
  courage_effects,
  by = NULL
)
##  contrast                                                                                          
##  (Courage_Dummy0.5 - (Courage_Dummy-0.5) Nurses) - (Courage_Dummy0.5 - (Courage_Dummy-0.5) Soldier)
##  (Courage_Dummy0.5 - (Courage_Dummy-0.5) Nurses) - (Courage_Dummy0.5 - (Courage_Dummy-0.5) Welder) 
##  (Courage_Dummy0.5 - (Courage_Dummy-0.5) Soldier) - (Courage_Dummy0.5 - (Courage_Dummy-0.5) Welder)
##  estimate    SE   df t.ratio p.value
##   -0.0926 0.144 1187  -0.642  0.7969
##   -0.7480 0.144 1187  -5.178  <.0001
##   -0.6554 0.145 1187  -4.517  <.0001
## 
## Results are averaged over the levels of: Suffering 
## P value adjustment: tukey method for comparing a family of 3 estimates

YEP. As often the case in our previous studies, welders are more malleable: the effect of courage associated with welders is significantly larger than the effects for the other occupations.

Model 3: Attitude as a covariate

Then model 3, adds attitude to model 1:

summary(mod3 <-lm(Endure_mean ~ Suffering*Courage_Dummy + Job + Attitude_N, data = LongDF_num)) # Provides intercept (No suffering) vs each other level.
## 
## Call:
## lm(formula = Endure_mean ~ Suffering * Courage_Dummy + Job + 
##     Attitude_N, data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.3898 -0.5384  0.1889  0.7263  2.1882 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        4.80522    0.19743  24.338  < 2e-16 ***
## SufferingPhys_suff                -0.10231    0.07244  -1.412   0.1582    
## SufferingPsych_Suff               -0.16311    0.07229  -2.256   0.0242 *  
## Courage_Dummy                      0.62309    0.10258   6.074 1.68e-09 ***
## JobSoldier                         0.37713    0.07593   4.967 7.80e-07 ***
## JobWelder                         -0.30810    0.07368  -4.182 3.10e-05 ***
## Attitude_N                         0.15656    0.02876   5.444 6.34e-08 ***
## SufferingPhys_suff:Courage_Dummy   0.10670    0.14492   0.736   0.4617    
## SufferingPsych_Suff:Courage_Dummy  0.17762    0.14455   1.229   0.2194    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.023 on 1192 degrees of freedom
## Multiple R-squared:  0.1852, Adjusted R-squared:  0.1797 
## F-statistic: 33.86 on 8 and 1192 DF,  p-value: < 2.2e-16

Nothing new - attitude as a covariate seems to slightly increase the anectodal effect of psychological suffering on endurance.

There is a positive correlation between attitude and Enduring pain.

Model 4: job as moderator + attitude as covariate

Model 4, adds attitude to model 2:

summary(mod4 <-lm(Endure_mean ~ Suffering*Courage_Dummy + Suffering:Job + Courage_Dummy:Job + Job+ Attitude_N, data = LongDF_num)) # Provides intercept (No suffering) vs each other level.
## 
## Call:
## lm(formula = Endure_mean ~ Suffering * Courage_Dummy + Suffering:Job + 
##     Courage_Dummy:Job + Job + Attitude_N, data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.3412 -0.5171  0.1705  0.7290  2.3797 
## 
## Coefficients:
##                                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        4.786033   0.204371  23.418  < 2e-16 ***
## SufferingPhys_suff                -0.045272   0.123379  -0.367  0.71373    
## SufferingPsych_Suff               -0.005694   0.122478  -0.046  0.96293    
## Courage_Dummy                      0.379318   0.129895   2.920  0.00356 ** 
## JobSoldier                         0.498896   0.126044   3.958 8.00e-05 ***
## JobWelder                         -0.221973   0.124518  -1.783  0.07490 .  
## Attitude_N                         0.148412   0.028533   5.201 2.33e-07 ***
## SufferingPhys_suff:Courage_Dummy   0.100291   0.143302   0.700  0.48415    
## SufferingPsych_Suff:Courage_Dummy  0.175358   0.142934   1.227  0.22012    
## SufferingPhys_suff:JobSoldier     -0.168178   0.175018  -0.961  0.33679    
## SufferingPsych_Suff:JobSoldier    -0.213761   0.174329  -1.226  0.22037    
## SufferingPhys_suff:JobWelder      -0.005337   0.175297  -0.030  0.97572    
## SufferingPsych_Suff:JobWelder     -0.259407   0.174836  -1.484  0.13815    
## Courage_Dummy:JobSoldier           0.055463   0.142810   0.388  0.69782    
## Courage_Dummy:JobWelder            0.695582   0.143263   4.855 1.36e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.012 on 1186 degrees of freedom
## Multiple R-squared:  0.2074, Adjusted R-squared:  0.198 
## F-statistic: 22.17 on 14 and 1186 DF,  p-value: < 2.2e-16

Model comparisons

We will assess if the effects of our manipulations observed in the model hold true when accounting for attitude as a covariate (i.e., Suffering and Courage main effects in model 3 and 4).

To account for the possible effect of attitude (i.e., Halo effect), we will compare a model accounting for attitude as a covariate to a model not accounting for attitude as a covariate in an ANOVA (i.e., we will compare Model 1 to Model 3; and Model 2 to Model 4) and evaluate which model provides the best fit with the data.

anova(mod1, mod3)
anova(mod2, mod4)

Attitude is a significant contributor to the model.

Diagnostics
Toggle details regarding diagnostic and robustness checks

Let’s assess homoscedasticity and normality of residuals for the main model:

plot(mod1)

the importan plots to look at are:

  • QQ plot: must be a straight line.
  • fitted vs residuals: must be horizontal with noise dispersed randomly across the plot.

Let’s run a robust model to assess if it changes any decision:

summary(rlm(GlobalVict ~ Job + Suffering*Courage_Dummy, data = LongDF_num)) # 
## 
## Call: rlm(formula = GlobalVict ~ Job + Suffering * Courage_Dummy, data = LongDF_num)
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -3.76149 -0.73940 -0.02965  0.75008  2.94658 
## 
## Coefficients:
##                                   Value    Std. Error t value 
## (Intercept)                         4.5548   0.0678    67.2155
## JobSoldier                         -0.8439   0.0744   -11.3398
## JobWelder                          -0.8676   0.0746   -11.6370
## SufferingPhys_suff                  0.5473   0.0747     7.3278
## SufferingPsych_Suff                 0.4619   0.0746     6.1962
## Courage_Dummy                       0.0183   0.1056     0.1729
## SufferingPhys_suff:Courage_Dummy   -0.0036   0.1494    -0.0243
## SufferingPsych_Suff:Courage_Dummy  -0.1513   0.1491    -1.0146
## 
## Residual standard error: 1.111 on 1193 degrees of freedom

Comparing the betas (Value in rlm) and t-values does not result in decision change.

Assumption of vulnerability

The measure of assumption of vulnerability is taken from the following paper: https://journals.sagepub.com/doi/10.1177/01461672261422957

Model 1: DV ~ Courage * Suffering + Job_condition

summary(mod1<-lm(AoV_mean ~ Job + Suffering*Courage_Dummy, data = LongDF_num)) # 
## 
## Call:
## lm(formula = AoV_mean ~ Job + Suffering * Courage_Dummy, data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.5020 -0.6875  0.0055  0.8015  3.3315 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        4.91032    0.07519  65.308  < 2e-16 ***
## JobSoldier                        -0.50755    0.08256  -6.148 1.07e-09 ***
## JobWelder                         -1.13804    0.08277 -13.749  < 2e-16 ***
## SufferingPhys_suff                 0.57098    0.08292   6.886 9.25e-12 ***
## SufferingPsych_Suff                0.50898    0.08271   6.154 1.03e-09 ***
## Courage_Dummy                      0.20754    0.11712   1.772   0.0766 .  
## SufferingPhys_suff:Courage_Dummy  -0.18573    0.16583  -1.120   0.2630    
## SufferingPsych_Suff:Courage_Dummy -0.37303    0.16542  -2.255   0.0243 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.171 on 1192 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.1742, Adjusted R-squared:  0.1694 
## F-statistic: 35.92 on 7 and 1192 DF,  p-value: < 2.2e-16

H9a: participants in the physical suffering (vs no suffering) condition will be perceived as more likely to be vulnerable ==> Yes

H9b: participants in the psychological suffering (vs no suffering) condition will be perceived as more likely to be vulnerable ==> Yes

Exploratory note: Courage appears to moderate the effect of psychological suffering on assumptions of vulnerability - i will explore this.

emm_JS <- emmeans(
  mod1,
  ~ Suffering | Courage_Dummy,
  at = list(Courage_Dummy = c(-0.5, 0.5))
)

emm_JS_df <- as.data.frame(emm_JS)


emm_JS_df$Suffering <- factor(
  emm_JS_df$Suffering,
  levels = c("No_Suff", "Phys_suff", "Psych_Suff"),
  labels = c("No suffering", "Physical", "Psychological")
)

emm_JS_df$Courage_Label <- ifelse(
  emm_JS_df$Courage_Dummy == -0.5,
  "Non-courageous",
  "Courageous"
)

ggplot(
  emm_JS_df,
  aes(
    x = Suffering,
    y = emmean  )
) +
  geom_col(
    position = position_dodge(width = 0.80),
    width = 0.70,
    color = "black"
  ) +
  geom_errorbar(
    aes(
      ymin = lower.CL,
      ymax = upper.CL
    ),
    position = position_dodge(width = 0.80),
    width = 0.20
  ) +
  facet_wrap(~ Courage_Label) +
  labs(
    x = "Suffering condition",
    y = "Estimated marginal mean") +
  theme_classic(base_size = 14)

Hm. It appears that courage might reduce the effect of psych suffering on AoV. A posteriori, not a completely crazy idea.

emcatcat <- emmeans(mod1, ~ Courage_Dummy*Suffering)
contrast(emcatcat, "revpairwise",by="Courage_Dummy")
## Courage_Dummy = -0.5:
##  contrast               estimate    SE   df t.ratio p.value
##  Phys_suff - No_Suff      0.6638 0.117 1192   5.668  <.0001
##  Psych_Suff - No_Suff     0.6955 0.117 1192   5.961  <.0001
##  Psych_Suff - Phys_suff   0.0317 0.117 1192   0.271  0.9604
## 
## Courage_Dummy =  0.5:
##  contrast               estimate    SE   df t.ratio p.value
##  Phys_suff - No_Suff      0.4781 0.117 1192   4.072  0.0001
##  Psych_Suff - No_Suff     0.3225 0.117 1192   2.750  0.0166
##  Psych_Suff - Phys_suff  -0.1557 0.117 1192  -1.327  0.3802
## 
## Results are averaged over the levels of: Job 
## P value adjustment: tukey method for comparing a family of 3 estimates

Hm. Yes. Not massively - the effect remains significant in both conditions. The two effects should differ statistically.

courage_effects <-contrast(emcatcat, "revpairwise",by="Courage_Dummy")


pairs(
  courage_effects,
  by = NULL
)
##  contrast                                                                              
##  (Phys_suff - No_Suff Courage_Dummy-0.5) - (Psych_Suff - No_Suff Courage_Dummy-0.5)    
##  (Phys_suff - No_Suff Courage_Dummy-0.5) - (Psych_Suff - Phys_suff Courage_Dummy-0.5)  
##  (Phys_suff - No_Suff Courage_Dummy-0.5) - (Phys_suff - No_Suff Courage_Dummy0.5)      
##  (Phys_suff - No_Suff Courage_Dummy-0.5) - (Psych_Suff - No_Suff Courage_Dummy0.5)     
##  (Phys_suff - No_Suff Courage_Dummy-0.5) - (Psych_Suff - Phys_suff Courage_Dummy0.5)   
##  (Psych_Suff - No_Suff Courage_Dummy-0.5) - (Psych_Suff - Phys_suff Courage_Dummy-0.5) 
##  (Psych_Suff - No_Suff Courage_Dummy-0.5) - (Phys_suff - No_Suff Courage_Dummy0.5)     
##  (Psych_Suff - No_Suff Courage_Dummy-0.5) - (Psych_Suff - No_Suff Courage_Dummy0.5)    
##  (Psych_Suff - No_Suff Courage_Dummy-0.5) - (Psych_Suff - Phys_suff Courage_Dummy0.5)  
##  (Psych_Suff - Phys_suff Courage_Dummy-0.5) - (Phys_suff - No_Suff Courage_Dummy0.5)   
##  (Psych_Suff - Phys_suff Courage_Dummy-0.5) - (Psych_Suff - No_Suff Courage_Dummy0.5)  
##  (Psych_Suff - Phys_suff Courage_Dummy-0.5) - (Psych_Suff - Phys_suff Courage_Dummy0.5)
##  (Phys_suff - No_Suff Courage_Dummy0.5) - (Psych_Suff - No_Suff Courage_Dummy0.5)      
##  (Phys_suff - No_Suff Courage_Dummy0.5) - (Psych_Suff - Phys_suff Courage_Dummy0.5)    
##  (Psych_Suff - No_Suff Courage_Dummy0.5) - (Psych_Suff - Phys_suff Courage_Dummy0.5)   
##  estimate    SE   df t.ratio p.value
##   -0.0317 0.117 1192  -0.271  0.9998
##    0.6322 0.203 1192   3.115  0.0231
##    0.1857 0.166 1192   1.120  0.8732
##    0.3414 0.166 1192   2.060  0.3093
##    0.8195 0.166 1192   4.945  <.0001
##    0.6638 0.117 1192   5.668  <.0001
##    0.2174 0.166 1192   1.313  0.7778
##    0.3730 0.165 1192   2.255  0.2137
##    0.8511 0.165 1192   5.145  <.0001
##   -0.4465 0.166 1192  -2.694  0.0772
##   -0.2908 0.166 1192  -1.756  0.4950
##    0.1873 0.166 1192   1.131  0.8686
##    0.1557 0.117 1192   1.327  0.7698
##    0.6338 0.203 1192   3.118  0.0229
##    0.4781 0.117 1192   4.072  0.0007
## 
## Results are averaged over the levels of: Job 
## P value adjustment: tukey method for comparing a family of 6 estimates

(Psych_Suff - No_Suff Courage_Dummy-0.5) - (Psych_Suff - No_Suff Courage_Dummy0.5) is the line we’re looking for. But there does not seem to be anything of interest happening here. Oh well, I suppose the interaction was very small in the first place.

(Note that p is tukey adjusted)

Conclusion on main model for Assumptions of Vulnerability: As predicted, suffering (psychological or physical) increased assumptions of vulnerability of the workers.

Model 2: job as a moderator?

We can move to our second model, accounting for occupation type:

### Model 2: Target outcome ~ Suffering * Courage + Occupation:Suffering + Occupation:Courage + Occupation
summary(mod2 <-lm(AoV_mean ~ Suffering*Courage_Dummy + Suffering:Job + Courage_Dummy:Job + Job, data = LongDF_num)) 
## 
## Call:
## lm(formula = AoV_mean ~ Suffering * Courage_Dummy + Suffering:Job + 
##     Courage_Dummy:Job + Job, data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.3955 -0.7288  0.0539  0.7942  3.5195 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        5.02451    0.10031  50.091  < 2e-16 ***
## SufferingPhys_suff                 0.45673    0.14266   3.202   0.0014 ** 
## SufferingPsych_Suff                0.28141    0.14160   1.987   0.0471 *  
## Courage_Dummy                      0.19341    0.15020   1.288   0.1981    
## JobSoldier                        -0.56512    0.14266  -3.961 7.89e-05 ***
## JobWelder                         -1.42821    0.14320  -9.973  < 2e-16 ***
## SufferingPhys_suff:Courage_Dummy  -0.18477    0.16564  -1.115   0.2649    
## SufferingPsych_Suff:Courage_Dummy -0.37258    0.16523  -2.255   0.0243 *  
## SufferingPhys_suff:JobSoldier     -0.04773    0.20231  -0.236   0.8135    
## SufferingPsych_Suff:JobSoldier     0.21977    0.20156   1.090   0.2758    
## SufferingPhys_suff:JobWelder       0.39647    0.20289   1.954   0.0509 .  
## SufferingPsych_Suff:JobWelder      0.47223    0.20214   2.336   0.0197 *  
## Courage_Dummy:JobSoldier           0.00305    0.16493   0.018   0.9853    
## Courage_Dummy:JobWelder            0.03822    0.16535   0.231   0.8172    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.17 on 1186 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.1803, Adjusted R-squared:  0.1713 
## F-statistic: 20.06 on 13 and 1186 DF,  p-value: < 2.2e-16

Again, the effects of suffering There appears to be an interaction with occupations where nurses vs welders differ in their sensitivity to the psychological suffering manipulation… my hunch is that we’re repeating what we observed, the manipulations produce stronger effect sizes for underwater welders. Let’s dig:

emm_JS <- emmeans(
  mod2,
  ~ Job * Suffering | Courage_Dummy,
  at = list(Courage_Dummy = c(-0.5, 0.5))
)

emm_JS_df <- as.data.frame(emm_JS)

emm_JS_df$Job <- factor(
  emm_JS_df$Job,
  levels = c("Nurses", "Soldier", "Welder")
)

emm_JS_df$Suffering <- factor(
  emm_JS_df$Suffering,
  levels = c("No_Suff", "Phys_suff", "Psych_Suff"),
  labels = c("No suffering", "Physical", "Psychological")
)

emm_JS_df$Courage_Label <- ifelse(
  emm_JS_df$Courage_Dummy == -0.5,
  "Non-courageous",
  "Courageous"
)

ggplot(
  emm_JS_df,
  aes(
    x = Suffering,
    y = emmean,
    fill = Job
  )
) +
  geom_col(
    position = position_dodge(width = 0.80),
    width = 0.70,
    color = "black"
  ) +
  geom_errorbar(
    aes(
      ymin = lower.CL,
      ymax = upper.CL
    ),
    position = position_dodge(width = 0.80),
    width = 0.20
  ) +
  facet_wrap(~ Courage_Label) +
  labs(
    x = "Suffering condition",
    y = "Estimated marginal mean",
    fill = "Job"
  ) +
  theme_classic(base_size = 14)

It is so… non obvious that i don’t even want to excavate this. But for science…

emcatcat <- emmeans(mod2, ~ Suffering*Job)
contrast(emcatcat, "revpairwise",by="Job")
## Job = Nurses:
##  contrast               estimate    SE   df t.ratio p.value
##  Phys_suff - No_Suff      0.4567 0.143 1186   3.202  0.0040
##  Psych_Suff - No_Suff     0.2814 0.142 1186   1.987  0.1157
##  Psych_Suff - Phys_suff  -0.1753 0.142 1186  -1.231  0.4349
## 
## Job = Soldier:
##  contrast               estimate    SE   df t.ratio p.value
##  Phys_suff - No_Suff      0.4090 0.143 1186   2.851  0.0123
##  Psych_Suff - No_Suff     0.5012 0.143 1186   3.494  0.0014
##  Psych_Suff - Phys_suff   0.0922 0.143 1186   0.643  0.7966
## 
## Job = Welder:
##  contrast               estimate    SE   df t.ratio p.value
##  Phys_suff - No_Suff      0.8532 0.144 1186   5.914  <.0001
##  Psych_Suff - No_Suff     0.7536 0.144 1186   5.224  <.0001
##  Psych_Suff - Phys_suff  -0.0996 0.144 1186  -0.691  0.7686
## 
## Results are averaged over the levels of: Courage_Dummy 
## P value adjustment: tukey method for comparing a family of 3 estimates
courage_effects <-contrast(emcatcat, "revpairwise",by="Job")

All right, the effect is null for nurses, but sig for welders. Hm. It seems people don’t infer greater assumptions of vulnerability of nurses when they’re described as psychologically suffering…

pairs(
  courage_effects,
  by = NULL
)
##  contrast                                                           estimate
##  (Phys_suff - No_Suff Nurses) - (Psych_Suff - No_Suff Nurses)         0.1753
##  (Phys_suff - No_Suff Nurses) - (Psych_Suff - Phys_suff Nurses)       0.6320
##  (Phys_suff - No_Suff Nurses) - (Phys_suff - No_Suff Soldier)         0.0477
##  (Phys_suff - No_Suff Nurses) - (Psych_Suff - No_Suff Soldier)       -0.0445
##  (Phys_suff - No_Suff Nurses) - (Psych_Suff - Phys_suff Soldier)      0.3645
##  (Phys_suff - No_Suff Nurses) - (Phys_suff - No_Suff Welder)         -0.3965
##  (Phys_suff - No_Suff Nurses) - (Psych_Suff - No_Suff Welder)        -0.2969
##  (Phys_suff - No_Suff Nurses) - (Psych_Suff - Phys_suff Welder)       0.5563
##  (Psych_Suff - No_Suff Nurses) - (Psych_Suff - Phys_suff Nurses)      0.4567
##  (Psych_Suff - No_Suff Nurses) - (Phys_suff - No_Suff Soldier)       -0.1276
##  (Psych_Suff - No_Suff Nurses) - (Psych_Suff - No_Suff Soldier)      -0.2198
##  (Psych_Suff - No_Suff Nurses) - (Psych_Suff - Phys_suff Soldier)     0.1892
##  (Psych_Suff - No_Suff Nurses) - (Phys_suff - No_Suff Welder)        -0.5718
##  (Psych_Suff - No_Suff Nurses) - (Psych_Suff - No_Suff Welder)       -0.4722
##  (Psych_Suff - No_Suff Nurses) - (Psych_Suff - Phys_suff Welder)      0.3810
##  (Psych_Suff - Phys_suff Nurses) - (Phys_suff - No_Suff Soldier)     -0.5843
##  (Psych_Suff - Phys_suff Nurses) - (Psych_Suff - No_Suff Soldier)    -0.6765
##  (Psych_Suff - Phys_suff Nurses) - (Psych_Suff - Phys_suff Soldier)  -0.2675
##  (Psych_Suff - Phys_suff Nurses) - (Phys_suff - No_Suff Welder)      -1.0285
##  (Psych_Suff - Phys_suff Nurses) - (Psych_Suff - No_Suff Welder)     -0.9290
##  (Psych_Suff - Phys_suff Nurses) - (Psych_Suff - Phys_suff Welder)   -0.0758
##  (Phys_suff - No_Suff Soldier) - (Psych_Suff - No_Suff Soldier)      -0.0922
##  (Phys_suff - No_Suff Soldier) - (Psych_Suff - Phys_suff Soldier)     0.3168
##  (Phys_suff - No_Suff Soldier) - (Phys_suff - No_Suff Welder)        -0.4442
##  (Phys_suff - No_Suff Soldier) - (Psych_Suff - No_Suff Welder)       -0.3446
##  (Phys_suff - No_Suff Soldier) - (Psych_Suff - Phys_suff Welder)      0.5085
##  (Psych_Suff - No_Suff Soldier) - (Psych_Suff - Phys_suff Soldier)    0.4090
##  (Psych_Suff - No_Suff Soldier) - (Phys_suff - No_Suff Welder)       -0.3520
##  (Psych_Suff - No_Suff Soldier) - (Psych_Suff - No_Suff Welder)      -0.2525
##  (Psych_Suff - No_Suff Soldier) - (Psych_Suff - Phys_suff Welder)     0.6007
##  (Psych_Suff - Phys_suff Soldier) - (Phys_suff - No_Suff Welder)     -0.7610
##  (Psych_Suff - Phys_suff Soldier) - (Psych_Suff - No_Suff Welder)    -0.6615
##  (Psych_Suff - Phys_suff Soldier) - (Psych_Suff - Phys_suff Welder)   0.1917
##  (Phys_suff - No_Suff Welder) - (Psych_Suff - No_Suff Welder)         0.0996
##  (Phys_suff - No_Suff Welder) - (Psych_Suff - Phys_suff Welder)       0.9527
##  (Psych_Suff - No_Suff Welder) - (Psych_Suff - Phys_suff Welder)      0.8532
##     SE   df t.ratio p.value
##  0.142 1186   1.231  0.9496
##  0.247 1186   2.555  0.2072
##  0.202 1186   0.236  1.0000
##  0.202 1186  -0.220  1.0000
##  0.202 1186   1.802  0.6810
##  0.203 1186  -1.954  0.5759
##  0.203 1186  -1.463  0.8722
##  0.203 1186   2.744  0.1336
##  0.143 1186   3.202  0.0376
##  0.202 1186  -0.633  0.9994
##  0.202 1186  -1.090  0.9756
##  0.202 1186   0.939  0.9907
##  0.202 1186  -2.829  0.1081
##  0.202 1186  -2.336  0.3212
##  0.202 1186   1.886  0.6234
##  0.202 1186  -2.891  0.0919
##  0.202 1186  -3.347  0.0237
##  0.202 1186  -1.323  0.9244
##  0.203 1186  -5.074  <.0001
##  0.203 1186  -4.583  0.0002
##  0.203 1186  -0.374  1.0000
##  0.143 1186  -0.643  0.9994
##  0.248 1186   1.275  0.9385
##  0.203 1186  -2.183  0.4172
##  0.203 1186  -1.694  0.7503
##  0.203 1186   2.502  0.2319
##  0.143 1186   2.851  0.1020
##  0.203 1186  -1.730  0.7277
##  0.203 1186  -1.241  0.9473
##  0.203 1186   2.956  0.0771
##  0.203 1186  -3.741  0.0060
##  0.203 1186  -3.251  0.0323
##  0.203 1186   0.943  0.9904
##  0.144 1186   0.691  0.9989
##  0.250 1186   3.818  0.0045
##  0.144 1186   5.914  <.0001
## 
## Results are averaged over the levels of: Courage_Dummy 
## P value adjustment: tukey method for comparing a family of 9 estimates

Nothing strikes me as unusual here. Again, the line we’re interested in is (Psych_Suff - No_Suff Nurses) - (Psych_Suff - No_Suff Welder), p = .32

(Note that p is tukey adjusted)

Model 3: Attitude as a covariate

Then model 3, adds attitude to model 1:

summary(mod3 <-lm(AoV_mean ~ Suffering*Courage_Dummy + Job + Attitude_N, data = LongDF_num)) # Provides intercept (No suffering) vs each other level.
## 
## Call:
## lm(formula = AoV_mean ~ Suffering * Courage_Dummy + Job + Attitude_N, 
##     data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.5141 -0.6901  0.0114  0.8044  3.3043 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        4.75829    0.22613  21.042  < 2e-16 ***
## SufferingPhys_suff                 0.56879    0.08299   6.854 1.15e-11 ***
## SufferingPsych_Suff                0.50709    0.08277   6.126 1.22e-09 ***
## Courage_Dummy                      0.20148    0.11745   1.715   0.0865 .  
## JobSoldier                        -0.48816    0.08694  -5.615 2.44e-08 ***
## JobWelder                         -1.12627    0.08442 -13.341  < 2e-16 ***
## Attitude_N                         0.02348    0.03294   0.713   0.4761    
## SufferingPhys_suff:Courage_Dummy  -0.18047    0.16603  -1.087   0.2773    
## SufferingPsych_Suff:Courage_Dummy -0.37023    0.16550  -2.237   0.0255 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.171 on 1191 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.1746, Adjusted R-squared:  0.169 
## F-statistic: 31.48 on 8 and 1191 DF,  p-value: < 2.2e-16

There is a no correlation between attitude and Endurance of pain

Model 4: job as moderator + attitude as covariate

Model 4, adds attitude to model 2:

summary(mod4 <-lm(AoV_mean ~ Suffering*Courage_Dummy + Suffering:Job + Courage_Dummy:Job + Job+ Attitude_N, data = LongDF_num)) # Provides intercept (No suffering) vs each other level.
## 
## Call:
## lm(formula = AoV_mean ~ Suffering * Courage_Dummy + Suffering:Job + 
##     Courage_Dummy:Job + Job + Attitude_N, data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.4059 -0.7392  0.0581  0.7883  3.4893 
## 
## Coefficients:
##                                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        4.857334   0.236417  20.546  < 2e-16 ***
## SufferingPhys_suff                 0.455297   0.142690   3.191 0.001456 ** 
## SufferingPsych_Suff                0.279245   0.141648   1.971 0.048911 *  
## Courage_Dummy                      0.191850   0.150238   1.277 0.201863    
## JobSoldier                        -0.541791   0.145773  -3.717 0.000211 ***
## JobWelder                         -1.416523   0.144007  -9.836  < 2e-16 ***
## Attitude_N                         0.025778   0.033009   0.781 0.435004    
## SufferingPhys_suff:Courage_Dummy  -0.178940   0.165839  -1.079 0.280810    
## SufferingPsych_Suff:Courage_Dummy -0.369511   0.165306  -2.235 0.025582 *  
## SufferingPhys_suff:JobSoldier     -0.051887   0.202411  -0.256 0.797729    
## SufferingPsych_Suff:JobSoldier     0.217717   0.201614   1.080 0.280421    
## SufferingPhys_suff:JobWelder       0.397745   0.202926   1.960 0.050224 .  
## SufferingPsych_Suff:JobWelder      0.474579   0.202200   2.347 0.019086 *  
## Courage_Dummy:JobSoldier          -0.003398   0.165163  -0.021 0.983587    
## Courage_Dummy:JobWelder            0.029231   0.165779   0.176 0.860071    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.17 on 1185 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.1807, Adjusted R-squared:  0.171 
## F-statistic: 18.67 on 14 and 1185 DF,  p-value: < 2.2e-16

Model comparisons

We will assess if the effects of our manipulations observed in the model hold true when accounting for attitude as a covariate (i.e., Suffering and Courage main effects in model 3 and 4).

To account for the possible effect of attitude (i.e., Halo effect), we will compare a model accounting for attitude as a covariate to a model not accounting for attitude as a covariate in an ANOVA (i.e., we will compare Model 1 to Model 3; and Model 2 to Model 4) and evaluate which model provides the best fit with the data.

anova(mod1, mod3)
anova(mod2, mod4)

Attitude is a NOT significant contributor to the model of AoV.

Diagnostics
Toggle details regarding diagnostic and robustness checks

Let’s assess homoscedasticity and normality of residuals for the main model:

plot(mod1)

the importan plots to look at are:

  • QQ plot: must be a straight line.
  • fitted vs residuals: must be horizontal with noise dispersed randomly across the plot.

Let’s run a robust model to assess if it changes any decision:

summary(rlm(AoV_mean ~ Job + Suffering*Courage_Dummy, data = LongDF_num)) # 
## 
## Call: rlm(formula = AoV_mean ~ Job + Suffering * Courage_Dummy, data = LongDF_num)
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -4.577057 -0.733080  0.002862  0.772786  3.353401 
## 
## Coefficients:
##                                   Value    Std. Error t value 
## (Intercept)                         4.9482   0.0761    65.0599
## JobSoldier                         -0.5383   0.0835    -6.4459
## JobWelder                          -1.2068   0.0837   -14.4137
## SufferingPhys_suff                  0.6228   0.0839     7.4249
## SufferingPsych_Suff                 0.5564   0.0837     6.6501
## Courage_Dummy                       0.1897   0.1185     1.6008
## SufferingPhys_suff:Courage_Dummy   -0.1186   0.1678    -0.7067
## SufferingPsych_Suff:Courage_Dummy  -0.3345   0.1673    -1.9990
## 
## Residual standard error: 1.105 on 1192 degrees of freedom
##   (1 observation deleted due to missingness)

Comparing the betas (Value in rlm) and t-values does not result in decision change.


CONCLUSIONS

Let us sum up our hypotheses:

library(knitr)
library(kableExtra)

hypothesis_table <- data.frame(
  Hypothesis = c(
    "H1a", "H1b",
    "H2a", "H2b",
    "H3a", "H3b",
    "H4a", "H4b",
    "H5a", "H5b",
    "H6",
    "H7a", "H7b",
    "H8a", "H8b",
    "H9a", "H9b"
  ),
  
  Prediction = c(
    "Physical suffering, compared with no suffering, will increase victim perceptions.",
    "Physical suffering, compared with no suffering, will increase hero perceptions.",
    
    "Psychological suffering, compared with no suffering, will increase victim perceptions.",
    "Psychological suffering, compared with no suffering, will increase hero perceptions.",
    
    "Courageous individuals, compared with non-courageous individuals, will be perceived as less victimized.",
    "Courageous individuals, compared with non-courageous individuals, will be perceived as more heroic.",
    
    "The positive effect of courage on heroism will be stronger under physical suffering than under no suffering.",
    "The negative effect of courage on victim perception will be stronger under physical suffering than under no suffering.",
    
    "The positive effect of courage on heroism will be stronger under psychological suffering than under no suffering.",
    "The negative effect of courage on victim perception will be stronger under psychological suffering than under no suffering.",
    
    "Courageous workers, compared with non-courageous workers, will be perceived as more likely to endure suffering.",
    
    "The effect of courage on perceived endurance of suffering will be stronger under physical suffering than under no suffering.",
    "The effect of courage on perceived endurance of suffering will be stronger under psychological suffering than under no suffering.",
    
    "Physical suffering, compared with no suffering, will increase perceived victimization.",
    "Psychological suffering, compared with no suffering, will increase perceived victimization.",
    
    "Physical suffering, compared with no suffering, will increase perceived vulnerability.",
    "Psychological suffering, compared with no suffering, will increase perceived vulnerability."
  ),
  
  Outcome = c(
    "Supported", "Not supported",
    "Supported", "Not supported",
    "Not supported", "Not supported",
    "Not supported", "Not supported",
    "Not supported", "Not supported",
    "Supported",
    "Not supported", "Not supported",
    "Supported", "Supported",
    "Supported", "Supported"
  ),
  
  stringsAsFactors = FALSE
)

hypothesis_table$Outcome_Formatted <- ifelse(
  hypothesis_table$Outcome == "Supported",
  cell_spec("Supported", color = "white", background = "#2E7D32", bold = TRUE),
  cell_spec("Not supported", color = "white", background = "#B71C1C", bold = TRUE)
)

hypothesis_table_final <- hypothesis_table[, c(
  "Hypothesis",
  "Prediction",
  "Outcome_Formatted"
)]

names(hypothesis_table_final) <- c(
  "Hypothesis",
  "Prediction",
  "Outcome"
)

table_object <- kable(
  hypothesis_table_final,
  format = "html",
  escape = FALSE,
  align = c("l", "l", "c"),
  caption = "Summary of hypothesis tests"
)

table_object <- kable_styling(
  table_object,
  full_width = FALSE,
  bootstrap_options = c("striped", "hover", "condensed", "responsive"),
  position = "center",
  font_size = 14
)

table_object <- column_spec(
  table_object,
  column = 1,
  bold = TRUE,
  width = "8em"
)

table_object <- column_spec(
  table_object,
  column = 2,
  width = "36em"
)

table_object <- column_spec(
  table_object,
  column = 3,
  width = "10em"
)

table_object
Summary of hypothesis tests
Hypothesis Prediction Outcome
H1a Physical suffering, compared with no suffering, will increase victim perceptions. Supported
H1b Physical suffering, compared with no suffering, will increase hero perceptions. Not supported
H2a Psychological suffering, compared with no suffering, will increase victim perceptions. Supported
H2b Psychological suffering, compared with no suffering, will increase hero perceptions. Not supported
H3a Courageous individuals, compared with non-courageous individuals, will be perceived as less victimized. Not supported
H3b Courageous individuals, compared with non-courageous individuals, will be perceived as more heroic. Not supported
H4a The positive effect of courage on heroism will be stronger under physical suffering than under no suffering. Not supported
H4b The negative effect of courage on victim perception will be stronger under physical suffering than under no suffering. Not supported
H5a The positive effect of courage on heroism will be stronger under psychological suffering than under no suffering. Not supported
H5b The negative effect of courage on victim perception will be stronger under psychological suffering than under no suffering. Not supported
H6 Courageous workers, compared with non-courageous workers, will be perceived as more likely to endure suffering. Supported
H7a The effect of courage on perceived endurance of suffering will be stronger under physical suffering than under no suffering. Not supported
H7b The effect of courage on perceived endurance of suffering will be stronger under psychological suffering than under no suffering. Not supported
H8a Physical suffering, compared with no suffering, will increase perceived victimization. Supported
H8b Psychological suffering, compared with no suffering, will increase perceived victimization. Supported
H9a Physical suffering, compared with no suffering, will increase perceived vulnerability. Supported
H9b Psychological suffering, compared with no suffering, will increase perceived vulnerability. Supported

In a nutshell, the courage condition appears to have ’’’‘worked’’’’, in the sense that it successfully influenced the perception of willingness to endure suffering - characterised in their measures by a prioritisation of the mission over the worker’s own health. So…

However, this form of prioritisation (that we call courage - but participants might disagree with us here, see failed manipulation checks) does not influence perceived heroism, perceived victim status, and does not characterise the effects of suffering on victim-status.

This study is thus a bag of mixed findings, but overall, we did not validate our main hypotheses. As a reminder, our main problematic here is: Both heroes and victims are characterised by suffering – but we can distinguish them by their perceived courage. We can’t say nothing with regards to that problematic as, in our study, suffering only characterised victims, and courage did not influence heroism nor victim status. As we say in France: chou blanc.


Exploratory analyses

Correlational hypotheses

Our manipulations did not work. Nonetheless, we have measures of perceived bravery, perceived courage, perceived psychological suffering, and perceived physical suffering, that can be used to test our hypotheses correlationally.

Let’s scale all the numeric variables.

LongDF_num$Heroism_num <- scale(LongDF_num$HeroVictim_N_1)
LongDF_num$Victim_num <- scale(LongDF_num$HeroVictim_N_2)
LongDF_num$Help_num <- scale(LongDF_num$ManipCheck_N_help)
LongDF_num$Brave_num <- scale(LongDF_num$ManipCheck_N_brave)
LongDF_num$Courage_num <- scale(LongDF_num$ManipCheck_N_courageous)
LongDF_num$Risk_num <- scale(LongDF_num$ManipCheck_N_risk)
LongDF_num$Phys_suff_num <- scale(LongDF_num$ManipCheck_N_physsuff)
LongDF_num$Psych_suff_num <- scale(LongDF_num$ManipCheck_N_psychsuff)

Then let’s assess our hypotheses using continuous perceived attributes as predictors rather than manipulated descriptions.

summary(lm(Heroism_num ~ Psych_suff_num*Courage_num + Job, data = LongDF_num))
## 
## Call:
## lm(formula = Heroism_num ~ Psych_suff_num * Courage_num + Job, 
##     data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.6217 -0.3015  0.0017  0.4709  2.5577 
## 
## Coefficients:
##                            Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                 0.37668    0.03735  10.085   <2e-16 ***
## Psych_suff_num             -0.01392    0.02315  -0.601    0.548    
## Courage_num                 0.64377    0.02294  28.065   <2e-16 ***
## JobSoldier                 -0.46914    0.05170  -9.074   <2e-16 ***
## JobWelder                  -0.71199    0.05202 -13.688   <2e-16 ***
## Psych_suff_num:Courage_num  0.03950    0.01960   2.016    0.044 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.7255 on 1195 degrees of freedom
## Multiple R-squared:  0.4758, Adjusted R-squared:  0.4736 
## F-statistic:   217 on 5 and 1195 DF,  p-value: < 2.2e-16
summary(lm(Heroism_num ~ Phys_suff_num*Courage_num  + Job, data = LongDF_num))
## 
## Call:
## lm(formula = Heroism_num ~ Phys_suff_num * Courage_num + Job, 
##     data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.6211 -0.2920  0.0014  0.4786  2.5348 
## 
## Coefficients:
##                           Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                0.38082    0.03724  10.226   <2e-16 ***
## Phys_suff_num             -0.01164    0.02284  -0.509    0.611    
## Courage_num                0.64386    0.02372  27.145   <2e-16 ***
## JobSoldier                -0.47718    0.05134  -9.294   <2e-16 ***
## JobWelder                 -0.70822    0.05161 -13.723   <2e-16 ***
## Phys_suff_num:Courage_num  0.02908    0.01886   1.542    0.123    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.7261 on 1195 degrees of freedom
## Multiple R-squared:  0.475,  Adjusted R-squared:  0.4728 
## F-statistic: 216.3 on 5 and 1195 DF,  p-value: < 2.2e-16

OK, this is behaving as could be predicted. Heroism is qualified by courage. Moreover, this is all very exploratory but, not accounting for courage:

summary(lm(Heroism_num ~ Psych_suff_num+ Job, data = LongDF_num))
## 
## Call:
## lm(formula = Heroism_num ~ Psych_suff_num + Job, data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.6027 -0.5478  0.2596  0.7154  2.0362 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     0.35763    0.04651   7.689 3.08e-14 ***
## Psych_suff_num  0.21744    0.02790   7.793 1.41e-14 ***
## JobSoldier     -0.46492    0.06653  -6.988 4.61e-12 ***
## JobWelder      -0.61619    0.06679  -9.226  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9371 on 1197 degrees of freedom
## Multiple R-squared:  0.1239, Adjusted R-squared:  0.1218 
## F-statistic: 56.45 on 3 and 1197 DF,  p-value: < 2.2e-16
summary(lm(Heroism_num ~ Phys_suff_num  + Job, data = LongDF_num))
## 
## Call:
## lm(formula = Heroism_num ~ Phys_suff_num + Job, data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.5784 -0.4734  0.2482  0.7397  2.0962 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    0.38821    0.04637   8.372  < 2e-16 ***
## Phys_suff_num  0.23351    0.02703   8.639  < 2e-16 ***
## JobSoldier    -0.43346    0.06579  -6.589 6.64e-11 ***
## JobWelder     -0.74063    0.06613 -11.199  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.932 on 1197 degrees of freedom
## Multiple R-squared:  0.1335, Adjusted R-squared:  0.1314 
## F-statistic: 61.49 on 3 and 1197 DF,  p-value: < 2.2e-16

Then suffering IS a predictor of perceived heroism. BUT, this effect disappear once courage is taken into account. So it suggests that the correlation between suffering and heroism is explained by courage. When courage enters the explanation of heroism, the effect of suffering is reduced to non-significance.

summary(lm(Phys_suff_num ~ Courage_num , data = LongDF_num))
## 
## Call:
## lm(formula = Phys_suff_num ~ Courage_num, data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.5836 -0.3416  0.1749  0.6914  2.5049 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 8.487e-17  2.662e-02    0.00        1    
## Courage_num 3.866e-01  2.663e-02   14.51   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9226 on 1199 degrees of freedom
## Multiple R-squared:  0.1494, Adjusted R-squared:  0.1487 
## F-statistic: 210.7 on 1 and 1199 DF,  p-value: < 2.2e-16
summary(lm(Psych_suff_num ~ Courage_num , data = LongDF_num))
## 
## Call:
## lm(formula = Psych_suff_num ~ Courage_num, data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.0781 -0.5067  0.1559  0.7820  2.7699 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 1.080e-15  2.701e-02    0.00        1    
## Courage_num 3.531e-01  2.702e-02   13.07   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.936 on 1199 degrees of freedom
## Multiple R-squared:  0.1247, Adjusted R-squared:  0.124 
## F-statistic: 170.8 on 1 and 1199 DF,  p-value: < 2.2e-16

Yes. Courage and suffering are positively correlated. What explains the correlation between suffering and heroism is the shared variance between courage and suffering. This is very consistent with our problematic, albeit very exploratory too.

In addition, we have a small interaction between psychological suffering and courage (p = .044). We did predict, on the experimental level, that heroism would be increased by the combination of suffering and courage. The interaction is small, and because it is exploratory, i do not really trust that p-value. But we can still take a look:

summary(interactMod<- lm(Heroism_num ~ Psych_suff_num*Courage_num + Job, data = LongDF_num))
## 
## Call:
## lm(formula = Heroism_num ~ Psych_suff_num * Courage_num + Job, 
##     data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.6217 -0.3015  0.0017  0.4709  2.5577 
## 
## Coefficients:
##                            Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                 0.37668    0.03735  10.085   <2e-16 ***
## Psych_suff_num             -0.01392    0.02315  -0.601    0.548    
## Courage_num                 0.64377    0.02294  28.065   <2e-16 ***
## JobSoldier                 -0.46914    0.05170  -9.074   <2e-16 ***
## JobWelder                  -0.71199    0.05202 -13.688   <2e-16 ***
## Psych_suff_num:Courage_num  0.03950    0.01960   2.016    0.044 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.7255 on 1195 degrees of freedom
## Multiple R-squared:  0.4758, Adjusted R-squared:  0.4736 
## F-statistic:   217 on 5 and 1195 DF,  p-value: < 2.2e-16
interact_plot(interactMod, pred = Courage_num, modx = Psych_suff_num)

The effect of courage on heroism is stronger for high psychological suffering, but it’s very ugly… Considering our large N – I would take this with a handful of salt.


Anyway, let’s crack on with victims. Following our problematic, we should expect the opposite pattern with victims: Yes, suffering predicts victim-status, but, in contrast to heroism, adding courage to the model will not change perceived victim status.

summary(lm(Victim_num ~ Psych_suff_num+ Job, data = LongDF_num))
## 
## Call:
## lm(formula = Victim_num ~ Psych_suff_num + Job, data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.1103 -0.7124  0.0162  0.6601  3.5406 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     0.26107    0.04630   5.639 2.14e-08 ***
## Psych_suff_num  0.31026    0.02778  11.170  < 2e-16 ***
## JobSoldier     -0.39615    0.06623  -5.982 2.91e-09 ***
## JobWelder      -0.39263    0.06649  -5.906 4.57e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9329 on 1197 degrees of freedom
## Multiple R-squared:  0.1319, Adjusted R-squared:  0.1297 
## F-statistic: 60.61 on 3 and 1197 DF,  p-value: < 2.2e-16
summary(lm(Victim_num ~ Phys_suff_num  + Job, data = LongDF_num))
## 
## Call:
## lm(formula = Victim_num ~ Phys_suff_num + Job, data = LongDF_num)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.06890 -0.66741 -0.02836  0.65589  2.92096 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    0.29538    0.04710   6.272 4.98e-10 ***
## Phys_suff_num  0.25538    0.02746   9.301  < 2e-16 ***
## JobSoldier    -0.34135    0.06683  -5.108 3.79e-07 ***
## JobWelder     -0.55190    0.06717  -8.216 5.41e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9467 on 1197 degrees of freedom
## Multiple R-squared:  0.106,  Adjusted R-squared:  0.1038 
## F-statistic: 47.31 on 3 and 1197 DF,  p-value: < 2.2e-16

==> Yes, suffering predicts victim status

summary(lm(Victim_num ~ Psych_suff_num* Courage_num + + Job, data = LongDF_num))
## 
## Call:
## lm(formula = Victim_num ~ Psych_suff_num * Courage_num + +Job, 
##     data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.1438 -0.7178  0.0178  0.6563  3.4488 
## 
## Coefficients:
##                              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                 0.2726709  0.0480505   5.675 1.74e-08 ***
## Psych_suff_num              0.3074015  0.0297774  10.323  < 2e-16 ***
## Courage_num                -0.0006679  0.0295096  -0.023    0.982    
## JobSoldier                 -0.4014074  0.0665123  -6.035 2.12e-09 ***
## JobWelder                  -0.3983850  0.0669193  -5.953 3.45e-09 ***
## Psych_suff_num:Courage_num -0.0225504  0.0252098  -0.895    0.371    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9334 on 1195 degrees of freedom
## Multiple R-squared:  0.1325, Adjusted R-squared:  0.1288 
## F-statistic:  36.5 on 5 and 1195 DF,  p-value: < 2.2e-16
summary(lm(Victim_num ~ Phys_suff_num* Courage_num  + Job, data = LongDF_num))
## 
## Call:
## lm(formula = Victim_num ~ Phys_suff_num * Courage_num + Job, 
##     data = LongDF_num)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.18589 -0.70127 -0.02778  0.64181  2.78009 
## 
## Coefficients:
##                            Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                0.319045   0.048513   6.577 7.18e-11 ***
## Phys_suff_num              0.248132   0.029752   8.340  < 2e-16 ***
## Courage_num               -0.001752   0.030898  -0.057   0.9548    
## JobSoldier                -0.348921   0.066879  -5.217 2.14e-07 ***
## JobWelder                 -0.558726   0.067230  -8.311 2.56e-16 ***
## Phys_suff_num:Courage_num -0.048930   0.024568  -1.992   0.0466 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9458 on 1195 degrees of freedom
## Multiple R-squared:  0.1092, Adjusted R-squared:  0.1054 
## F-statistic: 29.29 on 5 and 1195 DF,  p-value: < 2.2e-16

Lo’ and behold: adding courage did not add anything. The effect of suffering is still there, and the effect of courage is absent. So:

Without accounting for courage (as we have always done): Heroes = Suffering & Victims = Suffering.

When adding courage to the model: Heroes = Courage but not suffering; Victims = Suffering but no courage. This is our problematic solved on a correlational level, using non-registered analyses.


summary(PhysVic<-lm(GlobalVict ~ Phys_suff_num*Courage_num  + Job, data = LongDF_num))
## 
## Call:
## lm(formula = GlobalVict ~ Phys_suff_num * Courage_num + Job, 
##     data = LongDF_num)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.92944 -0.62919  0.04378  0.67558  2.51178 
## 
## Coefficients:
##                           Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                4.95085    0.04826 102.579  < 2e-16 ***
## Phys_suff_num              0.44843    0.02960  15.150  < 2e-16 ***
## Courage_num                0.04139    0.03074   1.346  0.17843    
## JobSoldier                -0.88451    0.06654 -13.294  < 2e-16 ***
## JobWelder                 -0.95475    0.06688 -14.275  < 2e-16 ***
## Phys_suff_num:Courage_num -0.07395    0.02444  -3.025  0.00254 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.941 on 1195 degrees of freedom
## Multiple R-squared:  0.305,  Adjusted R-squared:  0.3021 
## F-statistic: 104.9 on 5 and 1195 DF,  p-value: < 2.2e-16
summary(PsychVic<-lm(GlobalVict ~ Psych_suff_num*Courage_num  + Job, data = LongDF_num))
## 
## Call:
## lm(formula = GlobalVict ~ Psych_suff_num * Courage_num + Job, 
##     data = LongDF_num)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -3.08887 -0.60686  0.05981  0.65336  2.83863 
## 
## Coefficients:
##                            Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                 4.88194    0.04830 101.066   <2e-16 ***
## Psych_suff_num              0.46544    0.02993  15.549   <2e-16 ***
## Courage_num                 0.06672    0.02967   2.249   0.0247 *  
## JobSoldier                 -0.96225    0.06686 -14.391   <2e-16 ***
## JobWelder                  -0.69963    0.06727 -10.400   <2e-16 ***
## Psych_suff_num:Courage_num -0.05085    0.02534  -2.006   0.0450 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9383 on 1195 degrees of freedom
## Multiple R-squared:  0.3089, Adjusted R-squared:  0.306 
## F-statistic: 106.8 on 5 and 1195 DF,  p-value: < 2.2e-16

Victimisation is about Suffering, not courage. But they appear to interact (especially with physical suffering).

interact_plot(PhysVic, pred = Phys_suff_num, modx = Courage_num )
## Warning: 1 is outside the observed range of Courage_num

interact_plot(PsychVic, pred = Psych_suff_num, modx = Courage_num)
## Warning: 1 is outside the observed range of Courage_num

The effect of suffering on victim status is stronger for low-levels of courage. But that’s not a clean interaction.

summary(AovInter<-lm(AoV_mean ~ Phys_suff_num*Courage_num  + Job, data = LongDF_num))
## 
## Call:
## lm(formula = AoV_mean ~ Phys_suff_num * Courage_num + Job, data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.5293 -0.7245  0.0984  0.8038  3.0756 
## 
## Coefficients:
##                           Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                5.36128    0.05674  94.495  < 2e-16 ***
## Phys_suff_num              0.41268    0.03480  11.858  < 2e-16 ***
## Courage_num                0.06727    0.03614   1.861  0.06297 .  
## JobSoldier                -0.58158    0.07822  -7.436 1.98e-13 ***
## JobWelder                 -1.24865    0.07867 -15.871  < 2e-16 ***
## Phys_suff_num:Courage_num -0.07694    0.02874  -2.677  0.00753 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.106 on 1194 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.2621, Adjusted R-squared:  0.259 
## F-statistic: 84.82 on 5 and 1194 DF,  p-value: < 2.2e-16
summary(lm(AoV_mean ~ Psych_suff_num*Courage_num  + Job, data = LongDF_num))
## 
## Call:
## lm(formula = AoV_mean ~ Psych_suff_num * Courage_num + Job, data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.8458 -0.7210  0.1415  0.8420  2.8492 
## 
## Coefficients:
##                            Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                 5.29768    0.05625  94.186   <2e-16 ***
## Psych_suff_num              0.46337    0.03488  13.285   <2e-16 ***
## Courage_num                 0.07922    0.03455   2.293   0.0220 *  
## JobSoldier                 -0.66282    0.07786  -8.513   <2e-16 ***
## JobWelder                  -1.00208    0.07840 -12.781   <2e-16 ***
## Psych_suff_num:Courage_num -0.05719    0.02952  -1.938   0.0529 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.093 on 1194 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.2801, Adjusted R-squared:  0.2771 
## F-statistic: 92.92 on 5 and 1194 DF,  p-value: < 2.2e-16

Assumptions of vulnerability is about suffering, but not (much) courage. There seems to be an interaction with physical suffering.

interact_plot(AovInter, pred =Courage_num , modx = Phys_suff_num)

Physical suffering increases Assumptions of vulnerability – particularly for low Courage perception. Retrospectively, it makes sense.

summary(lm(Endure_mean ~ Phys_suff_num*Courage_num  + Job, data = LongDF_num))
## 
## Call:
## lm(formula = Endure_mean ~ Phys_suff_num * Courage_num + Job, 
##     data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.5631 -0.5220  0.1986  0.8089  1.9852 
## 
## Coefficients:
##                           Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                5.76411    0.05527 104.286  < 2e-16 ***
## Phys_suff_num              0.05220    0.03390   1.540  0.12383    
## Courage_num                0.19398    0.03520   5.510 4.38e-08 ***
## JobSoldier                 0.21693    0.07620   2.847  0.00449 ** 
## JobWelder                 -0.41111    0.07660  -5.367 9.60e-08 ***
## Phys_suff_num:Courage_num -0.01866    0.02799  -0.667  0.50518    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.078 on 1195 degrees of freedom
## Multiple R-squared:  0.09382,    Adjusted R-squared:  0.09003 
## F-statistic: 24.74 on 5 and 1195 DF,  p-value: < 2.2e-16
summary(lm(Endure_mean ~ Psych_suff_num*Courage_num  + Job, data = LongDF_num))
## 
## Call:
## lm(formula = Endure_mean ~ Psych_suff_num * Courage_num + Job, 
##     data = LongDF_num)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.6377 -0.5253  0.1918  0.8201  2.0867 
## 
## Coefficients:
##                            Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                 5.77682    0.05545 104.187  < 2e-16 ***
## Psych_suff_num              0.02263    0.03436   0.659  0.51032    
## Courage_num                 0.19890    0.03405   5.841 6.68e-09 ***
## JobSoldier                  0.20490    0.07675   2.670  0.00769 ** 
## JobWelder                  -0.40046    0.07722  -5.186 2.52e-07 ***
## Psych_suff_num:Courage_num -0.05508    0.02909  -1.893  0.05856 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.077 on 1195 degrees of freedom
## Multiple R-squared:  0.09478,    Adjusted R-squared:  0.09099 
## F-statistic: 25.02 on 5 and 1195 DF,  p-value: < 2.2e-16

Enduring pain is about courage, not suffering.

So, if we take back our hypotheses, then on a correlational level:

hypothesis_table <- data.frame(
  Hypothesis = c(
    "H1a", "H1b",
    "H2a", "H2b",
    "H3a", "H3b",
    "H4a", "H4b",
    "H5a", "H5b",
    "H6",
    "H7a", "H7b",
    "H8a", "H8b",
    "H9a", "H9b"
  ),
  
  Prediction = c(
    "Physical suffering is positively correlated with victim perceptions.",
    "Physical suffering is positively correlated with hero perceptions.",
    
    "Psychological suffering is positively correlated with victim perceptions.",
    "Psychological suffering is positively correlated with hero perceptions.",
    
    "Courage is negatively correlated with victim perceptions",
    "Courageous is positively correlated with hero perceptions.",
    
    "The positive correlation of courage with hero perception will be positively moderated by physical suffering",
    "The negative correlation of courage with victim perception will be positively moderated (i.e., made more negative) by physical suffering",
    
    "The positive correlation of courage with hero perception will be positively moderated by psychological suffering",
    "The negative correlation of courage with victim perception will be positively moderated (i.e., made more negative) by psychological suffering",
    
    "Courage will be positively correlated with endurance of suffering.",
    
    "The correlation of courage with endurance of suffering will be positively moderated by physical suffering.",
    "The correlation of courage with endurance of suffering will be positively moderated by psychological suffering.",
    
    "Physical suffering will be positively correlated with victimization.",
    "Psychological suffering will be positively correlated with victimization.",
    
    "Physical suffering will be positively correlated with assumptions of vulnerability.",
    "Psychological suffering will be positively correlated with assumptions of vulnerability."
  ),
  
  Outcome = c(
    "Supported", "Supported",
    "Supported", "Supported",
    "Not supported", "Supported",
    "Not supported", "Not supported",
    "Kind of...", "Not supported",
    "Supported",
    "Not supported", "Opposite effect",
    "Supported", "Supported",
    "Supported", "Supported"
  ),
  
  stringsAsFactors = FALSE
)

hypothesis_table$Outcome_Formatted <- ifelse(
  hypothesis_table$Outcome == "Supported",
  cell_spec("Supported", color = "white", background = "#2E7D32", bold = TRUE), 
  ifelse(
    hypothesis_table$Outcome == "Kind of...", 
    cell_spec("Kind of...", color = "white", background = "orange", bold = TRUE),
  ifelse(
    hypothesis_table$Outcome == "Opposite effect", 
    cell_spec("Opposite effect", color = "white", background = "black", bold = TRUE),
  cell_spec("Not supported", color = "white", background = "#B71C1C", bold = TRUE))
)
)
hypothesis_table_final <- hypothesis_table[, c(
  "Hypothesis",
  "Prediction",
  "Outcome_Formatted"
)]

names(hypothesis_table_final) <- c(
  "Hypothesis",
  "Prediction",
  "Outcome"
)

table_object <- kable(
  hypothesis_table_final,
  format = "html",
  escape = FALSE,
  align = c("l", "l", "c"),
  caption = "Summary of hypothesis tests"
)

table_object <- kable_styling(
  table_object,
  full_width = FALSE,
  bootstrap_options = c("striped", "hover", "condensed", "responsive"),
  position = "center",
  font_size = 14
)

table_object <- column_spec(
  table_object,
  column = 1,
  bold = TRUE,
  width = "8em"
)

table_object <- column_spec(
  table_object,
  column = 2,
  width = "36em"
)

table_object <- column_spec(
  table_object,
  column = 3,
  width = "10em"
)

table_object
Summary of hypothesis tests
Hypothesis Prediction Outcome
H1a Physical suffering is positively correlated with victim perceptions. Supported
H1b Physical suffering is positively correlated with hero perceptions. Supported
H2a Psychological suffering is positively correlated with victim perceptions. Supported
H2b Psychological suffering is positively correlated with hero perceptions. Supported
H3a Courage is negatively correlated with victim perceptions Not supported
H3b Courageous is positively correlated with hero perceptions. Supported
H4a The positive correlation of courage with hero perception will be positively moderated by physical suffering Not supported
H4b The negative correlation of courage with victim perception will be positively moderated (i.e., made more negative) by physical suffering Not supported
H5a The positive correlation of courage with hero perception will be positively moderated by psychological suffering Kind of…
H5b The negative correlation of courage with victim perception will be positively moderated (i.e., made more negative) by psychological suffering Not supported
H6 Courage will be positively correlated with endurance of suffering. Supported
H7a The correlation of courage with endurance of suffering will be positively moderated by physical suffering. Not supported
H7b The correlation of courage with endurance of suffering will be positively moderated by psychological suffering. Opposite effect
H8a Physical suffering will be positively correlated with victimization. Supported
H8b Psychological suffering will be positively correlated with victimization. Supported
H9a Physical suffering will be positively correlated with assumptions of vulnerability. Supported
H9b Psychological suffering will be positively correlated with assumptions of vulnerability. Supported

Now this looks better. But also it is more ad hoc.

Correlation matrix

PerformanceAnalytics::chart.Correlation(LongDF_num[, c(32:35, 37:45)]) # With VictimSN1

# PerformanceAnalytics::chart.Correlation(LongDF_num[, c(31:34, 36:44)]) # Without VictimSN1
colnames(LongDF_num)
##  [1] "Endure_S_N_1"            "Endure_S_N_2"           
##  [3] "Endure_S_N_3"            "Endure_S_N_4"           
##  [5] "Endure_S_N_5"            "Victim_G_N_1"           
##  [7] "Victim_G_N_2"            "Victim_G_N_3"           
##  [9] "Victim_S_N_1"            "Victim_S_N_2"           
## [11] "Victim_S_N_3"            "AoV_n_1"                
## [13] "AoV_n_2"                 "AoV_n_3"                
## [15] "HeroVictim_N_1"          "HeroVictim_N_2"         
## [17] "ManipCheck_N_help"       "ManipCheck_N_brave"     
## [19] "ManipCheck_N_courageous" "ManipCheck_N_risk"      
## [21] "ManipCheck_N_physsuff"   "ManipCheck_N_psychsuff" 
## [23] "Attitude_N"              "PROLIFIC_PID"           
## [25] "Attempts"                "FailedComp"             
## [27] "Subcond"                 "Suffering"              
## [29] "Courage"                 "Job"                    
## [31] "Victimhood_mean"         "Endure_mean"            
## [33] "AoV_mean"                "Victim_G_mean"          
## [35] "Victim_S_mean"           "Courage_Dummy"          
## [37] "GlobalVict"              "Heroism_num"            
## [39] "Victim_num"              "Help_num"               
## [41] "Brave_num"               "Courage_num"            
## [43] "Risk_num"                "Phys_suff_num"          
## [45] "Psych_suff_num"
df_long <- LongDF_num %>%
  pivot_longer(
    cols = c(Heroism_num,Victim_num,
             Help_num, Brave_num,Courage_num,Risk_num,  Phys_suff_num, Psych_suff_num, Attitude_N),
    names_to = "Variable",
    values_to = "Score"
  )

# 2. Compute summary statistics by Job and Variable

df_summary <- df_long %>%
  group_by(Job, Variable) %>%
  summarize(
    mean_score = mean(Score, na.rm = TRUE),
    sd_score   = sd(Score, na.rm = TRUE),
    .groups = "drop"
  )

# 3. Create the ggplot using the long format data
ggplot(df_long, aes(x = Score)) +
  geom_histogram(aes(fill = after_stat(count)),
                 binwidth = 1,
                 color = "black", show.legend = FALSE) +
  facet_grid(Variable ~ Job, scales = "free") +
  scale_fill_gradientn(
    colours = brewer.pal(9, "YlOrBr"),
    name = "Count"
  ) +
  labs(
    title = "Histograms of Variable by Occupation",
    x = "Score",
    y = "Count"
  ) +
  # Annotate each facet with the mean and standard deviation
  geom_text(data = df_summary,
            aes(x = 7, y = Inf,
                label = paste0("Mean = ", round(mean_score, 2),
                               "\nSD = ", round(sd_score, 2))),
            vjust = 1.5, hjust = 1.1, size = 3) +
  theme_classic() +
  theme(
    panel.grid.major.y = element_line(linewidth = 0.5),
    panel.grid.minor.y = element_line(linewidth = 0.5)
  )

Breakdown by occupations

I create three data frames, subsetting only the relevant occupations.

Nurses <- subset(LongDF_num, LongDF_num$Job =="Nurses")
Soldier <- subset(LongDF_num, LongDF_num$Job =="Soldier")
Welder <- subset(LongDF_num, LongDF_num$Job =="Welder")

Let us review the hypotheses within each target occupation.

Nurses

Below, three tables summarizing effect sizes observed in the nurse condition for each experimental condition x outcome:

variables <- c(
  "Heroism_num",
  "Victim_num",
  "Endure_mean",
  "AoV_mean",
  "GlobalVict",
  "Help_num",
  "Brave_num",
  "Courage_num",
  "Risk_num",
  "Phys_suff_num",
  "Psych_suff_num"
)
contrast_specs <- data.frame(
  Contrast = c("Effect of Courage", "Effect of Psychological suffering", "Effect of Physical suffering"),
  group_variable = c("Courage", "Suffering", "Suffering"),
  group_1 = c("Courageous", "Psych_Suff", "Phys_suff"),
  group_2 = c("Non_Courageous", "No_Suff", "No_Suff")
)

TableD_All <- data.frame()

for (i in seq_len(nrow(contrast_specs))) {
  for (job_level in sort(unique(na.omit(LongDF_num$Job)))) {
    for (variable in variables) {
      
      this_data <- LongDF_num[LongDF_num$Job == job_level &
                                LongDF_num[[contrast_specs$group_variable[i]]] %in%
                                c(contrast_specs$group_1[i], contrast_specs$group_2[i]),
                              c(variable, contrast_specs$group_variable[i])] # This is the filtering of the data
      
     names(this_data) <- c("score", "group")

this_data$group <- factor(
  this_data$group,
  levels = c(contrast_specs$group_1[i], contrast_specs$group_2[i])
)

this_data <- na.omit(this_data)

d <- cohens_d(score ~ group, data = this_data, pooled_sd = TRUE)

TableD_All <- rbind(
  TableD_All,
  data.frame(
    Job = job_level,
    Contrast = contrast_specs$Contrast[i],
    Variable = variable,
    N_1 = sum(this_data$group == contrast_specs$group_1[i]),
    N_2 = sum(this_data$group == contrast_specs$group_2[i]),
    Cohen_d = round(d$Cohens_d, 2),
    CI_low = round(d$CI_low, 2),
  CI_high = round(d$CI_high, 2)
  )
)
    }
  }
}

TablesD_ByJob_ByContrast <- lapply(split(TableD_All, TableD_All$Job), function(x) {
  lapply(split(x, x$Contrast), function(y) {
    y$Job <- NULL
    y$Contrast <- NULL
    rownames(y) <- NULL
    y
  })
})
All effect sizes for Courage in Nurses
print.data.frame(TablesD_ByJob_ByContrast$Nurses$`Effect of Courage`)
##          Variable N_1 N_2 Cohen_d CI_low CI_high
## 1     Heroism_num 202 204    0.02  -0.17    0.21
## 2      Victim_num 202 204    0.03  -0.16    0.22
## 3     Endure_mean 202 204    0.53   0.33    0.73
## 4        AoV_mean 202 204    0.01  -0.19    0.20
## 5      GlobalVict 202 204   -0.06  -0.25    0.14
## 6        Help_num 202 204    0.03  -0.16    0.23
## 7       Brave_num 202 204    0.05  -0.14    0.25
## 8     Courage_num 202 204   -0.03  -0.23    0.16
## 9        Risk_num 202 204    0.01  -0.19    0.20
## 10  Phys_suff_num 202 204   -0.03  -0.22    0.17
## 11 Psych_suff_num 202 204    0.02  -0.17    0.22
All effect sizes for Physical suffering in Nurses
print.data.frame(TablesD_ByJob_ByContrast$Nurses$`Effect of Physical suffering`)
##          Variable N_1 N_2 Cohen_d CI_low CI_high
## 1     Heroism_num 133 136    0.13  -0.11    0.37
## 2      Victim_num 133 136    0.26   0.02    0.50
## 3     Endure_mean 133 136   -0.04  -0.28    0.19
## 4        AoV_mean 133 136    0.41   0.17    0.65
## 5      GlobalVict 133 136    0.47   0.23    0.71
## 6        Help_num 133 136   -0.02  -0.26    0.22
## 7       Brave_num 133 136    0.10  -0.14    0.34
## 8     Courage_num 133 136    0.13  -0.11    0.37
## 9        Risk_num 133 136    0.22  -0.02    0.46
## 10  Phys_suff_num 133 136    0.56   0.31    0.80
## 11 Psych_suff_num 133 136    0.54   0.29    0.78
All effect sizes for psychological suffering in Nurses
print.data.frame(TablesD_ByJob_ByContrast$Nurses$`Effect of Psychological suffering`)
##          Variable N_1 N_2 Cohen_d CI_low CI_high
## 1     Heroism_num 137 136    0.19  -0.05    0.43
## 2      Victim_num 137 136    0.22  -0.02    0.46
## 3     Endure_mean 137 136    0.00  -0.23    0.24
## 4        AoV_mean 137 136    0.23  -0.01    0.47
## 5      GlobalVict 137 136    0.36   0.12    0.60
## 6        Help_num 137 136    0.07  -0.17    0.30
## 7       Brave_num 137 136    0.13  -0.11    0.37
## 8     Courage_num 137 136    0.14  -0.10    0.38
## 9        Risk_num 137 136    0.24   0.00    0.47
## 10  Phys_suff_num 137 136    0.32   0.08    0.56
## 11 Psych_suff_num 137 136    0.66   0.42    0.91

Models for Nurses

Select the tab corresponding to the model you want to investigate. For each outcome, we ran an OLS model, decomposed the interaction between the two experimental conditions, and evaluate the importance of attitude by comparing a model using attitude as a covariate with our main model.

Hero perception

We can run our models:

summary(mod1<-lm(HeroVictim_N_1 ~ Suffering*Courage_Dummy, data = Nurses)) # 
## 
## Call:
## lm(formula = HeroVictim_N_1 ~ Suffering * Courage_Dummy, data = Nurses)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.2537 -0.3088  0.6912  0.7971  0.9853 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        6.05147    0.09261  65.342   <2e-16 ***
## SufferingPhys_suff                 0.14358    0.13171   1.090    0.276    
## SufferingPsych_Suff                0.20439    0.13074   1.563    0.119    
## Courage_Dummy                      0.07353    0.18522   0.397    0.692    
## SufferingPhys_suff:Courage_Dummy  -0.19090    0.26342  -0.725    0.469    
## SufferingPsych_Suff:Courage_Dummy  0.03240    0.26147   0.124    0.901    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.08 on 400 degrees of freedom
## Multiple R-squared:  0.008545,   Adjusted R-squared:  -0.003848 
## F-statistic: 0.6895 on 5 and 400 DF,  p-value: 0.6316
#summary(rlm(HeroVictim_N_1 ~ Suffering*Courage_Dummy, data = Nurses)) # 
iv_slopes <-emmeans::emtrends(mod1, specs = "Suffering", var = "Courage_Dummy")
emmeans(iv_slopes, specs = ~ 1, weights = "equal")
##  1       Courage_Dummy.trend    SE  df lower.CL upper.CL
##  overall              0.0207 0.107 400    -0.19    0.231
## 
## Results are averaged over the levels of: Courage_Dummy, Suffering 
## Confidence level used: 0.95

Comparison with model considering halo effect:

Anova(mod3 <-lm(HeroVictim_N_1 ~ Suffering*Courage_Dummy + Attitude_N, data = Nurses), type = "III") # Provides intercept (No suffering) vs each other level.
anova(mod1, mod3)

Victim perception

We can do the same for the set of predictions regarding victim perception:

LongDF_num$Courage_Dummy <- ifelse(LongDF_num$Courage == "Courageous", 0.5, -0.5)

We can run our models:

summary(mod1<-lm(HeroVictim_N_2 ~ Suffering*Courage_Dummy, data = Nurses)) # 
## 
## Call:
## lm(formula = HeroVictim_N_2 ~ Suffering * Courage_Dummy, data = Nurses)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.1061 -1.1061  0.1304  1.1493  3.5441 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                         3.5882     0.1374  26.114   <2e-16 ***
## SufferingPhys_suff                  0.3902     0.1954   1.997   0.0465 *  
## SufferingPsych_Suff                 0.3613     0.1940   1.862   0.0633 .  
## Courage_Dummy                      -0.2647     0.2748  -0.963   0.3360    
## SufferingPhys_suff:Courage_Dummy    0.5200     0.3908   1.331   0.1841    
## SufferingPsych_Suff:Courage_Dummy   0.4246     0.3879   1.094   0.2744    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.602 on 400 degrees of freedom
## Multiple R-squared:  0.01739,    Adjusted R-squared:  0.00511 
## F-statistic: 1.416 on 5 and 400 DF,  p-value: 0.2174
#summary(rlm(HeroVictim_N_2 ~ Suffering*Courage_Dummy, data = Nurses)) # 
iv_slopes <-emmeans::emtrends(mod1, specs = "Suffering", var = "Courage_Dummy")
emmeans(iv_slopes, specs = ~ 1, weights = "equal")
##  1       Courage_Dummy.trend    SE  df lower.CL upper.CL
##  overall              0.0502 0.159 400   -0.263    0.363
## 
## Results are averaged over the levels of: Courage_Dummy, Suffering 
## Confidence level used: 0.95

Comparison with models using halo effect:

Then model 3, adds attitude to model 1:

Anova(mod3 <-lm(HeroVictim_N_2 ~ Suffering*Courage_Dummy + Attitude_N, data = Nurses), type = "III") # Provides intercept (No suffering) vs each other level.
anova(mod1, mod3)

Endurance
summary(mod1<-lm(Endure_mean ~  Suffering*Courage_Dummy, data = Nurses)) # 
## 
## Call:
## lm(formula = Endure_mean ~ Suffering * Courage_Dummy, data = Nurses)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.2000 -0.5088  0.0061  0.6061  1.5118 
## 
## Coefficients:
##                                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        5.748529   0.075171  76.473  < 2e-16 ***
## SufferingPhys_suff                -0.036634   0.106907  -0.343 0.732024    
## SufferingPsych_Suff                0.005882   0.106115   0.055 0.955821    
## Courage_Dummy                      0.520588   0.150342   3.463 0.000593 ***
## SufferingPhys_suff:Courage_Dummy   0.043500   0.213815   0.203 0.838887    
## SufferingPsych_Suff:Courage_Dummy -0.211765   0.212230  -0.998 0.318977    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.8766 on 400 degrees of freedom
## Multiple R-squared:  0.07021,    Adjusted R-squared:  0.05859 
## F-statistic: 6.041 on 5 and 400 DF,  p-value: 2.092e-05
#summary(rlm(Endure_mean ~ Suffering*Courage_Dummy, data = Nurses)) # 

Anova(mod3<-lm(Endure_mean ~ Suffering*Courage_Dummy + Attitude_N, data = Nurses)) # 
anova(mod1, mod3)

Victimisation
Nurses$GlobalVict <- (Nurses$Victim_G_mean + Nurses$Victim_S_mean)/2
summary(mod1<-lm(GlobalVict ~ Suffering*Courage_Dummy, data = Nurses)) # 
## 
## Call:
## lm(formula = GlobalVict ~ Suffering * Courage_Dummy, data = Nurses)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.7040 -0.6971  0.0910  0.7896  2.3848 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        4.56005    0.09158  49.794  < 2e-16 ***
## SufferingPhys_suff                 0.49017    0.13024   3.764 0.000193 ***
## SufferingPsych_Suff                0.40557    0.12928   3.137 0.001832 ** 
## Courage_Dummy                     -0.11029    0.18316  -0.602 0.547393    
## SufferingPhys_suff:Courage_Dummy   0.13611    0.26048   0.523 0.601586    
## SufferingPsych_Suff:Courage_Dummy  0.02220    0.25855   0.086 0.931616    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.068 on 400 degrees of freedom
## Multiple R-squared:  0.04055,    Adjusted R-squared:  0.02855 
## F-statistic: 3.381 on 5 and 400 DF,  p-value: 0.005284
#summary(rlm(GlobalVict ~ Suffering*Courage_Dummy, data = Nurses)) #

Anova(mod3<-lm(GlobalVict ~ Suffering*Courage_Dummy + Attitude_N, data = Nurses)) # 
anova(mod1, mod3)

AoV
summary(mod1<-lm(AoV_mean ~ Suffering*Courage_Dummy, data = Nurses)) # 
## 
## Call:
## lm(formula = AoV_mean ~ Suffering * Courage_Dummy, data = Nurses)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.3333 -0.6569  0.0098  0.7206  2.0098 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        5.02451    0.10087  49.813  < 2e-16 ***
## SufferingPhys_suff                 0.45725    0.14345   3.187  0.00155 ** 
## SufferingPsych_Suff                0.28186    0.14239   1.980  0.04844 *  
## Courage_Dummy                     -0.06863    0.20174  -0.340  0.73390    
## SufferingPhys_suff:Courage_Dummy   0.21622    0.28691   0.754  0.45151    
## SufferingPsych_Suff:Courage_Dummy  0.01471    0.28478   0.052  0.95884    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.176 on 400 degrees of freedom
## Multiple R-squared:  0.02689,    Adjusted R-squared:  0.01473 
## F-statistic: 2.211 on 5 and 400 DF,  p-value: 0.05248
#summary(rlm(AoV_mean ~ Suffering*Courage_Dummy, data = Nurses)) #

Anova(mod3<-lm(AoV_mean ~ Suffering*Courage_Dummy + Attitude_N, data = Nurses)) # 
anova(mod1, mod3)

Soldier

Below, three tables summarizing effect sizes observed in the soldier condition for each experimental condition x outcome:

All effect sizes for Courage in soldiers

print.data.frame(TablesD_ByJob_ByContrast$Soldier$`Effect of Courage`)
##          Variable N_1 N_2 Cohen_d CI_low CI_high
## 1     Heroism_num 200 199    0.08  -0.11    0.28
## 2      Victim_num 200 199    0.10  -0.09    0.30
## 3     Endure_mean 200 199    0.57   0.37    0.77
## 4        AoV_mean 200 199    0.01  -0.18    0.21
## 5      GlobalVict 200 199    0.01  -0.19    0.20
## 6        Help_num 200 199    0.12  -0.07    0.32
## 7       Brave_num 200 199    0.08  -0.12    0.27
## 8     Courage_num 200 199    0.08  -0.11    0.28
## 9        Risk_num 200 199    0.05  -0.15    0.25
## 10  Phys_suff_num 200 199    0.10  -0.09    0.30
## 11 Psych_suff_num 200 199    0.11  -0.09    0.30

All effect sizes for Physical suffering in soldiers

print.data.frame(TablesD_ByJob_ByContrast$Soldier$`Effect of Physical suffering`)
##          Variable N_1 N_2 Cohen_d CI_low CI_high
## 1     Heroism_num 133 133    0.08  -0.16    0.32
## 2      Victim_num 133 133    0.35   0.11    0.59
## 3     Endure_mean 133 133   -0.19  -0.43    0.06
## 4        AoV_mean 133 133    0.33   0.09    0.57
## 5      GlobalVict 133 133    0.37   0.13    0.62
## 6        Help_num 133 133    0.09  -0.15    0.33
## 7       Brave_num 133 133    0.20  -0.05    0.44
## 8     Courage_num 133 133    0.27   0.03    0.51
## 9        Risk_num 133 133    0.10  -0.14    0.34
## 10  Phys_suff_num 133 133    0.73   0.48    0.98
## 11 Psych_suff_num 133 133    0.62   0.38    0.87

All effect sizes for psychological suffering in soldiers

print.data.frame(TablesD_ByJob_ByContrast$Soldier$`Effect of Psychological suffering`)
##          Variable N_1 N_2 Cohen_d CI_low CI_high
## 1     Heroism_num 133 133    0.05  -0.19    0.29
## 2      Victim_num 133 133    0.25   0.01    0.49
## 3     Endure_mean 133 133   -0.18  -0.42    0.06
## 4        AoV_mean 133 133    0.41   0.17    0.65
## 5      GlobalVict 133 133    0.33   0.08    0.57
## 6        Help_num 133 133   -0.05  -0.29    0.19
## 7       Brave_num 133 133    0.05  -0.19    0.29
## 8     Courage_num 133 133    0.10  -0.14    0.34
## 9        Risk_num 133 133   -0.03  -0.27    0.21
## 10  Phys_suff_num 133 133    0.47   0.23    0.71
## 11 Psych_suff_num 133 133    0.67   0.42    0.92

Models for Soldiers

Select the tab corresponding to the model you want to investigate. For each outcome, we ran an OLS model, decomposed the interaction between the two experimental conditions, and evaluate the importance of attitude by comparing a model using attitude as a covariate with our main model.

Hero perception

We can run our models:

summary(mod1<-lm(HeroVictim_N_1 ~ Suffering*Courage_Dummy, data = Soldier)) # 
## 
## Call:
## lm(formula = HeroVictim_N_1 ~ Suffering * Courage_Dummy, data = Soldier)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.5758 -0.7273  0.4030  1.2727  1.6061 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        5.54161    0.13086  42.347   <2e-16 ***
## SufferingPhys_suff                 0.12053    0.18506   0.651    0.515    
## SufferingPsych_Suff                0.07327    0.18506   0.396    0.692    
## Courage_Dummy                      0.06829    0.26172   0.261    0.794    
## SufferingPhys_suff:Courage_Dummy  -0.19855    0.37013  -0.536    0.592    
## SufferingPsych_Suff:Courage_Dummy  0.37359    0.37013   1.009    0.313    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.509 on 393 degrees of freedom
## Multiple R-squared:  0.009072,   Adjusted R-squared:  -0.003536 
## F-statistic: 0.7196 on 5 and 393 DF,  p-value: 0.6091
#summary(rlm(HeroVictim_N_1 ~ Suffering*Courage_Dummy, data = Soldier)) # 
iv_slopes <-emmeans::emtrends(mod1, specs = "Suffering", var = "Courage_Dummy")
emmeans(iv_slopes, specs = ~ 1, weights = "equal")
##  1       Courage_Dummy.trend    SE  df lower.CL upper.CL
##  overall               0.127 0.151 393    -0.17    0.424
## 
## Results are averaged over the levels of: Courage_Dummy, Suffering 
## Confidence level used: 0.95

Comparison with model considering halo effect:

Anova(mod3 <-lm(HeroVictim_N_1 ~ Suffering*Courage_Dummy + Attitude_N, data = Soldier), type = "III") # Provides intercept (No suffering) vs each other level.
anova(mod1, mod3)

Victim perception

We can do the same for the set of predictions regarding victim perception:

LongDF_num$Courage_Dummy <- ifelse(LongDF_num$Courage == "Courageous", 0.5, -0.5)

We can run our models:

summary(mod1<-lm(HeroVictim_N_2 ~ Suffering*Courage_Dummy, data = Soldier)) # 
## 
## Call:
## lm(formula = HeroVictim_N_2 ~ Suffering * Courage_Dummy, data = Soldier)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.7761 -1.3864 -0.0149  0.9851  3.9851 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                       3.030190   0.136321  22.228  < 2e-16 ***
## SufferingPhys_suff                0.539688   0.192787   2.799  0.00537 ** 
## SufferingPsych_Suff               0.398236   0.192787   2.066  0.03951 *  
## Courage_Dummy                     0.030529   0.272642   0.112  0.91090    
## SufferingPhys_suff:Courage_Dummy  0.381954   0.385575   0.991  0.32249    
## SufferingPsych_Suff:Courage_Dummy 0.008141   0.385575   0.021  0.98317    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.572 on 393 degrees of freedom
## Multiple R-squared:  0.02673,    Adjusted R-squared:  0.01435 
## F-statistic: 2.159 on 5 and 393 DF,  p-value: 0.05793
#summary(rlm(HeroVictim_N_2 ~ Suffering*Courage_Dummy, data = Soldier)) # 
iv_slopes <-emmeans::emtrends(mod1, specs = "Suffering", var = "Courage_Dummy")
emmeans(iv_slopes, specs = ~ 1, weights = "equal")
##  1       Courage_Dummy.trend    SE  df lower.CL upper.CL
##  overall               0.161 0.157 393   -0.149     0.47
## 
## Results are averaged over the levels of: Courage_Dummy, Suffering 
## Confidence level used: 0.95

Comparison with models using halo effect:

Then model 3, adds attitude to model 1:

Anova(mod3 <-lm(HeroVictim_N_2 ~ Suffering*Courage_Dummy + Attitude_N, data = Soldier), type = "III") # Provides intercept (No suffering) vs each other level.
anova(mod1, mod3)

Endurance
summary(mod1<-lm(Endure_mean ~  Suffering*Courage_Dummy, data = Soldier)) # 
## 
## Call:
## lm(formula = Endure_mean ~ Suffering * Courage_Dummy, data = Soldier)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.1818 -0.4934  0.2182  0.6435  1.4333 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        6.11330    0.08407  72.719  < 2e-16 ***
## SufferingPhys_suff                -0.18107    0.11889  -1.523  0.12855    
## SufferingPsych_Suff               -0.19564    0.11889  -1.646  0.10066    
## Courage_Dummy                      0.53704    0.16813   3.194  0.00152 ** 
## SufferingPhys_suff:Courage_Dummy  -0.10896    0.23778  -0.458  0.64705    
## SufferingPsych_Suff:Courage_Dummy  0.16495    0.23778   0.694  0.48828    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9695 on 393 degrees of freedom
## Multiple R-squared:  0.08675,    Adjusted R-squared:  0.07513 
## F-statistic: 7.466 on 5 and 393 DF,  p-value: 1.042e-06
#summary(rlm(Endure_mean ~ Suffering*Courage_Dummy, data = Soldier)) # 

Anova(mod3<-lm(Endure_mean ~ Suffering*Courage_Dummy + Attitude_N, data = Soldier)) # 
anova(mod1, mod3)

Victimisation

Because the measurement model allows it, we can make a global victimization score.

Soldier$GlobalVict <- (Soldier$Victim_G_mean + Soldier$Victim_S_mean)/2
summary(mod1<-lm(GlobalVict ~ Suffering*Courage_Dummy, data = Soldier)) # 
## 
## Call:
## lm(formula = GlobalVict ~ Suffering * Courage_Dummy, data = Soldier)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.82338 -0.80100 -0.04726  0.76010  2.81313 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        3.79888    0.09224  41.184  < 2e-16 ***
## SufferingPhys_suff                 0.39942    0.13045   3.062  0.00235 ** 
## SufferingPsych_Suff                0.35052    0.13045   2.687  0.00752 ** 
## Courage_Dummy                      0.16991    0.18448   0.921  0.35762    
## SufferingPhys_suff:Courage_Dummy  -0.25309    0.26090  -0.970  0.33261    
## SufferingPsych_Suff:Courage_Dummy -0.24484    0.26090  -0.938  0.34860    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.064 on 393 degrees of freedom
## Multiple R-squared:  0.03057,    Adjusted R-squared:  0.01824 
## F-statistic: 2.479 on 5 and 393 DF,  p-value: 0.03153
#summary(rlm(GlobalVict ~ Suffering*Courage_Dummy, data = Soldier)) #

Anova(mod3<-lm(GlobalVict ~ Suffering*Courage_Dummy + Attitude_N, data = Soldier)) # 
anova(mod1, mod3)

AoV
summary(mod1<-lm(AoV_mean ~ Suffering*Courage_Dummy, data = Soldier)) # 
## 
## Call:
## lm(formula = AoV_mean ~ Suffering * Courage_Dummy, data = Soldier)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.4801 -0.7576  0.0758  0.7424  2.7413 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                         4.4602     0.1036  43.032  < 2e-16 ***
## SufferingPhys_suff                  0.4087     0.1466   2.788 0.005559 ** 
## SufferingPsych_Suff                 0.5007     0.1466   3.416 0.000702 ***
## Courage_Dummy                       0.4029     0.2073   1.944 0.052650 .  
## SufferingPhys_suff:Courage_Dummy   -0.5137     0.2932  -1.752 0.080491 .  
## SufferingPsych_Suff:Courage_Dummy  -0.6630     0.2932  -2.261 0.024275 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.195 on 393 degrees of freedom
## Multiple R-squared:  0.04589,    Adjusted R-squared:  0.03376 
## F-statistic: 3.781 on 5 and 393 DF,  p-value: 0.002347
#summary(rlm(AoV_mean ~ Suffering*Courage_Dummy, data = Soldier)) #

Anova(mod3<-lm(AoV_mean ~ Suffering*Courage_Dummy + Attitude_N, data = Soldier)) # 
anova(mod1, mod3)

Welder

Below, three tables summarizing effect sizes observed in the welder condition for each experimental condition x outcome:

All effect sizes for Courage in welders

print.data.frame(TablesD_ByJob_ByContrast$Welder$`Effect of Courage`)
##          Variable N_1 N_2 Cohen_d CI_low CI_high
## 1     Heroism_num 197 199    0.17  -0.02    0.37
## 2      Victim_num 197 199   -0.01  -0.21    0.18
## 3     Endure_mean 197 199    1.01   0.80    1.22
## 4        AoV_mean 196 199    0.04  -0.16    0.24
## 5      GlobalVict 197 199    0.01  -0.19    0.20
## 6        Help_num 197 199    0.12  -0.08    0.32
## 7       Brave_num 197 199    0.26   0.06    0.46
## 8     Courage_num 197 199    0.29   0.09    0.49
## 9        Risk_num 197 199    0.16  -0.04    0.35
## 10  Phys_suff_num 197 199    0.09  -0.11    0.29
## 11 Psych_suff_num 197 199   -0.04  -0.24    0.16

All effect sizes for Physical suffering in welders

print.data.frame(TablesD_ByJob_ByContrast$Welder$`Effect of Physical suffering`)
##          Variable N_1 N_2 Cohen_d CI_low CI_high
## 1     Heroism_num 133 131    0.07  -0.17    0.31
## 2      Victim_num 133 131    0.48   0.23    0.72
## 3     Endure_mean 133 131   -0.03  -0.27    0.21
## 4        AoV_mean 132 131    0.76   0.51    1.01
## 5      GlobalVict 133 131    0.68   0.43    0.92
## 6        Help_num 133 131    0.03  -0.21    0.27
## 7       Brave_num 133 131    0.24   0.00    0.48
## 8     Courage_num 133 131    0.19  -0.05    0.43
## 9        Risk_num 133 131    0.44   0.20    0.69
## 10  Phys_suff_num 133 131    1.35   1.08    1.62
## 11 Psych_suff_num 133 131    0.78   0.53    1.03

All effect sizes for psychological suffering in welders

print.data.frame(TablesD_ByJob_ByContrast$Welder$`Effect of Psychological suffering`)
##          Variable N_1 N_2 Cohen_d CI_low CI_high
## 1     Heroism_num 132 131    0.00  -0.24    0.24
## 2      Victim_num 132 131    0.42   0.17    0.66
## 3     Endure_mean 132 131   -0.20  -0.44    0.04
## 4        AoV_mean 132 131    0.64   0.39    0.89
## 5      GlobalVict 132 131    0.62   0.37    0.87
## 6        Help_num 132 131    0.04  -0.20    0.28
## 7       Brave_num 132 131    0.25   0.00    0.49
## 8     Courage_num 132 131    0.17  -0.08    0.41
## 9        Risk_num 132 131    0.35   0.10    0.59
## 10  Phys_suff_num 132 131    0.94   0.69    1.19
## 11 Psych_suff_num 132 131    1.30   1.04    1.57

Models for Welders

Select the tab corresponding to the model you want to investigate. For each outcome, we ran an OLS model, decomposed the interaction between the two experimental conditions, and evaluate the importance of attitude by comparing a model using attitude as a covariate with our main model.

Hero perception
summary(mod1<-lm(HeroVictim_N_1 ~ Suffering*Courage_Dummy, data = Welder)) # 
## 
## Call:
## lm(formula = HeroVictim_N_1 ~ Suffering * Courage_Dummy, data = Welder)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.1231 -0.9394 -0.1061  0.8939  2.0606 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        5.18508    0.12082  42.917   <2e-16 ***
## SufferingPhys_suff                 0.09183    0.17022   0.539   0.5899    
## SufferingPsych_Suff               -0.00414    0.17055  -0.024   0.9806    
## Courage_Dummy                      0.49138    0.24164   2.034   0.0427 *  
## SufferingPhys_suff:Courage_Dummy  -0.14968    0.34044  -0.440   0.6604    
## SufferingPsych_Suff:Courage_Dummy -0.60710    0.34109  -1.780   0.0759 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.383 on 390 degrees of freedom
## Multiple R-squared:  0.01719,    Adjusted R-squared:  0.004586 
## F-statistic: 1.364 on 5 and 390 DF,  p-value: 0.237
#summary(rlm(HeroVictim_N_1 ~ Suffering*Courage_Dummy, data = Welder)) # 
iv_slopes <-emmeans::emtrends(mod1, specs = "Suffering", var = "Courage_Dummy")
emmeans(iv_slopes, specs = ~ 1, weights = "equal")
##  1       Courage_Dummy.trend    SE  df lower.CL upper.CL
##  overall               0.239 0.139 390  -0.0341    0.512
## 
## Results are averaged over the levels of: Courage_Dummy, Suffering 
## Confidence level used: 0.95

Comparison with model considering halo effect:

Anova(mod3 <-lm(HeroVictim_N_1 ~ Suffering*Courage_Dummy + Attitude_N, data = Welder), type = "III") # Provides intercept (No suffering) vs each other level.
anova(mod1, mod3)

Victim perception

We can do the same for the set of predictions regarding victim perception:

LongDF_num$Courage_Dummy <- ifelse(LongDF_num$Courage == "Courageous", 0.5, -0.5)

We can run our models:

summary(mod1<-lm(HeroVictim_N_2 ~ Suffering*Courage_Dummy, data = Welder)) # 
## 
## Call:
## lm(formula = HeroVictim_N_2 ~ Suffering * Courage_Dummy, data = Welder)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.3881 -1.2273 -0.2273  1.3385  3.9385 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        2.61865    0.12972  20.188  < 2e-16 ***
## SufferingPhys_suff                 0.68902    0.18276   3.770 0.000188 ***
## SufferingPsych_Suff                0.59869    0.18311   3.270 0.001173 ** 
## Courage_Dummy                      0.08578    0.25943   0.331 0.741087    
## SufferingPhys_suff:Courage_Dummy   0.07501    0.36551   0.205 0.837516    
## SufferingPsych_Suff:Courage_Dummy -0.39738    0.36621  -1.085 0.278548    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.485 on 390 degrees of freedom
## Multiple R-squared:  0.04594,    Adjusted R-squared:  0.0337 
## F-statistic: 3.756 on 5 and 390 DF,  p-value: 0.002474
#summary(rlm(HeroVictim_N_2 ~ Suffering*Courage_Dummy, data = Welder)) # 
iv_slopes <-emmeans::emtrends(mod1, specs = "Suffering", var = "Courage_Dummy")
emmeans(iv_slopes, specs = ~ 1, weights = "equal")
##  1       Courage_Dummy.trend    SE  df lower.CL upper.CL
##  overall             -0.0217 0.149 390   -0.315    0.272
## 
## Results are averaged over the levels of: Courage_Dummy, Suffering 
## Confidence level used: 0.95

Comparison with models using halo effect:

Then model 3, adds attitude to model 1:

Anova(mod3 <-lm(HeroVictim_N_2 ~ Suffering*Courage_Dummy + Attitude_N, data = Welder), type = "III") # Provides intercept (No suffering) vs each other level.
anova(mod1, mod3)

Endurance
summary(mod1<-lm(Endure_mean ~  Suffering*Courage_Dummy, data = Welder)) # 
## 
## Call:
## lm(formula = Endure_mean ~ Suffering * Courage_Dummy, data = Welder)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.8179 -0.5917  0.1970  0.8677  2.3433 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        5.45855    0.10458  52.197  < 2e-16 ***
## SufferingPhys_suff                -0.04808    0.14733  -0.326   0.7443    
## SufferingPsych_Suff               -0.26404    0.14762  -1.789   0.0744 .  
## Courage_Dummy                      0.94135    0.20915   4.501 8.95e-06 ***
## SufferingPhys_suff:Courage_Dummy   0.27353    0.29467   0.928   0.3539    
## SufferingPsych_Suff:Courage_Dummy  0.53424    0.29524   1.810   0.0711 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.197 on 390 degrees of freedom
## Multiple R-squared:  0.2178, Adjusted R-squared:  0.2078 
## F-statistic: 21.72 on 5 and 390 DF,  p-value: < 2.2e-16
#summary(rlm(Endure_mean ~ Suffering*Courage_Dummy, data = Welder)) # 

Anova(mod3<-lm(Endure_mean ~ Suffering*Courage_Dummy + Attitude_N, data = Welder)) # 
anova(mod1, mod3)

Victimisation

Because the measurement model allows it, we can make a global victimization score

Welder$GlobalVict <- (Welder$Victim_G_mean + Welder$Victim_S_mean)/2
summary(mod1<-lm(GlobalVict ~ Suffering*Courage_Dummy, data = Welder)) # 
## 
## Call:
## lm(formula = GlobalVict ~ Suffering * Courage_Dummy, data = Welder)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.69444 -0.68657 -0.02778  0.72157  2.57960 
## 
## Coefficients:
##                                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        3.605575   0.085140  42.349  < 2e-16 ***
## SufferingPhys_suff                 0.668264   0.119952   5.571 4.73e-08 ***
## SufferingPsych_Suff                0.577701   0.120183   4.807 2.19e-06 ***
## Courage_Dummy                     -0.006022   0.170280  -0.035    0.972    
## SufferingPhys_suff:Courage_Dummy   0.164811   0.239905   0.687    0.493    
## SufferingPsych_Suff:Courage_Dummy -0.134889   0.240366  -0.561    0.575    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9744 on 390 degrees of freedom
## Multiple R-squared:  0.08896,    Adjusted R-squared:  0.07728 
## F-statistic: 7.617 on 5 and 390 DF,  p-value: 7.627e-07
#summary(rlm(GlobalVict ~ Suffering*Courage_Dummy, data = Welder)) #

Anova(mod3<-lm(GlobalVict ~ Suffering*Courage_Dummy + Attitude_N, data = Welder)) # 
anova(mod1, mod3)

AoV
summary(mod1<-lm(AoV_mean ~ Suffering*Courage_Dummy, data = Welder)) # 
## 
## Call:
## lm(formula = AoV_mean ~ Suffering * Courage_Dummy, data = Welder)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.2564 -0.7761 -0.1010  0.8687  3.5505 
## 
## Coefficients:
##                                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                        3.59654    0.09926  36.233  < 2e-16 ***
## SufferingPhys_suff                 0.85295    0.14011   6.088 2.75e-09 ***
## SufferingPsych_Suff                0.75306    0.14012   5.374 1.33e-07 ***
## Courage_Dummy                      0.29409    0.19852   1.481   0.1393    
## SufferingPhys_suff:Courage_Dummy  -0.26379    0.28022  -0.941   0.3471    
## SufferingPsych_Suff:Courage_Dummy -0.48047    0.28023  -1.715   0.0872 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.136 on 389 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.1089, Adjusted R-squared:  0.09746 
## F-statistic: 9.509 on 5 and 389 DF,  p-value: 1.433e-08
#summary(rlm(AoV_mean ~ Suffering*Courage_Dummy, data = Welder)) #

Anova(mod3<-lm(AoV_mean ~ Suffering*Courage_Dummy + Attitude_N, data = Welder)) # 
anova(mod1, mod3)