In this report, I use some packages to format data, plot results, and run robust analyses. Installed packages are detailed in the code chunk below.

if(!require("dplyr")) install.packages("dplyr")
if(!require("tidyr")) install.packages("tidyr")
if(!require("stringr")) install.packages("stringr")
if(!require("ggplot2")) install.packages("ggplot2")
if(!require("emmeans")) install.packages("emmeans")
if(!require("data.table")) install.packages("data.table")
if(!require("PerformanceAnalytics")) install.packages("PerformanceAnalytics")
if(!require("interactions")) install.packages("interactions")
if(!require("car")) install.packages("car")
if(!require("effectsize")) install.packages("effectsize")
if(!require("RColorBrewer")) install.packages("RColorBrewer")
if(!require("effectsize")) install.packages("effectsize")
if(!require("report")) install.packages("report")
if(!require("ordinal")) install.packages("ordinal")
if(!require("robustbase")) install.packages("robustbase")
if(!require("olsrr")) install.packages("olsrr")
if(!require("knitr")) install.packages("knitr")
if(!require("kableExtra")) install.packages("kableExtra")
if(!require("gt")) install.packages("gt")
if(!require("lavaan")) install.packages("lavaan")

Introduction

In the previous study, we tried to manipulate the perception of Motivation (IV1) and Altruism (IV2) for different occupations. Although the manipulation of Motivation was associated to the expected results in at least 3 occupations (Firefighters, Welders, and Psychiatrists), our manipulation of Altruism resulted in small effect sizes (all Cohen’s d < 0.3) and mixed success (only changed perceptions of heroism for welders and psychiatrists). Additional explorations indicate that the relative success of the manipulation might be accounted by a more general effect on attitude, rather than a direct effect on heroism (i.e., we suspect a mediation effect where our Altruism increased positive attitude in occupations, but did not directly increased heroism). Moreover, when assessing the competitive effects of evaluations of Exposure to Danger, Bravery, Selflessness, and Effective Helpfulness, we observed that heroism was principally explained by Effective Helpfulness above and beyond Selflessness.

Taken together, these results indicate that heroes might be individuals who help people, rather than individuals who act selflessly. Because our previous manipulation consisted in emphasising the selfless motivations in the occupations, we want to adjust the manipulation to reflect the fact that, above and beyond wanting to help, target occupations are helpful (vs they are not).

Looking at our previous manipulation, I realise that there is an important difference between the way we manipulated Motivation and motivation. Every Motivation manipulation starts with “Despite the idea that…”: basically we start with a situation, and emphasise that the opposite is true. In contrast, every motivation manipulation only emphasise a specific motive –> It does not invalidate that alternative motives (e.g. “Helping people” in the Self improving condition) is true. The construction of the Motivation motivation is, by design, maximizing the contrast between the two levels. In contrast, the Motivation manipulation does not invalidate any prior idea one might have regarding, say, the motivations of psychiatrists to help people.I think this might be an important reason for our small effect sizes. Aims: All conditions states selfless motives but, the motive is either fulfilled in most cases, or frustrated/ineffective in most cases

Helpfulness of the group’s member contribute to the perception of heroism

Rationale

Franco et al. (2011) provided the general and, to their own admission, overly simplistic definition of heroism as “to act in a prosocial manner despite personal Motivation” (p.99). Altruism and exposure to danger are indeed two core elements that are consistently found in the lay people’s prototype of a hero (Kinsella et al., 2015). Regarding physical threat, Sternstorm & Curtis (2012) observed that altruistic actions were distinguished between being merely altruistic vs heroic as a direct function of the level of physical danger. The more dangerous the action, the more heroic rather than altruistic.

As emphasised by Sternstorm & Curtis (2012), altruism may not be a sufficient element to the perception of heroism, but it might be necessary element nonetheless. However, to our knowledge, there is a lack of experimental evidence for this influence of altruism on the perception of heroism. In previous studies, we observed that above and beyond altruism (being selfless - having altruistic motivations) it might be effectively helping people (regardless of one’s motivation) that makes the hero. We believe that manipulating effective helpfulness of groups might influence their heroism perception.

Manipulations

We will manipulate targets (firefighters, welders or psychiatrists) as being at physical Motivation (in all conditions of the study) and either effectively helpful (e.g., reports show that they help people in 89% of the cases) or not (“reports show that they do not help people in 89% of the cases).

  • A manipulation check (MC) will use attributes ratings for each occupation regarding how much participants perceive them to be “effectively helping people”.

MC will be successful if occupations described as effectively helping people are perceived as significantly helping more people than occupations not described as effectively helping people.

Hypotheses

  • H1a - Describing an occupation as effectively helping people (vs not effectively helping people) will increase perception of heroism regardless of the occupation

  • H1b - Describing an occupation as “wanting to help people” (vs “Not wanting to help people”) will increase perception of heroism regardless of the occupation

  • H2a - Perceiving that an occupation is effectively helpful will correlate positively with perceived heroism

  • H2b - Perceiving that an occupation is selfless will correlate positively with perceived heroism

Methods

After reading the Consent form and confirming their participation, reporting their Prolific ID, and answering a commitment check (Geisen, 2022 [avaiblable at https://www.qualtrics.com/blog/attention-checks-and-data-quality/]; Peer et al., 2024), participants will read a description of one of the target occupation (randomly selected, between-participant). Each description consists of a short 3-paragraph long description of the occupation. The first paragraphs briefly describe the targeted occupation, and emphasise the presence of risk in the occupation (see previous study “Perceing Heroism 2” for the High risk condition). The second paragraph will describe the occupation as motivated to help people (vs. not motivated to help people). The third paragraph will emphasise to what extent the profession is helping people vs. not helping people. These two paragraphs will be displayed in a random order. Participants will be randomly assigned in experimental conditions.

After reading the descriptions, participants will complete a comprehension check. They will have two attempts to answer correctly; if they fail both, they will be redirected to a page instructing them to return their survey. Those who pass the comprehension check will proceed to complete a scale measuring the extent to which they personally view the assigned target occupation as ‘heroes.’ Finally, participants will respond to two Likert-scale items assessing, as a manipulation check, the extent to which the target occupation is perceived as (1) selfless and (2) helpful.

Finally, participants will report their general attitude toward the assigned target group (covariate) using a 7-points scale from “Very negative” to “Very positive”.

At the end of the study, participants will complete some demographics regarding their gender, age, and occupation. They will finally answer to 1 final manipulation check regarding the credibility of our deception (“In your opinion, how believable was the information that you read at the beginning of this study, about the target occupation?”). They will then be debriefed and thanked.

Occupation Descriptions. Each description consists in 3 paragraphs with one of the paragraph emphasising that the workers are motivated to help people (vs not motivated to help people), and one that emphasise that they are effectively helping people (vs not helping people, see Material on OSF project). We will use deceptive information to manipulate selfless motivations and helpfulness. Specifically we will report false results from a survey indicating that”81% of XXX are motivated to help people”, and “89% of XXX help people” (vs “11% of XXX help people”).

Moral role attribution. Participants will evaluate to what extent they agree with the target occupations being described as “Heroes” using a 7-point Likert scale from “Strongly disagree” to “Strongly agree”.

Manipulation checks. Participants will then rate to what extent they believe the target occupation is selfless, and to what extent the people in this profession are helpful. Both questions use 7-point Likert scales from “Not at all” to “Extremely”.

General attitude. Participants will report their general attitude toward each target occupation using a 7-point-scale from “Very negative” to “Very positive”.

Comprehension check. Participants will need to respond to a multiple choice question asking them about the content of the vignette they just read (see material for details). They will have two chances of correctly answering the comprehension check - after which they will be urged to return their survey. The comprehension check will be displayed right beneath the descriptions and consist of an easy question about the content of the vignette. The comprehension check was set according to Prolific policy on Comprehension checks.

Credibility check. Participants will answer the following question: “In your opinion, how believable was the information that you read at the beginning of this study, about the target occupation?” from 1- Very unbelievable to 7 - Very believable. Credibility will be measured to explore its potential role as a moderator of the observed results.

Loading data

Please adjust the path if you are running this script in your local machine. For the purpose of this pre-registration script, we simulated data using Qualtrics “Generate Test data” feature.

Things to note in the data wrangling process:

  • 1 participant reported a mistake in the comment section (“I made a mistake in the first question when asked about whether firefighters are heroes and I said I strongly disagree while I meant to say strongly agree.”)

  • 3 participants returned their survey (because of failed comprehension check, k = 2, and one returned a completed survey for unknown reasons) - they are removed so it does not mess with the representation of our sample

  • 2 participants timed out, despite completing the survey - they are removed so it does not mess with the representation of our sample

Set <- read.csv("~/Downloads/GW1+-+3rd+attempt+-Study+1c_July+3,+2025_06.49.csv", comment.char="#")
Set <- subset(Set, Set$Q233 != "No, I won't")
Set <- Set[-c(1:2),]
Set <- subset(Set, Set$FailedComp == "No") # Keep only participants who succeeded the completion checks
Set <- subset(Set, Set$Age != "") # Keep only participants who succeeded the completion checks

# Remove this weird participant that completed the survey yet returned the survey to preserve representativity
ProlExport<- read.csv("~/Downloads/prolific_export_68541b7296d11f4b2e3bc37e(2).csv")
Ret <- subset(ProlExport, ProlExport$Status == "RETURNED")
# intersect(Set$Prol_ID, Ret$Participant.id)

# Remove Timed Out yet Complete Questionnaires to preserve representativity
ProlExport<- read.csv("~/Downloads/prolific_export_68541b7296d11f4b2e3bc37e(2).csv")
TO <- subset(ProlExport, ProlExport$Status == "TIMED-OUT")
# intersect(Set$Prol_ID, TO$Participant.id)

# Also, one participant reported a mistake, we can correct this:
idx <- which(
  Set$Q523 == "I made a mistake in the first question when asked about whether firefighters are heroes and I said I strongly disagree while I meant to say strongly agree."
)

Set$F_Selfish_Help_h_1[idx] <- "7 - Strongly agree"


Set <- subset(Set, 
              !(Set$PROLIFIC_PID %in% TO$Participant.id | 
                Set$PROLIFIC_PID %in% Ret$Participant.id))


#table(Set$SubCond, Set$Condition)
#colnames(Set)
Demographics <- Set[,c(37, 39:46)]# First, add a unique row identifier if one does not exist already:
job_cols <- c("Job_match_1", "Job_match_2", "Job_match_3", 
              "Job_match_4", "Job_match_5", "Job_match_7", "Job_match_6")

Demographics$JOB <- apply(Demographics[, job_cols], 1, function(x) {
  # Remove empty strings
  reported_jobs <- x[x != ""]
  # If no jobs reported, assign NA; else paste the jobs together
  if (length(reported_jobs) == 0) NA else paste(reported_jobs, collapse = ", ")
})

Set$Credibility[Set$Credibility == "Very unbelievable"] <- 1
Set$Credibility[Set$Credibility == "Quite unbelievable"] <- 2
Set$Credibility[Set$Credibility == "Somewhat unbelievable"] <- 3
Set$Credibility[Set$Credibility == "Neutral"] <- 4
Set$Credibility[Set$Credibility == "Somewhat believable"] <- 5
Set$Credibility[Set$Credibility == "Quite believable"] <- 6
Set$Credibility[Set$Credibility == "Very believable"] <- 7

# 1. Identify all columns whose names start with "AC" (attention checks)
ac_cols <- grep("^AC", names(Set), value = TRUE)

# 2. Pivot those AC columns into long form so each respondent has exactly one row
Set_long <- Set %>%
  mutate(row_id = row_number()) %>%        # create a unique ID for each row
  pivot_longer(
    cols      = all_of(ac_cols),           # take all attention-check columns
    names_to  = "ac_var",                  # put their names into a column called ac_var
    values_to = "ac_resp"                  # put their values into a column called ac_resp
  ) %>%
  filter(ac_resp != "")                    # keep only the non-empty entry per respondent



# Identify all columns ending with "h_1" and use it to fill the column "CONDITION"
h1_cols <- grep("_h_1$", names(Set_long), value = TRUE)
# Creating the condition
Set_long_filtered <- Set_long %>%
  rowwise() %>%  # process each row individually
  mutate(
    # Count how many of the h1_cols are non-empty ("")
    non_empty_count = sum(c_across(all_of(h1_cols)) != ""),
    
    # Determine the Condition based on non-empty count
    Condition_2 = if (non_empty_count == 1) {
      # Get the name of the column that is non-empty
      selected_col <- h1_cols[which(c_across(all_of(h1_cols)) != "")]
      # Remove the "_h_1" suffix to get the condition (e.g., "NRS" from "NRS_h_1")
      str_remove(selected_col, "_h_1")
    } else {
      "Error"
    }
  ) %>%
  ungroup() %>%  # exit rowwise mode
  dplyr::select(-non_empty_count) %>% distinct(ResponseId, .keep_all=T) # remove the helper column if no longer needed



### RESPONSES TO ATTENTION CHECKS MATCH THE CONDITION

# Now I'll neatly create the main data frame. I create a helper function that extract all non empty values and apply it on all rows ending with our codes: 
# - _h_1 is heroism rating, _m_1_1 is first item of MC1, m_1_2, is second item of mc2, _at is attitude etc.


# Helper function: Given a vector, return the only non-empty element (or NA if none/few found)
extract_value <- function(x) {
  non_empty <- x[x != ""]
  if(length(non_empty) == 1) return(non_empty)
  else return(NA)
}

# Create the final data frame
final_df <- Set_long_filtered %>%
  mutate(
    # Extract the non-empty value from each group of columns:
    Heroism = apply(dplyr::select(., ends_with("_h_1")), 1, extract_value),
    Selfless        = apply(dplyr::select(., ends_with("m_1")), 1, extract_value),
    Helpfulness        = apply(dplyr::select(., ends_with("m_2")), 1, extract_value),
    Brave        = apply(dplyr::select(., ends_with("m_3")), 1, extract_value),
    Danger        = apply(dplyr::select(., ends_with("m_4")), 1, extract_value),
    Attitude     = apply(dplyr::select(., matches("(_at)$")), 1, extract_value)
  ) %>%
  # Select only the required columns in the final data frame
  dplyr::select(ResponseId, Condition, Condition_2, Heroism, Danger, Helpfulness, Brave, Selfless, Attitude, Credibility, Gender, Age)

# Recoding values:
final_df<-subset(final_df, final_df$Condition_2 != "Error")
final_df <- final_df %>%
  # 1. Split Condition into Job, Motivation, and Help
  mutate(
    Job  = str_sub(Condition_2, 1, 1),
    Motivation = if_else(grepl("Selfless", Condition_2, ignore.case = TRUE), "Selfless", "Selfish"),
    Help       = if_else(grepl("Unhelp",     Condition_2, ignore.case = TRUE), "Unhelp", "Help")  ) %>%
  # 2. Dummy code Motivation and Help: R -> 0.5, B -> -0.5; H -> 0.5, S -> -0.5
  mutate(
    Motivation_dummy = case_when(
      Motivation == "Selfless" ~ 0.5,
      Motivation == "Selfish" ~ -0.5,
      TRUE ~ NA_real_
    ),
    Help_dummy = case_when(
      Help == "Help" ~ 0.5,
      Help == "Unhelp" ~ -0.5,
      TRUE ~ NA_real_
    )
  ) %>%
  # 3. Recode rating items (HeroismScore, MC1_1, MC1_2, MC2_1, MC2_2)
  mutate_at(vars(Heroism, Danger, Helpfulness, Brave, Selfless), 
            ~ case_when(
              . == "1 - Strongly disagree" ~ "1",
              . == "7 - Strongly agree"    ~ "7",
              TRUE ~ .
            )) %>%
  # Optionally convert these recoded columns to numeric
  mutate_at(vars(Heroism, Danger, Helpfulness,Brave, Selfless), as.numeric) %>%
  # 4. Recode Attitude values
  mutate(
    Attitude = case_when(
      Attitude == "Very negative"    ~ 1,
      Attitude == "Quite negative" ~ 2,
      Attitude == "Somewhat negative" ~ 3,
      Attitude == "Neutral"           ~ 4,
      Attitude == "Somewhat positive" ~ 5,
      Attitude == "Quite positive" ~ 6,
      Attitude == "Very positive" ~ 7,
      TRUE ~ NA_real_
    )
  ) 

#final_df$Part_Job <- Demographics$JOB
Set<-final_df

Results

Demographics

First, let’s get an idea of the demographics in our sample.

Demographics$flag_inconsistent <- (Demographics$Job_match_6 == "None of the above") & 
  (Demographics$Job_match_1 != "" | Demographics$Job_match_2 != "" | Demographics$Job_match_3 != "" | 
   Demographics$Job_match_4 != "" | Demographics$Job_match_5 != "")




paste0("816 participants took part in the study. Mean age in the sample is ", mean(as.numeric(Set$Age)), ", SD = ", sd(as.numeric(Set$Age)))
## [1] "816 participants took part in the study. Mean age in the sample is 46.389705882353, SD = 15.4076737127492"
## Gender

Set %>% group_by(Gender) %>% 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(Demographics[-which(Demographics$flag_inconsistent == T), 4:10])           # Make a long list of all jobs that were named

jobs <- unlist(Demographics[, 3:9])           # 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")

Descriptives

Replicating our previous study (https://jeanmoneger.com/uploads/report_gw1_april2025), we found that firefighters are the apex of heroism, and psychiatrists and welders, not so much.

# 1. Create a summary dataframe for facet annotations (mean and SD)
df_summary <- Set %>%
  group_by(Job) %>%
  summarize(
    mean_score = mean(Heroism, na.rm = TRUE),
    sd_score   = sd(Heroism, na.rm = TRUE),
    .groups = "drop"
  )

# 2. Create the ggplot using the long format data
ggplot(Set, aes(x = Heroism)) +
  geom_histogram(aes(fill = after_stat(count)),
                 binwidth = 1,
                 color = "black", show.legend = FALSE) +
  facet_grid( ~ Job, scales = "free") +
  scale_fill_gradientn(
    colours = brewer.pal(9, "YlOrBr"),
    name = "Count"
  ) +
  labs(
    title = "Histograms of Heroism 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))

It is important to keep in mind that ALL occupations were framed as exposed to danger in the current study. For this reason, perceived exposure to danger is generally quite high - especially for firefighters and welders.

Set$Credibility <- as.numeric(Set$Credibility)
df_long <- Set %>%
  pivot_longer(
    cols = c(Heroism, Danger, Helpfulness, Attitude, Credibility),
    names_to = "Variable",
    values_to = "Score"
  )

# 2. Compute summary statistics by Job and Variable
df_long2<- subset(df_long, df_long$Variable != "Credibility")

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"
  )
df_summary2 <- df_long2 %>%
  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_long2, 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_summary2,
            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)
  )

Manipulation checks

As registered, manipulating helpful frames should influence perceived helpfulness; and manipulating altruistic motivation frames should influence perceived selflessness.

Altruistic outcome

To what extent do you believe the target occupation helps people?Helpfulness condition should increase evaluation of help provided

The Welch Two Sample t-test testing the difference of perceived helpfulness by Help condition (mean in group Help = 6.36, mean in group Unhelp = 5.10) suggests that the effect is positive, statistically significant, and large (difference = 1.26, 95% CI [1.09, 1.43], t(632.43) = 14.53, p < .001; Cohen’s d = 1.02, 95% CI [0.87, 1.17])

Set$Motivation <- factor(Set$Motivation, levels = c("Selfless", "Selfish"))

t.test(Set$Helpfulness ~Set$Help)
## 
##  Welch Two Sample t-test
## 
## data:  Set$Helpfulness by Set$Help
## t = 14.53, df = 632.43, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group Help and group Unhelp is not equal to 0
## 95 percent confidence interval:
##  1.092808 1.434348
## sample estimates:
##   mean in group Help mean in group Unhelp 
##             6.361858             5.098280
cohens_d(t.test(Set$Helpfulness ~Set$Help))
## Cohen's d |       95% CI
## ------------------------
## 1.02      | [0.87, 1.17]
## 
## - Estimated using un-pooled SD.
my_sum <- Set %>%
  group_by(Help) %>%
  summarise( 
    n=n(),
    mean=mean(Helpfulness),
    sd=sd(Helpfulness)
  ) %>%
  mutate( se=sd/sqrt(n))
 
# Standard deviation
ggplot(my_sum) +
  geom_bar( aes(x=Help, y=mean), stat="identity", fill="forestgreen", alpha=0.5) +
  geom_errorbar( aes(x=Help, ymin=mean-se, ymax=mean+se), width=0.4, colour="orange", alpha=0.9, size=1.5) +
  ggtitle("Helpfulness ~ Motivation type (H = Helping; S = Self-improve); bars are SE")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Altruistic motivation

The Welch Two Sample t-test testing the difference of perceived selflessness by Altruistic motivation condition (mean in group Selfless = 5.28, mean in group Selfish = 4.85) suggests that the effect is positive, statistically significant, and small (difference = 0.43, 95% CI [0.22, 0.63], t(810.46) = 4.10, p < .001; Cohen’s d = 0.29, 95% CI [0.15, 0.42]).

t.test(Set$Selfless ~Set$Motivation)
## 
##  Welch Two Sample t-test
## 
## data:  Set$Selfless by Set$Motivation
## t = 4.0986, df = 810.46, p-value = 4.575e-05
## alternative hypothesis: true difference in means between group Selfless and group Selfish is not equal to 0
## 95 percent confidence interval:
##  0.2236695 0.6348156
## sample estimates:
## mean in group Selfless  mean in group Selfish 
##               5.280098               4.850856
cohens_d(Set$Selfless ~ Set$Motivation)
## Cohen's d |       95% CI
## ------------------------
## 0.29      | [0.15, 0.42]
## 
## - Estimated using pooled SD.
my_sum <- Set %>%
  group_by(Motivation) %>%
  summarise( 
    n=n(),
    mean=mean(Selfless),
    sd=sd(Selfless)
  ) %>%
  mutate( se=sd/sqrt(n))
 
# Standard deviation
ggplot(my_sum) +
  geom_bar( aes(x=Motivation, y=mean), stat="identity", fill="forestgreen", alpha=0.5) +
  geom_errorbar( aes(x=Motivation, ymin=mean-se, ymax=mean+se), width=0.4, colour="orange", alpha=0.9, size=1.5) +
  ggtitle("Selfless ~ Motivation type; bars are SE")

Cross over manip check

It is interesting to compare the effect of Helpfulness motivation on Perceived selflessness, and the effect of Selflessness manipulation on perceived helpfulness. Indeed, whereas manipulating selflessness has no effect on perceived helpfulness (people understand that being selfless does not mean being helpful) – manipulating helpfulness influenced the perception of selflessness, with a very similar magnitude as the manipulation of selflessness (!!) –> People understands that, regardless of perceived intentions and self-reported selflessness, an helpful person is a selfless person.

The Welch Two Sample t-test testing the difference of perceived helpfulness by Selflessness condition (mean in group Selfless = 5.80, mean in group Selfish = 5.66) suggests that the effect is positive, statistically not significant, and very small (difference = 0.14, 95% CI [-0.05, 0.33], t(813.94) = 1.47, p = 0.141; Cohen’s d = 0.10, 95% CI [-0.03, 0.24])

The Welch Two Sample t-test testing the difference of perceived selflessness by Helpfulness condition (mean in group Help = 5.29, mean in group Unhelp = 4.84) suggests that the effect is positive, statistically significant, and small (difference = 0.46, 95% CI [0.25, 0.66], t(812.07) = 4.38, p < .001; Cohen’s d = 0.31, 95%CI [0.17, 0.44])

t.test(Set$Selfless ~Set$Help)
## 
##  Welch Two Sample t-test
## 
## data:  Set$Selfless by Set$Help
## t = 4.3784, df = 812.07, p-value = 1.352e-05
## alternative hypothesis: true difference in means between group Help and group Unhelp is not equal to 0
## 95 percent confidence interval:
##  0.2526814 0.6633540
## sample estimates:
##   mean in group Help mean in group Unhelp 
##             5.293399             4.835381
cohens_d(t.test(Set$Selfless ~Set$Help))
## Cohen's d |       95% CI
## ------------------------
## 0.31      | [0.17, 0.44]
## 
## - Estimated using un-pooled SD.
report(t.test(Set$Helpfulness ~Set$Motivation))
## Effect sizes were labelled following Cohen's (1988) recommendations.
## 
## The Welch Two Sample t-test testing the difference of Set$Helpfulness by
## Set$Motivation (mean in group Selfless = 5.80, mean in group Selfish = 5.66)
## suggests that the effect is positive, statistically not significant, and very
## small (difference = 0.14, 95% CI [-0.05, 0.33], t(813.94) = 1.47, p = 0.141;
## Cohen's d = 0.10, 95% CI [-0.03, 0.24])
t.test(Set$Helpfulness ~Set$Motivation)
## 
##  Welch Two Sample t-test
## 
## data:  Set$Helpfulness by Set$Motivation
## t = 1.4718, df = 813.94, p-value = 0.1415
## alternative hypothesis: true difference in means between group Selfless and group Selfish is not equal to 0
## 95 percent confidence interval:
##  -0.04780704  0.33439325
## sample estimates:
## mean in group Selfless  mean in group Selfish 
##               5.803440               5.660147
cohens_d(Set$Helpfulness ~Set$Motivation)
## Cohen's d |        95% CI
## -------------------------
## 0.10      | [-0.03, 0.24]
## 
## - Estimated using pooled SD.

Credibility analyses

We included a credibility check. Participants were asked at the end of the study, “to what extent they found the information presented believable”. Scores range from 1 to 7. We can check the distribution of the credibility rating.

Participants report that the manipulations were overall quite credible. The least credible condition is Selfish and unhelpful psychiatrists. In particular, people might not believe psychiatrists are selfish.

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

ggplot(Cred, aes(x = Score)) +
  geom_histogram(aes(fill = after_stat(count)),
                 binwidth = 1,
                 color = "black", show.legend = FALSE) +
  facet_grid(
    Help + Motivation ~ Job,
    scales = "free"
  ) +
  scale_fill_gradientn(
    colours = RColorBrewer::brewer.pal(9, "YlOrBr"),
    name = "Count"
  ) +
  labs(
    title = "Frequency of Credibility Scores by Job, Help & Motivation",
    x = "Score", y = "Count"
  ) +
  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)
  )

