Chapter 7 Week6_2: R Lab on Disaster Dataset (Chapman and Lickel, 2016)
7.1 Data Prep
The following example data are from Chapman and Lickel (2016) Also example data in Chapter 12 of Hayes (2017)
Simply load the .rda into R:
load("disaster.rda")
head(disaster)
## id frame donate justify skeptic
## 1 1 1 5.6 2.95 1.8
## 2 2 1 4.2 2.85 5.2
## 3 3 1 4.2 3.00 3.2
## 4 4 1 4.6 3.30 1.0
## 5 5 1 3.0 5.00 7.6
## 6 6 0 5.0 3.20 4.2
str(disaster)
## 'data.frame': 211 obs. of 5 variables:
## $ id : num 1 2 3 4 5 6 7 8 9 10 ...
## ..- attr(*, "format.spss")= chr "F8.0"
## ..- attr(*, "display_width")= int 6
## $ frame : num 1 1 1 1 1 0 0 1 0 0 ...
## ..- attr(*, "label")= chr "Experimental condition"
## ..- attr(*, "format.spss")= chr "F8.2"
## ..- attr(*, "labels")= Named num [1:2] 0 1
## .. ..- attr(*, "names")= chr [1:2] "naturally caused disaster" "climate change caused disaster"
## $ donate : num 5.6 4.2 4.2 4.6 3 5 4.8 6 4.2 4.4 ...
## ..- attr(*, "label")= chr "Positive attitudes toward donating"
## ..- attr(*, "format.spss")= chr "F8.2"
## ..- attr(*, "display_width")= int 9
## $ justify: num 2.95 2.85 3 3.3 5 3.2 2.9 1.4 3.25 3.55 ...
## ..- attr(*, "label")= chr "Negative justifications"
## ..- attr(*, "format.spss")= chr "F8.2"
## ..- attr(*, "display_width")= int 10
## $ skeptic: num 1.8 5.2 3.2 1 7.6 4.2 4.2 1.2 1.8 8.8 ...
## ..- attr(*, "label")= chr "Climate change skepticism"
## ..- attr(*, "format.spss")= chr "F8.2"
If you are able to install package processR, you can also view its help page:
install.packages("processR")
# If error message persists, change the repository to CRAN:
install.packages("processR", repos="https://cran.rstudio.com/")
library(processR)
data(disaster)
# take a look at the dataset:
?disaster
library(processR)
You probably have to go to https://www.xquartz.org/ to download and install X11, which is a server required by many R packages, including processR.
Disaster is a data.frame with 211 obs. of 5 variables:
- id
- frame: Experimental condition. 0 = naturally caused disaster, 1 = climate change caused disaster
- donate: Positive attitudes toward donating
- justify: Negative justifications
- skeptic: Climate change skepticism
7.1.1 Scatterplot Matrix
Before we build linear models, we should plot the relationship between pairs of variables:
library(PerformanceAnalytics)
chart.Correlation(disaster[,-1])
7.1.2 p-value or bootstrapped confidence interval?
For models that involve mediation effects, we prefer to use bootstrap confidence intervals over p-values for evaluating the significance of parameter estimates. That is, in the parameter table generated by parameterEstimates() function:
- A coefficient is considered significant when the interval [ci.lower, ci.upper] does not include zero;
- A coefficient is considered insignificant when the interval [ci.lower, ci.upper] includes zero.
In most cases, bootstrap confidence intervals and p-values yield the same conclusions regarding the significance of parameter estimates. If not, bootstrap confidence intervals are used to make the final call.
In this document, all bootstrap confidence intervals and p-values yield the same conclusions regarding significances, so I’ll only refer to p-values for the readability of the analyses.
7.2 Model 1: Simple Linear Regression Model
With processR, you can draw concept diagram and statistical diagram of mediation
and moderation
models quite easily. For example:
=list(X="frame",M="justify",Y="donate",W="skeptic")
labelspar(mfrow = c(2,1), mar=c(0,0,0,0), oma=c(0,0,0,0))
pmacroModel(0,labels=labels)
statisticalDiagram(0, labels=labels)
return the diagrams of a simple linear regression model.
For Model 1, let’s run a simple linear regression using lm() to estimate the total effect of frame on willingness to donate:
= lm(donate ~ frame , data = disaster)
lm1 summary(lm1)[[4]]
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.56363636 0.1258337 36.2672028 3.955220e-92
## frame 0.08388839 0.1818769 0.4612372 6.451081e-01
Note that the
[[4]]
was added aftersummary(lm1)
to request the coefficient table only.The total effect is c = 0.084 (p = 0.645), not significant.
However, we learned in this class that absence of association between X and Y does NOT mean that X isn’t affecting Y (remember inconsistent mediation?).
So let’s move on…
7.3 Model 2: Simple Mediation Model
Q: If a disaster is framed as the result of a climate change (instead of a natural disaster), do you think it’s justified to withhold aid to the victims, and thus become less willing to donate?
par(mfrow = c(1,2), mar=c(0,0,0,0), oma=c(0,0,0,0))
pmacroModel(4,labels=labels)
statisticalDiagram(4, labels=labels)
Load the lavaan package:
library(lavaan)
and test the mediation effect (ab) using bootstrap:
<- '
lm2.syntax donate ~ b*justify + cprime*frame
justify ~ a*frame
# Define new parameters
#The := operator in lavaan defines new parameters.
ab:= a*b
c:= a*b + cprime
'
set.seed(2022)
= sem(lm2.syntax, data = disaster, se = "bootstrap", bootstrap = 1000, fixed.x=FALSE, meanstructure = TRUE)
lm2.bfit summary(lm2.bfit, ci = T)
## lavaan 0.6-10 ended normally after 19 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 9
##
## Number of observations 211
##
## Model Test User Model:
##
## Test statistic 0.000
## Degrees of freedom 0
##
## Parameter Estimates:
##
## Standard errors Bootstrap
## Number of requested bootstrap draws 1000
## Number of successful bootstrap draws 1000
##
## Regressions:
## Estimate Std.Err z-value P(>|z|) ci.lower ci.upper
## donate ~
## justify (b) -0.953 0.065 -14.641 0.000 -1.078 -0.823
## frame (cprm) 0.212 0.139 1.526 0.127 -0.065 0.492
## justify ~
## frame (a) 0.134 0.131 1.023 0.306 -0.133 0.393
##
## Intercepts:
## Estimate Std.Err z-value P(>|z|) ci.lower ci.upper
## .donate 7.235 0.199 36.380 0.000 6.810 7.595
## .justify 2.802 0.083 33.785 0.000 2.644 2.967
## frame 0.479 0.036 13.458 0.000 0.403 0.545
##
## Variances:
## Estimate Std.Err z-value P(>|z|) ci.lower ci.upper
## .donate 0.948 0.118 8.061 0.000 0.712 1.171
## .justify 0.856 0.097 8.866 0.000 0.683 1.071
## frame 0.250 0.003 97.289 0.000 0.241 0.250
##
## Defined Parameters:
## Estimate Std.Err z-value P(>|z|) ci.lower ci.upper
## ab -0.128 0.125 -1.022 0.307 -0.378 0.125
## c 0.084 0.188 0.447 0.655 -0.253 0.476
parameterEstimates(lm2.bfit, boot.ci.type = "bca.simple", standardized = T)
## lhs op rhs label est se z pvalue ci.lower ci.upper std.lv std.all std.nox
## 1 donate ~ justify b -0.953 0.065 -14.641 0.000 -1.083 -0.828 -0.953 -0.673 -0.673
## 2 donate ~ frame cprime 0.212 0.139 1.526 0.127 -0.062 0.503 0.212 0.081 0.161
## 3 justify ~ frame a 0.134 0.131 1.023 0.306 -0.147 0.380 0.134 0.072 0.145
## 4 donate ~~ donate 0.948 0.118 8.061 0.000 0.735 1.214 0.948 0.549 0.549
## 5 justify ~~ justify 0.856 0.097 8.866 0.000 0.699 1.096 0.856 0.995 0.995
## 6 frame ~~ frame 0.250 0.003 97.289 0.000 0.244 0.250 0.250 1.000 0.250
## 7 donate ~1 7.235 0.199 36.380 0.000 6.808 7.590 7.235 5.506 5.506
## 8 justify ~1 2.802 0.083 33.785 0.000 2.649 2.976 2.802 3.022 3.022
## 9 frame ~1 0.479 0.036 13.458 0.000 0.390 0.536 0.479 0.958 0.479
## 10 ab := a*b ab -0.128 0.125 -1.022 0.307 -0.362 0.144 -0.128 -0.049 -0.097
## 11 c := a*b+cprime c 0.084 0.188 0.447 0.655 -0.233 0.524 0.084 0.032 0.064
From the coefficient table, we can see:
- a path: a = 0.134 (p = 0.306)
- b path: b = -0.953 (p = 0.000)
- indirect effect: ab = -0.128 (p = 0.307)
- direct effect: cprime = 0.212 (p = 0.127)
- total effect: c = ab + cprime = 0.084 (p = 0.655)
- Except for b path, all effects above are not significant.
This tells us:
- The framing of the disaster did not significantly change people’s beliefs about whether providing aid to the victims is justified (a path)
- Justification for withholding aid did make participants less willing to donate (b path)
- However, the indirect effect ab was not significant, meaning justification for withholding did not explain the relationship between frame and willingness to donate
Let’s switch to moderation model:
7.4 Model 3: Simple Moderation Model
Skepticism of climate change cannot be changed by the frame, so skeptic is a moderator, not a mediator, it does not stand in the middle of the pathway
par(mfrow = c(1,2), mar=c(0,0,0,0), oma=c(0,0,0,0))
pmacroModel(1,labels=labels)
statisticalDiagram(1, labels=labels)
Since the moderator skeptic is a continuous measure, we need to mean center it first:
$skep_raw = disaster$skeptic
disaster$skeptic = scale(disaster$skep_raw, center = TRUE, scale = FALSE)
disaster$skep_sd = scale(disaster$skep_raw, center = TRUE, scale = TRUE)
disaster$skepxframe = disaster$skeptic * disaster$frame disaster
.. and manually create an interaction term by multiplying skeptic and frame:
$skepxframe = disaster$skeptic * disaster$frame disaster
Let’s examine their means and standard deviations:
round(apply(disaster, 2, mean), 2)
## id frame donate justify skeptic skep_raw skep_sd skepxframe
## 106.00 0.48 4.60 2.87 0.00 3.38 0.00 0.02
round(apply(disaster, 2, sd), 2)
## id frame donate justify skeptic skep_raw skep_sd skepxframe
## 61.05 0.50 1.32 0.93 2.03 2.03 1.00 1.40
Let’s write the syntax for the simple moderation model:
<- '
lm3.syntax #Regression with interaction
donate ~ b1*skeptic + b2*frame + b3*skepxframe
'
= sem(lm3.syntax, data = disaster, fixed.x=FALSE, meanstructure = TRUE)
lm3.fit parameterEstimates(lm3.fit, ci = T)
## lhs op rhs label est se z pvalue ci.lower ci.upper
## 1 donate ~ skeptic b1 -0.140 0.057 -2.433 0.015 -0.252 -0.027
## 2 donate ~ frame b2 0.103 0.169 0.609 0.542 -0.228 0.433
## 3 donate ~ skepxframe b3 -0.171 0.083 -2.054 0.040 -0.334 -0.008
## 4 donate ~~ donate 1.495 0.146 10.271 0.000 1.210 1.780
## 5 skeptic ~~ skeptic 4.113 0.400 10.271 0.000 3.328 4.897
## 6 skeptic ~~ frame 0.021 0.070 0.294 0.769 -0.116 0.157
## 7 skeptic ~~ skepxframe 1.957 0.237 8.249 0.000 1.492 2.423
## 8 frame ~~ frame 0.250 0.024 10.271 0.000 0.202 0.297
## 9 frame ~~ skepxframe 0.011 0.048 0.222 0.824 -0.084 0.105
## 10 skepxframe ~~ skepxframe 1.957 0.191 10.271 0.000 1.584 2.331
## 11 donate ~1 4.558 0.117 39.092 0.000 4.330 4.787
## 12 skeptic ~1 0.000 0.140 0.000 1.000 -0.274 0.274
## 13 frame ~1 0.479 0.034 13.919 0.000 0.411 0.546
## 14 skepxframe ~1 0.021 0.096 0.213 0.831 -0.168 0.209
- b3 = -0.171, p = 0.040
- So this moderator, skeptic, is a significant moderator of the frame-donate path, that is, skepticism of climate change could change the effect of framing on willingness to donate.
7.4.1 JOHNSON-NEYMAN INTERVAL
<- lm(donate ~ skeptic*frame, disaster)
interactionModel2
summary(interactionModel2)
##
## Call:
## lm(formula = donate ~ skeptic * frame, data = disaster)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.8341 -0.7077 0.1659 0.9101 2.6682
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.55815 0.11772 38.719 <2e-16 ***
## skeptic -0.13953 0.05790 -2.410 0.0168 *
## frame 0.10266 0.17016 0.603 0.5469
## skeptic:frame -0.17071 0.08393 -2.034 0.0432 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.234 on 207 degrees of freedom
## Multiple R-squared: 0.1343, Adjusted R-squared: 0.1218
## F-statistic: 10.71 on 3 and 207 DF, p-value: 1.424e-06
library(interactions)
::johnson_neyman(interactionModel2, pred = "frame", modx = "skeptic", alpha = 0.05) interactions
## JOHNSON-NEYMAN INTERVAL
##
## When skeptic is OUTSIDE the interval [-2.59, 22.34], the slope of frame is p < .05.
##
## Note: The range of observed values of skeptic is [-2.38, 5.62]
- As can be seen, it appears that among those low in climate change skepticism (lower than -2.59), framing the drought as caused by climate change produced a greater willingness to donate (simple slopes were significantly positive) compared to when climate change was not described as the cause.
- Among climate change skeptics (i.e., those high on the skepticism scale), the willingness to donate to the victims were not affected the framing of the problem (simple slopes were not significantly different from 0).
Next, let’s test those Moderated Mediation Models one by one.
7.5 Model 4a: Moderated Mediation Model - Path a only
par(mfrow = c(1,2), mar=c(0,0,0,0), oma=c(0,0,0,0))
pmacroModel(7,labels=labels)
statisticalDiagram(7, labels=labels)
Since the frame-justify (a path) is hypothesized to be moderated by skeptic, the simple slope of justify on frame is a function of skeptic, that is, a1+a3*skeptic
The indirect effect through justify also depends on skeptic, calculated as b*(a1+a3*skeptic)
Since skeptic is a continuous variable, we will pick three values from it. The chapter in Hayes (2017) picked the 16th, 50th, and 84th percentiles of the distribution using the quantile() function:
quantile(disaster$skeptic, probs = c(0.16, 0.5, 0.84))
## 16% 50% 84%
## -1.7779621 -0.5779621 1.8220379
which are:
- low: -1.78
- median: -0.58
- mean: 0 (why)
- high: 1.82
We’ll also define the index of moderated mediation to be:
- a3*b (refer to slides of week6_1)
Let’s write the syntax for the moderated mediation model:
<- '
lm4a.syntax donate ~ b*justify + cprime*frame
justify ~ a1*frame + a2*skeptic + a3*skepxframe
# Define simple slopes and conditional indirect effects using :=
# index of moderated mediation
IndMedMod:= a3*b
# simple slope of justify on frame is a1+a3*skeptic
aLow: = a1+a3*(-1.78)
aMedian: = a1+a3*(-0.58)
aMean: = a1+a3*(0)
aHigh: = a1+a3*1.82
# conditional indirect effects is b*(a1+a3*skeptic)
abLow: = b*aLow
abMedian: = b*aMedian
abMean: = b*aMean
abHigh: = b*aHigh
'
set.seed(2022)
= sem(lm4a.syntax, data = disaster, se = "bootstrap", bootstrap = 1000, fixed.x=FALSE, meanstructure = TRUE)
lm4a.fit parameterEstimates(lm4a.fit, level = 0.95, boot.ci.type = "bca.simple")
## lhs op rhs label est se z pvalue ci.lower ci.upper
## 1 donate ~ justify b -0.953 0.065 -14.641 0.000 -1.083 -0.828
## 2 donate ~ frame cprime 0.212 0.139 1.526 0.127 -0.062 0.503
## 3 justify ~ frame a1 0.117 0.114 1.023 0.306 -0.113 0.324
## 4 justify ~ skeptic a2 0.105 0.043 2.459 0.014 0.020 0.194
## 5 justify ~ skepxframe a3 0.201 0.063 3.201 0.001 0.077 0.326
## 6 donate ~~ donate 0.948 0.118 8.061 0.000 0.735 1.214
## 7 justify ~~ justify 0.648 0.066 9.767 0.000 0.539 0.809
## 8 frame ~~ frame 0.250 0.003 97.289 0.000 0.242 0.250
## 9 frame ~~ skeptic 0.021 0.074 0.277 0.782 -0.125 0.168
## 10 frame ~~ skepxframe 0.011 0.052 0.207 0.836 -0.089 0.121
## 11 skeptic ~~ skeptic 4.113 0.498 8.257 0.000 3.211 5.198
## 12 skeptic ~~ skepxframe 1.957 0.349 5.606 0.000 1.333 2.721
## 13 skepxframe ~~ skepxframe 1.957 0.348 5.618 0.000 1.328 2.708
## 14 donate ~1 7.235 0.199 36.380 0.000 6.808 7.590
## 15 justify ~1 2.806 0.079 35.374 0.000 2.659 2.976
## 16 frame ~1 0.479 0.036 13.458 0.000 0.396 0.540
## 17 skeptic ~1 0.000 0.142 0.000 1.000 -0.274 0.286
## 18 skepxframe ~1 0.021 0.099 0.206 0.837 -0.173 0.223
## 19 IndMedMod := a3*b IndMedMod -0.192 0.062 -3.073 0.002 -0.327 -0.076
## 20 aLow := a1+a3*(-1.78) aLow -0.241 0.154 -1.568 0.117 -0.563 0.045
## 21 aMedian := a1+a3*(-0.58) aMedian 0.000 0.117 0.004 0.997 -0.240 0.209
## 22 aMean := a1+a3*(0) aMean 0.117 0.115 1.023 0.307 -0.113 0.324
## 23 aHigh := a1+a3*1.82 aHigh 0.483 0.168 2.874 0.004 0.138 0.829
## 24 abLow := b*aLow abLow 0.230 0.149 1.546 0.122 -0.044 0.540
## 25 abMedian := b*aMedian abMedian 0.000 0.112 -0.004 0.997 -0.201 0.236
## 26 abMean := b*aMean abMean -0.112 0.109 -1.027 0.305 -0.306 0.103
## 27 abHigh := b*aHigh abHigh -0.461 0.164 -2.811 0.005 -0.796 -0.130
So we have:
- interaction of skepxframe on justify: a3 = 0.201 (p = 0.001)
The overall effect of frame on justify is significantly moderated by skeptic. That is, how the disaster is framed has a differential effect for people who differ in their climate change skepticism on their beliefs that if it was justified to withhold aid to the victims.
Let’s look at the simple slopes.
- aLow = -0.241 (p = 0.117)
- aMedian = 0 (p = 0.997)
- aMean = 0.117 (p = 0.307)
- aHigh = 0.483 (p = 0.004)
Moreover, the simple slope aHigh is positive and aLow is negative. That is, when told that the disaster is the result of climate change instead of natural disaster (changing frame from 0 to 1), those who doubt climate change (high on skepticism) think it’s justified to withhold the aid whereas those who do not doubt (low on skepticism) it think it’s not justified to withhold the aid.
Okay! The a path is moderated. What about the mediation effect ab?
- IndexOfModMed = -0.192 (p = 0.002)
IndexOfModMed is sig! Woo-hoo! Indirect effect is moderated, too! So what story does it tell you?
- abLow = 0.230 (p = 0.122)
- abMedian = 0.000 (p = 0.997)
- abMean = -0.112 (p = 0.305)
- abHigh = -0.461 (p = 0.005)
Furthermore, abHigh is negative and abLow is positive, meaning that framing the disaster as caused by climate change leads to less donation for people who doubt climate change (high on skepticism) but it leads to more donation for people who believe it (low on skepticism). The reason for this differential effect is that those who doubt climate change tend to favor the idea of withholding the aid, thus leading to less donation.
7.6 Model 4b: Moderated Mediation Model - Path b only
par(mfrow = c(1,2), mar=c(0,0,0,0), oma=c(0,0,0,0))
pmacroModel(14,labels=labels)
statisticalDiagram(14, labels=labels)
Since justify is also a continuous measure, we need to mean center it first:
$just_raw = disaster$justify
disaster$justify = scale(disaster$just_raw, center = TRUE, scale = FALSE)
disaster$just_sd = scale(disaster$just_raw, center = TRUE, scale = TRUE) disaster
and create an interaction term by multiplying skeptic by justify (note that this is a new interaction term!):
$skepxjusti = disaster$skeptic * disaster$justify disaster
Let’s examine their means and standard deviations:
round(apply(disaster[,-1], 2, mean), 2)
## frame donate justify skeptic skep_raw skep_sd skepxframe just_raw just_sd skepxjusti
## 0.48 4.60 0.00 0.00 3.38 0.00 0.02 2.87 0.00 0.83
round(apply(disaster[,-1], 2, sd), 2)
## frame donate justify skeptic skep_raw skep_sd skepxframe just_raw just_sd skepxjusti
## 0.50 1.32 0.93 2.03 2.03 1.00 1.40 0.93 1.00 2.66
Since the b path is hypothesized moderated by skeptic, the simple slope of donation on justify (b path) depends on skeptic, the indirect effect through justify (ab) also depends on skeptic.
We’ll define an index of moderated mediation to be:
- a*b3 (can you derive this?)
Let’s write the syntax for the moderated mediation model:
<- '
lm4b.syntax donate ~ b1*justify + cprime*frame + b2*skeptic + b3*skepxjusti
justify ~ a*frame
# Define simple slopes and conditional indirect effects using :=
# index of moderated mediation
IndMedMod:= a*b3
# simple slope of donate on justify is b1+b3*skeptic
bLow: = b1+b3*(-1.78)
bMedian: = b1+b3*(-0.58)
bMean: = b1+b3*(0)
bHigh: = b1+b3*1.82
# conditional indirect effects is a*(b1+b3*skeptic)
abLow: = a*bLow
abMedian: = a*bMedian
abMean: = a*bMean
abHigh: = a*bHigh
'
set.seed(2022)
= sem(lm4b.syntax, data = disaster, se = "bootstrap", bootstrap = 1000, fixed.x=FALSE, meanstructure = TRUE)
lm4b.fit parameterEstimates(lm4b.fit, level = 0.95, boot.ci.type = "bca.simple")
## lhs op rhs label est se z pvalue ci.lower ci.upper
## 1 donate ~ justify b1 -0.922 0.079 -11.611 0.000 -1.085 -0.772
## 2 donate ~ frame cprime 0.204 0.140 1.455 0.146 -0.064 0.492
## 3 donate ~ skeptic b2 -0.040 0.041 -0.968 0.333 -0.127 0.039
## 4 donate ~ skepxjusti b3 0.008 0.026 0.327 0.743 -0.043 0.059
## 5 justify ~ frame a 0.134 0.131 1.023 0.306 -0.147 0.380
## 6 donate ~~ donate 0.943 0.116 8.128 0.000 0.736 1.200
## 7 justify ~~ justify 0.856 0.097 8.866 0.000 0.699 1.096
## 8 frame ~~ frame 0.250 0.003 97.289 0.000 0.244 0.250
## 9 frame ~~ skeptic 0.021 0.074 0.277 0.782 -0.125 0.168
## 10 frame ~~ skepxjusti 0.204 0.091 2.233 0.026 0.045 0.414
## 11 skeptic ~~ skeptic 4.113 0.498 8.257 0.000 3.211 5.198
## 12 skeptic ~~ skepxjusti 2.067 0.867 2.383 0.017 0.691 4.089
## 13 skepxjusti ~~ skepxjusti 7.017 2.414 2.907 0.004 3.602 13.111
## 14 donate ~1 4.499 0.110 40.942 0.000 4.288 4.708
## 15 justify ~1 -0.064 0.083 -0.775 0.438 -0.218 0.109
## 16 frame ~1 0.479 0.036 13.458 0.000 0.396 0.540
## 17 skeptic ~1 0.000 0.142 0.000 1.000 -0.274 0.286
## 18 skepxjusti ~1 0.828 0.179 4.632 0.000 0.526 1.218
## 19 IndMedMod := a*b3 IndMedMod 0.001 0.005 0.243 0.808 -0.005 0.018
## 20 bLow := b1+b3*(-1.78) bLow -0.937 0.103 -9.140 0.000 -1.138 -0.729
## 21 bMedian := b1+b3*(-0.58) bMedian -0.927 0.085 -10.904 0.000 -1.096 -0.758
## 22 bMean := b1+b3*(0) bMean -0.922 0.079 -11.605 0.000 -1.085 -0.772
## 23 bHigh := b1+b3*1.82 bHigh -0.907 0.079 -11.427 0.000 -1.073 -0.752
## 24 abLow := a*bLow abLow -0.126 0.123 -1.023 0.306 -0.369 0.130
## 25 abMedian := a*bMedian abMedian -0.125 0.122 -1.023 0.306 -0.361 0.137
## 26 abMean := a*bMean abMean -0.124 0.121 -1.022 0.307 -0.360 0.135
## 27 abHigh := a*bHigh abHigh -0.122 0.120 -1.015 0.310 -0.351 0.130
So we have:
- b3 = 0.008 (p = 0.743)
The effect of justify on donate is not moderated by skeptic. That is, justification for withholding aid always leads to less donation has a fixed effect on their willingness to donate (b path) regardless of their climate change skepticism.
Let’s look at the simple slopes.
- bLow = -0.937 (p = 0.000)
- bMedian = -0.927 (p = 0.000)
- bMean = -0.922 (p = 0.000)
- bHigh = -0.907 (p = 0.000)
which do not change much as their climate change skepticism change. Justification for withholding aid always leads to less donation. Skeptic is not an effective moderator.
Let’s look at the indirect effects
- IndexOfModMed = 0.001 (p = 0.808)
- abLow = -0.126 (p = 0.306)
- abMedian = -0.125 (p = 0.306)
- abMean = -0.124 (p = 0.307)
- abHigh = -0.122 (p = 0.310)
Similarly, skeptic is not a good moderator for the indirect effect given that IndexOfModMed is not significant and the indirect effects at high/low levels of skepticism do not differ much.
7.7 Model 4c: Moderation & Mediation Model - Path cprime only
par(mfrow = c(1,2), mar=c(0,0,0,0), oma=c(0,0,0,0))
pmacroModel(5,labels=labels)
statisticalDiagram(5, labels=labels)
Since there is NO indirect effect being moderated here, we’ll not define any index of moderation mediation. There is only one c3prime coefficient that quantifies the moderation effect of skeptic on frame-donation path.
<- '
lm4c.syntax donate ~ b*justify + c1prime*frame + skeptic + c3prime*skepxframe
justify ~ a*frame
# Define new parameters
#The := operator in lavaan defines new parameters.
# simple slope of donate on frame is c1prime+c3prime*skeptic
cLow: = c1prime+c3prime*(-1.78)
cMedian: = c1prime+c3prime*(-0.58)
cMean: = c1prime+c3prime*(0)
cHigh: = c1prime+c3prime*1.82
# mediation effect
ab:= a*b
'
set.seed(2022)
= sem(lm4c.syntax, data = disaster, se = "bootstrap", bootstrap = 1000, fixed.x=FALSE, meanstructure = TRUE)
lm4c.fit parameterEstimates(lm4c.fit, level = 0.95, boot.ci.type = "bca.simple")
## lhs op rhs label est se z pvalue ci.lower ci.upper
## 1 donate ~ justify b -0.923 0.078 -11.781 0.000 -1.076 -0.764
## 2 donate ~ frame c1prime 0.211 0.140 1.503 0.133 -0.064 0.496
## 3 donate ~ skeptic -0.043 0.057 -0.742 0.458 -0.165 0.061
## 4 donate ~ skepxframe c3prime 0.015 0.074 0.203 0.839 -0.120 0.171
## 5 justify ~ frame a 0.134 0.131 1.023 0.306 -0.147 0.380
## 6 donate ~~ donate 0.943 0.116 8.152 0.000 0.743 1.208
## 7 justify ~~ justify 0.856 0.097 8.866 0.000 0.699 1.096
## 8 frame ~~ frame 0.250 0.003 97.289 0.000 0.244 0.250
## 9 frame ~~ skeptic 0.021 0.074 0.277 0.782 -0.125 0.168
## 10 frame ~~ skepxframe 0.011 0.052 0.207 0.836 -0.089 0.121
## 11 skeptic ~~ skeptic 4.113 0.498 8.257 0.000 3.211 5.198
## 12 skeptic ~~ skepxframe 1.957 0.349 5.606 0.000 1.333 2.721
## 13 skepxframe ~~ skepxframe 1.957 0.348 5.618 0.000 1.328 2.708
## 14 donate ~1 4.503 0.109 41.164 0.000 4.283 4.711
## 15 justify ~1 -0.064 0.083 -0.775 0.438 -0.218 0.109
## 16 frame ~1 0.479 0.036 13.458 0.000 0.396 0.540
## 17 skeptic ~1 0.000 0.142 0.000 1.000 -0.274 0.286
## 18 skepxframe ~1 0.021 0.099 0.206 0.837 -0.173 0.223
## 19 cLow := c1prime+c3prime*(-1.78) cLow 0.184 0.172 1.074 0.283 -0.150 0.527
## 20 cMedian := c1prime+c3prime*(-0.58) cMedian 0.202 0.138 1.463 0.143 -0.062 0.482
## 21 cMean := c1prime+c3prime*(0) cMean 0.211 0.140 1.503 0.133 -0.064 0.496
## 22 cHigh := c1prime+c3prime*1.82 cHigh 0.238 0.213 1.118 0.264 -0.153 0.662
## 23 ab := a*b ab -0.124 0.122 -1.020 0.308 -0.356 0.138
Since we have:
- c3prime = 0.015 (p = 0.839)
Skeptic is not a moderator for this frame-donation path (cprime).
The mediation effect:
- ab = -0.124 (p = 0.308)
is not significant, just like in Model 2.
7.8 Model 4d: Moderated Mediation Model - Path a and cprime
par(mfrow = c(1,2), mar=c(0,0,0,0), oma=c(0,0,0,0))
pmacroModel(8,labels=labels)
statisticalDiagram(8, labels=labels)
Model 4d is very similar to Model 4a, except that cprime path is also moderated. We’ll still define the index of moderated mediation to be:
- a3*b
<- '
lm4d.syntax donate ~ b*justify + c1prime*frame + c2prime*skeptic + c3prime*skepxframe
justify ~ a1*frame + a2*skeptic + a3*skepxframe
# Define simple slopes and conditional indirect effects using :=
# index of moderated mediation
IndMedMod:= a3*b
# simple slope of justify on frame is a1+a3*skeptic
aLow: = a1+a3*(-1.78)
aMedian: = a1+a3*(-0.58)
aMean: = a1+a3*(0)
aHigh: = a1+a3*1.82
# conditional indirect effects is b*(a1+a3*skeptic)
abLow: = b*aLow
abMedian: = b*aMedian
abMean: = b*aMean
abHigh: = b*aHigh
'
set.seed(2022)
= sem(lm4d.syntax, data = disaster, se = "bootstrap", bootstrap = 1000, fixed.x=FALSE, meanstructure = TRUE)
lm4d.fit parameterEstimates(lm4d.fit, level = 0.95, boot.ci.type = "bca.simple")
## lhs op rhs label est se z pvalue ci.lower ci.upper
## 1 donate ~ justify b -0.923 0.078 -11.781 0.000 -1.076 -0.764
## 2 donate ~ frame c1prime 0.211 0.140 1.503 0.133 -0.064 0.496
## 3 donate ~ skeptic c2prime -0.043 0.057 -0.742 0.458 -0.165 0.061
## 4 donate ~ skepxframe c3prime 0.015 0.074 0.203 0.839 -0.120 0.171
## 5 justify ~ frame a1 0.117 0.114 1.023 0.306 -0.113 0.324
## 6 justify ~ skeptic a2 0.105 0.043 2.459 0.014 0.020 0.194
## 7 justify ~ skepxframe a3 0.201 0.063 3.201 0.001 0.077 0.326
## 8 donate ~~ donate 0.943 0.116 8.152 0.000 0.743 1.208
## 9 justify ~~ justify 0.648 0.066 9.767 0.000 0.539 0.809
## 10 frame ~~ frame 0.250 0.003 97.289 0.000 0.244 0.250
## 11 frame ~~ skeptic 0.021 0.074 0.277 0.782 -0.125 0.168
## 12 frame ~~ skepxframe 0.011 0.052 0.207 0.836 -0.089 0.121
## 13 skeptic ~~ skeptic 4.113 0.498 8.257 0.000 3.211 5.198
## 14 skeptic ~~ skepxframe 1.957 0.349 5.606 0.000 1.333 2.721
## 15 skepxframe ~~ skepxframe 1.957 0.348 5.618 0.000 1.328 2.708
## 16 donate ~1 4.503 0.109 41.164 0.000 4.283 4.711
## 17 justify ~1 -0.060 0.079 -0.759 0.448 -0.208 0.109
## 18 frame ~1 0.479 0.036 13.458 0.000 0.396 0.540
## 19 skeptic ~1 0.000 0.142 0.000 1.000 -0.274 0.286
## 20 skepxframe ~1 0.021 0.099 0.206 0.837 -0.173 0.223
## 21 IndMedMod := a3*b IndMedMod -0.186 0.062 -2.979 0.003 -0.318 -0.071
## 22 aLow := a1+a3*(-1.78) aLow -0.241 0.154 -1.568 0.117 -0.563 0.045
## 23 aMedian := a1+a3*(-0.58) aMedian 0.000 0.117 0.004 0.997 -0.240 0.209
## 24 aMean := a1+a3*(0) aMean 0.117 0.115 1.023 0.307 -0.113 0.324
## 25 aHigh := a1+a3*1.82 aHigh 0.483 0.168 2.874 0.004 0.138 0.829
## 26 abLow := b*aLow abLow 0.222 0.146 1.526 0.127 -0.036 0.532
## 27 abMedian := b*aMedian abMedian 0.000 0.108 -0.004 0.997 -0.194 0.228
## 28 abMean := b*aMean abMean -0.108 0.105 -1.026 0.305 -0.301 0.095
## 29 abHigh := b*aHigh abHigh -0.446 0.162 -2.757 0.006 -0.785 -0.127
Here we have two interaction coefficients:
- a3 = 0.201 (p = 0.001)
- c3prime = 0.015 (p = 0.839)
so that skeptic is a moderator for the frame-to-justify path (a path) but not a moderator for frame-to-donate path (cprime path). For the frame-to-justify path:
- aLow = -0.241 (p = 0.117)
- aMedian = 0 (p = 0.997)
- aMean = 0.117 (p = 0.307)
- aHigh = 0.483 (p = 0.004)
which are exactly the same as those in Model 4a. The simple slope aHigh is positive and aLow is negative. Those who are high on climate change skepticism think it’s justified to withhold the aid whereas those who are low on the skepticism do not think it’s justified to withhold the aid.
- IndexOfModMed = -0.186 (p = 0.003)
- abLow = 0.222 (p = 0.127)
- abMedian = 0.000 (p = 0.997)
- abMean = -0.108 (p = 0.305)
- abHigh = -0.446 (p = 0.006)
which are close to those in Model 4a. The indirect effect of donate on frame through justify (ab path) is moderated by skeptic (IndexOfModMed is sig!). Moreover, abHigh is negative and abLow is positive, meaning that framing the disaster as caused by climate change leads to less donation for people who doubt climate change but it leads to more donation for people who believes it because they do not think it’s justified to withhold the aid.
7.9 Model 4e: Moderated Mediation Model - Path b and cprime
par(mfrow = c(1,2), mar=c(0,0,0,0), oma=c(0,0,0,0))
pmacroModel(15,labels=labels)
statisticalDiagram(15, labels=labels)
Model 4e is very similar to Model 4b except that cprime path is also moderated. We’ll still define the index of moderated mediation to be:
- a*b3 (actually, a*b2 in this diagram)
Let’s write the syntax for the moderated mediation model:
<- '
lm4e.syntax donate ~ b1*justify + b2*skepxjusti + c1prime*frame + c2prime*skeptic + c3prime*skepxframe
justify ~ a*frame
# Define simple slopes and conditional indirect effects using :=
# index of moderated mediation
IndMedMod:= a*b2
# simple slope of donate on justify is b1+b2*skeptic
bLow: = b1+b2*(-1.78)
bMedian: = b1+b2*(-0.58)
bMean: = b1+b2*(0)
bHigh: = b1+b2*1.82
# conditional indirect effects is a*(b1+b2*skeptic)
abLow: = a*bLow
abMedian: = a*bMedian
abMean: = a*bMean
abHigh: = a*bHigh
'
set.seed(2022)
= sem(lm4e.syntax, data = disaster, se = "bootstrap", bootstrap = 1000, fixed.x=FALSE, meanstructure = TRUE)
lm4e.fit parameterEstimates(lm4e.fit, level = 0.95, boot.ci.type = "bca.simple")
## lhs op rhs label est se z pvalue ci.lower ci.upper
## 1 donate ~ justify b1 -0.925 0.081 -11.473 0.000 -1.085 -0.762
## 2 donate ~ skepxjusti b2 0.007 0.028 0.258 0.797 -0.047 0.063
## 3 donate ~ frame c1prime 0.205 0.143 1.432 0.152 -0.075 0.500
## 4 donate ~ skeptic c2prime -0.043 0.058 -0.749 0.454 -0.165 0.058
## 5 donate ~ skepxframe c3prime 0.009 0.079 0.119 0.905 -0.139 0.171
## 6 justify ~ frame a 0.134 0.131 1.023 0.306 -0.147 0.380
## 7 donate ~~ donate 0.943 0.116 8.148 0.000 0.744 1.212
## 8 justify ~~ justify 0.856 0.097 8.866 0.000 0.699 1.096
## 9 skepxjusti ~~ skepxjusti 7.017 2.414 2.907 0.004 3.602 13.111
## 10 skepxjusti ~~ frame 0.204 0.091 2.233 0.026 0.045 0.414
## 11 skepxjusti ~~ skeptic 2.067 0.867 2.383 0.017 0.691 4.089
## 12 skepxjusti ~~ skepxframe 1.828 0.784 2.332 0.020 0.600 3.681
## 13 frame ~~ frame 0.250 0.003 97.289 0.000 0.244 0.250
## 14 frame ~~ skeptic 0.021 0.074 0.277 0.782 -0.125 0.168
## 15 frame ~~ skepxframe 0.011 0.052 0.207 0.836 -0.089 0.121
## 16 skeptic ~~ skeptic 4.113 0.498 8.257 0.000 3.211 5.198
## 17 skeptic ~~ skepxframe 1.957 0.349 5.606 0.000 1.333 2.721
## 18 skepxframe ~~ skepxframe 1.957 0.348 5.618 0.000 1.328 2.708
## 19 donate ~1 4.499 0.110 40.945 0.000 4.283 4.708
## 20 justify ~1 -0.064 0.083 -0.775 0.438 -0.218 0.109
## 21 skepxjusti ~1 0.828 0.179 4.632 0.000 0.526 1.218
## 22 frame ~1 0.479 0.036 13.458 0.000 0.397 0.540
## 23 skeptic ~1 0.000 0.142 0.000 1.000 -0.274 0.286
## 24 skepxframe ~1 0.021 0.099 0.206 0.837 -0.173 0.223
## 25 IndMedMod := a*b2 IndMedMod 0.001 0.005 0.189 0.850 -0.006 0.018
## 26 bLow := b1+b2*(-1.78) bLow -0.937 0.103 -9.121 0.000 -1.142 -0.730
## 27 bMedian := b1+b2*(-0.58) bMedian -0.929 0.085 -10.877 0.000 -1.096 -0.756
## 28 bMean := b1+b2*(0) bMean -0.925 0.081 -11.467 0.000 -1.085 -0.762
## 29 bHigh := b1+b2*1.82 bHigh -0.912 0.086 -10.622 0.000 -1.084 -0.741
## 30 abLow := a*bLow abLow -0.126 0.123 -1.024 0.306 -0.372 0.129
## 31 abMedian := a*bMedian abMedian -0.125 0.122 -1.022 0.307 -0.366 0.127
## 32 abMean := a*bMean abMean -0.124 0.122 -1.021 0.307 -0.361 0.132
## 33 abHigh := a*bHigh abHigh -0.122 0.121 -1.012 0.312 -0.349 0.133
Here we have two interaction coefficients:
- b2 = 0.007 (p = 0.258)
- c3prime = 0.009 (p = 0.905)
so that skeptic is not a moderator for the b path nor for the cprime path. For the simple slopes of b path:
- bLow = -0.937 (p = 0.000)
- bMedian = -0.929 (p = 0.000)
- bMean = -0.925 (p = 0.000)
- bHigh = -0.912 (p = 0.000)
which do not change much as their climate change skepticism change. Justification for withholding aid always leads to less donation. Skeptic is not an effective moderator.
Let’s look at the indirect effects:
- IndexOfModMed = 0.001 (p = 0.850)
- abLow = -0.126 (p = 0.306)
- abMedian = -0.125 (p = 0.307)
- abMean = -0.124 (p = 0.307)
- abHigh = -0.122 (p = 0.312)
Similarly, skeptic is not a good moderator for the indirect effect given that IndexOfModMed is not significant and the indirect effects at high/low levels of skepticism do not differ much.
7.10 Model 4f: Moderated Mediation Model - Path a and b
par(mfrow = c(1,2), mar=c(0,0,0,0), oma=c(0,0,0,0))
pmacroModel(58,labels=labels)
statisticalDiagram(58, labels=labels)
When both a and b are moderated by the same moderator, we have:
- a = a1 + a3*skep
- b = b1 + b3*skep
- ab = (a1 + a3*skep)*(b1 + b3*skep) = a1*b1 + (a1*b3+a3*b1)*skep + a3*b3*skep^2
So the indirect effect does not depend on the moderator in a linear way.
We don’t have a formal definition of index of moderated mediation in this scenario. If we are lucky, we might get both (a1*b3+a3*b1) and a3*b3 to be significant…
Let’s write the syntax for the moderated mediation model:
<- '
lm4f.syntax donate ~ b1*justify + b2*skeptic + b3*skepxjusti + cprime*frame
justify ~ a1*frame + a2*skeptic + a3*skepxframe
# index of moderated mediation
IndMedMod1:= a1*b3+a3*b1
IndMedMod2:= a3*b3
# simple slope of justify on frame is a1+a3*skeptic
aLow: = a1+a3*(-1.78)
aMedian: = a1+a3*(-0.58)
aMean: = a1+a3*(0)
aHigh: = a1+a3*1.82
# simple slope of donate on justify is b1+b3*skeptic
bLow: = b1+b3*(-1.78)
bMedian: = b1+b3*(-0.58)
bMean: = b1+b3*(0)
bHigh: = b1+b3*1.82
# conditional indirect effects is a*(b1+b3*skeptic)
abLow: = aLow*bLow
abMedian: = aMedian*bMedian
abMean: = aMean*bMean
abHigh: = aHigh*bHigh
'
set.seed(2022)
= sem(lm4f.syntax, data = disaster, se = "bootstrap", bootstrap = 1000, fixed.x=FALSE, meanstructure = TRUE)
lm4f.fit parameterEstimates(lm4f.fit, level = 0.95, boot.ci.type = "bca.simple")
## lhs op rhs label est se z pvalue ci.lower ci.upper
## 1 donate ~ justify b1 -0.922 0.079 -11.611 0.000 -1.085 -0.772
## 2 donate ~ skeptic b2 -0.040 0.041 -0.968 0.333 -0.127 0.039
## 3 donate ~ skepxjusti b3 0.008 0.026 0.327 0.743 -0.043 0.059
## 4 donate ~ frame cprime 0.204 0.140 1.455 0.146 -0.064 0.492
## 5 justify ~ frame a1 0.117 0.114 1.023 0.306 -0.113 0.324
## 6 justify ~ skeptic a2 0.105 0.043 2.459 0.014 0.020 0.194
## 7 justify ~ skepxframe a3 0.201 0.063 3.201 0.001 0.077 0.326
## 8 donate ~~ donate 0.943 0.116 8.129 0.000 0.736 1.200
## 9 justify ~~ justify 0.648 0.066 9.767 0.000 0.539 0.809
## 10 skeptic ~~ skeptic 4.113 0.498 8.257 0.000 3.211 5.198
## 11 skeptic ~~ skepxjusti 2.067 0.867 2.383 0.017 0.691 4.089
## 12 skeptic ~~ frame 0.021 0.074 0.277 0.782 -0.125 0.168
## 13 skeptic ~~ skepxframe 1.957 0.349 5.606 0.000 1.333 2.721
## 14 skepxjusti ~~ skepxjusti 7.017 2.414 2.907 0.004 3.602 13.111
## 15 skepxjusti ~~ frame 0.204 0.091 2.233 0.026 0.045 0.414
## 16 skepxjusti ~~ skepxframe 1.828 0.784 2.332 0.020 0.600 3.681
## 17 frame ~~ frame 0.250 0.003 97.289 0.000 0.244 0.250
## 18 frame ~~ skepxframe 0.011 0.052 0.207 0.836 -0.089 0.121
## 19 skepxframe ~~ skepxframe 1.957 0.348 5.618 0.000 1.328 2.708
## 20 donate ~1 4.499 0.110 40.942 0.000 4.288 4.708
## 21 justify ~1 -0.060 0.079 -0.759 0.448 -0.208 0.109
## 22 skeptic ~1 0.000 0.142 0.000 1.000 -0.274 0.286
## 23 skepxjusti ~1 0.828 0.179 4.632 0.000 0.526 1.218
## 24 frame ~1 0.479 0.036 13.458 0.000 0.396 0.540
## 25 skepxframe ~1 0.021 0.099 0.206 0.837 -0.173 0.223
## 26 IndMedMod1 := a1*b3+a3*b1 IndMedMod1 -0.185 0.062 -2.975 0.003 -0.324 -0.071
## 27 IndMedMod2 := a3*b3 IndMedMod2 0.002 0.005 0.330 0.741 -0.009 0.012
## 28 aLow := a1+a3*(-1.78) aLow -0.241 0.154 -1.568 0.117 -0.563 0.045
## 29 aMedian := a1+a3*(-0.58) aMedian 0.000 0.117 0.004 0.997 -0.240 0.209
## 30 aMean := a1+a3*(0) aMean 0.117 0.115 1.023 0.307 -0.113 0.324
## 31 aHigh := a1+a3*1.82 aHigh 0.483 0.168 2.874 0.004 0.138 0.829
## 32 bLow := b1+b3*(-1.78) bLow -0.937 0.103 -9.140 0.000 -1.138 -0.729
## 33 bMedian := b1+b3*(-0.58) bMedian -0.927 0.085 -10.904 0.000 -1.096 -0.758
## 34 bMean := b1+b3*(0) bMean -0.922 0.079 -11.605 0.000 -1.085 -0.772
## 35 bHigh := b1+b3*1.82 bHigh -0.907 0.079 -11.427 0.000 -1.073 -0.752
## 36 abLow := aLow*bLow abLow 0.226 0.150 1.501 0.133 -0.035 0.578
## 37 abMedian := aMedian*bMedian abMedian 0.000 0.109 -0.004 0.997 -0.192 0.234
## 38 abMean := aMean*bMean abMean -0.108 0.105 -1.028 0.304 -0.304 0.096
## 39 abHigh := aHigh*bHigh abHigh -0.438 0.161 -2.727 0.006 -0.779 -0.123
Here we have two interaction terms:
- a3 = 0.201 (p = 0.001)
- b3 = 0.008 (p = 0.743)
which means that skeptic is a moderator for the a path but not a moderator for the b path.
As for the index of moderated mediation:
- IndMedMod1 = -0.185 (p = 0.003)
- IndMedMod2 = 0.002 (p = 0.741)
So IndMedMod1 is sig but IndMedMod2 is not (meh)… Let’s examine the indirect effects at different levels:
- abLow = 0.226 (p = 0.133)
- abMedian = 0.000 (p = 0.997)
- abMean = -0.108 (p = 0.304)
- abHigh = -0.438 (p = 0.006)
which does vary as a function of skepticism. So, we still have a significant moderated mediation in this model.
7.11 Model 4g: Moderated Mediation Model - Path a, b, and cprime
par(mfrow = c(1,2), mar=c(0,0,0,0), oma=c(0,0,0,0))
pmacroModel(59,labels=labels)
statisticalDiagram(59, labels=labels)
Let’s write the syntax for the moderated mediation model:
<- '
lm4g.syntax donate ~ b1*justify + b2*skepxjusti + c1prime*frame + c2prime*skeptic + c3prime*skepxframe
justify ~ a1*frame + a2*skeptic + a3*skepxframe
# index of moderated mediation
IndMedMod1:= a1*b2+a3*b1
IndMedMod2:= a3*b2
# simple slope of justify on frame is a1+a3*skeptic
aLow: = a1+a3*(-1.78)
aMedian: = a1+a3*(-0.58)
aMean: = a1+a3*(0)
aHigh: = a1+a3*1.82
# simple slope of donate on justify is b1+b2*skeptic
bLow: = b1+b2*(-1.78)
bMedian: = b1+b2*(-0.58)
bMean: = b1+b2*(0)
bHigh: = b1+b2*1.82
# conditional indirect effects is a*(b1+b2*skeptic)
abLow: = aLow*bLow
abMedian: = aMedian*bMedian
abMean: = aMean*bMean
abHigh: = aHigh*bHigh
'
set.seed(2022)
= sem(lm4g.syntax, data = disaster, se = "bootstrap", bootstrap = 1000, fixed.x=FALSE, meanstructure = TRUE)
lm4g.fit parameterEstimates(lm4g.fit, level = 0.95, boot.ci.type = "bca.simple")
## lhs op rhs label est se z pvalue ci.lower ci.upper
## 1 donate ~ justify b1 -0.925 0.081 -11.473 0.000 -1.085 -0.762
## 2 donate ~ skepxjusti b2 0.007 0.028 0.258 0.797 -0.047 0.063
## 3 donate ~ frame c1prime 0.205 0.143 1.432 0.152 -0.075 0.500
## 4 donate ~ skeptic c2prime -0.043 0.058 -0.749 0.454 -0.165 0.058
## 5 donate ~ skepxframe c3prime 0.009 0.079 0.119 0.905 -0.139 0.171
## 6 justify ~ frame a1 0.117 0.114 1.023 0.306 -0.113 0.324
## 7 justify ~ skeptic a2 0.105 0.043 2.459 0.014 0.020 0.194
## 8 justify ~ skepxframe a3 0.201 0.063 3.201 0.001 0.077 0.326
## 9 donate ~~ donate 0.943 0.116 8.148 0.000 0.744 1.212
## 10 justify ~~ justify 0.648 0.066 9.767 0.000 0.539 0.809
## 11 skepxjusti ~~ skepxjusti 7.017 2.414 2.907 0.004 3.602 13.111
## 12 skepxjusti ~~ frame 0.204 0.091 2.233 0.026 0.045 0.414
## 13 skepxjusti ~~ skeptic 2.067 0.867 2.383 0.017 0.691 4.089
## 14 skepxjusti ~~ skepxframe 1.828 0.784 2.332 0.020 0.600 3.681
## 15 frame ~~ frame 0.250 0.003 97.289 0.000 0.245 0.250
## 16 frame ~~ skeptic 0.021 0.074 0.277 0.782 -0.125 0.168
## 17 frame ~~ skepxframe 0.011 0.052 0.207 0.836 -0.089 0.121
## 18 skeptic ~~ skeptic 4.113 0.498 8.257 0.000 3.211 5.198
## 19 skeptic ~~ skepxframe 1.957 0.349 5.606 0.000 1.333 2.721
## 20 skepxframe ~~ skepxframe 1.957 0.348 5.618 0.000 1.328 2.708
## 21 donate ~1 4.499 0.110 40.945 0.000 4.283 4.708
## 22 justify ~1 -0.060 0.079 -0.759 0.448 -0.208 0.109
## 23 skepxjusti ~1 0.828 0.179 4.632 0.000 0.526 1.218
## 24 frame ~1 0.479 0.036 13.458 0.000 0.396 0.540
## 25 skeptic ~1 0.000 0.142 0.000 1.000 -0.274 0.286
## 26 skepxframe ~1 0.021 0.099 0.206 0.837 -0.173 0.223
## 27 IndMedMod1 := a1*b2+a3*b1 IndMedMod1 -0.185 0.063 -2.948 0.003 -0.321 -0.071
## 28 IndMedMod2 := a3*b2 IndMedMod2 0.001 0.006 0.257 0.797 -0.009 0.014
## 29 aLow := a1+a3*(-1.78) aLow -0.241 0.154 -1.568 0.117 -0.563 0.045
## 30 aMedian := a1+a3*(-0.58) aMedian 0.000 0.117 0.004 0.997 -0.240 0.209
## 31 aMean := a1+a3*(0) aMean 0.117 0.115 1.023 0.307 -0.113 0.324
## 32 aHigh := a1+a3*1.82 aHigh 0.483 0.168 2.874 0.004 0.138 0.829
## 33 bLow := b1+b2*(-1.78) bLow -0.937 0.103 -9.121 0.000 -1.142 -0.730
## 34 bMedian := b1+b2*(-0.58) bMedian -0.929 0.085 -10.877 0.000 -1.096 -0.756
## 35 bMean := b1+b2*(0) bMean -0.925 0.081 -11.467 0.000 -1.085 -0.762
## 36 bHigh := b1+b2*1.82 bHigh -0.912 0.086 -10.622 0.000 -1.084 -0.741
## 37 abLow := aLow*bLow abLow 0.226 0.151 1.500 0.134 -0.036 0.580
## 38 abMedian := aMedian*bMedian abMedian 0.000 0.109 -0.004 0.997 -0.194 0.233
## 39 abMean := aMean*bMean abMean -0.108 0.105 -1.027 0.304 -0.306 0.094
## 40 abHigh := aHigh*bHigh abHigh -0.441 0.164 -2.685 0.007 -0.783 -0.118
Here we have interaction terms:
- a3 = 0.201 (p = 0.001)
- b2 = 0.007 (p = 0.797)
- c3prime = 0.009 (p = 0.905)
which means that skeptic is a moderator for the a path but not a moderator for the b path or the cprime path.
As for the index of moderated mediation:
- IndMedMod1 = -0.185 (p = 0.003)
- IndMedMod2 = 0.001 (p = 0.797)
So IndMedMod1 is sig but IndMedMod2 is not (again)… Let’s examine the indirect effects at different levels:
- abLow = 0.226 (p = 0.134)
- abMedian = 0.000 (p = 0.997)
- abMean = -0.108 (p = 0.304)
- abHigh = -0.441 (p = 0.007)
which does vary as a function of skepticism. So, we still have a significant moderated mediation in this model.
7.12 Conclusions
- Although the total effect of frame on donation is not significant to begin with (in Model 1), it should not discourage you from looking for mediators and moderators on any of the paths.
- In the simple mediation model (model 2), only b path is significantly negative, meaning that justification for withholding aid always leads to less donation regardless of the skepticism towards climate change. Although a path was not significant, again, it should not discourage you from looking for mediators and moderators on that a path.
- Including a moderator skeptic for a path and testing the moderated mediation models in Model 4a-Model 4g showed that skeptic is only a moderator for the a path, meaning that those who are high on climate change skepticism think it’s justified to withhold the aid whereas those who are low on the skepticism think it’s not justified to withhold the aid.
- Comparing Model 4a/4d/4f/4g (which all involve moderate a path), all the simple slopes and indirect effects of a path are more or less the same, and I recommend reported model 4g.
- Our final conclusion is: a path was moderated by skepticism, b path was not moderated by skepticism but b path itself is significant, cprime was not moderated by skepticism. The indirect path ab was also moderated by skepticism. In particular, framing the disaster as caused by climate change (X) leads to less donation (Y) for people who doubt climate change (W_high) but it leads to more donation (Y) for people who believes it (W_low) because they do not think it’s justified to withhold the aid (M). Ignoring this moderator leads to an insignificant mediation effect in Model 2.
According to Hayes (2017, p. 439):
“Climate change skeptics seem to feel that victims of a climate change induced disaster (compared to one not attributed to climate change) don’t deserve assistance, and this belief may translate into a reduced willingness to personally donate to the victims. This is a negative indirect effect. But among believers in climate change, the opposite effect is observed, with a climate change induced disaster leading believers to see the victims as more worthy of assistance than if the disaster wasn’t caused by climate change, and this is related to a greater willingness to donate. This is a positive indirect effect. Ignoring the contingency of the indirect effect by failing to include moderation by climate change skepticism in the mediation model obscures the conditional nature of the mechanism at work.”