d <-na.omit(subset(df1, select=c(grep("Q39_", colnames(df1)))))labels <-c(Q39_1 ="Less Courtesy",Q39_2 ="Less Respect",Q39_3 ="Poorer Service",Q39_4 ="Seen as Not Smart",Q39_5 ="Seen as Threatening",Q39_6 ="Seen as Dishonest",Q39_8 ="Inferior",Q39_9 ="Insulted",Q39_10 ="Threatened/Harassed")names(d) <- labelsd_long <-stack(d)names(d_long) <-c("value", "variable")ggplot(d_long, aes(x = value)) +geom_histogram(binwidth =1, fill ="steelblue", color ="white") +facet_wrap(~ variable, labeller =label_wrap_gen(width =30)) +theme_minimal()
EFA 1
Code
ev <-eigen(cor(d)) # get eigenvaluesap <-parallel(subject=nrow(d),var=ncol(d),rep=100,cent=.05) # run the parallel analysis, gives us another perspective on how many factors should be used in the modelnS <-nScree(x=ev$values, aparallel=ap$eigen$qevpea) # creates the scree plotplotnScree(nS) # shows us the scree plot, look for the elbows
Call:
factanal(x = d, factors = 1, rotation = "promax")
Uniquenesses:
Less Courtesy Less Respect Poorer Service Seen as Not Smart
0.175 0.151 0.684 0.542
Seen as Threatening Seen as Dishonest Inferior Insulted
0.804 0.658 0.504 0.678
Threatened/Harassed
0.716
Loadings:
Factor1
Less Courtesy 0.908
Less Respect 0.921
Poorer Service 0.562
Seen as Not Smart 0.677
Seen as Threatening 0.443
Seen as Dishonest 0.585
Inferior 0.705
Insulted 0.568
Threatened/Harassed 0.533
Factor1
SS loadings 4.089
Proportion Var 0.454
Test of the hypothesis that 1 factor is sufficient.
The chi square statistic is 373.2 on 27 degrees of freedom.
The p-value is 1.39e-62
EFA 2
Code
d <-subset(d, select =-c(`Seen as Threatening`, `Threatened/Harassed`, `Insulted`, `Poorer Service`))ev <-eigen(cor(d)) # get eigenvaluesap <-parallel(subject=nrow(d),var=ncol(d),rep=100,cent=.05) # run the parallel analysis, gives us another perspective on how many factors should be used in the modelnS <-nScree(x=ev$values, aparallel=ap$eigen$qevpea) # creates the scree plotplotnScree(nS) # shows us the scree plot, look for the elbows
Call:
factanal(x = d, factors = 1, rotation = "promax")
Uniquenesses:
Less Courtesy Less Respect Seen as Not Smart Seen as Dishonest
0.132 0.111 0.595 0.712
Inferior
0.545
Loadings:
Factor1
Less Courtesy 0.931
Less Respect 0.943
Seen as Not Smart 0.637
Seen as Dishonest 0.536
Inferior 0.674
Factor1
SS loadings 2.904
Proportion Var 0.581
Test of the hypothesis that 1 factor is sufficient.
The chi square statistic is 125.02 on 5 degrees of freedom.
The p-value is 2.71e-25
d <-na.omit(subset(df1, select=c(grep("Q40_", colnames(df1)))))labels <-c(Q40_1 ="Hiring Discrimination",Q40_2 ="Seen as Untrustworthy",Q40_3 ="Seen as Dangerous",Q40_4 ="Devalued",Q40_5 ="Looked Down On",Q40_6 ="Seen as Less Intelligent")names(d) <- labelsd_long <-stack(d)names(d_long) <-c("value", "variable")ggplot(d_long, aes(x = value)) +geom_histogram(binwidth =1, fill ="steelblue", color ="white") +facet_wrap(~ variable, labeller =label_wrap_gen(width =30)) +theme_minimal()
EFA 1
Code
ev <-eigen(cor(d)) # get eigenvaluesap <-parallel(subject=nrow(d),var=ncol(d),rep=100,cent=.05) # run the parallel analysis, gives us another perspective on how many factors should be used in the modelnS <-nScree(x=ev$values, aparallel=ap$eigen$qevpea) # creates the scree plotplotnScree(nS) # shows us the scree plot, look for the elbows
Call:
factanal(x = d, factors = 1, rotation = "promax")
Uniquenesses:
Hiring Discrimination Seen as Untrustworthy Seen as Dangerous
0.529 0.488 0.556
Devalued Looked Down On Seen as Less Intelligent
0.125 0.138 0.357
Loadings:
Factor1
Hiring Discrimination 0.686
Seen as Untrustworthy 0.716
Seen as Dangerous 0.666
Devalued 0.935
Looked Down On 0.928
Seen as Less Intelligent 0.802
Factor1
SS loadings 3.807
Proportion Var 0.635
Test of the hypothesis that 1 factor is sufficient.
The chi square statistic is 140.3 on 9 degrees of freedom.
The p-value is 8.97e-26
Call:
factanal(x = d, factors = 2, rotation = "promax")
Uniquenesses:
Hiring Discrimination Seen as Untrustworthy Seen as Dangerous
0.538 0.246 0.322
Devalued Looked Down On Seen as Less Intelligent
0.145 0.085 0.355
Loadings:
Factor1 Factor2
Hiring Discrimination 0.541
Seen as Untrustworthy 0.860
Seen as Dangerous 0.859
Devalued 0.864
Looked Down On 1.014
Seen as Less Intelligent 0.661
Factor1 Factor2
SS loadings 2.505 1.547
Proportion Var 0.418 0.258
Cumulative Var 0.418 0.675
Factor Correlations:
Factor1 Factor2
Factor1 1.000 -0.782
Factor2 -0.782 1.000
Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is 18.69 on 4 degrees of freedom.
The p-value is 0.000906
EFA 2
Code
d <-subset(d, select =-c(`Seen as Dangerous`))ev <-eigen(cor(d)) # get eigenvaluesap <-parallel(subject=nrow(d),var=ncol(d),rep=100,cent=.05) # run the parallel analysis, gives us another perspective on how many factors should be used in the modelnS <-nScree(x=ev$values, aparallel=ap$eigen$qevpea) # creates the scree plotplotnScree(nS) # shows us the scree plot, look for the elbows
Call:
factanal(x = d, factors = 1, rotation = "promax")
Uniquenesses:
Hiring Discrimination Seen as Untrustworthy Devalued
0.531 0.518 0.129
Looked Down On Seen as Less Intelligent
0.119 0.360
Loadings:
Factor1
Hiring Discrimination 0.685
Seen as Untrustworthy 0.694
Devalued 0.933
Looked Down On 0.939
Seen as Less Intelligent 0.800
Factor1
SS loadings 3.343
Proportion Var 0.669
Test of the hypothesis that 1 factor is sufficient.
The chi square statistic is 23.77 on 5 degrees of freedom.
The p-value is 0.000241
d <-na.omit(subset(df1, select=c(grep("Q9_", colnames(df1)))))labels <-c(Q9_1 ="Clarity: Difficulty Making Sense of Feelings",Q9_2 ="Clarity: Confused About Feelings",Q9_3 ="Goals: Difficulty Working",Q9_4 ="Impulse: Out of Control",Q9_5 ="Strategies: Will Remain Upset",Q9_6 ="Strategies: Will Feel Depressed",Q9_7 ="Goals: Difficulty Focusing",Q9_8 ="Impulse: Feels Out of Control",Q9_9 ="Nonacceptance: Ashamed of Feelings",Q9_10 ="Nonacceptance: Feels Weak",Q9_11 ="Impulse: Difficulty Controlling Behavior",Q9_12 ="Strategies: Nothing Will Help",Q9_13 ="Nonacceptance: Irritated at Self",Q9_14 ="Nonacceptance: Feels Bad About Self",Q9_15 ="Goals: Can't Think of Anything Else",Q9_16 ="Strategies: Emotions Overwhelming")names(d) <- labelsd_long <-stack(d)names(d_long) <-c("value", "variable")ggplot(d_long, aes(x = value)) +geom_histogram(binwidth =1, fill ="steelblue", color ="white") +facet_wrap(~ variable, labeller =label_wrap_gen(width =30)) +theme_minimal()
CFA
Dropped item 16, was crossloading on Goals subscale (should be Strategies).
Code
d <-na.omit(subset(df1, select=c(grep("Q9_", colnames(df1)))))# specify model: latent variables =~ observed indicatorsmodel <-' clarity =~ Q9_1 + Q9_2 goals =~ Q9_3 + Q9_7 + Q9_15 impulse =~ Q9_4 + Q9_8 + Q9_11 strategies =~ Q9_5 + Q9_6 + Q9_12 nonacceptance =~ Q9_9 + Q9_10 + Q9_13 + Q9_14'# fit CFAfit <-cfa(model, data = d, std.lv =TRUE)# summary with fit indices and standardized loadingssummary(fit, fit.measures =TRUE, standardized =TRUE)
d <-na.omit(subset(df1, select=c(grep("Q18_", colnames(df1)))))labels <-c(Q18_1 ="Unfair Treatment Expected",Q18_2 ="Information Untruthful",Q18_3 ="Distrust from Experience",Q18_4 ="Insincere Intentions",Q18_5 ="Can't Trust Others",Q18_6 ="Will Be Taken Advantage Of",Q18_7 ="No One Would Help",Q18_8 ="Others Out to Get Me",Q18_9 ="Distrust Authority",Q18_11 ="Officials Untrustworthy",Q18_12 ="Treated Unjustly",Q18_13 ="Prefer Self-Research",Q18_14 ="Faith Leads to Hurt",Q18_15 ="Question Why Told Things",Q18_16 ="Ignore Others' Advice")# shorten labels to max 40 characters (you can adjust the number)# labels <- str_trunc(labels, width = 60, side = "right")# replace column namesnames(d) <- labelsd_long <-stack(d)names(d_long) <-c("value", "variable")ggplot(d_long, aes(x = value)) +geom_histogram(binwidth =1, fill ="steelblue", color ="white") +facet_wrap(~ variable, labeller =label_wrap_gen(width =30)) +theme_minimal()
EFA 1
Code
ev <-eigen(cor(d)) # get eigenvaluesap <-parallel(subject=nrow(d),var=ncol(d),rep=100,cent=.05) # run the parallel analysis, gives us another perspective on how many factors should be used in the modelnS <-nScree(x=ev$values, aparallel=ap$eigen$qevpea) # creates the scree plotplotnScree(nS) # shows us the scree plot, look for the elbows
Call:
factanal(x = d, factors = 3, rotation = "promax")
Uniquenesses:
Unfair Treatment Expected Information Untruthful
0.546 0.648
Distrust from Experience Insincere Intentions
0.231 0.155
Can't Trust Others Will Be Taken Advantage Of
0.342 0.497
No One Would Help Others Out to Get Me
0.684 0.535
Distrust Authority Officials Untrustworthy
0.342 0.450
Treated Unjustly Prefer Self-Research
0.391 0.757
Faith Leads to Hurt Question Why Told Things
0.435 0.388
Ignore Others' Advice
0.692
Loadings:
Factor1 Factor2 Factor3
Information Untruthful 0.622
Others Out to Get Me 0.697
Distrust Authority 0.932
Officials Untrustworthy 0.821
Treated Unjustly 0.780
Distrust from Experience 0.926
Insincere Intentions 0.942
Can't Trust Others 0.632
Faith Leads to Hurt 0.714
Question Why Told Things 0.884
Ignore Others' Advice 0.571
Unfair Treatment Expected 0.481
Will Be Taken Advantage Of 0.433
No One Would Help
Prefer Self-Research 0.444
Factor1 Factor2 Factor3
SS loadings 3.557 2.454 1.898
Proportion Var 0.237 0.164 0.127
Cumulative Var 0.237 0.401 0.527
Factor Correlations:
Factor1 Factor2 Factor3
Factor1 1.000 0.683 0.692
Factor2 0.683 1.000 0.721
Factor3 0.692 0.721 1.000
Test of the hypothesis that 3 factors are sufficient.
The chi square statistic is 121.21 on 63 degrees of freedom.
The p-value is 1.48e-05
EFA 2
Code
d <-subset(d, select =-c(`No One Would Help`))ev <-eigen(cor(d)) # get eigenvaluesap <-parallel(subject=nrow(d),var=ncol(d),rep=100,cent=.05) # run the parallel analysis, gives us another perspective on how many factors should be used in the modelnS <-nScree(x=ev$values, aparallel=ap$eigen$qevpea) # creates the scree plotplotnScree(nS) # shows us the scree plot, look for the elbows
Call:
factanal(x = d, factors = 3, rotation = "promax")
Uniquenesses:
Unfair Treatment Expected Information Untruthful
0.548 0.643
Distrust from Experience Insincere Intentions
0.230 0.155
Can't Trust Others Will Be Taken Advantage Of
0.342 0.498
Others Out to Get Me Distrust Authority
0.556 0.340
Officials Untrustworthy Treated Unjustly
0.432 0.393
Prefer Self-Research Faith Leads to Hurt
0.749 0.423
Question Why Told Things Ignore Others' Advice
0.413 0.688
Loadings:
Factor1 Factor2 Factor3
Information Untruthful 0.614
Others Out to Get Me 0.657
Distrust Authority 0.915
Officials Untrustworthy 0.823
Treated Unjustly 0.763
Distrust from Experience 0.919
Insincere Intentions 0.931
Can't Trust Others 0.628
Faith Leads to Hurt 0.722
Question Why Told Things 0.836
Ignore Others' Advice 0.567
Unfair Treatment Expected 0.470
Will Be Taken Advantage Of 0.431
Prefer Self-Research 0.451
Factor1 Factor2 Factor3
SS loadings 3.267 2.411 1.805
Proportion Var 0.233 0.172 0.129
Cumulative Var 0.233 0.406 0.535
Factor Correlations:
Factor1 Factor2 Factor3
Factor1 1.000 -0.67 0.679
Factor2 -0.670 1.00 -0.700
Factor3 0.679 -0.70 1.000
Test of the hypothesis that 3 factors are sufficient.
The chi square statistic is 85.57 on 52 degrees of freedom.
The p-value is 0.00231
labels <-c(Q40_4 ="Love",Q42_4 ="Narcissism",Q44_4 ="Depression",Q46_4 ="Intelligence",Q50_4 ="Trauma1",Q54_4 ="Trauma2",Q58_4 ="Toxic People",Q62_4 ="Psychiatric Symptoms",Q66_4 ="Introversion",Q68_4 ="Manipulativeness",Q74_4 ="Attraction",Q78_4 ="Childhood",Q82_4 ="Friendship",Q86_4 ="Anxiety & Emotion Regulation",Q90_4 ="Family")# shorten labels to max 40 characters (you can adjust the number)# labels <- str_trunc(labels, width = 60, side = "right")# replace column namesnames(d) <- labelsd_long <-stack(d)names(d_long) <-c("value", "variable")ggplot(d_long, aes(x = value)) +geom_histogram(binwidth =1, fill ="steelblue", color ="white") +facet_wrap(~ variable, labeller =label_wrap_gen(width =30)) +theme_minimal()
Warning: Removed 1353 rows containing non-finite outside the scale range
(`stat_bin()`).
EFA 1
Very imperfect due to structure of the data.
Code
d2 <- dset.seed(42) # for reproducibility# mi <- mifa(# data = d2,# m = 30,# ci = "boot",# n_pc = 1:10,# print = F# )# save(mi, file = "mi.RData")load("mi.RData") # restores 'mi' object back into environment# Use pooled covariance matrix from mifa, converted to correlation matrixcov_pooled <- mi$cov_combinedcor_pooled <-cov2cor(cov_pooled)ev <-eigen(cor_pooled) # get eigenvaluesap <-parallel(subject =nrow(d2), var =ncol(cor_pooled), rep =100, cent = .05) # run the parallel analysis, gives us another perspective on how many factors should be used in the modelnS <-nScree(x = ev$values, aparallel = ap$eigen$qevpea)plotnScree(nS) # shows us the scree plot, look for the elbows
Code
# EFA using pooled covariance matrixEFA <-fa(r = cov_pooled,nfactors =3, # update based on screen.obs =nrow(d2),fm ="ml",rotate ="promax")
Loading required namespace: GPArotation
Code
print(EFA$loadings, sort =TRUE, cutoff = .4)
Loadings:
ML1 ML2 ML3
Trauma2 0.601
Psychiatric Symptoms 1.012 -0.618
Introversion 0.694
Friendship 0.588
Narcissism 0.609
Trauma1 0.552
Toxic People 0.834
Manipulativeness 0.503
Love 0.528
Anxiety & Emotion Regulation 0.526
Depression 0.488
Intelligence 0.477
Attraction 0.474
Childhood 0.487
Family 0.425
ML1 ML2 ML3
SS loadings 3.004 2.097 1.658
Proportion Var 0.200 0.140 0.111
Cumulative Var 0.200 0.340 0.451
Code
# EFA using pooled covariance matrixEFA <-fa(r = cov_pooled,nfactors =2, # update based on screen.obs =nrow(d2),fm ="ml",rotate ="promax")print(EFA$loadings, sort =TRUE, cutoff = .4)
Loadings:
ML1 ML2
Narcissism 0.603
Depression 0.556
Intelligence 0.648
Trauma1 0.851
Toxic People 0.738
Trauma2 0.539
Psychiatric Symptoms 0.812
Introversion 0.805
Attraction 0.568
Childhood 0.570
Friendship 0.580
Family 0.514
Love 0.486
Manipulativeness 0.468
Anxiety & Emotion Regulation 0.441
ML1 ML2
SS loadings 3.089 3.043
Proportion Var 0.206 0.203
Cumulative Var 0.206 0.409
labels <-c(Q23_4 ="Love",Q34_4 ="Narcissism",Q36_4 ="Depression",Q38_4 ="Intelligence",Q48_4 ="Trauma1",Q52_4 ="Trauma2",Q56_4 ="Toxic People",Q60_4 ="Psychiatric Symptoms",Q64_4 ="Introversion",Q70_4 ="Manipulativeness",Q72_4 ="Attraction",Q76_4 ="Childhood",Q80_4 ="Friendship",Q84_4 ="Anxiety & Emotion Regulation",Q88_4 ="Family")# shorten labels to max 40 characters (you can adjust the number)# labels <- str_trunc(labels, width = 60, side = "right")# replace column namesnames(d) <- labelsd_long <-stack(d)names(d_long) <-c("value", "variable")ggplot(d_long, aes(x = value)) +geom_histogram(binwidth =1, fill ="steelblue", color ="white") +facet_wrap(~ variable, labeller =label_wrap_gen(width =30)) +theme_minimal()
Warning: Removed 1407 rows containing non-finite outside the scale range
(`stat_bin()`).
EFA 1
Very imperfect due to structure of the data.
Code
d2 <- dset.seed(42) # for reproducibility# mi2 <- mifa(# data = d2,# m = 30,# ci = "boot",# n_pc = 1:10,# print = F# )# save(mi2, file = "mi2.RData")load("mi2.RData") # restores 'mi2' object back into environment# Use pooled covariance matrix from mifa, converted to correlation matrixcov_pooled <- mi2$cov_combinedcor_pooled <-cov2cor(cov_pooled)ev <-eigen(cor_pooled) # get eigenvaluesap <-parallel(subject =nrow(d2), var =ncol(cor_pooled), rep =100, cent = .05) # run the parallel analysis, gives us another perspective on how many factors should be used in the modelnS <-nScree(x = ev$values, aparallel = ap$eigen$qevpea)plotnScree(nS) # shows us the scree plot, look for the elbows
Code
# EFA using pooled covariance matrixEFA <-fa(r = cov_pooled,nfactors =3, # update based on screen.obs =nrow(d2),fm ="ml",rotate ="promax")print(EFA$loadings, sort =TRUE, cutoff = .4)
Loadings:
ML1 ML2 ML3
Trauma2 0.692
Introversion 0.681
Manipulativeness 0.734
Attraction 0.572
Childhood 0.788
Love 0.539
Toxic People 0.854
Psychiatric Symptoms 0.735
Narcissism 0.534
Depression 0.772
Intelligence 0.419 0.473
Trauma1 0.484
Friendship 0.463
Anxiety & Emotion Regulation 0.430
Family 0.493
ML1 ML2 ML3
SS loadings 3.294 1.905 1.509
Proportion Var 0.220 0.127 0.101
Cumulative Var 0.220 0.347 0.447
Warning: Removed 2760 rows containing non-finite outside the scale range
(`stat_bin()`).
EFA 1
Very imperfect due to structure of the data.
Code
d2 <- dset.seed(42) # for reproducibility# mi3 <- mifa(# data = d2,# m = 30,# ci = "boot",# n_pc = 1:10,# print = F# )# save(mi3, file = "mi3.RData")load("mi3.RData") # restores 'mi' object back into environment# Use pooled covariance matrix from mifa, converted to correlation matrixcov_pooled <- mi3$cov_combinedcor_pooled <-cov2cor(cov_pooled)ev <-eigen(cor_pooled) # get eigenvaluesap <-parallel(subject =nrow(d2), var =ncol(cor_pooled), rep =100, cent = .05) # run the parallel analysis, gives us another perspective on how many factors should be used in the modelnS <-nScree(x = ev$values, aparallel = ap$eigen$qevpea)plotnScree(nS) # shows us the scree plot, look for the elbows
Code
# EFA using pooled covariance matrixEFA <-fa(r = cov_pooled,nfactors =3, # update based on screen.obs =nrow(d2),fm ="ml",rotate ="promax")print(EFA$loadings, sort =TRUE, cutoff = .4)
d <-subset(df2, select=c(grep("Q29_", colnames(df2))))labels <-c(Q29_1 ="Ordinary People Unites",Q29_2 ="Ordinary People Good",Q29_3 ="Scientists Advantage",Q29_4 ="Scientists Cahoots",Q29_5 ="People Influence",Q29_6 ="People Decisions",Q29_7 ="Rely Experience",Q29_8 ="Rely Common Sense")# shorten labels to max 40 characters (you can adjust the number)# labels <- str_trunc(labels, width = 60, side = "right")# replace column namesnames(d) <- labelsd_long <-stack(d)names(d_long) <-c("value", "variable")ggplot(d_long, aes(x = value)) +geom_histogram(binwidth =1, fill ="steelblue", color ="white") +facet_wrap(~ variable, labeller =label_wrap_gen(width =30)) +theme_minimal()
CFA
Code
d <-subset(df2, select=c(grep("Q29_", colnames(df2))))# Specify CFA modelmodel <-' ppl =~ Q29_1 + Q29_2 eli =~ Q29_3 + Q29_4 dec =~ Q29_5 + Q29_6 tru =~ Q29_7 + Q29_8'# fit CFAfit <-cfa(model, data = d, std.lv =TRUE)# summary with fit indices and standardized loadingssummary(fit, fit.measures =TRUE, standardized =TRUE)
lavaan 0.6.17 ended normally after 29 iterations
Estimator ML
Optimization method NLMINB
Number of model parameters 22
Number of observations 184
Model Test User Model:
Test statistic 24.826
Degrees of freedom 14
P-value (Chi-square) 0.036
Model Test Baseline Model:
Test statistic 490.930
Degrees of freedom 28
P-value 0.000
User Model versus Baseline Model:
Comparative Fit Index (CFI) 0.977
Tucker-Lewis Index (TLI) 0.953
Loglikelihood and Information Criteria:
Loglikelihood user model (H0) -1594.557
Loglikelihood unrestricted model (H1) -1582.144
Akaike (AIC) 3233.114
Bayesian (BIC) 3303.843
Sample-size adjusted Bayesian (SABIC) 3234.163
Root Mean Square Error of Approximation:
RMSEA 0.065
90 Percent confidence interval - lower 0.016
90 Percent confidence interval - upper 0.106
P-value H_0: RMSEA <= 0.050 0.251
P-value H_0: RMSEA >= 0.080 0.301
Standardized Root Mean Square Residual:
SRMR 0.036
Parameter Estimates:
Standard errors Standard
Information Expected
Information saturated (h1) model Structured
Latent Variables:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
ppl =~
Q29_1 0.511 0.205 2.497 0.013 0.511 0.774
Q29_2 0.252 0.110 2.296 0.022 0.252 0.376
eli =~
Q29_3 0.640 0.059 10.910 0.000 0.640 0.803
Q29_4 0.704 0.070 10.125 0.000 0.704 0.746
dec =~
Q29_5 0.808 0.067 12.023 0.000 0.808 0.856
Q29_6 0.801 0.068 11.703 0.000 0.801 0.835
tru =~
Q29_7 0.747 0.063 11.824 0.000 0.747 0.820
Q29_8 0.692 0.061 11.268 0.000 0.692 0.785
Covariances:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
ppl ~~
eli -0.067 0.109 -0.614 0.539 -0.067 -0.067
dec 0.152 0.111 1.363 0.173 0.152 0.152
tru 0.154 0.115 1.346 0.178 0.154 0.154
eli ~~
dec 0.532 0.074 7.213 0.000 0.532 0.532
tru 0.726 0.062 11.735 0.000 0.726 0.726
dec ~~
tru 0.628 0.064 9.811 0.000 0.628 0.628
Variances:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
.Q29_1 0.175 0.206 0.848 0.396 0.175 0.401
.Q29_2 0.385 0.064 6.013 0.000 0.385 0.858
.Q29_3 0.225 0.049 4.633 0.000 0.225 0.355
.Q29_4 0.396 0.066 6.000 0.000 0.396 0.444
.Q29_5 0.237 0.066 3.574 0.000 0.237 0.267
.Q29_6 0.279 0.067 4.148 0.000 0.279 0.303
.Q29_7 0.272 0.055 4.946 0.000 0.272 0.328
.Q29_8 0.297 0.051 5.834 0.000 0.297 0.383
ppl 1.000 1.000 1.000
eli 1.000 1.000 1.000
dec 1.000 1.000 1.000
tru 1.000 1.000 1.000
d <-subset(df2, select=c(grep("Q30_", colnames(df2))))labels <-c(Q30_1 ="Breakdown Recognize",Q30_2 ="Breakdown Values",Q30_3 ="Breakdown Change",Q30_4 ="Breakdown Morals",Q30_5 ="Breakdown Trust",Q30_6 ="Disintegration Morals",Q30_7 ="Disintegration Selfish",Q30_8 ="Disintegration Trust Rely",Q30_9 ="Disintegration Trust",Q30_10 ="Disintegration Care",Q30_11 ="Disintegration Communal",Q30_12 ="Disintegration End Justifies",Q30_13 ="Disintegration Rules Fading",Q30_14 ="Disintegration Good Evil",Q30_15 ="Disintegration No Regard")# shorten labels to max 40 characters (you can adjust the number)# labels <- str_trunc(labels, width = 60, side = "right")# replace column namesnames(d) <- labelsd_long <-stack(d)names(d_long) <-c("value", "variable")ggplot(d_long, aes(x = value)) +geom_histogram(binwidth =1, fill ="steelblue", color ="white") +facet_wrap(~ variable, labeller =label_wrap_gen(width =30)) +theme_minimal()
CFA
Initial model had CFI/TLI in 80s. Dropped lower-loading items until fit indices improved. Dropped 1 and 3 from Breakdown, and 7, 9, 10, 11, and 12 from Disintegration
Code
d <-subset(df2, select=c(grep("Q30_", colnames(df2))))# Specify CFA modelmodel <-' breakdown =~ Q30_2 + Q30_4 + Q30_5 disintegration =~ Q30_6 + Q30_8 + Q30_13 + Q30_14 + Q30_15'# fit CFAfit <-cfa(model, data = d, std.lv =TRUE)# summary with fit indices and standardized loadingssummary(fit, fit.measures =TRUE, standardized =TRUE)
lavaan 0.6.17 ended normally after 25 iterations
Estimator ML
Optimization method NLMINB
Number of model parameters 17
Number of observations 184
Model Test User Model:
Test statistic 46.082
Degrees of freedom 19
P-value (Chi-square) 0.000
Model Test Baseline Model:
Test statistic 854.680
Degrees of freedom 28
P-value 0.000
User Model versus Baseline Model:
Comparative Fit Index (CFI) 0.967
Tucker-Lewis Index (TLI) 0.952
Loglikelihood and Information Criteria:
Loglikelihood user model (H0) -1559.581
Loglikelihood unrestricted model (H1) -1536.540
Akaike (AIC) 3153.162
Bayesian (BIC) 3207.816
Sample-size adjusted Bayesian (SABIC) 3153.973
Root Mean Square Error of Approximation:
RMSEA 0.088
90 Percent confidence interval - lower 0.056
90 Percent confidence interval - upper 0.121
P-value H_0: RMSEA <= 0.050 0.028
P-value H_0: RMSEA >= 0.080 0.685
Standardized Root Mean Square Residual:
SRMR 0.037
Parameter Estimates:
Standard errors Standard
Information Expected
Information saturated (h1) model Structured
Latent Variables:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
breakdown =~
Q30_2 0.693 0.063 11.064 0.000 0.693 0.737
Q30_4 0.779 0.064 12.243 0.000 0.779 0.793
Q30_5 0.702 0.061 11.460 0.000 0.702 0.756
disintegration =~
Q30_6 0.699 0.059 11.876 0.000 0.699 0.764
Q30_8 0.556 0.053 10.464 0.000 0.556 0.697
Q30_13 0.712 0.057 12.440 0.000 0.712 0.788
Q30_14 0.810 0.059 13.623 0.000 0.810 0.837
Q30_15 0.722 0.059 12.238 0.000 0.722 0.780
Covariances:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
breakdown ~~
disintegration 0.926 0.028 32.597 0.000 0.926 0.926
Variances:
Estimate Std.Err z-value P(>|z|) Std.lv Std.all
.Q30_2 0.405 0.051 7.963 0.000 0.405 0.457
.Q30_4 0.360 0.050 7.206 0.000 0.360 0.372
.Q30_5 0.371 0.048 7.749 0.000 0.371 0.429
.Q30_6 0.349 0.042 8.245 0.000 0.349 0.417
.Q30_8 0.327 0.038 8.687 0.000 0.327 0.514
.Q30_13 0.309 0.039 8.006 0.000 0.309 0.378
.Q30_14 0.279 0.038 7.316 0.000 0.279 0.299
.Q30_15 0.336 0.042 8.097 0.000 0.336 0.392
breakdown 1.000 1.000 1.000
disintegration 1.000 1.000 1.000
corrout1 <-corr.test(subset(df1, select=c(60:72)))corrplot( corrout1$r,p.mat = corrout1$p, # add p-valuessig.level =0.05, # hide correlations above this p-valueinsig ="pch", # or "pch" to mark nonsignificant onesmethod ="color",type ="upper",tl.col ="black",tl.srt =45,addCoef.col ="black",number.cex =0.8)
S2
Code
corrout2 <-corr.test(subset(df2, select=c(216:242)))corrplot( corrout2$r,p.mat = corrout2$p, # add p-valuessig.level =0.05, # hide correlations above this p-valueinsig ="pch", # or "pch" to mark nonsignificant onesmethod ="color",type ="upper",tl.col ="black",tl.srt =45,addCoef.col ="black",number.cex =0.8)
Student Status & SES
Code
t.test(parent_edu ~ samp, data = df1)
Welch Two Sample t-test
data: parent_edu by samp
t = -12.26, df = 368.52, p-value < 2.2e-16
alternative hypothesis: true difference in means between group Prolific and group SONA is not equal to 0
95 percent confidence interval:
-1.3390379 -0.9688569
sample estimates:
mean in group Prolific mean in group SONA
2.546053 3.700000
Code
t.test(parent_edu ~ samp, data = df2)
Welch Two Sample t-test
data: parent_edu by samp
t = -8.0798, df = 83.629, p-value = 4.312e-12
alternative hypothesis: true difference in means between group Prolific and group SONA is not equal to 0
95 percent confidence interval:
-1.5966197 -0.9658899
sample estimates:
mean in group Prolific mean in group SONA
2.577236 3.858491
Hypothesis 1
Stress, minority stress, and ER predict IDM (sample 1)
Findings
Discrimination, rejection sensitivity, and emotion dysregulation (strat) were significant. Students were significantly lower in IDM than non-students.
Conclusions
Experiences with discrimination, rejection sensitivity, and limited access to emotion regulation strategies are the most consistent predictors of inequality-driven mistrust. Although stress (self-efficacy) significantly predicted distrust of authority, it was not significant for the other subscales or for the overall measure, suggesting that IDM is a product of minority stress and not a product of general stress. Most of the emotion dysregulation subscales were not significant, although clarity significantly predicted distrust of authority and there were some borderline significant effects of difficulties engaging in goal-directed behavior on defensive processing. These findings suggest that minority stress contributes to inequality-driven mistrust by depleting access to emotion regulation strategies, undermining participants’ ability to manage the emotional weight of minority stress and to appraise social systems objectively.
The effect of discrimination on limited access to strategies is stronger than the effect of rejection on limited access to strategies
Path B
Limited access to strategies is significantly related to inequality driven mistrust when controlling for discrimination and rejection sensitivity (b = .32)
Path C and C’
The indirect effect of discrimination (b = .10, CI 95%[.058, .151]) explains about a quarter of the total effect of discrimination on IDM (b = .40)
The indirect effect of rejection sensitivity (b = .04, CI 95%[.004,.081]) explains little of the total effect of rejection sensitivity on IDM (b = .25)
Even when accounting for the other variables in the model and the mediation effect, the direct effect of discrimination on IDM is still significant (b = .30, p < .001)
The direct effect of rejection sensitivity on IDM also remains signficant (b = .21, p < .001)
Conclusions
Overall, the mediation model provided mixed support for the hypothesis. The direct effects are significant for both predictors, with rejection sensitivity showing a particularly strong direct effect, but the indirect effects are generally weak. The mediation is only partial, and the lower bounds for the rejection sensitivity mediation are approaching zero. This suggests that limited access to strategies partially explains the impact of discrimination and rejection sensitivity on inequality-driven mistrust, but that other factors explain the bulk of the effect.
Code
# Define the modelmodel <-' # Direct effects on Y (c-prime paths) idm_z ~ c1*discrim_z + c2*reject_z + samp + parent_edu # Effects of predictors on mediator (a paths) ders_strat_z ~ a1*discrim_z + a2*reject_z + samp + parent_edu # Effect of mediator on Y controlling for predictors (b path) idm_z ~ b*ders_strat_z # Covariance between predictors discrim_z ~~ reject_z # Indirect effects indirect_discrim := a1*b indirect_reject := a2*b # Test whether indirect effects differ indirect_diff := indirect_discrim - indirect_reject # Total effects total_discrim := c1 + (a1*b) total_reject := c2 + (a2*b)'# Fit the model# fit <- sem(model, data = df1, se = "bootstrap", bootstrap = 5000)# saveRDS(fit, file = "mediation_fit1.rds")fit1 <-readRDS("mediation_fit1.rds")# Summarize resultssummary(fit1, fit.measures =TRUE, ci =TRUE)
lavaan 0.6-21 ended normally after 12 iterations
Estimator ML
Optimization method NLMINB
Number of model parameters 14
Used Total
Number of observations 418 420
Model Test User Model:
Test statistic 49.310
Degrees of freedom 4
P-value (Chi-square) 0.000
Model Test Baseline Model:
Test statistic 504.959
Degrees of freedom 14
P-value 0.000
User Model versus Baseline Model:
Comparative Fit Index (CFI) 0.908
Tucker-Lewis Index (TLI) 0.677
Loglikelihood and Information Criteria:
Loglikelihood user model (H0) -2144.267
Loglikelihood unrestricted model (H1) NA
Akaike (AIC) 4316.533
Bayesian (BIC) 4373.030
Sample-size adjusted Bayesian (SABIC) 4328.604
Root Mean Square Error of Approximation:
RMSEA 0.165
90 Percent confidence interval - lower 0.125
90 Percent confidence interval - upper 0.207
P-value H_0: RMSEA <= 0.050 0.000
P-value H_0: RMSEA >= 0.080 1.000
Standardized Root Mean Square Residual:
SRMR 0.076
Parameter Estimates:
Standard errors Bootstrap
Number of requested bootstrap draws 5000
Number of successful bootstrap draws 5000
Regressions:
Estimate Std.Err z-value P(>|z|) ci.lower ci.upper
idm_z ~
discrim_z (c1) 0.296 0.045 6.570 0.000 0.210 0.387
reject_z (c2) 0.210 0.046 4.518 0.000 0.119 0.299
samp -0.496 0.085 -5.801 0.000 -0.665 -0.326
parent_ed -0.030 0.037 -0.819 0.413 -0.101 0.043
ders_strat_z ~
discrim_z (a1) 0.316 0.054 5.800 0.000 0.209 0.423
reject_z (a2) 0.135 0.061 2.221 0.026 0.011 0.254
samp -0.037 0.109 -0.334 0.738 -0.249 0.182
parent_ed 0.055 0.047 1.154 0.249 -0.038 0.146
idm_z ~
drs_strt_ (b) 0.317 0.042 7.586 0.000 0.237 0.402
Covariances:
Estimate Std.Err z-value P(>|z|) ci.lower ci.upper
discrim_z ~~
reject_z 0.462 0.056 8.322 0.000 0.357 0.571
Variances:
Estimate Std.Err z-value P(>|z|) ci.lower ci.upper
.idm_z 0.507 0.035 14.668 0.000 0.435 0.569
.ders_strat_z 0.843 0.060 13.974 0.000 0.719 0.957
discrim_z 0.996 0.061 16.392 0.000 0.877 1.114
reject_z 1.002 0.066 15.219 0.000 0.874 1.130
Defined Parameters:
Estimate Std.Err z-value P(>|z|) ci.lower ci.upper
indirect_dscrm 0.100 0.024 4.231 0.000 0.059 0.151
indirect_rejct 0.043 0.019 2.208 0.027 0.004 0.081
indirect_diff 0.057 0.035 1.658 0.097 -0.004 0.131
total_discrim 0.397 0.044 9.090 0.000 0.312 0.483
total_reject 0.253 0.048 5.280 0.000 0.159 0.344
Stress, minority stress, and ER predict IDM (sample 2, replication from sample 1)
Findings
High VIF score (> 5) for the ders_strat variable. Removing it from the models did not significantly change findings so it was retained.
Rejection sensitivity and stress (helplessness) were significant. In sample 1, discrimination and emotion dysregulation (strat) were also significant. Students are still lower in IDM than non-students.
Conclusions
Some of the central findings from H1 did not replicate. Discrimination and emotion dysregulation (strat) were no longer significant, while rejection sensitivity remained a strong predictor of IDM. The effect of stress (helplessness) was new. The lack of significant findings for discrimination and emotion dysregulation could be due to the smaller sample size.
The effect of discrimination on limited access to strategies is stronger than the effect of rejection on limited access to strategies
This is the same general pattern from sample 1.
Path B
Limited access to strategies is significantly related to inequality driven mistrust when controlling for discrimination and rejection sensitivity (b = .16)
This is also consistent with sample 1, although the effect size has been approximately halved (from .32 to .16)
Path C and C’
The indirect effect of discrimination (b = .06, CI 95%[.006,.146]) explains about a third of the total effect of discrimination on IDM (b = .19)
The indirect effect of rejection sensitivity (b = .03, CI 95%[.002,.091]) explains very little of the total effect of rejection sensitivity on IDM (b = .51)
Once accounting for the other variables in the middle and the mediation effect, the direct effect of discrimination on IDM is no longer significant (b = .08, p = .277)
However, the direct effect of rejection sensitivity on IDM remains signficant (b = .47, p < .001)
Some shifts here from sample 1. The mediation effects are a bit weaker, and the mediation for discrimination has shifted from partial to full. However, the general pattern is consistent.
Conclusions
Overall, the mediation model provided mixed support for the hypothesis, but are broadly consistent from sample 1. The effect of rejection sensitivity on IDM and the effect of discrimination on limited access to strategies are supported. The indirect effects are weakly supported, with lower bounds approaching zero. There is a pattern of full vs partial mediation, although the effects are small. One thing to keep in mind is the small sample (n2 = 184, n1 = 420)
Analyses
Code
# Fit the model# fit <- sem(model, data = df2, se = "bootstrap", bootstrap = 5000)# saveRDS(fit, file = "mediation_fit2.rds")fit2 <-readRDS("mediation_fit2.rds")# Summarize resultssummary(fit2, fit.measures =TRUE, ci =TRUE)
lavaan 0.6-21 ended normally after 12 iterations
Estimator ML
Optimization method NLMINB
Number of model parameters 14
Used Total
Number of observations 176 184
Model Test User Model:
Test statistic 12.570
Degrees of freedom 4
P-value (Chi-square) 0.014
Model Test Baseline Model:
Test statistic 253.770
Degrees of freedom 14
P-value 0.000
User Model versus Baseline Model:
Comparative Fit Index (CFI) 0.964
Tucker-Lewis Index (TLI) 0.875
Loglikelihood and Information Criteria:
Loglikelihood user model (H0) -875.666
Loglikelihood unrestricted model (H1) NA
Akaike (AIC) 1779.333
Bayesian (BIC) 1823.719
Sample-size adjusted Bayesian (SABIC) 1779.385
Root Mean Square Error of Approximation:
RMSEA 0.110
90 Percent confidence interval - lower 0.045
90 Percent confidence interval - upper 0.182
P-value H_0: RMSEA <= 0.050 0.062
P-value H_0: RMSEA >= 0.080 0.809
Standardized Root Mean Square Residual:
SRMR 0.045
Parameter Estimates:
Standard errors Bootstrap
Number of requested bootstrap draws 5000
Number of successful bootstrap draws 5000
Regressions:
Estimate Std.Err z-value P(>|z|) ci.lower ci.upper
idm_z ~
discrim_z (c1) 0.125 0.075 1.665 0.096 -0.024 0.268
reject_z (c2) 0.473 0.068 6.935 0.000 0.337 0.605
samp -0.360 0.164 -2.202 0.028 -0.670 -0.032
parent_ed -0.035 0.064 -0.551 0.582 -0.163 0.088
ders_strat_z ~
discrim_z (a1) 0.391 0.082 4.756 0.000 0.233 0.552
reject_z (a2) 0.239 0.085 2.820 0.005 0.071 0.398
samp 0.256 0.153 1.669 0.095 -0.053 0.549
parent_ed -0.093 0.066 -1.415 0.157 -0.222 0.037
idm_z ~
drs_strt_ (b) 0.163 0.078 2.090 0.037 0.017 0.323
Covariances:
Estimate Std.Err z-value P(>|z|) ci.lower ci.upper
discrim_z ~~
reject_z 0.547 0.104 5.279 0.000 0.351 0.757
Variances:
Estimate Std.Err z-value P(>|z|) ci.lower ci.upper
.idm_z 0.540 0.064 8.429 0.000 0.403 0.654
.ders_strat_z 0.684 0.089 7.654 0.000 0.501 0.849
discrim_z 1.004 0.108 9.319 0.000 0.791 1.213
reject_z 0.963 0.107 8.961 0.000 0.750 1.175
Defined Parameters:
Estimate Std.Err z-value P(>|z|) ci.lower ci.upper
indirect_dscrm 0.064 0.036 1.780 0.075 0.006 0.146
indirect_rejct 0.039 0.023 1.697 0.090 0.002 0.091
indirect_diff 0.025 0.031 0.800 0.424 -0.019 0.103
total_discrim 0.189 0.070 2.693 0.007 0.049 0.324
total_reject 0.512 0.066 7.784 0.000 0.384 0.638
Code
graph_sem(fit2, layout = lay)
Mini Meta-Analysis
Combined Datasets
Code
# Pool the datasets and test the interactiondf_combined <-bind_rows( df1 %>%mutate(sample =1), df2 %>%mutate(sample =2))df_combined$sample <-as.factor(df_combined$sample)interaction_model <-lm(idm_z ~ stress_helpless_z + stress_efficacy_z + discrim_z + reject_z + ders_clarity_z + ders_goals_z + ders_impulse_z + ders_strat_z + ders_nonacc_z + samp + sample + parent_edu,data = df_combined)summary(interaction_model)
IDM predicts misinformation acceptance, accurate information acceptance, and increased susceptability to misinformation (sample 2)
Findings
IDM predicts misinformation acceptance (b = .14, p = .049) but not accurate information acceptance (b = .04, p = .549). Students are lower in misinformation (b = -.65, p < .001) and accurate information (b = -.71, p < .001) acceptance. IDM also predicts increased susceptability to misinformation acceptance (using residualized change approach; b = .11, p = .045). Students have lower susceptability to misinformation than non-students, but the difference is only borderline significant (b = -.23, p = .080).
Conclusions
IDM predicts misinformation acceptance and increased susceptability to misinformation, but not accurate information acceptance.
Call:
lm(formula = mis_dang_z ~ acc_dang_z + idm_z + samp, data = df2)
Residuals:
Min 1Q Median 3Q Max
-2.56046 -0.55236 0.04106 0.62231 1.94738
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.09610 0.08672 1.108 0.2695
acc_dang_z 0.42090 0.07460 5.642 7.7e-08 ***
idm_z 0.14944 0.07137 2.094 0.0379 *
sampSONA -0.24012 0.16541 -1.452 0.1486
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.8955 on 156 degrees of freedom
(24 observations deleted due to missingness)
Multiple R-squared: 0.246, Adjusted R-squared: 0.2315
F-statistic: 16.97 on 3 and 156 DF, p-value: 1.376e-09
Hypothesis 5
Minority stress predicts misinformation acceptance, mediated by IDM (sample 2)
Hypothesis 6
Condition (misinformation exposure) will predict less social support, higher science populism, higher anomie, controlling for student status, parent education status, and IDM (sample 2) Susceptibility to misinformation acceptance will be associated with lower perceived social support, higher science populism, and higher anomie, even when controlling for misinformation exposure, controlling for student status, parent education status, and IDM (sample 2)
Social Support
Histograms
Code
Code
CFA
Code
Code