Principal analyses

Hypotheses 1: Manipulation as predictors

SEE REGISTRATION

We will compare the two models (with and without accounting for the occupation condition) to quantify the extent to which the effect of our manipulation is explained by normative differences in occupation type: A significant reduction in the other predictors’ main effect sizes when controlling for Job Type would indicate that these effects are partially dependent on normative evaluations of the job type.

We will base our conclusions regarding the effects of our manipulations irrespective of the job types (i.e., across all jobs) on the Model 1. Model 2 is used to quantify normative evaluation effects in our effects.

mod <-lm(Heroism ~ Help_dummy * Motivation_dummy, data = Set)

mod_cov<-lm(Heroism ~ Help_dummy* Motivation_dummy + Job, data = Set)

anova(mod, mod_cov)
## Analysis of Variance Table
## 
## Model 1: Heroism ~ Help_dummy * Motivation_dummy
## Model 2: Heroism ~ Help_dummy * Motivation_dummy + Job
##   Res.Df    RSS Df Sum of Sq      F    Pr(>F)    
## 1    812 1731.8                                  
## 2    810 1419.9  2    311.86 88.952 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

==> Occupation significantly accounts for Heroism.

Before running the model, we look at some diagnostic plots. Residuals seems normal-ish (qqplot) and homogeneous. As always, there is evidence of extreme Cook’s values. We’ll run the standard registered model, but will also run a robust and a non linear model to assess robustness of our inferences.

In our standard OLS model:

- The effect of Helpfulness condition (dummy coded) is statistically significant and positive (beta = 0.68, 95% CI [0.48, 0.88], t(812) = 6.61, p < .001; Std. beta = 0.23, 95% CI [0.16, 0.29])

- The effect of Motivation condition (dummy coded) is statistically non-significant and positive (beta = 0.19, 95% CI [-9.18e-03, 0.39], t(812) = 1.87, p = 0.061; Std. beta = 0.06, 95% CI [-2.94e-03, 0.13])

So, as expected – we replicate a weak effect of our altruistic motivation condition (see previous report https://jeanmoneger.com/uploads/report_gw1_april2025). However – YayHelpfulness manipulation does influence heroism.

It is quite fascinating: heroes help people regardless of their motivation to help people. It is actually not that relevant to heroism perception whether the workers want to help or not. What matters is whether they help. This is what we wanted to demonstrate.

plot(mod)

summary(mod)
## 
## Call:
## lm(formula = Heroism ~ Help_dummy * Motivation_dummy, data = Set)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.3122 -0.8276  0.1724  1.2157  2.2157 
## 
## Coefficients:
##                             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                  5.14401    0.05112 100.618  < 2e-16 ***
## Help_dummy                   0.67613    0.10225   6.613 6.84e-11 ***
## Motivation_dummy             0.19152    0.10225   1.873   0.0614 .  
## Help_dummy:Motivation_dummy  0.29649    0.20450   1.450   0.1475    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.46 on 812 degrees of freedom
## Multiple R-squared:  0.05724,    Adjusted R-squared:  0.05376 
## F-statistic: 16.43 on 3 and 812 DF,  p-value: 2.243e-10
report(mod)
## We fitted a linear model (estimated using OLS) to predict Heroism with
## Help_dummy and Motivation_dummy (formula: Heroism ~ Help_dummy *
## Motivation_dummy). The model explains a statistically significant and weak
## proportion of variance (R2 = 0.06, F(3, 812) = 16.43, p < .001, adj. R2 =
## 0.05). The model's intercept, corresponding to Help_dummy = 0 and
## Motivation_dummy = 0, is at 5.14 (95% CI [5.04, 5.24], t(812) = 100.62, p <
## .001). Within this model:
## 
##   - The effect of Help dummy is statistically significant and positive (beta =
## 0.68, 95% CI [0.48, 0.88], t(812) = 6.61, p < .001; Std. beta = 0.23, 95% CI
## [0.16, 0.29])
##   - The effect of Motivation dummy is statistically non-significant and positive
## (beta = 0.19, 95% CI [-9.18e-03, 0.39], t(812) = 1.87, p = 0.061; Std. beta =
## 0.06, 95% CI [-2.94e-03, 0.13])
##   - The effect of Help dummy × Motivation dummy is statistically non-significant
## and positive (beta = 0.30, 95% CI [-0.10, 0.70], t(812) = 1.45, p = 0.147; Std.
## beta = 0.05, 95% CI [-0.02, 0.12])
## 
## Standardized parameters were obtained by fitting the model on a standardized
## version of the dataset. 95% Confidence Intervals (CIs) and p-values were
## computed using a Wald t-distribution approximation.

Effect sizes

Partial eta squared:

ModIII <- car::Anova(mod, type = "III")
eta_squared(ModIII, partial = TRUE, alternative = "two.sided")
## Type 3 ANOVAs only give sensible and informative results when covariates
##   are mean-centered and factors are coded with orthogonal contrasts (such
##   as those produced by `contr.sum`, `contr.poly`, or `contr.helmert`, but
##   *not* by the default `contr.treatment`).
## # Effect Size for ANOVA (Type III)
## 
## Parameter                   | Eta2 (partial) |       95% CI
## -----------------------------------------------------------
## Help_dummy                  |           0.05 | [0.03, 0.08]
## Motivation_dummy            |       4.30e-03 | [0.00, 0.02]
## Help_dummy:Motivation_dummy |       2.58e-03 | [0.00, 0.01]

Cohen’s d:

d_help<-effectsize::cohens_d(Set$Heroism ~ Set$Help)


d_self<-effectsize::cohens_d(Set$Heroism ~ Set$Motivation)


results <- data.frame(
  Predictor = c("Helpfulness", "Selflessness"),
  Cohens_d = c(round(d_help$Cohens_d, 2), round(d_self$Cohens_d, 2)),
  CI = c(
    paste0("[", round(d_help$CI_low, 2), ", ", round(d_help$CI_high, 2), "]"),
    paste0("[", round(d_self$CI_low, 2), ", ", round(d_self$CI_high, 2), "]")
  )
)

# Render the table
kable(results, caption = "Cohen's d for Heroism by Predictor", align = "c")
Cohen’s d for Heroism by Predictor
Predictor Cohens_d CI
Helpfulness 0.46 [0.32, 0.6]
Selflessness 0.13 [-0.01, 0.27]

Robustness check

Our main model use ordinal variable as an outcome - it is more appropriate, but less ordinary, to run a Cumulative Link model.

Moreover, there is evidence of influential cases on the basis of Cook’s distance. Using a robust version of the linear model might be indicated.

In order to assess the robustness of our results, we will run the model using 1) a CLM model, and 2) a robust linear model.

CML model

Because the main outcome is an ordinal variable (using integrals), it is unclear whether the model is linear or not. We can fit a cumulative link model, ideal for ordinal outcomes, to assess to what extent this changes our inferences.

# # Fitted values from your model
# fitted_vals <- fitted(mod)
# 
# # Plot observed values against fitted values
# plot(fitted_vals, Set$Heroism,
#      xlab = "Fitted Values",
#      ylab = "Observed Heroes",
#      main = "Observed vs Fitted Values")
# abline(0, 1, col = "blue", lty = 2)

summary(clm(ordered(Heroism) ~ Help_dummy*Motivation_dummy, data = Set, link = "logit"))
## formula: ordered(Heroism) ~ Help_dummy * Motivation_dummy
## data:    Set
## 
##  link  threshold nobs logLik   AIC     niter max.grad cond.H 
##  logit flexible  816  -1372.42 2762.85 6(0)  3.09e-12 7.1e+01
## 
## Coefficients:
##                             Estimate Std. Error z value Pr(>|z|)    
## Help_dummy                    0.8003     0.1266   6.319 2.63e-10 ***
## Motivation_dummy              0.2649     0.1247   2.125   0.0336 *  
## Help_dummy:Motivation_dummy   0.3136     0.2490   1.260   0.2078    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Threshold coefficients:
##     Estimate Std. Error z value
## 1|2 -4.57814    0.33578 -13.634
## 2|3 -2.67982    0.13972 -19.179
## 3|4 -1.96191    0.10557 -18.585
## 4|5 -0.76066    0.07608  -9.998
## 5|6  0.22896    0.07167   3.195
## 6|7  1.26056    0.08489  14.850

==> It does not influence our inferences.

Robust model

As registered: we’ll check for outliers by comparing robust vs non robust models.

Cook’s distance plot does show that there are some influential cases:

ols_plot_cooksd_bar(mod, type = 1)

To account for potential influential cases, we run Robust regression (huber weighted, MM-estimates, tuned to achieve 50% breakdown and 95% Gaussian efficiency).

summary(modrob<-lmrob(Set$Heroism ~ Set$Help_dummy*Set$Motivation_dummy))
## 
## Call:
## lmrob(formula = Set$Heroism ~ Set$Help_dummy * Set$Motivation_dummy)
##  \--> method = "MM"
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -4.38635 -0.91267  0.08733  1.17555  2.17555 
## 
## Coefficients:
##                                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                          5.21183    0.05526  94.310  < 2e-16 ***
## Set$Help_dummy                       0.68653    0.10750   6.386 2.86e-10 ***
## Set$Motivation_dummy                 0.21285    0.10766   1.977   0.0484 *  
## Set$Help_dummy:Set$Motivation_dummy  0.24927    0.21505   1.159   0.2467    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Robust residual standard error: 1.51 
## Multiple R-squared:  0.05734,    Adjusted R-squared:  0.05385 
## Convergence in 10 IRWLS iterations
## 
## Robustness weights: 
##  51 weights are ~= 1. The remaining 765 ones are summarized as
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.3790  0.8848  0.9455  0.9147  0.9850  0.9988 
## Algorithmic parameters: 
##        tuning.chi                bb        tuning.psi        refine.tol 
##         1.548e+00         5.000e-01         4.685e+00         1.000e-07 
##           rel.tol         scale.tol         solve.tol          zero.tol 
##         1.000e-07         1.000e-10         1.000e-07         1.000e-10 
##       eps.outlier             eps.x warn.limit.reject warn.limit.meanrw 
##         1.225e-04         1.819e-12         5.000e-01         5.000e-01 
##      nResample         max.it       best.r.s       k.fast.s          k.max 
##            500             50              2              1            200 
##    maxit.scale      trace.lev            mts     compute.rd fast.s.large.n 
##            200              0           1000              0           2000 
##                   psi           subsampling                   cov 
##            "bisquare"         "nonsingular"         ".vcov.avar1" 
## compute.outlier.stats 
##                  "SM" 
## seed : int(0)
paste0("Weights applied to residuals - a value of zero would mean that the observation was discarded, a value of 1 means no re-weighting")
## [1] "Weights applied to residuals - a value of zero would mean that the observation was discarded, a value of 1 means no re-weighting"
plot(modrob$rweights)

==> It does not influence our inferences.


H1 Job interaction and decomposition

How does occupation change the effect of our predictors on Heroism? i.e., are these effects stronger for welders? Firefighters? Psychiatrists?

anova(lm(Heroism ~ Help_dummy * Motivation_dummy * Job, data = Set))
## Analysis of Variance Table
## 
## Response: Heroism
##                                  Df  Sum Sq Mean Sq F value    Pr(>F)    
## Help_dummy                        1   93.16  93.158 55.5299 2.380e-13 ***
## Motivation_dummy                  1    7.51   7.511  4.4772   0.03466 *  
## Job                               2  311.46 155.728 92.8269 < 2.2e-16 ***
## Help_dummy:Motivation_dummy       1    4.89   4.890  2.9150   0.08814 .  
## Help_dummy:Job                    2   67.19  33.596 20.0261 3.254e-09 ***
## Motivation_dummy:Job              2    0.93   0.466  0.2775   0.75774    
## Help_dummy:Motivation_dummy:Job   2    2.99   1.496  0.8917   0.41034    
## Residuals                       804 1348.81   1.678                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

==> There is evidence that our Helpfulness manipulation is ingluenced by occupation. However, the same cannot be said for our selflessness manipulation. Let’s investigate how effects are modulated within each occupation.

The table below sum up key statistics for each manipulation within each occupation.

Firef <- subset(Set, Set$Job == "F")
Psych <- subset(Set, Set$Job == "P")
Weld <- subset(Set, Set$Job == "W")

# A list of our models
mods <- list(
  Firefighter = lm(Heroism ~ Motivation_dummy * Help_dummy, data = Firef),
  Psychologist = lm(Heroism ~ Motivation_dummy * Help_dummy, data = Psych),
  Welder       = lm(Heroism ~ Motivation_dummy * Help_dummy, data = Weld)
)

# tidy + bind + format
table1 <- bind_rows(
  lapply(names(mods), function(occ) {
    broom::tidy(mods[[occ]], conf.int = TRUE) %>%
      mutate(Occupation = occ)
  }),
  .id = NULL
) %>%
    filter(term != "(Intercept)") %>%        # drop intercepts
  mutate(
    CI = paste0("[", round(conf.low, 2), ", ", round(conf.high, 2), "]"), # Format a CI string
    Beta = round(estimate, 2),
    t     = round(statistic, 2),
    p     = sprintf("%.3f", p.value)
  ) %>%
  select(
    Occupation,
    Predictor = term,
    Beta,
    `95% CI` = CI,
    t,
    `p‐value` = p
  )


# render
kable(
  table1,
  caption = "Table 1. Regression coefficients by occupation",
  align   = "c"
)
Table 1. Regression coefficients by occupation
Occupation Predictor Beta 95% CI t p‐value
Firefighter Motivation_dummy 0.16 [-0.13, 0.44] 1.08 0.281
Firefighter Help_dummy 0.18 [-0.1, 0.47] 1.27 0.205
Firefighter Motivation_dummy:Help_dummy 0.60 [0.03, 1.17] 2.09 0.038
Psychologist Motivation_dummy 0.27 [-0.06, 0.59] 1.60 0.111
Psychologist Help_dummy 0.38 [0.05, 0.7] 2.26 0.025
Psychologist Motivation_dummy:Help_dummy 0.35 [-0.31, 1] 1.04 0.300
Welder Motivation_dummy 0.11 [-0.21, 0.42] 0.67 0.506
Welder Help_dummy 1.49 [1.17, 1.8] 9.29 0.000
Welder Motivation_dummy:Help_dummy 0.01 [-0.62, 0.64] 0.02 0.981
d_F_Help <- cohens_d(Heroism ~ Help,       data = Firef)
d_F_Mot  <- cohens_d(Heroism ~ Motivation, data = Firef)
d_P_Help <- cohens_d(Heroism ~ Help,       data = Psych)
d_P_Mot  <- cohens_d(Heroism ~ Motivation, data = Psych)
d_W_Help <- cohens_d(Heroism ~ Help,       data = Weld)
d_W_Mot  <- cohens_d(Heroism ~ Motivation, data = Weld)

# assemble into a single data.frame
table2 <- bind_rows(
  data.frame(
    Occupation = "Firefighter",
    Predictor  = "Helpfulness",
    d          = round(d_F_Help$Cohens_d, 2),
    CI         = paste0("[", round(d_F_Help$CI_low, 2), ", ", round(d_F_Help$CI_high, 2), "]")
  ),
  data.frame(
    Occupation = "Firefighter",
    Predictor  = "Motivation",
    d          = round(d_F_Mot$Cohens_d, 2),
    CI         = paste0("[", round(d_F_Mot$CI_low, 2), ", ", round(d_F_Mot$CI_high, 2), "]")
  ),
  data.frame(
    Occupation = "Psychologist",
    Predictor  = "Helpfulness",
    d          = round(d_P_Help$Cohens_d, 2),
    CI         = paste0("[", round(d_P_Help$CI_low, 2), ", ", round(d_P_Help$CI_high, 2), "]")
  ),
  data.frame(
    Occupation = "Psychologist",
    Predictor  = "Motivation",
    d          = round(d_P_Mot$Cohens_d, 2),
    CI         = paste0("[", round(d_P_Mot$CI_low, 2), ", ", round(d_P_Mot$CI_high, 2), "]")
  ),
  data.frame(
    Occupation = "Welder",
    Predictor  = "Helpfulness",
    d          = round(d_W_Help$Cohens_d, 2),
    CI         = paste0("[", round(d_W_Help$CI_low, 2), ", ", round(d_W_Help$CI_high, 2), "]")
  ),
  data.frame(
    Occupation = "Welder",
    Predictor  = "Motivation",
    d          = round(d_W_Mot$Cohens_d, 2),
    CI         = paste0("[", round(d_W_Mot$CI_low, 2), ", ", round(d_W_Mot$CI_high, 2), "]")
  )
) %>%
  rename(`Cohen's d` = d)

# render
kable(
  table2,
  caption = "Table 2. Cohen’s d by occupation and predictor",
  align   = "c"
)
Table 2. Cohen’s d by occupation and predictor
Occupation Predictor Cohen’s d CI
Firefighter Helpfulness 0.15 [-0.08, 0.39]
Firefighter Motivation 0.13 [-0.11, 0.37]
Psychologist Helpfulness 0.27 [0.03, 0.51]
Psychologist Motivation 0.19 [-0.05, 0.42]
Welder Helpfulness 1.14 [0.88, 1.39]
Welder Motivation 0.09 [-0.15, 0.33]

The Helpfulness manipulation is effective for psychiatrists and welders (particularly welders).

However, it proves ineffective in Firefighters.

In all likelihood - protecting buildings is still helping people.

Robustness check

We can explore the robustness of our inferences by using attitude or credibility as covariate. Basically, this will test whether our effect(s) are conditioned on attitude (see Halo effect) or credibility of the manipulation. In the previous study, we found that selflessness manipulation was conditionned on attitude and credibility, suggestion mediation effects whereby framing selflessness influenced perceived heroism through influencing attitude. In itself, it’s not a problem – but we’d rather find a component that has a direct effect on heroism, that is, a component that is part of the essential definition of heroism.

Attitude as a covariate

summary(lm(Heroism ~ Help_dummy * Motivation_dummy + scale(Attitude), data = Set))
## 
## Call:
## lm(formula = Heroism ~ Help_dummy * Motivation_dummy + scale(Attitude), 
##     data = Set)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.9065 -0.3620  0.0017  0.8499  3.7740 
## 
## Coefficients:
##                             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                  5.14434    0.03883 132.474  < 2e-16 ***
## Help_dummy                   0.25473    0.07956   3.202  0.00142 ** 
## Motivation_dummy             0.03309    0.07794   0.425  0.67129    
## scale(Attitude)              0.97534    0.03994  24.421  < 2e-16 ***
## Help_dummy:Motivation_dummy  0.24991    0.15534   1.609  0.10806    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.109 on 811 degrees of freedom
## Multiple R-squared:  0.4567, Adjusted R-squared:  0.4541 
## F-statistic: 170.5 on 4 and 811 DF,  p-value: < 2.2e-16
report(lm(Heroism ~ Help_dummy * Motivation_dummy + scale(Attitude), data = Set))
## We fitted a linear model (estimated using OLS) to predict Heroism with
## Help_dummy, Motivation_dummy and Attitude (formula: Heroism ~ Help_dummy *
## Motivation_dummy + scale(Attitude)). The model explains a statistically
## significant and substantial proportion of variance (R2 = 0.46, F(4, 811) =
## 170.46, p < .001, adj. R2 = 0.45). The model's intercept, corresponding to
## Help_dummy = 0, Motivation_dummy = 0 and Attitude = 0, is at 5.14 (95% CI
## [5.07, 5.22], t(811) = 132.47, p < .001). Within this model:
## 
##   - The effect of Help dummy is statistically significant and positive (beta =
## 0.25, 95% CI [0.10, 0.41], t(811) = 3.20, p = 0.001; Std. beta = 0.08, 95% CI
## [0.03, 0.14])
##   - The effect of Motivation dummy is statistically non-significant and positive
## (beta = 0.03, 95% CI [-0.12, 0.19], t(811) = 0.42, p = 0.671; Std. beta = 0.01,
## 95% CI [-0.04, 0.06])
##   - The effect of Attitude is statistically significant and positive (beta =
## 0.98, 95% CI [0.90, 1.05], t(811) = 24.42, p < .001; Std. beta = 0.65, 95% CI
## [0.60, 0.70])
##   - The effect of Help dummy × Motivation dummy is statistically non-significant
## and positive (beta = 0.25, 95% CI [-0.06, 0.55], t(811) = 1.61, p = 0.108; Std.
## beta = 0.04, 95% CI [-9.17e-03, 0.09])
## 
## Standardized parameters were obtained by fitting the model on a standardized
## version of the dataset. 95% Confidence Intervals (CIs) and p-values were
## computed using a Wald t-distribution approximation.

==> Our Helpfulness manipulation is robust to accounting for Attitude, i.e., the effect of helpfulness on heroism might be direct (rather than mediated through attitude). Helpfulness can influence Attitude-free ratings of heroism.

Replicating our previous study, the same cannot be said about Selflessness conditions -> The effect of selflessness is nullified when accounting for attitude, suggesting a mediation pattern.

Credibility as a covariate

summary(lm(Heroism ~ Help_dummy * Motivation_dummy + scale(Credibility), data = Set))
## 
## Call:
## lm(formula = Heroism ~ Help_dummy * Motivation_dummy + scale(Credibility), 
##     data = Set)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.3843 -0.8267  0.1733  1.0158  3.2885 
## 
## Coefficients:
##                             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                  5.14403    0.04939 104.143  < 2e-16 ***
## Help_dummy                   0.55376    0.10007   5.534 4.23e-08 ***
## Motivation_dummy             0.08292    0.09980   0.831   0.4063    
## scale(Credibility)           0.38900    0.05069   7.674 4.80e-14 ***
## Help_dummy:Motivation_dummy  0.40849    0.19811   2.062   0.0395 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.411 on 811 degrees of freedom
## Multiple R-squared:  0.1211, Adjusted R-squared:  0.1167 
## F-statistic: 27.93 on 4 and 811 DF,  p-value: < 2.2e-16
report(lm(Heroism ~ Help_dummy * Motivation_dummy + scale(Credibility), data = Set))
## We fitted a linear model (estimated using OLS) to predict Heroism with
## Help_dummy, Motivation_dummy and Credibility (formula: Heroism ~ Help_dummy *
## Motivation_dummy + scale(Credibility)). The model explains a statistically
## significant and weak proportion of variance (R2 = 0.12, F(4, 811) = 27.93, p <
## .001, adj. R2 = 0.12). The model's intercept, corresponding to Help_dummy = 0,
## Motivation_dummy = 0 and Credibility = 0, is at 5.14 (95% CI [5.05, 5.24],
## t(811) = 104.14, p < .001). Within this model:
## 
##   - The effect of Help dummy is statistically significant and positive (beta =
## 0.55, 95% CI [0.36, 0.75], t(811) = 5.53, p < .001; Std. beta = 0.18, 95% CI
## [0.12, 0.25])
##   - The effect of Motivation dummy is statistically non-significant and positive
## (beta = 0.08, 95% CI [-0.11, 0.28], t(811) = 0.83, p = 0.406; Std. beta = 0.03,
## 95% CI [-0.04, 0.09])
##   - The effect of Credibility is statistically significant and positive (beta =
## 0.39, 95% CI [0.29, 0.49], t(811) = 7.67, p < .001; Std. beta = 0.26, 95% CI
## [0.19, 0.33])
##   - The effect of Help dummy × Motivation dummy is statistically significant and
## positive (beta = 0.41, 95% CI [0.02, 0.80], t(811) = 2.06, p = 0.040; Std. beta
## = 0.07, 95% CI [3.27e-03, 0.13])
## 
## Standardized parameters were obtained by fitting the model on a standardized
## version of the dataset. 95% Confidence Intervals (CIs) and p-values were
## computed using a Wald t-distribution approximation.

==> Same conclusions! Our helpfulness manipulation is robust to accounting for credibility of the manipulation, meaning this effect happens independently of any effect of the manipulation on credibility (see appendix), meaning: the effect of this manipulation is not explained by the fact that some conditions are more credible than others. ___

Hypotheses 2: Situation attributions as predictors

We repeat these analyses but using Situation attributions as predictors. Our results perfectly replicate the previous study, so I will not comment on them (please see previous pilot studies: https://jeanmoneger.com/uploads/report_gw1_april2025)

Model comparison with job

Set$Danger_scale <- scale(Set$Danger)
Set$Helpfulness_scale <- scale(Set$Helpfulness)

(mod<-lm(Heroism ~ Helpfulness_scale * Danger_scale , data = Set))
## 
## Call:
## lm(formula = Heroism ~ Helpfulness_scale * Danger_scale, data = Set)
## 
## Coefficients:
##                    (Intercept)               Helpfulness_scale  
##                         5.1144                          0.7724  
##                   Danger_scale  Helpfulness_scale:Danger_scale  
##                         0.3867                          0.1209
mod_cov<-lm(Heroism ~ Helpfulness_scale * Danger_scale + Job , data = Set)
anova(mod, mod_cov)
## Analysis of Variance Table
## 
## Model 1: Heroism ~ Helpfulness_scale * Danger_scale
## Model 2: Heroism ~ Helpfulness_scale * Danger_scale + Job
##   Res.Df    RSS Df Sum of Sq      F    Pr(>F)    
## 1    812 1132.4                                  
## 2    810 1040.5  2    91.853 35.751 1.321e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

H2 Model comparison with attitude

To account for a possible Halo effect, let’s see if attitudes play a role in explaining heroism.

Set$Attitude_scale <- scale(Set$Attitude)
(mod<-lm(Heroism ~ Helpfulness_scale * Danger_scale , data = Set))
## 
## Call:
## lm(formula = Heroism ~ Helpfulness_scale * Danger_scale, data = Set)
## 
## Coefficients:
##                    (Intercept)               Helpfulness_scale  
##                         5.1144                          0.7724  
##                   Danger_scale  Helpfulness_scale:Danger_scale  
##                         0.3867                          0.1209
summary(mod_cov2<-lm(Heroism ~ Helpfulness_scale * Danger_scale + Attitude_scale , data = Set))
## 
## Call:
## lm(formula = Heroism ~ Helpfulness_scale * Danger_scale + Attitude_scale, 
##     data = Set)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.3600 -0.3650  0.1466  0.6400  3.6651 
## 
## Coefficients:
##                                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                     5.13051    0.03729 137.572  < 2e-16 ***
## Helpfulness_scale               0.43885    0.04387  10.004  < 2e-16 ***
## Danger_scale                    0.16570    0.04226   3.921 9.56e-05 ***
## Attitude_scale                  0.70034    0.04666  15.011  < 2e-16 ***
## Helpfulness_scale:Danger_scale  0.05638    0.02875   1.961   0.0502 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.045 on 811 degrees of freedom
## Multiple R-squared:  0.5176, Adjusted R-squared:  0.5152 
## F-statistic: 217.5 on 4 and 811 DF,  p-value: < 2.2e-16
anova(mod, mod_cov2)
## Analysis of Variance Table
## 
## Model 1: Heroism ~ Helpfulness_scale * Danger_scale
## Model 2: Heroism ~ Helpfulness_scale * Danger_scale + Attitude_scale
##   Res.Df     RSS Df Sum of Sq      F    Pr(>F)    
## 1    812 1132.39                                  
## 2    811  886.18  1    246.21 225.32 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

H2 Main registered model

summary(mod)
## 
## Call:
## lm(formula = Heroism ~ Helpfulness_scale * Danger_scale, data = Set)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.1796 -0.6193  0.3633  0.8204  3.6220 
## 
## Coefficients:
##                                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                     5.11437    0.04211 121.443  < 2e-16 ***
## Helpfulness_scale               0.77243    0.04273  18.078  < 2e-16 ***
## Danger_scale                    0.38667    0.04475   8.641  < 2e-16 ***
## Helpfulness_scale:Danger_scale  0.12092    0.03212   3.765 0.000178 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.181 on 812 degrees of freedom
## Multiple R-squared:  0.3835, Adjusted R-squared:  0.3813 
## F-statistic: 168.4 on 3 and 812 DF,  p-value: < 2.2e-16
confint(mod)
##                                     2.5 %    97.5 %
## (Intercept)                    5.03170383 5.1970316
## Helpfulness_scale              0.68855824 0.8562944
## Danger_scale                   0.29883544 0.4745117
## Helpfulness_scale:Danger_scale 0.05788199 0.1839585
report(mod) 
## We fitted a linear model (estimated using OLS) to predict Heroism with
## Helpfulness_scale and Danger_scale (formula: Heroism ~ Helpfulness_scale *
## Danger_scale). The model explains a statistically significant and substantial
## proportion of variance (R2 = 0.38, F(3, 812) = 168.40, p < .001, adj. R2 =
## 0.38). The model's intercept, corresponding to Helpfulness_scale = 0 and
## Danger_scale = 0, is at 5.11 (95% CI [5.03, 5.20], t(812) = 121.44, p < .001).
## Within this model:
## 
##   - The effect of Helpfulness scale is statistically significant and positive
## (beta = 0.77, 95% CI [0.69, 0.86], t(812) = 18.08, p < .001; Std. beta = 0.51,
## 95% CI [0.46, 0.57])
##   - The effect of Danger scale is statistically significant and positive (beta =
## 0.39, 95% CI [0.30, 0.47], t(812) = 8.64, p < .001; Std. beta = 0.26, 95% CI
## [0.20, 0.32])
##   - The effect of Helpfulness scale × Danger scale is statistically significant
## and positive (beta = 0.12, 95% CI [0.06, 0.18], t(812) = 3.77, p < .001; Std.
## beta = 0.08, 95% CI [0.04, 0.12])
## 
## Standardized parameters were obtained by fitting the model on a standardized
## version of the dataset. 95% Confidence Intervals (CIs) and p-values were
## computed using a Wald t-distribution approximation.
ModIII <- car::Anova(mod, type = "III")
eta_squared(ModIII, partial = TRUE)
## Type 3 ANOVAs only give sensible and informative results when covariates
##   are mean-centered and factors are coded with orthogonal contrasts (such
##   as those produced by `contr.sum`, `contr.poly`, or `contr.helmert`, but
##   *not* by the default `contr.treatment`).
## # Effect Size for ANOVA (Type III)
## 
## Parameter                      | Eta2 (partial) |       95% CI
## --------------------------------------------------------------
## Helpfulness_scale              |           0.29 | [0.25, 1.00]
## Danger_scale                   |           0.08 | [0.06, 1.00]
## Helpfulness_scale:Danger_scale |           0.02 | [0.01, 1.00]
## 
## - One-sided CIs: upper bound fixed at [1.00].

Let’s assess this significant interaction:

interact_plot(mod, pred = "Danger_scale", modx = "Helpfulness_scale")
## Warning: 0.999999999999999 is outside the observed range of Helpfulness_scale

Accounting for a possible halo effects by controlling for attitude, does not change our main inferences:

summary(mod_cov2)
## 
## Call:
## lm(formula = Heroism ~ Helpfulness_scale * Danger_scale + Attitude_scale, 
##     data = Set)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.3600 -0.3650  0.1466  0.6400  3.6651 
## 
## Coefficients:
##                                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                     5.13051    0.03729 137.572  < 2e-16 ***
## Helpfulness_scale               0.43885    0.04387  10.004  < 2e-16 ***
## Danger_scale                    0.16570    0.04226   3.921 9.56e-05 ***
## Attitude_scale                  0.70034    0.04666  15.011  < 2e-16 ***
## Helpfulness_scale:Danger_scale  0.05638    0.02875   1.961   0.0502 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.045 on 811 degrees of freedom
## Multiple R-squared:  0.5176, Adjusted R-squared:  0.5152 
## F-statistic: 217.5 on 4 and 811 DF,  p-value: < 2.2e-16

Assumption checks

plot(mod)

Model Linearity

# Fitted values from your model
fitted_vals <- fitted(mod)

# Plot observed values against fitted values
plot(fitted_vals, Set$Heroism,
     xlab = "Fitted Values",
     ylab = "Observed Heroes",
     main = "Observed vs Fitted Values")
abline(0, 1, col = "blue", lty = 2)

library(ordinal)

# Fit a cumulative link mixed model
Set$Heroes_ord <- factor(Set$Heroism, ordered = TRUE)

# Now fit the cumulative link mixed model
clm_mod <- clm(Heroes_ord ~ Danger_scale * Helpfulness_scale, data = Set, link = "logit")

# Summarize the cumulative link mixed model
summary(clm_mod)
## formula: Heroes_ord ~ Danger_scale * Helpfulness_scale
## data:    Set
## 
##  link  threshold nobs logLik   AIC     niter max.grad cond.H 
##  logit flexible  816  -1185.27 2388.53 6(0)  2.68e-11 9.0e+01
## 
## Coefficients:
##                                Estimate Std. Error z value Pr(>|z|)    
## Danger_scale                    0.66214    0.07131   9.285  < 2e-16 ***
## Helpfulness_scale               1.24085    0.07736  16.041  < 2e-16 ***
## Danger_scale:Helpfulness_scale  0.24902    0.04694   5.305 1.13e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Threshold coefficients:
##     Estimate Std. Error z value
## 1|2 -5.63456    0.35635 -15.812
## 2|3 -3.52836    0.16930 -20.841
## 3|4 -2.63552    0.13151 -20.040
## 4|5 -1.03947    0.09036 -11.504
## 5|6  0.33391    0.08253   4.046
## 6|7  1.74565    0.10085  17.309

H2 Outliers analyses

Cook’s distance plot:

ols_plot_cooksd_bar(mod)

Outlier analyses through model comparison with a robust model:

summary(Robmod<-lmrob(Heroism ~ Danger_scale * Helpfulness_scale, data = Set))
## 
## Call:
## lmrob(formula = Heroism ~ Danger_scale * Helpfulness_scale, data = Set)
##  \--> method = "MM"
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.4386 -0.7440  0.2217  0.5614  3.8628 
## 
## Coefficients:
##                                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                     5.23539    0.04384 119.430  < 2e-16 ***
## Danger_scale                    0.44333    0.04188  10.585  < 2e-16 ***
## Helpfulness_scale               0.85308    0.04708  18.118  < 2e-16 ***
## Danger_scale:Helpfulness_scale  0.15602    0.02292   6.808 1.93e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Robust residual standard error: 0.9325 
## Multiple R-squared:  0.511,  Adjusted R-squared:  0.5092 
## Convergence in 11 IRWLS iterations
## 
## Robustness weights: 
##  4 observations c(260,408,622,678) are outliers with |weight| = 0 ( < 0.00012); 
##  33 weights are ~= 1. The remaining 779 ones are summarized as
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## 0.005089 0.849700 0.956900 0.878200 0.979900 0.998700 
## Algorithmic parameters: 
##        tuning.chi                bb        tuning.psi        refine.tol 
##         1.548e+00         5.000e-01         4.685e+00         1.000e-07 
##           rel.tol         scale.tol         solve.tol          zero.tol 
##         1.000e-07         1.000e-10         1.000e-07         1.000e-10 
##       eps.outlier             eps.x warn.limit.reject warn.limit.meanrw 
##         1.225e-04         3.735e-11         5.000e-01         5.000e-01 
##      nResample         max.it       best.r.s       k.fast.s          k.max 
##            500             50              2              1            200 
##    maxit.scale      trace.lev            mts     compute.rd fast.s.large.n 
##            200              0           1000              0           2000 
##                   psi           subsampling                   cov 
##            "bisquare"         "nonsingular"         ".vcov.avar1" 
## compute.outlier.stats 
##                  "SM" 
## seed : int(0)

Decomposition of the effects within job

Let’s see if there is an higher-order job interaction:

anova(lm(Heroism ~ Helpfulness_scale*Danger_scale*Job, data = Set))
## Analysis of Variance Table
## 
## Response: Heroism
##                                     Df  Sum Sq Mean Sq  F value    Pr(>F)    
## Helpfulness_scale                    1  598.23  598.23 464.4557 < 2.2e-16 ***
## Danger_scale                         1   86.55   86.55  67.1924 9.692e-16 ***
## Job                                  2  101.06   50.53  39.2294 < 2.2e-16 ***
## Helpfulness_scale:Danger_scale       1   10.57   10.57   8.2044  0.004288 ** 
## Helpfulness_scale:Job                2    1.54    0.77   0.5962  0.551128    
## Danger_scale:Job                     2    1.80    0.90   0.6987  0.497549    
## Helpfulness_scale:Danger_scale:Job   2    1.63    0.82   0.6329  0.531327    
## Residuals                          804 1035.57    1.29                       
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

The helpfulness effect appears to be influenced by Job. Let’s see what happens within each job. Take a look at the weak-to-non-significant interactions between danger and helpfulness.

Firefighters

paste0("Firefighter analysis")
## [1] "Firefighter analysis"
Firef<-subset(Set, Set$Job == "F")
summary(FireMod<-lm(Heroism ~ Danger_scale * Helpfulness_scale, data = Firef))
## 
## Call:
## lm(formula = Heroism ~ Danger_scale * Helpfulness_scale, data = Firef)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.5463 -0.5463  0.4199  0.4537  2.2978 
## 
## Coefficients:
##                                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                     5.63675    0.07790  72.356  < 2e-16 ***
## Danger_scale                    0.40825    0.08652   4.719 3.83e-06 ***
## Helpfulness_scale               0.64598    0.10693   6.041 5.10e-09 ***
## Danger_scale:Helpfulness_scale  0.03617    0.05520   0.655    0.513    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.005 on 268 degrees of freedom
## Multiple R-squared:  0.2999, Adjusted R-squared:  0.2921 
## F-statistic: 38.28 on 3 and 268 DF,  p-value: < 2.2e-16
FfMod_typeIII <- car::Anova(FireMod, type = "III")
eta_squared(FfMod_typeIII, partial = TRUE)
## Type 3 ANOVAs only give sensible and informative results when covariates
##   are mean-centered and factors are coded with orthogonal contrasts (such
##   as those produced by `contr.sum`, `contr.poly`, or `contr.helmert`, but
##   *not* by the default `contr.treatment`).
## # Effect Size for ANOVA (Type III)
## 
## Parameter                      | Eta2 (partial) |       95% CI
## --------------------------------------------------------------
## Danger_scale                   |           0.08 | [0.03, 1.00]
## Helpfulness_scale              |           0.12 | [0.07, 1.00]
## Danger_scale:Helpfulness_scale |       1.60e-03 | [0.00, 1.00]
## 
## - One-sided CIs: upper bound fixed at [1.00].

In firefighters: Heroism is driven bu Helpfulness, and then Danger. No interaction.

Psychiatrists

paste0("Psy analysis")
## [1] "Psy analysis"
PsyRole<- subset(Set, Set$Job == "P")
PsyRole$Danger <- scale(PsyRole$Danger)
PsyRole$Helpfulness <- scale(PsyRole$Helpfulness)


summary(PsyMod<-lm(Heroism ~ Danger * Helpfulness, data = PsyRole))
## 
## Call:
## lm(formula = Heroism ~ Danger * Helpfulness, data = PsyRole)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.8074 -0.7717  0.1926  0.7176  3.4248 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         4.68036    0.07198  65.024  < 2e-16 ***
## Danger              0.33949    0.07293   4.655 5.08e-06 ***
## Helpfulness         0.61932    0.07319   8.462 1.67e-15 ***
## Danger:Helpfulness  0.10330    0.06233   1.657   0.0986 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.158 on 271 degrees of freedom
## Multiple R-squared:  0.3147, Adjusted R-squared:  0.3071 
## F-statistic: 41.48 on 3 and 271 DF,  p-value: < 2.2e-16
PsyTypeIII <- car::Anova(PsyMod, type = "III")
eta_squared(PsyTypeIII, partial = TRUE)
## Type 3 ANOVAs only give sensible and informative results when covariates
##   are mean-centered and factors are coded with orthogonal contrasts (such
##   as those produced by `contr.sum`, `contr.poly`, or `contr.helmert`, but
##   *not* by the default `contr.treatment`).
## # Effect Size for ANOVA (Type III)
## 
## Parameter          | Eta2 (partial) |       95% CI
## --------------------------------------------------
## Danger             |           0.07 | [0.03, 1.00]
## Helpfulness        |           0.21 | [0.14, 1.00]
## Danger:Helpfulness |           0.01 | [0.00, 1.00]
## 
## - One-sided CIs: upper bound fixed at [1.00].
sim_slopes(PsyMod, pred = Danger, modx = Helpfulness)
## JOHNSON-NEYMAN INTERVAL
## 
## When Helpfulness is INSIDE the interval [-1.27, 16.98], the slope of Danger
## is p < .05.
## 
## Note: The range of observed values of Helpfulness is [-3.19, 1.04]
## 
## SIMPLE SLOPES ANALYSIS
## 
## Slope of Danger when Helpfulness = -1.000000e+00 (- 1 SD): 
## 
##   Est.   S.E.   t val.      p
## ------ ------ -------- ------
##   0.24   0.09     2.51   0.01
## 
## Slope of Danger when Helpfulness = -1.316119e-16 (Mean): 
## 
##   Est.   S.E.   t val.      p
## ------ ------ -------- ------
##   0.34   0.07     4.65   0.00
## 
## Slope of Danger when Helpfulness =  1.000000e+00 (+ 1 SD): 
## 
##   Est.   S.E.   t val.      p
## ------ ------ -------- ------
##   0.44   0.10     4.54   0.00
interact_plot(PsyMod, pred = Danger, modx = Helpfulness)

# etc.

Psychiatrists heroism is largely derived from both Helpfulness (21%) but not so much by Danger (7%). The interaction is not significant.

Welders

paste0("Welders analysis")
## [1] "Welders analysis"
Weld<- subset(Set, Set$Job == "W")
Weld$Danger <- scale(Weld$Danger)
Weld$Helpfulness <- scale(Weld$Helpfulness)


summary(WeldMod<-lm(Heroism ~ Danger * Helpfulness, data = Weld))
## 
## Call:
## lm(formula = Heroism ~ Danger * Helpfulness, data = Weld)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.8375 -0.7809  0.1625  0.8412  3.2324 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         4.67804    0.07613  61.450  < 2e-16 ***
## Danger              0.24276    0.08671   2.800  0.00549 ** 
## Helpfulness         0.80637    0.07710  10.459  < 2e-16 ***
## Danger:Helpfulness  0.13076    0.06032   2.168  0.03105 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.23 on 265 degrees of freedom
## Multiple R-squared:  0.3402, Adjusted R-squared:  0.3328 
## F-statistic: 45.55 on 3 and 265 DF,  p-value: < 2.2e-16
WeldTypeIII <- car::Anova(WeldMod, type = "III")
eta_squared(WeldTypeIII, partial = TRUE)
## Type 3 ANOVAs only give sensible and informative results when covariates
##   are mean-centered and factors are coded with orthogonal contrasts (such
##   as those produced by `contr.sum`, `contr.poly`, or `contr.helmert`, but
##   *not* by the default `contr.treatment`).
## # Effect Size for ANOVA (Type III)
## 
## Parameter          | Eta2 (partial) |       95% CI
## --------------------------------------------------
## Danger             |           0.03 | [0.00, 1.00]
## Helpfulness        |           0.29 | [0.22, 1.00]
## Danger:Helpfulness |           0.02 | [0.00, 1.00]
## 
## - One-sided CIs: upper bound fixed at [1.00].
sim_slopes(WeldMod, pred = Danger, modx = Helpfulness)
## JOHNSON-NEYMAN INTERVAL
## 
## When Helpfulness is OUTSIDE the interval [-14.27, -0.70], the slope of
## Danger is p < .05.
## 
## Note: The range of observed values of Helpfulness is [-2.44, 1.14]
## 
## SIMPLE SLOPES ANALYSIS
## 
## Slope of Danger when Helpfulness = -1.000000e+00 (- 1 SD): 
## 
##   Est.   S.E.   t val.      p
## ------ ------ -------- ------
##   0.11   0.08     1.41   0.16
## 
## Slope of Danger when Helpfulness =  2.596023e-16 (Mean): 
## 
##   Est.   S.E.   t val.      p
## ------ ------ -------- ------
##   0.24   0.09     2.80   0.01
## 
## Slope of Danger when Helpfulness =  1.000000e+00 (+ 1 SD): 
## 
##   Est.   S.E.   t val.      p
## ------ ------ -------- ------
##   0.37   0.13     2.96   0.00
interact_plot(WeldMod, pred = Danger, modx = Helpfulness)

# etc.

Welders are heroic because of helpfulness (29%), but not that much because of the danger exposure (3%). Again Let’s keep in mind that this third pilot study is centered on the Danger condition.


Hypotheses 3: Character attributions as predictors

We repeat these analyses but using Character attributions (brave and selfless) as predictors. Our results perfectly replicate the previous study, so I will not comment on them (please see previous pilot studies: https://jeanmoneger.com/uploads/report_gw1_april2025)

Model comparison with job

Set$Brave_scale <- scale(Set$Brave)
Set$Selfless_scale <- scale(Set$Selfless)

(mod<-lm(Heroism ~ Selfless_scale * Brave_scale , data = Set))
## 
## Call:
## lm(formula = Heroism ~ Selfless_scale * Brave_scale, data = Set)
## 
## Coefficients:
##                (Intercept)              Selfless_scale  
##                    5.09103                     0.71840  
##                Brave_scale  Selfless_scale:Brave_scale  
##                    0.48350                     0.09615
mod_cov<-lm(Heroism ~ Selfless_scale * Brave_scale + Job , data = Set)
anova(mod, mod_cov)
## Analysis of Variance Table
## 
## Model 1: Heroism ~ Selfless_scale * Brave_scale
## Model 2: Heroism ~ Selfless_scale * Brave_scale + Job
##   Res.Df    RSS Df Sum of Sq      F    Pr(>F)    
## 1    812 952.49                                  
## 2    810 884.90  2    67.585 30.932 1.134e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

H3 Model comparison with attitude

To account for a possible Halo effect, let’s see if attitudes play a role in explaining heroism.

Set$Attitude_scale <- scale(Set$Attitude)
(mod<-lm(Heroism ~ Selfless_scale * Brave_scale , data = Set))
## 
## Call:
## lm(formula = Heroism ~ Selfless_scale * Brave_scale, data = Set)
## 
## Coefficients:
##                (Intercept)              Selfless_scale  
##                    5.09103                     0.71840  
##                Brave_scale  Selfless_scale:Brave_scale  
##                    0.48350                     0.09615
summary(mod_cov2<-lm(Heroism ~ Selfless_scale * Brave_scale + Attitude_scale , data = Set))
## 
## Call:
## lm(formula = Heroism ~ Selfless_scale * Brave_scale + Attitude_scale, 
##     data = Set)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.6330 -0.4634  0.2330  0.5581  3.1123 
## 
## Coefficients:
##                            Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                 5.08436    0.04004 126.967  < 2e-16 ***
## Selfless_scale              0.45887    0.04749   9.662  < 2e-16 ***
## Brave_scale                 0.32821    0.05015   6.545 1.05e-10 ***
## Attitude_scale              0.57968    0.04524  12.814  < 2e-16 ***
## Selfless_scale:Brave_scale  0.10812    0.03619   2.988   0.0029 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9883 on 811 degrees of freedom
## Multiple R-squared:  0.5688, Adjusted R-squared:  0.5667 
## F-statistic: 267.4 on 4 and 811 DF,  p-value: < 2.2e-16
anova(mod, mod_cov2)
## Analysis of Variance Table
## 
## Model 1: Heroism ~ Selfless_scale * Brave_scale
## Model 2: Heroism ~ Selfless_scale * Brave_scale + Attitude_scale
##   Res.Df    RSS Df Sum of Sq      F    Pr(>F)    
## 1    812 952.49                                  
## 2    811 792.10  1    160.38 164.21 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

H3 Main registered model

summary(mod)
## 
## Call:
## lm(formula = Heroism ~ Selfless_scale * Brave_scale, data = Set)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.5375 -0.5375  0.1979  0.4654  3.6473 
## 
## Coefficients:
##                            Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                 5.09103    0.04388 116.018   <2e-16 ***
## Selfless_scale              0.71840    0.04708  15.260   <2e-16 ***
## Brave_scale                 0.48350    0.05333   9.067   <2e-16 ***
## Selfless_scale:Brave_scale  0.09615    0.03965   2.425   0.0155 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.083 on 812 degrees of freedom
## Multiple R-squared:  0.4815, Adjusted R-squared:  0.4796 
## F-statistic: 251.3 on 3 and 812 DF,  p-value: < 2.2e-16
confint(mod)
##                                 2.5 %    97.5 %
## (Intercept)                5.00489921 5.1771681
## Selfless_scale             0.62598814 0.8108069
## Brave_scale                0.37882832 0.5881781
## Selfless_scale:Brave_scale 0.01832296 0.1739754
report(mod) 
## We fitted a linear model (estimated using OLS) to predict Heroism with
## Selfless_scale and Brave_scale (formula: Heroism ~ Selfless_scale *
## Brave_scale). The model explains a statistically significant and substantial
## proportion of variance (R2 = 0.48, F(3, 812) = 251.33, p < .001, adj. R2 =
## 0.48). The model's intercept, corresponding to Selfless_scale = 0 and
## Brave_scale = 0, is at 5.09 (95% CI [5.00, 5.18], t(812) = 116.02, p < .001).
## Within this model:
## 
##   - The effect of Selfless scale is statistically significant and positive (beta
## = 0.72, 95% CI [0.63, 0.81], t(812) = 15.26, p < .001; Std. beta = 0.48, 95% CI
## [0.42, 0.54])
##   - The effect of Brave scale is statistically significant and positive (beta =
## 0.48, 95% CI [0.38, 0.59], t(812) = 9.07, p < .001; Std. beta = 0.32, 95% CI
## [0.25, 0.39])
##   - The effect of Selfless scale × Brave scale is statistically significant and
## positive (beta = 0.10, 95% CI [0.02, 0.17], t(812) = 2.43, p = 0.016; Std. beta
## = 0.06, 95% CI [0.01, 0.12])
## 
## Standardized parameters were obtained by fitting the model on a standardized
## version of the dataset. 95% Confidence Intervals (CIs) and p-values were
## computed using a Wald t-distribution approximation.
ModIII <- car::Anova(mod, type = "III")
eta_squared(ModIII, partial = TRUE)
## Type 3 ANOVAs only give sensible and informative results when covariates
##   are mean-centered and factors are coded with orthogonal contrasts (such
##   as those produced by `contr.sum`, `contr.poly`, or `contr.helmert`, but
##   *not* by the default `contr.treatment`).
## # Effect Size for ANOVA (Type III)
## 
## Parameter                  | Eta2 (partial) |       95% CI
## ----------------------------------------------------------
## Selfless_scale             |           0.22 | [0.18, 1.00]
## Brave_scale                |           0.09 | [0.06, 1.00]
## Selfless_scale:Brave_scale |       7.19e-03 | [0.00, 1.00]
## 
## - One-sided CIs: upper bound fixed at [1.00].

Let’s assess this significant interaction:

interact_plot(mod, pred = "Brave_scale", modx = "Selfless_scale")

Accounting for a possible halo effects by controlling for attitude, does not change our main inferences:

summary(mod_cov2)
## 
## Call:
## lm(formula = Heroism ~ Selfless_scale * Brave_scale + Attitude_scale, 
##     data = Set)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.6330 -0.4634  0.2330  0.5581  3.1123 
## 
## Coefficients:
##                            Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                 5.08436    0.04004 126.967  < 2e-16 ***
## Selfless_scale              0.45887    0.04749   9.662  < 2e-16 ***
## Brave_scale                 0.32821    0.05015   6.545 1.05e-10 ***
## Attitude_scale              0.57968    0.04524  12.814  < 2e-16 ***
## Selfless_scale:Brave_scale  0.10812    0.03619   2.988   0.0029 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9883 on 811 degrees of freedom
## Multiple R-squared:  0.5688, Adjusted R-squared:  0.5667 
## F-statistic: 267.4 on 4 and 811 DF,  p-value: < 2.2e-16

Assumption checks

plot(mod)

Model Linearity

# Fitted values from your model
fitted_vals <- fitted(mod)

# Plot observed values against fitted values
plot(fitted_vals, Set$Heroism,
     xlab = "Fitted Values",
     ylab = "Observed Heroes",
     main = "Observed vs Fitted Values")
abline(0, 1, col = "blue", lty = 2)

library(ordinal)

# Fit a cumulative link mixed model
Set$Heroes_ord <- factor(Set$Heroism, ordered = TRUE)

# Now fit the cumulative link mixed model
clm_mod <- clm(Heroes_ord ~ Brave_scale * Selfless_scale, data = Set, link = "logit")

# Summarize the cumulative link mixed model
summary(clm_mod)
## formula: Heroes_ord ~ Brave_scale * Selfless_scale
## data:    Set
## 
##  link  threshold nobs logLik   AIC     niter max.grad cond.H 
##  logit flexible  816  -1093.46 2204.92 6(0)  6.66e-11 7.5e+01
## 
## Coefficients:
##                            Estimate Std. Error z value Pr(>|z|)    
## Brave_scale                 0.95371    0.09610   9.924  < 2e-16 ***
## Selfless_scale              1.39398    0.09609  14.507  < 2e-16 ***
## Brave_scale:Selfless_scale  0.36296    0.07415   4.895 9.84e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Threshold coefficients:
##     Estimate Std. Error z value
## 1|2 -5.80540    0.36382 -15.957
## 2|3 -3.72209    0.17802 -20.908
## 3|4 -2.84530    0.14114 -20.159
## 4|5 -1.17333    0.10053 -11.671
## 5|6  0.45804    0.09471   4.836
## 6|7  2.23901    0.12951  17.289

H3 Outliers analyses

Cook’s distance plot:

ols_plot_cooksd_bar(mod)

Outlier analyses through model comparison with a robust model:

summary(Robmod<-lmrob(Heroism ~ Brave_scale * Selfless_scale, data = Set))
## 
## Call:
## lmrob(formula = Heroism ~ Brave_scale * Selfless_scale, data = Set)
##  \--> method = "MM"
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.7915 -0.7091  0.2085  0.4252  3.8586 
## 
## Coefficients:
##                            Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                 5.19452    0.04953 104.880  < 2e-16 ***
## Brave_scale                 0.48398    0.06064   7.982 4.92e-15 ***
## Selfless_scale              0.83995    0.06774  12.399  < 2e-16 ***
## Brave_scale:Selfless_scale  0.09107    0.05569   1.635    0.102    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Robust residual standard error: 0.7844 
## Multiple R-squared:  0.6413, Adjusted R-squared:  0.6399 
## Convergence in 16 IRWLS iterations
## 
## Robustness weights: 
##  8 observations c(210,282,321,324,380,622,678,726)
##   are outliers with |weight| = 0 ( < 0.00012); 
##  15 weights are ~= 1. The remaining 793 ones are summarized as
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.00289 0.84810 0.95170 0.87300 0.99360 0.99870 
## Algorithmic parameters: 
##        tuning.chi                bb        tuning.psi        refine.tol 
##         1.548e+00         5.000e-01         4.685e+00         1.000e-07 
##           rel.tol         scale.tol         solve.tol          zero.tol 
##         1.000e-07         1.000e-10         1.000e-07         1.000e-10 
##       eps.outlier             eps.x warn.limit.reject warn.limit.meanrw 
##         1.225e-04         2.129e-11         5.000e-01         5.000e-01 
##      nResample         max.it       best.r.s       k.fast.s          k.max 
##            500             50              2              1            200 
##    maxit.scale      trace.lev            mts     compute.rd fast.s.large.n 
##            200              0           1000              0           2000 
##                   psi           subsampling                   cov 
##            "bisquare"         "nonsingular"         ".vcov.avar1" 
## compute.outlier.stats 
##                  "SM" 
## seed : int(0)

Decomposition of the effects within job

Let’s see if there is an higher-order job interaction:

anova(lm(Heroism ~ Selfless_scale*Brave_scale*Job, data = Set))
## Analysis of Variance Table
## 
## Response: Heroism
##                                 Df Sum Sq Mean Sq  F value    Pr(>F)    
## Selfless_scale                   1 779.98  779.98 714.7900 < 2.2e-16 ***
## Brave_scale                      1  97.57   97.57  89.4141 < 2.2e-16 ***
## Job                              2  71.08   35.54  32.5675 2.511e-14 ***
## Selfless_scale:Brave_scale       1   3.41    3.41   3.1226   0.07759 .  
## Selfless_scale:Job               2   0.53    0.26   0.2407   0.78615    
## Brave_scale:Job                  2   5.73    2.86   2.6240   0.07313 .  
## Selfless_scale:Brave_scale:Job   2   1.32    0.66   0.6038   0.54700    
## Residuals                      804 877.33    1.09                       
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

No. For exploratory purposes, I’ll leave these analyses below. Let us underline the lack of interaction between Bravery and Selflessness

Firefighters

paste0("Firefighter analysis")
## [1] "Firefighter analysis"
Firef<-subset(Set, Set$Job == "F")
summary(FireMod<-lm(Heroism ~ scale(Brave_scale) * scale(Selfless_scale), data = Firef))
## 
## Call:
## lm(formula = Heroism ~ scale(Brave_scale) * scale(Selfless_scale), 
##     data = Firef)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.7392 -0.3707  0.2608  0.3312  2.4930 
## 
## Coefficients:
##                                          Estimate Std. Error t value Pr(>|t|)
## (Intercept)                               5.97418    0.06115  97.704  < 2e-16
## scale(Brave_scale)                        0.59063    0.08694   6.794 7.05e-11
## scale(Selfless_scale)                     0.38742    0.06603   5.867 1.30e-08
## scale(Brave_scale):scale(Selfless_scale)  0.07849    0.05202   1.509    0.133
##                                             
## (Intercept)                              ***
## scale(Brave_scale)                       ***
## scale(Selfless_scale)                    ***
## scale(Brave_scale):scale(Selfless_scale)    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.8851 on 268 degrees of freedom
## Multiple R-squared:  0.4573, Adjusted R-squared:  0.4512 
## F-statistic: 75.28 on 3 and 268 DF,  p-value: < 2.2e-16
FfMod_typeIII <- car::Anova(FireMod, type = "III")
eta_squared(FfMod_typeIII, partial = TRUE)
## Type 3 ANOVAs only give sensible and informative results when covariates
##   are mean-centered and factors are coded with orthogonal contrasts (such
##   as those produced by `contr.sum`, `contr.poly`, or `contr.helmert`, but
##   *not* by the default `contr.treatment`).
## # Effect Size for ANOVA (Type III)
## 
## Parameter                                | Eta2 (partial) |       95% CI
## ------------------------------------------------------------------------
## scale(Brave_scale)                       |           0.15 | [0.09, 1.00]
## scale(Selfless_scale)                    |           0.11 | [0.06, 1.00]
## scale(Brave_scale):scale(Selfless_scale) |       8.42e-03 | [0.00, 1.00]
## 
## - One-sided CIs: upper bound fixed at [1.00].

In firefighters: Heroism is driven bu Helpfulness, and then Danger. No interaction.

Psychiatrists

paste0("Psy analysis")
## [1] "Psy analysis"
PsyRole<- subset(Set, Set$Job == "P")
PsyRole$Brave <- scale(PsyRole$Brave)
PsyRole$Selfless <- scale(PsyRole$Selfless)


summary(PsyMod<-lm(Heroism ~ Brave * Selfless, data = PsyRole))
## 
## Call:
## lm(formula = Heroism ~ Brave * Selfless, data = PsyRole)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.2036 -0.5624  0.0790  0.6357  3.0790 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     4.68824    0.06704  69.931  < 2e-16 ***
## Brave           0.58249    0.07702   7.562 6.16e-13 ***
## Selfless        0.53804    0.07540   7.135 8.83e-12 ***
## Brave:Selfless  0.03375    0.05329   0.633    0.527    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9685 on 271 degrees of freedom
## Multiple R-squared:  0.521,  Adjusted R-squared:  0.5157 
## F-statistic: 98.26 on 3 and 271 DF,  p-value: < 2.2e-16
PsyTypeIII <- car::Anova(PsyMod, type = "III")
eta_squared(PsyTypeIII, partial = TRUE)
## Type 3 ANOVAs only give sensible and informative results when covariates
##   are mean-centered and factors are coded with orthogonal contrasts (such
##   as those produced by `contr.sum`, `contr.poly`, or `contr.helmert`, but
##   *not* by the default `contr.treatment`).
## # Effect Size for ANOVA (Type III)
## 
## Parameter      | Eta2 (partial) |       95% CI
## ----------------------------------------------
## Brave          |           0.17 | [0.11, 1.00]
## Selfless       |           0.16 | [0.10, 1.00]
## Brave:Selfless |       1.48e-03 | [0.00, 1.00]
## 
## - One-sided CIs: upper bound fixed at [1.00].
sim_slopes(PsyMod, pred = Brave, modx = Selfless)
## JOHNSON-NEYMAN INTERVAL
## 
## When Selfless is INSIDE the interval [-4.29, 7.47], the slope of Brave is p
## < .05.
## 
## Note: The range of observed values of Selfless is [-2.51, 1.75]
## 
## SIMPLE SLOPES ANALYSIS
## 
## Slope of Brave when Selfless = -1.000000e+00 (- 1 SD): 
## 
##   Est.   S.E.   t val.      p
## ------ ------ -------- ------
##   0.55   0.08     6.70   0.00
## 
## Slope of Brave when Selfless = -2.091256e-16 (Mean): 
## 
##   Est.   S.E.   t val.      p
## ------ ------ -------- ------
##   0.58   0.08     7.56   0.00
## 
## Slope of Brave when Selfless =  1.000000e+00 (+ 1 SD): 
## 
##   Est.   S.E.   t val.      p
## ------ ------ -------- ------
##   0.62   0.10     5.92   0.00
interact_plot(PsyMod, pred = Brave, modx = Selfless)

# etc.

Psychiatrists heroism is largely derived from both Helpfulness (21%) but not so much by Danger (7%). The interaction is not significant.

Welders

paste0("Welders analysis")
## [1] "Welders analysis"
Weld<- subset(Set, Set$Job == "W")
Weld$Brave <- scale(Weld$Brave)
Weld$Selfless <- scale(Weld$Selfless)


summary(WeldMod<-lm(Heroism ~ Brave * Selfless, data = Weld))
## 
## Call:
## lm(formula = Heroism ~ Brave * Selfless, data = Weld)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.0395 -0.6597  0.1677  0.9521  3.1439 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     4.66879    0.08361  55.840  < 2e-16 ***
## Brave           0.30238    0.09031   3.348 0.000931 ***
## Selfless        0.68509    0.08672   7.900 7.47e-14 ***
## Brave:Selfless  0.10107    0.09309   1.086 0.278581    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.249 on 265 degrees of freedom
## Multiple R-squared:  0.3203, Adjusted R-squared:  0.3126 
## F-statistic: 41.62 on 3 and 265 DF,  p-value: < 2.2e-16
WeldTypeIII <- car::Anova(WeldMod, type = "III")
eta_squared(WeldTypeIII, partial = TRUE)
## Type 3 ANOVAs only give sensible and informative results when covariates
##   are mean-centered and factors are coded with orthogonal contrasts (such
##   as those produced by `contr.sum`, `contr.poly`, or `contr.helmert`, but
##   *not* by the default `contr.treatment`).
## # Effect Size for ANOVA (Type III)
## 
## Parameter      | Eta2 (partial) |       95% CI
## ----------------------------------------------
## Brave          |           0.04 | [0.01, 1.00]
## Selfless       |           0.19 | [0.13, 1.00]
## Brave:Selfless |       4.43e-03 | [0.00, 1.00]
## 
## - One-sided CIs: upper bound fixed at [1.00].
sim_slopes(WeldMod, pred = Brave, modx = Selfless)
## JOHNSON-NEYMAN INTERVAL
## 
## When Selfless is INSIDE the interval [-1.03, 2.49], the slope of Brave is p
## < .05.
## 
## Note: The range of observed values of Selfless is [-2.43, 1.45]
## 
## SIMPLE SLOPES ANALYSIS
## 
## Slope of Brave when Selfless = -1.000000e+00 (- 1 SD): 
## 
##   Est.   S.E.   t val.      p
## ------ ------ -------- ------
##   0.20   0.10     2.03   0.04
## 
## Slope of Brave when Selfless = -1.626126e-16 (Mean): 
## 
##   Est.   S.E.   t val.      p
## ------ ------ -------- ------
##   0.30   0.09     3.35   0.00
## 
## Slope of Brave when Selfless =  1.000000e+00 (+ 1 SD): 
## 
##   Est.   S.E.   t val.      p
## ------ ------ -------- ------
##   0.40   0.15     2.62   0.01
interact_plot(WeldMod, pred = Brave, modx = Selfless)

# etc.

Additional elements

Without Relevant Job participants

Additional sensitivity analyses will be conducted when excluding participants whose occupations are directly relevant or similar to the target occupations of the study.

# e.g., 

# Add the General attitudes to the target df
#df_Roles_Excl <- subset(Set, Set$Part_Job=="None of the above")

#anova(mod<-lm(Heroism ~ Help_dummy * Job, data = df_Roles_Excl))

#anova(mod<-lm(Heroism ~ Brave_scale * Helpful_scale * Job, data = df_Roles_Excl))

#summary(mod)

Correlations

library(PerformanceAnalytics)


PerformanceAnalytics::chart.Correlation(Set[, c("Heroism", "Danger", "Helpfulness", "Attitude")], method = "spearman")


Is the model additive or interactive

It appears that all interactions are weak. Perhaps Altruism and Motivation work independently on heroism and not that synergetically. In the following section, I compare additive and interactive solutions to see which model result in the best fit.

In this section we will compare an additive model (Outcome ~ IV1 + IV2) and an interactive model (Outcome ~ IV1 * IV2)

H1 - Helpfulness manipulation and Selflessness manipulation

modAdd<-lm(Heroism ~ Help_dummy + Motivation_dummy, data = Set)
modInt<-lm(Heroism ~ Help_dummy * Motivation_dummy, data = Set)
paste0("Comparison between additive vs interactive models")
## [1] "Comparison between additive vs interactive models"
anova(modInt, modAdd)
## Analysis of Variance Table
## 
## Model 1: Heroism ~ Help_dummy * Motivation_dummy
## Model 2: Heroism ~ Help_dummy + Motivation_dummy
##   Res.Df    RSS Df Sum of Sq      F Pr(>F)
## 1    812 1731.8                           
## 2    813 1736.3 -1   -4.4833 2.1021 0.1475

No preference between additive and interactive = Additive model is more parsimonious and should be preferred.

paste0("Additive model")
## [1] "Additive model"
anova(modAdd)
## Analysis of Variance Table
## 
## Response: Heroism
##                   Df  Sum Sq Mean Sq F value    Pr(>F)    
## Help_dummy         1   93.16  93.158  43.621 7.196e-11 ***
## Motivation_dummy   1    7.51   7.511   3.517    0.0611 .  
## Residuals        813 1736.27   2.136                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ModIII <- car::Anova(modAdd, type = "III")
eta_squared(ModIII, partial = TRUE)
## # Effect Size for ANOVA (Type III)
## 
## Parameter        | Eta2 (partial) |       95% CI
## ------------------------------------------------
## Help_dummy       |           0.05 | [0.03, 1.00]
## Motivation_dummy |       4.31e-03 | [0.00, 1.00]
## 
## - One-sided CIs: upper bound fixed at [1.00].
paste0("Interactive model")
## [1] "Interactive model"
anova(modInt)
## Analysis of Variance Table
## 
## Response: Heroism
##                              Df  Sum Sq Mean Sq F value    Pr(>F)    
## Help_dummy                    1   93.16  93.158 43.6800 6.998e-11 ***
## Motivation_dummy              1    7.51   7.511  3.5218   0.06093 .  
## Help_dummy:Motivation_dummy   1    4.48   4.483  2.1021   0.14748    
## Residuals                   812 1731.78   2.133                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ModIII <- car::Anova(modInt, type = "III")
eta_squared(ModIII, partial = TRUE)
## Type 3 ANOVAs only give sensible and informative results when covariates
##   are mean-centered and factors are coded with orthogonal contrasts (such
##   as those produced by `contr.sum`, `contr.poly`, or `contr.helmert`, but
##   *not* by the default `contr.treatment`).
## # Effect Size for ANOVA (Type III)
## 
## Parameter                   | Eta2 (partial) |       95% CI
## -----------------------------------------------------------
## Help_dummy                  |           0.05 | [0.03, 1.00]
## Motivation_dummy            |       4.30e-03 | [0.00, 1.00]
## Help_dummy:Motivation_dummy |       2.58e-03 | [0.00, 1.00]
## 
## - One-sided CIs: upper bound fixed at [1.00].

H2 - Bravery and Selflessness

modAdd<-lm(Heroism ~ scale(Brave) + scale(Selfless), data = Set)
modInt<-lm(Heroism ~ scale(Brave) * scale(Selfless), data = Set)
paste0("Comparison between additive vs interactive models")
## [1] "Comparison between additive vs interactive models"
anova(modInt, modAdd)
## Analysis of Variance Table
## 
## Model 1: Heroism ~ scale(Brave) * scale(Selfless)
## Model 2: Heroism ~ scale(Brave) + scale(Selfless)
##   Res.Df    RSS Df Sum of Sq      F  Pr(>F)  
## 1    812 952.49                              
## 2    813 959.38 -1   -6.8982 5.8807 0.01552 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Here, there is a preference for the additive model which has a smaller RSS.

paste0("Additive model")
## [1] "Additive model"
anova(modAdd)
## Analysis of Variance Table
## 
## Response: Heroism
##                  Df Sum Sq Mean Sq F value    Pr(>F)    
## scale(Brave)      1 565.41  565.41  479.14 < 2.2e-16 ***
## scale(Selfless)   1 312.14  312.14  264.52 < 2.2e-16 ***
## Residuals       813 959.38    1.18                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ModIII <- car::Anova(modAdd, type = "III")
eta_squared(ModIII, partial = TRUE)
## # Effect Size for ANOVA (Type III)
## 
## Parameter       | Eta2 (partial) |       95% CI
## -----------------------------------------------
## scale(Brave)    |           0.09 | [0.06, 1.00]
## scale(Selfless) |           0.25 | [0.21, 1.00]
## 
## - One-sided CIs: upper bound fixed at [1.00].
paste0("Interactive model")
## [1] "Interactive model"
anova(modInt)
## Analysis of Variance Table
## 
## Response: Heroism
##                               Df Sum Sq Mean Sq  F value  Pr(>F)    
## scale(Brave)                   1 565.41  565.41 482.0159 < 2e-16 ***
## scale(Selfless)                1 312.14  312.14 266.1039 < 2e-16 ***
## scale(Brave):scale(Selfless)   1   6.90    6.90   5.8807 0.01552 *  
## Residuals                    812 952.49    1.17                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ModIII <- car::Anova(modInt, type = "III")
eta_squared(ModIII, partial = TRUE)
## Type 3 ANOVAs only give sensible and informative results when covariates
##   are mean-centered and factors are coded with orthogonal contrasts (such
##   as those produced by `contr.sum`, `contr.poly`, or `contr.helmert`, but
##   *not* by the default `contr.treatment`).
## # Effect Size for ANOVA (Type III)
## 
## Parameter                    | Eta2 (partial) |       95% CI
## ------------------------------------------------------------
## scale(Brave)                 |           0.09 | [0.06, 1.00]
## scale(Selfless)              |           0.22 | [0.18, 1.00]
## scale(Brave):scale(Selfless) |       7.19e-03 | [0.00, 1.00]
## 
## - One-sided CIs: upper bound fixed at [1.00].

H3 - Danger and Helpfulness

modAdd<-lm(Heroism ~ scale(Danger) + scale(Helpfulness), data = Set)
modInt<-lm(Heroism ~ scale(Danger) * scale(Helpfulness), data = Set)
paste0("Comparison between additive vs interactive models")
## [1] "Comparison between additive vs interactive models"
anova(modInt, modAdd)
## Analysis of Variance Table
## 
## Model 1: Heroism ~ scale(Danger) * scale(Helpfulness)
## Model 2: Heroism ~ scale(Danger) + scale(Helpfulness)
##   Res.Df    RSS Df Sum of Sq      F    Pr(>F)    
## 1    812 1132.4                                  
## 2    813 1152.2 -1   -19.771 14.177 0.0001784 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Here, there is a preference for the additive model which has a smaller RSS.

paste0("Additive model")
## [1] "Additive model"
anova(modAdd)
## Analysis of Variance Table
## 
## Response: Heroism
##                     Df  Sum Sq Mean Sq F value    Pr(>F)    
## scale(Danger)        1  228.94  228.94  161.55 < 2.2e-16 ***
## scale(Helpfulness)   1  455.83  455.83  321.65 < 2.2e-16 ***
## Residuals          813 1152.16    1.42                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ModIII <- car::Anova(modAdd, type = "III")
eta_squared(ModIII, partial = TRUE)
## # Effect Size for ANOVA (Type III)
## 
## Parameter          | Eta2 (partial) |       95% CI
## --------------------------------------------------
## scale(Danger)      |           0.07 | [0.04, 1.00]
## scale(Helpfulness) |           0.28 | [0.24, 1.00]
## 
## - One-sided CIs: upper bound fixed at [1.00].
paste0("Interactive model")
## [1] "Interactive model"
anova(modInt)
## Analysis of Variance Table
## 
## Response: Heroism
##                                   Df  Sum Sq Mean Sq F value    Pr(>F)    
## scale(Danger)                      1  228.94  228.94 164.167 < 2.2e-16 ***
## scale(Helpfulness)                 1  455.83  455.83 326.863 < 2.2e-16 ***
## scale(Danger):scale(Helpfulness)   1   19.77   19.77  14.177 0.0001784 ***
## Residuals                        812 1132.39    1.39                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
ModIII <- car::Anova(modInt, type = "III")
eta_squared(ModIII, partial = TRUE)
## Type 3 ANOVAs only give sensible and informative results when covariates
##   are mean-centered and factors are coded with orthogonal contrasts (such
##   as those produced by `contr.sum`, `contr.poly`, or `contr.helmert`, but
##   *not* by the default `contr.treatment`).
## # Effect Size for ANOVA (Type III)
## 
## Parameter                        | Eta2 (partial) |       95% CI
## ----------------------------------------------------------------
## scale(Danger)                    |           0.08 | [0.06, 1.00]
## scale(Helpfulness)               |           0.29 | [0.25, 1.00]
## scale(Danger):scale(Helpfulness) |           0.02 | [0.01, 1.00]
## 
## - One-sided CIs: upper bound fixed at [1.00].

Previous studies provided some evidence for a slight preference toward additive models. This third pilot study once again emphasise that Heroism components are additive rather than interactive: If heroes are not brave, then it means they’re selfless; and vice versa. But those two traits act independently on heroism perception. Do people have two definitions of heroism in their mind? Or is there a unified construct of heroism that is defined by Bravery OR Helpfulness. ____

Job Analysis and Situation attribution : Interactive vs Additive components of heroism?

In the next section, for each occupation, I systematically 1) Compare the fit of an interactive vs additive model in each occupation, and 2) compare the betas of the two predictors in the best model.

Regarding (1), I fit an interactive (Heroism ~ FeatureA * FeatureB) and an additive (Heroism ~ FeatureA + FeatureB) model. I then compare their RSS in an ANOVA to decide which model provides the best fit.

Regarding (2), I use the best model (see Point 1 just above). Then, to test that one feature of heroism contribute significantly more than the other, I use car::linearHypothesis: I force the model betas of the two predictors to be equivalent (e.g., Danger = Helpful) and see if this constrained model provides a better fit than the model where the betas are let loose. If the non-constrained model provides a better fit, it points to the relative superiority of one beta over the other in explaining the outcome.

Manipulations

Firefighters

(modAdd<-lm(Heroism ~ Motivation_dummy + Help_dummy, data = Firef))
## 
## Call:
## lm(formula = Heroism ~ Motivation_dummy + Help_dummy, data = Firef)
## 
## Coefficients:
##      (Intercept)  Motivation_dummy        Help_dummy  
##           6.0178            0.1555            0.1850
(modInt<-lm(Heroism ~ Motivation_dummy * Help_dummy, data = Firef))
## 
## Call:
## lm(formula = Heroism ~ Motivation_dummy * Help_dummy, data = Firef)
## 
## Coefficients:
##                 (Intercept)             Motivation_dummy  
##                      6.0189                       0.1555  
##                  Help_dummy  Motivation_dummy:Help_dummy  
##                      0.1828                       0.6008
anova(modAdd, modInt)
## Analysis of Variance Table
## 
## Model 1: Heroism ~ Motivation_dummy + Help_dummy
## Model 2: Heroism ~ Motivation_dummy * Help_dummy
##   Res.Df    RSS Df Sum of Sq      F  Pr(>F)  
## 1    269 382.97                              
## 2    268 376.83  1    6.1359 4.3638 0.03765 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
paste0("Interactive model is performing best")
## [1] "Interactive model is performing best"
car::linearHypothesis(modAdd, "Motivation_dummy = Help_dummy") 
## 
## Linear hypothesis test:
## Motivation_dummy - Help_dummy = 0
## 
## Model 1: restricted model
## Model 2: Heroism ~ Motivation_dummy + Help_dummy
## 
##   Res.Df    RSS Df Sum of Sq      F Pr(>F)
## 1    270 383.00                           
## 2    269 382.97  1  0.029719 0.0209 0.8852

For firefighters, the interactive model is slightly better than the additive one. There is no preference between the two predictors, they contribute ‘equally’ (that is they don’t contribute) to heroism.

Psychiatrists

(modAdd<-lm(Heroism ~ Motivation_dummy + Help_dummy, data = Psych))
## 
## Call:
## lm(formula = Heroism ~ Motivation_dummy + Help_dummy, data = Psych)
## 
## Coefficients:
##      (Intercept)  Motivation_dummy        Help_dummy  
##           4.7116            0.2638            0.3748
(modInt<-lm(Heroism ~ Motivation_dummy * Help_dummy, data = Psych))
## 
## Call:
## lm(formula = Heroism ~ Motivation_dummy * Help_dummy, data = Psych)
## 
## Coefficients:
##                 (Intercept)             Motivation_dummy  
##                      4.7126                       0.2657  
##                  Help_dummy  Motivation_dummy:Help_dummy  
##                      0.3754                       0.3451
anova(modAdd, modInt)
## Analysis of Variance Table
## 
## Model 1: Heroism ~ Motivation_dummy + Help_dummy
## Model 2: Heroism ~ Motivation_dummy * Help_dummy
##   Res.Df    RSS Df Sum of Sq     F Pr(>F)
## 1    272 516.44                          
## 2    271 514.39  1    2.0461 1.078 0.3001
paste0("Model do not significantly differ.")
## [1] "Model do not significantly differ."
car::linearHypothesis(modAdd, "Motivation_dummy = Help_dummy") 
## 
## Linear hypothesis test:
## Motivation_dummy - Help_dummy = 0
## 
## Model 1: restricted model
## Model 2: Heroism ~ Motivation_dummy + Help_dummy
## 
##   Res.Df    RSS Df Sum of Sq      F Pr(>F)
## 1    273 516.86                           
## 2    272 516.44  1   0.42782 0.2253 0.6354

In psychiatrists, no preference between additive vs interactive model. Altruistic motivation and altruistic outcome contribute equally to heroism, but we note that only Altruistic outcome (Helpfulness) reaches significance.

Welders

(modAdd<-lm(Heroism ~ Motivation_dummy + Help_dummy, data = Weld))
## 
## Call:
## lm(formula = Heroism ~ Motivation_dummy + Help_dummy, data = Weld)
## 
## Coefficients:
##      (Intercept)  Motivation_dummy        Help_dummy  
##           4.6931            0.1067            1.4890
(modInt<-lm(Heroism ~ Motivation_dummy * Help_dummy, data = Weld))
## 
## Call:
## lm(formula = Heroism ~ Motivation_dummy * Help_dummy, data = Weld)
## 
## Coefficients:
##                 (Intercept)             Motivation_dummy  
##                     4.69304                      0.10667  
##                  Help_dummy  Motivation_dummy:Help_dummy  
##                     1.48902                      0.00746
anova(modAdd, modInt)
## Analysis of Variance Table
## 
## Model 1: Heroism ~ Motivation_dummy + Help_dummy
## Model 2: Heroism ~ Motivation_dummy * Help_dummy
##   Res.Df    RSS Df  Sum of Sq     F Pr(>F)
## 1    266 457.59                           
## 2    265 457.58  1 0.00093473 5e-04 0.9815
paste0("No preference")
## [1] "No preference"
car::linearHypothesis(modInt, "Motivation_dummy = Help_dummy") 
## 
## Linear hypothesis test:
## Motivation_dummy - Help_dummy = 0
## 
## Model 1: restricted model
## Model 2: Heroism ~ Motivation_dummy * Help_dummy
## 
##   Res.Df    RSS Df Sum of Sq      F    Pr(>F)    
## 1    266 520.59                                  
## 2    265 457.58  1    63.002 36.486 5.182e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

In welders, interactive vs additive models are identical. However, the heroic profile of welders is definitely predicted by helpfulness (job description) rather than selflessness (character).


The plots below describe the Beta comparisons reported in the exploratory analyses:

# Right, so we're going to plot the betas difference for each occupation
# We create a list of df

datasets <- list(
  Firefighters   = Firef,
  Psychiatrists  = Psych,
  Welders = Weld
)

# Storing the results of the models
results <- list()

# for loop: in each dataset, fit the model, and extract the betas to substract them
for(model_name in names(datasets)) {
  data_ <- datasets[[model_name]]
  
  # Fitting mod
  mod <- lm(Heroism ~ Motivation_dummy + Help_dummy, data = data_)
  
  # Extract coefficients and the variance-covariance matrix (used for 95%CI)
  coefs <- coef(mod)
  vc   <- vcov(mod)
  
  # Compute the difference between coefficients "Brave" and "Selfless"
  diff_coef <- coefs["Motivation_dummy"] - coefs["Help_dummy"]
  
  # Compute standard error of the difference:
  se_diff <- sqrt(vc["Motivation_dummy", "Motivation_dummy"] + vc["Help_dummy", "Help_dummy"] - 2 * vc["Motivation_dummy", "Help_dummy"])
  
  # Compute the 95% confidence interval using a normal approximation (z = 1.96)
  crit <- qnorm(0.975)
  lower <- diff_coef - crit * se_diff
  upper <- diff_coef + crit * se_diff
  
  # Store the results in a data frame
  results[[model_name]] <- data.frame(
    Model  = model_name,
    diff   = diff_coef,
    lower  = lower,
    upper  = upper
  )
}

# Combine the list of data frames into one
df_results <- do.call(rbind, results)
df_results$Model <- factor(df_results$Model, levels = names(datasets))

ggplot(df_results, aes(x = Model, y = diff)) +
  geom_point(size = 3) +
  geom_errorbar(aes(ymin = lower, ymax = upper), width = 0.2) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
  labs(
    title = "Relative contribution of Motivation vs Helpfulness in predicting Heroism",
    y = "Coefficient Difference (Motivation - Help_dummy)",
    x = "Occupation"
  ) +
  theme_minimal()

Bravery and Selflessness

Firefighters

(modAdd<-lm(Heroism ~ scale(Brave) + scale(Selfless), data = Firef))
## 
## Call:
## lm(formula = Heroism ~ scale(Brave) + scale(Selfless), data = Firef)
## 
## Coefficients:
##     (Intercept)     scale(Brave)  scale(Selfless)  
##          6.0184           0.5038           0.4034
(modInt<-lm(Heroism ~ scale(Brave) * scale(Selfless), data = Firef))
## 
## Call:
## lm(formula = Heroism ~ scale(Brave) * scale(Selfless), data = Firef)
## 
## Coefficients:
##                  (Intercept)                  scale(Brave)  
##                      5.97418                       0.59063  
##              scale(Selfless)  scale(Brave):scale(Selfless)  
##                      0.38742                       0.07849
anova(modAdd, modInt)
## Analysis of Variance Table
## 
## Model 1: Heroism ~ scale(Brave) + scale(Selfless)
## Model 2: Heroism ~ scale(Brave) * scale(Selfless)
##   Res.Df    RSS Df Sum of Sq      F Pr(>F)
## 1    269 211.76                           
## 2    268 209.97  1    1.7834 2.2762 0.1326
paste0("Model do not significantly differ.")
## [1] "Model do not significantly differ."
car::linearHypothesis(modAdd, "scale(Brave) = scale(Selfless)") 
## 
## Linear hypothesis test:
## scale(Brave) - scale(Selfless) = 0
## 
## Model 1: restricted model
## Model 2: Heroism ~ scale(Brave) + scale(Selfless)
## 
##   Res.Df    RSS Df Sum of Sq      F Pr(>F)
## 1    270 212.35                           
## 2    269 211.76  1    0.5945 0.7552 0.3856

For firefighters, no preference between interactive or additive. In addition, selflessness and bravery provide equal contribution to heroism.

Psychiatrists

(modAdd<-lm(Heroism ~ scale(Brave) + scale(Selfless), data = Psych))
## 
## Call:
## lm(formula = Heroism ~ scale(Brave) + scale(Selfless), data = Psych)
## 
## Coefficients:
##     (Intercept)     scale(Brave)  scale(Selfless)  
##          4.7091           0.5703           0.5451
(modInt<-lm(Heroism ~ scale(Brave) * scale(Selfless), data = Psych))
## 
## Call:
## lm(formula = Heroism ~ scale(Brave) * scale(Selfless), data = Psych)
## 
## Coefficients:
##                  (Intercept)                  scale(Brave)  
##                      4.68824                       0.58249  
##              scale(Selfless)  scale(Brave):scale(Selfless)  
##                      0.53804                       0.03375
anova(modAdd, modInt)
## Analysis of Variance Table
## 
## Model 1: Heroism ~ scale(Brave) + scale(Selfless)
## Model 2: Heroism ~ scale(Brave) * scale(Selfless)
##   Res.Df    RSS Df Sum of Sq      F Pr(>F)
## 1    272 254.58                           
## 2    271 254.21  1   0.37636 0.4012  0.527
paste0("Model do not significantly differ")
## [1] "Model do not significantly differ"
car::linearHypothesis(modAdd, "scale(Brave) = scale(Selfless)") 
## 
## Linear hypothesis test:
## scale(Brave) - scale(Selfless) = 0
## 
## Model 1: restricted model
## Model 2: Heroism ~ scale(Brave) + scale(Selfless)
## 
##   Res.Df    RSS Df Sum of Sq      F Pr(>F)
## 1    273 254.62                           
## 2    272 254.58  1  0.032978 0.0352 0.8512

In psychiatrists, no preference between interactive or additive. In addition, selflessness and bravery provide equal contribution to heroism.

Welders

summary(modAdd<-lm(Heroism ~ scale(Brave) + scale(Selfless), data = Weld))
## 
## Call:
## lm(formula = Heroism ~ scale(Brave) + scale(Selfless), data = Weld)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.9630 -0.7375  0.1871  0.8861  3.7136 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      4.70632    0.07616  61.799  < 2e-16 ***
## scale(Brave)     0.26176    0.08222   3.184  0.00163 ** 
## scale(Selfless)  0.71511    0.08222   8.697 3.59e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.249 on 266 degrees of freedom
## Multiple R-squared:  0.3172, Adjusted R-squared:  0.3121 
## F-statistic: 61.79 on 2 and 266 DF,  p-value: < 2.2e-16
summary(modInt<-lm(Heroism ~ scale(Brave) * scale(Selfless), data = Weld))
## 
## Call:
## lm(formula = Heroism ~ scale(Brave) * scale(Selfless), data = Weld)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.0395 -0.6597  0.1677  0.9521  3.1439 
## 
## Coefficients:
##                              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                   4.66879    0.08361  55.840  < 2e-16 ***
## scale(Brave)                  0.30238    0.09031   3.348 0.000931 ***
## scale(Selfless)               0.68509    0.08672   7.900 7.47e-14 ***
## scale(Brave):scale(Selfless)  0.10107    0.09309   1.086 0.278581    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.249 on 265 degrees of freedom
## Multiple R-squared:  0.3203, Adjusted R-squared:  0.3126 
## F-statistic: 41.62 on 3 and 265 DF,  p-value: < 2.2e-16
anova(modAdd, modInt)
## Analysis of Variance Table
## 
## Model 1: Heroism ~ scale(Brave) + scale(Selfless)
## Model 2: Heroism ~ scale(Brave) * scale(Selfless)
##   Res.Df    RSS Df Sum of Sq      F Pr(>F)
## 1    266 414.99                           
## 2    265 413.15  1    1.8379 1.1788 0.2786
paste0("Slight preference for interactive models for welders")
## [1] "Slight preference for interactive models for welders"
car::linearHypothesis(modInt, "scale(Brave) = scale(Selfless)") 
## 
## Linear hypothesis test:
## scale(Brave) - scale(Selfless) = 0
## 
## Model 1: restricted model
## Model 2: Heroism ~ scale(Brave) * scale(Selfless)
## 
##   Res.Df    RSS Df Sum of Sq      F Pr(>F)  
## 1    266 423.17                             
## 2    265 413.15  1    10.025 6.4299 0.0118 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

For welders: no preference between interactive or additive. However, heroism is predicted by selflessness rather than bravery.


The plots below describe the Beta comparisons reported in the exploratory analyses:

# Right, so we're going to plot the betas difference for each occupation
# We create a list of df

datasets <- list(
  Firefighters   = Firef,
  Psychiatrists  = Psych,
  Welders = Weld
)

# Storing the results of the models
results <- list()
Firef$Brave <- scale(Firef$Brave)
Firef$Selfless <- scale(Firef$Selfless)

Weld$Brave <- scale(Weld$Brave)
Weld$Selfless <- scale(Weld$Selfless)

Psych$Brave <- scale(Psych$Brave)
Psych$Selfless <- scale(Psych$Selfless)


# for loop: in each dataset, fit the model, and extract the betas to substract them
for(model_name in names(datasets)) {
  data_ <- datasets[[model_name]]
  
  # Fitting mod
  mod <- lm(Heroism ~ Brave + Selfless, data = data_)
  
  # Extract coefficients and the variance-covariance matrix (used for 95%CI)
  coefs <- coef(mod)
  vc   <- vcov(mod)
  
  # Compute the difference between coefficients "Brave" and "Selfless"
  diff_coef <- coefs["Brave"] - coefs["Selfless"]
  
  # Compute standard error of the difference:
  se_diff <- sqrt(vc["Brave", "Brave"] + vc["Selfless", "Selfless"] - 2 * vc["Brave", "Selfless"])
  
  # Compute the 95% confidence interval using a normal approximation (z = 1.96)
  crit <- qnorm(0.975)
  lower <- diff_coef - crit * se_diff
  upper <- diff_coef + crit * se_diff
  
  # Store the results in a data frame
  results[[model_name]] <- data.frame(
    Model  = model_name,
    diff   = diff_coef,
    lower  = lower,
    upper  = upper
  )
}

# Combine the list of data frames into one
df_results <- do.call(rbind, results)
df_results$Model <- factor(df_results$Model, levels = names(datasets))

ggplot(df_results, aes(x = Model, y = diff)) +
  geom_point(size = 3) +
  geom_errorbar(aes(ymin = lower, ymax = upper), width = 0.2) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
  labs(
    title = "Relative contribution of Motivation vs Selfless in predicting Heroism",
    y = "Coefficient Difference (Brave - Selfless)",
    x = "Occupation"
  ) +
  theme_minimal()

Danger and Helpfulness

Firefighters

summary(modAdd<-lm(Heroism ~ scale(Danger) + scale(Helpfulness), data = Firef))
## 
## Call:
## lm(formula = Heroism ~ scale(Danger) + scale(Helpfulness), data = Firef)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.5281 -0.5281  0.3931  0.4719  2.2921 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         6.01838    0.06089  98.838  < 2e-16 ***
## scale(Danger)       0.32933    0.07037   4.680 4.55e-06 ***
## scale(Helpfulness)  0.42333    0.07037   6.016 5.82e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.004 on 269 degrees of freedom
## Multiple R-squared:  0.2988, Adjusted R-squared:  0.2936 
## F-statistic: 57.32 on 2 and 269 DF,  p-value: < 2.2e-16
summary(modInt<-lm(Heroism ~ scale(Danger) * scale(Helpfulness), data = Firef))
## 
## Call:
## lm(formula = Heroism ~ scale(Danger) * scale(Helpfulness), data = Firef)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.5463 -0.5463  0.4199  0.4537  2.2978 
## 
## Coefficients:
##                                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                       6.00858    0.06276  95.733  < 2e-16 ***
## scale(Danger)                     0.35031    0.07738   4.527 8.99e-06 ***
## scale(Helpfulness)                0.43170    0.07159   6.030 5.41e-09 ***
## scale(Danger):scale(Helpfulness)  0.01974    0.03012   0.655    0.513    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.005 on 268 degrees of freedom
## Multiple R-squared:  0.2999, Adjusted R-squared:  0.2921 
## F-statistic: 38.28 on 3 and 268 DF,  p-value: < 2.2e-16
anova(modAdd, modInt)
## Analysis of Variance Table
## 
## Model 1: Heroism ~ scale(Danger) + scale(Helpfulness)
## Model 2: Heroism ~ scale(Danger) * scale(Helpfulness)
##   Res.Df    RSS Df Sum of Sq      F Pr(>F)
## 1    269 271.29                           
## 2    268 270.86  1   0.43402 0.4294 0.5128
paste0("Model do not significantly differ. Consistency motive: we keep interaction; or Parsimony motive: we go with additive")
## [1] "Model do not significantly differ. Consistency motive: we keep interaction; or Parsimony motive: we go with additive"
car::linearHypothesis(modAdd, "scale(Danger) = scale(Helpfulness)") 
## 
## Linear hypothesis test:
## scale(Danger) - scale(Helpfulness) = 0
## 
## Model 1: restricted model
## Model 2: Heroism ~ scale(Danger) + scale(Helpfulness)
## 
##   Res.Df    RSS Df Sum of Sq      F Pr(>F)
## 1    270 271.89                           
## 2    269 271.29  1   0.60054 0.5955  0.441

Psychiatrists

summary(modAdd<-lm(Heroism ~ scale(Danger) + scale(Helpfulness), data = Psych))
## 
## Call:
## lm(formula = Heroism ~ scale(Danger) + scale(Helpfulness), data = Psych)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.8336 -0.6772  0.1664  0.8372  2.9688 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         4.70909    0.07008  67.192  < 2e-16 ***
## scale(Danger)       0.33513    0.07312   4.583 6.98e-06 ***
## scale(Helpfulness)  0.60826    0.07312   8.319 4.33e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.162 on 272 degrees of freedom
## Multiple R-squared:  0.3077, Adjusted R-squared:  0.3027 
## F-statistic: 60.46 on 2 and 272 DF,  p-value: < 2.2e-16
summary(modInt<-lm(Heroism ~ scale(Danger) * scale(Helpfulness), data = Psych))
## 
## Call:
## lm(formula = Heroism ~ scale(Danger) * scale(Helpfulness), data = Psych)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.8074 -0.7717  0.1926  0.7176  3.4248 
## 
## Coefficients:
##                                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                       4.68036    0.07198  65.024  < 2e-16 ***
## scale(Danger)                     0.33949    0.07293   4.655 5.08e-06 ***
## scale(Helpfulness)                0.61932    0.07319   8.462 1.67e-15 ***
## scale(Danger):scale(Helpfulness)  0.10330    0.06233   1.657   0.0986 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.158 on 271 degrees of freedom
## Multiple R-squared:  0.3147, Adjusted R-squared:  0.3071 
## F-statistic: 41.48 on 3 and 271 DF,  p-value: < 2.2e-16
anova(modAdd, modInt)
## Analysis of Variance Table
## 
## Model 1: Heroism ~ scale(Danger) + scale(Helpfulness)
## Model 2: Heroism ~ scale(Danger) * scale(Helpfulness)
##   Res.Df    RSS Df Sum of Sq      F  Pr(>F)  
## 1    272 367.40                              
## 2    271 363.71  1    3.6869 2.7471 0.09859 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
paste0("Model do not significantly differ. Consistency motive: we keep interaction; or Parsimony motive: we go with additive")
## [1] "Model do not significantly differ. Consistency motive: we keep interaction; or Parsimony motive: we go with additive"
car::linearHypothesis(modAdd, "scale(Danger) = scale(Helpfulness)") 
## 
## Linear hypothesis test:
## scale(Danger) - scale(Helpfulness) = 0
## 
## Model 1: restricted model
## Model 2: Heroism ~ scale(Danger) + scale(Helpfulness)
## 
##   Res.Df    RSS Df Sum of Sq      F  Pr(>F)  
## 1    273 374.76                              
## 2    272 367.40  1    7.3676 5.4545 0.02024 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

In psychiatrists, Heroism is about helpfulness rather than danger.

Welders

summary(modAdd<-lm(Heroism ~ scale(Danger) + scale(Helpfulness), data = Weld))
## 
## Call:
## lm(formula = Heroism ~ scale(Danger) + scale(Helpfulness), data = Weld)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.7343 -0.7605  0.2133  0.9320  3.3926 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         4.70632    0.07552  62.317   <2e-16 ***
## scale(Danger)       0.15624    0.07751   2.016   0.0448 *  
## scale(Helpfulness)  0.81569    0.07751  10.524   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.239 on 266 degrees of freedom
## Multiple R-squared:  0.3285, Adjusted R-squared:  0.3235 
## F-statistic: 65.07 on 2 and 266 DF,  p-value: < 2.2e-16
summary(modInt<-lm(Heroism ~ scale(Danger) * scale(Helpfulness), data = Weld))
## 
## Call:
## lm(formula = Heroism ~ scale(Danger) * scale(Helpfulness), data = Weld)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.8375 -0.7809  0.1625  0.8412  3.2324 
## 
## Coefficients:
##                                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                       4.67804    0.07613  61.450  < 2e-16 ***
## scale(Danger)                     0.24276    0.08671   2.800  0.00549 ** 
## scale(Helpfulness)                0.80637    0.07710  10.459  < 2e-16 ***
## scale(Danger):scale(Helpfulness)  0.13076    0.06032   2.168  0.03105 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.23 on 265 degrees of freedom
## Multiple R-squared:  0.3402, Adjusted R-squared:  0.3328 
## F-statistic: 45.55 on 3 and 265 DF,  p-value: < 2.2e-16
anova(modAdd, modInt)
## Analysis of Variance Table
## 
## Model 1: Heroism ~ scale(Danger) + scale(Helpfulness)
## Model 2: Heroism ~ scale(Danger) * scale(Helpfulness)
##   Res.Df    RSS Df Sum of Sq   F  Pr(>F)  
## 1    266 408.12                           
## 2    265 401.00  1    7.1122 4.7 0.03105 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
paste0("Slight preference for interactive models for welders")
## [1] "Slight preference for interactive models for welders"
car::linearHypothesis(modInt, "scale(Danger) = scale(Helpfulness)") 
## 
## Linear hypothesis test:
## scale(Danger) - scale(Helpfulness) = 0
## 
## Model 1: restricted model
## Model 2: Heroism ~ scale(Danger) * scale(Helpfulness)
## 
##   Res.Df    RSS Df Sum of Sq      F    Pr(>F)    
## 1    266 430.35                                  
## 2    265 401.00  1     29.35 19.396 1.543e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

For welders: an interactive model. Heroism is definitely about Helpfulness though. In our previous study, we did not find a superior influence of helpfulness over danger - but participants were not made aware of the fact that welders were helpful.


The plots below describe the Beta comparisons reported in the exploratory analyses:

# Right, so we're going to plot the betas difference for each occupation
# We create a list of df

datasets <- list(
  Firefighters   = Firef,
  Psychiatrists  = Psych,
  Welders = Weld
)

# Storing the results of the models
results <- list()
Firef$Danger <- scale(Firef$Danger)
Firef$Helpfulness <- scale(Firef$Helpfulness)

Weld$Danger <- scale(Weld$Danger)
Weld$Helpfulness <- scale(Weld$Helpfulness)

Psych$Danger <- scale(Psych$Danger)
Psych$Helpful <- scale(Psych$Helpfulness)


# for loop: in each dataset, fit the model, and extract the betas to substract them
for(model_name in names(datasets)) {
  data_ <- datasets[[model_name]]
  
  # Fitting mod
  mod <- lm(Heroism ~ Danger + Helpfulness, data = data_)
  
  # Extract coefficients and the variance-covariance matrix (used for 95%CI)
  coefs <- coef(mod)
  vc   <- vcov(mod)
  
  # Compute the difference between coefficients "Brave" and "Selfless"
  diff_coef <- coefs["Danger"] - coefs["Helpfulness"]
  
  # Compute standard error of the difference:
  se_diff <- sqrt(vc["Danger", "Danger"] + vc["Helpfulness", "Helpfulness"] - 2 * vc["Danger", "Helpfulness"])
  
  # Compute the 95% confidence interval using a normal approximation (z = 1.96)
  crit <- qnorm(0.975)
  lower <- diff_coef - crit * se_diff
  upper <- diff_coef + crit * se_diff
  
  # Store the results in a data frame
  results[[model_name]] <- data.frame(
    Model  = model_name,
    diff   = diff_coef,
    lower  = lower,
    upper  = upper
  )
}

# Combine the list of data frames into one
df_results <- do.call(rbind, results)
df_results$Model <- factor(df_results$Model, levels = names(datasets))

ggplot(df_results, aes(x = Model, y = diff)) +
  geom_point(size = 3) +
  geom_errorbar(aes(ymin = lower, ymax = upper), width = 0.2) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
  labs(
    title = "Relative contribution of Motivation vs Helpfulness in predicting Heroism",
    y = "Coefficient Difference (Motivation - Helpfulness)",
    x = "Occupation"
  ) +
  theme_minimal()

Any question can be addressed to Jean Monéger (My contact can be easily found using Google).





Appendix

Credibility test

Below are some additional insights into credibility of the manipulation and how it 1) is influenced by the conclusion, and 2) how it influences our results. There is solid ground to consider that the manipulation was:

  • Credible
  • Weaker for nurses and firefighters
  • The more credible, the better the effect of our manipulation.
summary(lm(Credibility ~ Job, data = Set))
## 
## Call:
## lm(formula = Credibility ~ Job, data = Set)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.6103 -0.6103  0.3897  0.8800  1.8800 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  5.61029    0.08382  66.931  < 2e-16 ***
## JobP        -0.49029    0.11822  -4.147 3.72e-05 ***
## JobW        -0.24970    0.11887  -2.101    0.036 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.382 on 813 degrees of freedom
## Multiple R-squared:  0.02072,    Adjusted R-squared:  0.01831 
## F-statistic: 8.601 on 2 and 813 DF,  p-value: 0.0002013
summary(lm(Credibility ~ Help_dummy, data = Firef))
## 
## Call:
## lm(formula = Credibility ~ Help_dummy, data = Firef)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.4338 -0.4338  0.2132  1.2132  1.5662 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  5.61029    0.07968  70.414   <2e-16 ***
## Help_dummy   0.35294    0.15935   2.215   0.0276 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.314 on 270 degrees of freedom
## Multiple R-squared:  0.01784,    Adjusted R-squared:  0.01421 
## F-statistic: 4.906 on 1 and 270 DF,  p-value: 0.02761
by(Firef$Credibility, Firef$Help_dummy, mean)
## Firef$Help_dummy: -0.5
## [1] 5.433824
## ------------------------------------------------------------ 
## Firef$Help_dummy: 0.5
## [1] 5.786765
by(Firef$Credibility, Firef$Help_dummy, sd)
## Firef$Help_dummy: -0.5
## [1] 1.39152
## ------------------------------------------------------------ 
## Firef$Help_dummy: 0.5
## [1] 1.231729
ggplot(Firef, aes(x = Help, y = Credibility)) +
  geom_boxplot() +
  labs(x = "Condition ",
       y = "Credibility",
       title = "FIREFIGHTERS: Credibility by Help Conditions") +
  theme_minimal()

summary(lm(Credibility ~ Help_dummy, data = Psych))
## 
## Call:
## lm(formula = Credibility ~ Help_dummy, data = Psych)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.3162 -0.9281  0.0719  1.0719  2.0719 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  5.12212    0.08296  61.739   <2e-16 ***
## Help_dummy   0.38812    0.16593   2.339   0.0201 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.376 on 273 degrees of freedom
## Multiple R-squared:  0.01965,    Adjusted R-squared:  0.01606 
## F-statistic: 5.471 on 1 and 273 DF,  p-value: 0.02005
by(Psych$Credibility, Psych$Help_dummy, mean)
## Psych$Help_dummy: -0.5
## [1] 4.928058
## ------------------------------------------------------------ 
## Psych$Help_dummy: 0.5
## [1] 5.316176
by(Psych$Credibility, Psych$Help_dummy, sd)
## Psych$Help_dummy: -0.5
## [1] 1.391695
## ------------------------------------------------------------ 
## Psych$Help_dummy: 0.5
## [1] 1.359206
ggplot(Psych, aes(x = Help, y = Credibility)) +
  geom_boxplot() +
  labs(x = "Condition (Motivation_dummy & Help_dummy)",
       y = "Credibility",
       title = "PSYCH: Credibility by Motivation and Help Conditions") +
  theme_minimal()

summary(lm(Credibility ~ Help_dummy, data = Weld))
## 
## Call:
## lm(formula = Credibility ~ Help_dummy, data = Weld)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.6423 -0.6423  0.3577  0.9318  1.9318 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  5.35526    0.08591  62.338  < 2e-16 ***
## Help_dummy   0.57415    0.17181   3.342 0.000951 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.409 on 267 degrees of freedom
## Multiple R-squared:  0.04015,    Adjusted R-squared:  0.03655 
## F-statistic: 11.17 on 1 and 267 DF,  p-value: 0.0009515
by(Weld$Credibility, Weld$Help_dummy, mean)
## Weld$Help_dummy: -0.5
## [1] 5.068182
## ------------------------------------------------------------ 
## Weld$Help_dummy: 0.5
## [1] 5.642336
by(Weld$Credibility, Weld$Help_dummy, sd)
## Weld$Help_dummy: -0.5
## [1] 1.554079
## ------------------------------------------------------------ 
## Weld$Help_dummy: 0.5
## [1] 1.252863
ggplot(Weld, aes(x = Help, y = Credibility)) +
  geom_boxplot() +
  labs(x = "Condition (Motivation_dummy & Help_dummy)",
       y = "Credibility",
       title = "WELDERS: Credibility by Motivation and Help Conditions") +
  theme_minimal()

Maybe our effects are conditionned by the credibility of our manipulation. We can model our effects using credibility as a covariant

summary(mod_cov2<-lm(Heroism ~  Help_dummy + scale(Credibility) , data = Set))
## 
## Call:
## lm(formula = Heroism ~ Help_dummy + scale(Credibility), data = Set)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.3217 -0.7663  0.2337  1.1246  3.3444 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         5.14393    0.04948 103.950  < 2e-16 ***
## Help_dummy          0.55376    0.10022   5.525 4.43e-08 ***
## scale(Credibility)  0.38742    0.05014   7.727 3.25e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.414 on 813 degrees of freedom
## Multiple R-squared:  0.1157, Adjusted R-squared:  0.1135 
## F-statistic: 53.16 on 2 and 813 DF,  p-value: < 2.2e-16
summary(mod_cov2<-lm(Heroism ~ Danger_scale * Helpfulness_scale + scale(Credibility) , data = Set))
## 
## Call:
## lm(formula = Heroism ~ Danger_scale * Helpfulness_scale + scale(Credibility), 
##     data = Set)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -5.3643 -0.6281  0.2646  0.7884  3.8951 
## 
## Coefficients:
##                                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                     5.11837    0.04150 123.334  < 2e-16 ***
## Danger_scale                    0.35186    0.04463   7.885 1.02e-14 ***
## Helpfulness_scale               0.73581    0.04272  17.225  < 2e-16 ***
## scale(Credibility)              0.21306    0.04221   5.047 5.53e-07 ***
## Danger_scale:Helpfulness_scale  0.10492    0.03180   3.299  0.00101 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.164 on 811 degrees of freedom
## Multiple R-squared:  0.4023, Adjusted R-squared:  0.3994 
## F-statistic: 136.5 on 4 and 811 DF,  p-value: < 2.2e-16
cohens_d(Firef$Credibility ~ Firef$Help)
## Cohen's d |       95% CI
## ------------------------
## 0.27      | [0.03, 0.51]
## 
## - Estimated using pooled SD.
cohens_d(Firef$Credibility ~ Firef$Motivation)
## Cohen's d |       95% CI
## ------------------------
## 0.54      | [0.30, 0.79]
## 
## - Estimated using pooled SD.
cohens_d(Psych$Credibility ~ Psych$Help)
## Cohen's d |       95% CI
## ------------------------
## 0.28      | [0.04, 0.52]
## 
## - Estimated using pooled SD.
cohens_d(Psych$Credibility ~ Psych$Motivation)
## Cohen's d |       95% CI
## ------------------------
## 0.45      | [0.21, 0.68]
## 
## - Estimated using pooled SD.
cohens_d(Weld$Credibility ~ Weld$Help)
## Cohen's d |       95% CI
## ------------------------
## 0.41      | [0.17, 0.65]
## 
## - Estimated using pooled SD.
cohens_d(Weld$Credibility ~ Weld$Motivation)
## Cohen's d |        95% CI
## -------------------------
## -0.10     | [-0.34, 0.14]
## 
## - Estimated using pooled SD.

Exploratory Occupation Decomposition with covariates

Subset analyses: testing attitude and credibility as covariates within occupations.

Firef <- subset(Set, Set$Job == "F")
Psych <- subset(Set, Set$Job == "P")
Weld <- subset(Set, Set$Job == "W")


anova(lm(Heroism ~ Help_dummy* Motivation_dummy, data = Firef))
## Analysis of Variance Table
## 
## Response: Heroism
##                              Df Sum Sq Mean Sq F value  Pr(>F)  
## Help_dummy                    1   2.30  2.2978  1.6342 0.20223  
## Motivation_dummy              1   1.64  1.6443  1.1694 0.28049  
## Help_dummy:Motivation_dummy   1   6.14  6.1359  4.3638 0.03765 *
## Residuals                   268 376.83  1.4061                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(lm(Heroism ~ Help_dummy* Motivation_dummy, data = Psych))
## Analysis of Variance Table
## 
## Response: Heroism
##                              Df Sum Sq Mean Sq F value  Pr(>F)  
## Help_dummy                    1   9.51  9.5066  5.0084 0.02604 *
## Motivation_dummy              1   4.78  4.7840  2.5204 0.11355  
## Help_dummy:Motivation_dummy   1   2.05  2.0461  1.0780 0.30008  
## Residuals                   271 514.39  1.8981                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(lm(Heroism ~ Help_dummy* Motivation_dummy, data = Weld))
## Analysis of Variance Table
## 
## Response: Heroism
##                              Df Sum Sq Mean Sq F value Pr(>F)    
## Help_dummy                    1 149.45 149.448 86.5494 <2e-16 ***
## Motivation_dummy              1   0.77   0.766  0.4435 0.5060    
## Help_dummy:Motivation_dummy   1   0.00   0.001  0.0005 0.9815    
## Residuals                   265 457.58   1.727                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(lm(Heroism ~ Help_dummy * Motivation_dummy + scale(Attitude), data = Firef))
## 
## Call:
## lm(formula = Heroism ~ Help_dummy * Motivation_dummy + scale(Attitude), 
##     data = Firef)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.3249 -0.3992  0.4528  0.6751  3.1083 
## 
## Coefficients:
##                              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                  6.019269   0.064546  93.256   <2e-16 ***
## Help_dummy                   0.157466   0.129129   1.219   0.2238    
## Motivation_dummy            -0.009478   0.130689  -0.073   0.9422    
## scale(Attitude)              0.531344   0.065616   8.098    2e-14 ***
## Help_dummy:Motivation_dummy  0.463633   0.258738   1.792   0.0743 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.064 on 267 degrees of freedom
## Multiple R-squared:  0.2181, Adjusted R-squared:  0.2064 
## F-statistic: 18.62 on 4 and 267 DF,  p-value: 1.644e-13
report(lm(Heroism ~ Help_dummy * Motivation_dummy + scale(Attitude), data = Firef))
## We fitted a linear model (estimated using OLS) to predict Heroism with
## Help_dummy, Motivation_dummy and Attitude (formula: Heroism ~ Help_dummy *
## Motivation_dummy + scale(Attitude)). The model explains a statistically
## significant and moderate proportion of variance (R2 = 0.22, F(4, 267) = 18.62,
## p < .001, adj. R2 = 0.21). The model's intercept, corresponding to Help_dummy =
## 0, Motivation_dummy = 0 and Attitude = 0, is at 6.02 (95% CI [5.89, 6.15],
## t(267) = 93.26, p < .001). Within this model:
## 
##   - The effect of Help dummy is statistically non-significant and positive (beta
## = 0.16, 95% CI [-0.10, 0.41], t(267) = 1.22, p = 0.224; Std. beta = 0.07, 95%
## CI [-0.04, 0.17])
##   - The effect of Motivation dummy is statistically non-significant and negative
## (beta = -9.48e-03, 95% CI [-0.27, 0.25], t(267) = -0.07, p = 0.942; Std. beta =
## -3.97e-03, 95% CI [-0.11, 0.10])
##   - The effect of Attitude is statistically significant and positive (beta =
## 0.53, 95% CI [0.40, 0.66], t(267) = 8.10, p < .001; Std. beta = 0.44, 95% CI
## [0.34, 0.55])
##   - The effect of Help dummy × Motivation dummy is statistically non-significant
## and positive (beta = 0.46, 95% CI [-0.05, 0.97], t(267) = 1.79, p = 0.074; Std.
## beta = 0.10, 95% CI [-9.62e-03, 0.20])
## 
## Standardized parameters were obtained by fitting the model on a standardized
## version of the dataset. 95% Confidence Intervals (CIs) and p-values were
## computed using a Wald t-distribution approximation.
summary(lm(Heroism ~ Help_dummy * Motivation_dummy + scale(Credibility), data = Firef))
## 
## Call:
## lm(formula = Heroism ~ Help_dummy * Motivation_dummy + scale(Credibility), 
##     data = Firef)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.0634 -0.6851  0.2233  0.8451  1.7480 
## 
## Coefficients:
##                             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                  6.01957    0.07056  85.317  < 2e-16 ***
## Help_dummy                   0.11470    0.14255   0.805 0.421776    
## Motivation_dummy             0.02316    0.14648   0.158 0.874476    
## scale(Credibility)           0.25031    0.07436   3.366 0.000874 ***
## Help_dummy:Motivation_dummy  0.69300    0.28355   2.444 0.015172 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.164 on 267 degrees of freedom
## Multiple R-squared:  0.0657, Adjusted R-squared:  0.0517 
## F-statistic: 4.694 on 4 and 267 DF,  p-value: 0.001122
report(lm(Heroism ~ Help_dummy * Motivation_dummy + scale(Credibility), data = Firef))
## We fitted a linear model (estimated using OLS) to predict Heroism with
## Help_dummy, Motivation_dummy and Credibility (formula: Heroism ~ Help_dummy *
## Motivation_dummy + scale(Credibility)). The model explains a statistically
## significant and weak proportion of variance (R2 = 0.07, F(4, 267) = 4.69, p =
## 0.001, adj. R2 = 0.05). The model's intercept, corresponding to Help_dummy = 0,
## Motivation_dummy = 0 and Credibility = 0, is at 6.02 (95% CI [5.88, 6.16],
## t(267) = 85.32, p < .001). Within this model:
## 
##   - The effect of Help dummy is statistically non-significant and positive (beta
## = 0.11, 95% CI [-0.17, 0.40], t(267) = 0.80, p = 0.422; Std. beta = 0.05, 95%
## CI [-0.07, 0.17])
##   - The effect of Motivation dummy is statistically non-significant and positive
## (beta = 0.02, 95% CI [-0.27, 0.31], t(267) = 0.16, p = 0.874; Std. beta =
## 9.71e-03, 95% CI [-0.11, 0.13])
##   - The effect of Credibility is statistically significant and positive (beta =
## 0.25, 95% CI [0.10, 0.40], t(267) = 3.37, p < .001; Std. beta = 0.21, 95% CI
## [0.09, 0.33])
##   - The effect of Help dummy × Motivation dummy is statistically significant and
## positive (beta = 0.69, 95% CI [0.13, 1.25], t(267) = 2.44, p = 0.015; Std. beta
## = 0.15, 95% CI [0.03, 0.26])
## 
## Standardized parameters were obtained by fitting the model on a standardized
## version of the dataset. 95% Confidence Intervals (CIs) and p-values were
## computed using a Wald t-distribution approximation.
summary(lm(Heroism ~ Help_dummy * Motivation_dummy + scale(Attitude), data = Psych))
## 
## Call:
## lm(formula = Heroism ~ Help_dummy * Motivation_dummy + scale(Attitude), 
##     data = Psych)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.1198 -0.4149 -0.0264  0.8119  2.7146 
## 
## Coefficients:
##                              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                  4.709965   0.058473  80.549   <2e-16 ***
## Help_dummy                  -0.009536   0.119210  -0.080   0.9363    
## Motivation_dummy             0.200274   0.117012   1.712   0.0881 .  
## scale(Attitude)              0.995139   0.059769  16.650   <2e-16 ***
## Help_dummy:Motivation_dummy  0.205923   0.234042   0.880   0.3797    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9695 on 270 degrees of freedom
## Multiple R-squared:  0.5218, Adjusted R-squared:  0.5147 
## F-statistic: 73.65 on 4 and 270 DF,  p-value: < 2.2e-16
report(lm(Heroism ~ Help_dummy * Motivation_dummy + scale(Attitude), data = Psych))
## We fitted a linear model (estimated using OLS) to predict Heroism with
## Help_dummy, Motivation_dummy and Attitude (formula: Heroism ~ Help_dummy *
## Motivation_dummy + scale(Attitude)). The model explains a statistically
## significant and substantial proportion of variance (R2 = 0.52, F(4, 270) =
## 73.65, p < .001, adj. R2 = 0.51). The model's intercept, corresponding to
## Help_dummy = 0, Motivation_dummy = 0 and Attitude = 0, is at 4.71 (95% CI
## [4.59, 4.83], t(270) = 80.55, p < .001). Within this model:
## 
##   - The effect of Help dummy is statistically non-significant and negative (beta
## = -9.54e-03, 95% CI [-0.24, 0.23], t(270) = -0.08, p = 0.936; Std. beta =
## -3.57e-03, 95% CI [-0.09, 0.08])
##   - The effect of Motivation dummy is statistically non-significant and positive
## (beta = 0.20, 95% CI [-0.03, 0.43], t(270) = 1.71, p = 0.088; Std. beta = 0.07,
## 95% CI [-0.01, 0.15])
##   - The effect of Attitude is statistically significant and positive (beta =
## 1.00, 95% CI [0.88, 1.11], t(270) = 16.65, p < .001; Std. beta = 0.72, 95% CI
## [0.63, 0.80])
##   - The effect of Help dummy × Motivation dummy is statistically non-significant
## and positive (beta = 0.21, 95% CI [-0.25, 0.67], t(270) = 0.88, p = 0.380; Std.
## beta = 0.04, 95% CI [-0.05, 0.12])
## 
## Standardized parameters were obtained by fitting the model on a standardized
## version of the dataset. 95% Confidence Intervals (CIs) and p-values were
## computed using a Wald t-distribution approximation.
summary(lm(Heroism ~ Help_dummy * Motivation_dummy + scale(Credibility), data = Psych))
## 
## Call:
## lm(formula = Heroism ~ Help_dummy * Motivation_dummy + scale(Credibility), 
##     data = Psych)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.7534 -0.7534  0.0815  0.9867  2.8613 
## 
## Coefficients:
##                             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                  4.71192    0.08052  58.517  < 2e-16 ***
## Help_dummy                   0.27296    0.16279   1.677   0.0947 .  
## Motivation_dummy             0.10785    0.16516   0.653   0.5143    
## scale(Credibility)           0.36051    0.08367   4.309  2.3e-05 ***
## Help_dummy:Motivation_dummy  0.41890    0.32254   1.299   0.1951    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.335 on 270 degrees of freedom
## Multiple R-squared:  0.09314,    Adjusted R-squared:  0.07971 
## F-statistic: 6.933 on 4 and 270 DF,  p-value: 2.515e-05
report(lm(Heroism ~ Help_dummy * Motivation_dummy + scale(Credibility), data = Psych))
## We fitted a linear model (estimated using OLS) to predict Heroism with
## Help_dummy, Motivation_dummy and Credibility (formula: Heroism ~ Help_dummy *
## Motivation_dummy + scale(Credibility)). The model explains a statistically
## significant and weak proportion of variance (R2 = 0.09, F(4, 270) = 6.93, p <
## .001, adj. R2 = 0.08). The model's intercept, corresponding to Help_dummy = 0,
## Motivation_dummy = 0 and Credibility = 0, is at 4.71 (95% CI [4.55, 4.87],
## t(270) = 58.52, p < .001). Within this model:
## 
##   - The effect of Help dummy is statistically non-significant and positive (beta
## = 0.27, 95% CI [-0.05, 0.59], t(270) = 1.68, p = 0.095; Std. beta = 0.10, 95%
## CI [-0.02, 0.21])
##   - The effect of Motivation dummy is statistically non-significant and positive
## (beta = 0.11, 95% CI [-0.22, 0.43], t(270) = 0.65, p = 0.514; Std. beta = 0.04,
## 95% CI [-0.08, 0.16])
##   - The effect of Credibility is statistically significant and positive (beta =
## 0.36, 95% CI [0.20, 0.53], t(270) = 4.31, p < .001; Std. beta = 0.26, 95% CI
## [0.14, 0.38])
##   - The effect of Help dummy × Motivation dummy is statistically non-significant
## and positive (beta = 0.42, 95% CI [-0.22, 1.05], t(270) = 1.30, p = 0.195; Std.
## beta = 0.08, 95% CI [-0.04, 0.19])
## 
## Standardized parameters were obtained by fitting the model on a standardized
## version of the dataset. 95% Confidence Intervals (CIs) and p-values were
## computed using a Wald t-distribution approximation.
summary(lm(Heroism ~ Help_dummy * Motivation_dummy + scale(Attitude), data = Weld))
## 
## Call:
## lm(formula = Heroism ~ Help_dummy * Motivation_dummy + scale(Attitude), 
##     data = Weld)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.0067 -0.5745  0.0551  0.9308  2.1037 
## 
## Coefficients:
##                             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                  4.69737    0.07080  66.344  < 2e-16 ***
## Help_dummy                   0.88260    0.15784   5.592 5.61e-08 ***
## Motivation_dummy            -0.04158    0.14262  -0.292    0.771    
## scale(Attitude)              0.69253    0.07963   8.696 3.72e-16 ***
## Help_dummy:Motivation_dummy  0.11114    0.28346   0.392    0.695    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.161 on 264 degrees of freedom
## Multiple R-squared:  0.4148, Adjusted R-squared:  0.4059 
## F-statistic: 46.78 on 4 and 264 DF,  p-value: < 2.2e-16
report(lm(Heroism ~ Help_dummy * Motivation_dummy + scale(Attitude), data = Weld))
## We fitted a linear model (estimated using OLS) to predict Heroism with
## Help_dummy, Motivation_dummy and Attitude (formula: Heroism ~ Help_dummy *
## Motivation_dummy + scale(Attitude)). The model explains a statistically
## significant and substantial proportion of variance (R2 = 0.41, F(4, 264) =
## 46.78, p < .001, adj. R2 = 0.41). The model's intercept, corresponding to
## Help_dummy = 0, Motivation_dummy = 0 and Attitude = 0, is at 4.70 (95% CI
## [4.56, 4.84], t(264) = 66.34, p < .001). Within this model:
## 
##   - The effect of Help dummy is statistically significant and positive (beta =
## 0.88, 95% CI [0.57, 1.19], t(264) = 5.59, p < .001; Std. beta = 0.29, 95% CI
## [0.19, 0.40])
##   - The effect of Motivation dummy is statistically non-significant and negative
## (beta = -0.04, 95% CI [-0.32, 0.24], t(264) = -0.29, p = 0.771; Std. beta =
## -0.01, 95% CI [-0.11, 0.08])
##   - The effect of Attitude is statistically significant and positive (beta =
## 0.69, 95% CI [0.54, 0.85], t(264) = 8.70, p < .001; Std. beta = 0.46, 95% CI
## [0.36, 0.56])
##   - The effect of Help dummy × Motivation dummy is statistically non-significant
## and positive (beta = 0.11, 95% CI [-0.45, 0.67], t(264) = 0.39, p = 0.695; Std.
## beta = 0.02, 95% CI [-0.07, 0.11])
## 
## Standardized parameters were obtained by fitting the model on a standardized
## version of the dataset. 95% Confidence Intervals (CIs) and p-values were
## computed using a Wald t-distribution approximation.
summary(lm(Heroism ~ Help_dummy * Motivation_dummy + scale(Credibility), data = Weld))
## 
## Call:
## lm(formula = Heroism ~ Help_dummy * Motivation_dummy + scale(Credibility), 
##     data = Weld)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.8177 -0.6312  0.1123  0.8083  2.7469 
## 
## Coefficients:
##                             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                  4.69395    0.07821  60.013  < 2e-16 ***
## Help_dummy                   1.36745    0.15970   8.563 9.26e-16 ***
## Motivation_dummy             0.13947    0.15667   0.890 0.374151    
## scale(Credibility)           0.30359    0.08029   3.781 0.000193 ***
## Help_dummy:Motivation_dummy  0.09406    0.31370   0.300 0.764531    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.282 on 264 degrees of freedom
## Multiple R-squared:  0.2858, Adjusted R-squared:  0.275 
## F-statistic: 26.41 on 4 and 264 DF,  p-value: < 2.2e-16
report(lm(Heroism ~ Help_dummy * Motivation_dummy + scale(Credibility), data = Weld))
## We fitted a linear model (estimated using OLS) to predict Heroism with
## Help_dummy, Motivation_dummy and Credibility (formula: Heroism ~ Help_dummy *
## Motivation_dummy + scale(Credibility)). The model explains a statistically
## significant and substantial proportion of variance (R2 = 0.29, F(4, 264) =
## 26.41, p < .001, adj. R2 = 0.28). The model's intercept, corresponding to
## Help_dummy = 0, Motivation_dummy = 0 and Credibility = 0, is at 4.69 (95% CI
## [4.54, 4.85], t(264) = 60.01, p < .001). Within this model:
## 
##   - The effect of Help dummy is statistically significant and positive (beta =
## 1.37, 95% CI [1.05, 1.68], t(264) = 8.56, p < .001; Std. beta = 0.45, 95% CI
## [0.35, 0.56])
##   - The effect of Motivation dummy is statistically non-significant and positive
## (beta = 0.14, 95% CI [-0.17, 0.45], t(264) = 0.89, p = 0.374; Std. beta = 0.05,
## 95% CI [-0.06, 0.15])
##   - The effect of Credibility is statistically significant and positive (beta =
## 0.30, 95% CI [0.15, 0.46], t(264) = 3.78, p < .001; Std. beta = 0.20, 95% CI
## [0.10, 0.31])
##   - The effect of Help dummy × Motivation dummy is statistically non-significant
## and positive (beta = 0.09, 95% CI [-0.52, 0.71], t(264) = 0.30, p = 0.765; Std.
## beta = 0.02, 95% CI [-0.09, 0.12])
## 
## Standardized parameters were obtained by fitting the model on a standardized
## version of the dataset. 95% Confidence Intervals (CIs) and p-values were
## computed using a Wald t-distribution approximation.