In these analyses, we test correlational associations between self and social relevance and broad- and narrowcast sharing intentions in a subset of data in which the correlations between self and social relevance are lower.

prep data

First, we load the relevant packages and data, and define the plotting aesthetics.

load packages

if (!require(tidyverse)) {
  install.packages('tidyverse')
}
if (!require(knitr)) {
  install.packages('knitr')
}
if (!require(kableExtra)) {
  install.packages('kableExtra')
}
if (!require(lmerTest)) {
  install.packages('lmerTest')
}
if (!require(report)) {
  install.packages('report')
}
report::cite_packages()
##   - Douglas Bates and Martin Maechler (2021). Matrix: Sparse and Dense Matrix Classes and Methods. R package version 1.3-4. https://CRAN.R-project.org/package=Matrix
##   - Douglas Bates, Martin Maechler, Ben Bolker, Steve Walker (2015). Fitting Linear Mixed-Effects Models Using lme4. Journal of Statistical Software, 67(1), 1-48. doi:10.18637/jss.v067.i01.
##   - H. Wickham. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York, 2016.
##   - Hadley Wickham (2019). stringr: Simple, Consistent Wrappers for Common String Operations. R package version 1.4.0. https://CRAN.R-project.org/package=stringr
##   - Hadley Wickham (2021). forcats: Tools for Working with Categorical Variables (Factors). R package version 0.5.1. https://CRAN.R-project.org/package=forcats
##   - Hadley Wickham (2021). tidyr: Tidy Messy Data. R package version 1.1.4. https://CRAN.R-project.org/package=tidyr
##   - Hadley Wickham, Jim Hester and Jennifer Bryan (2021). readr: Read Rectangular Text Data. R package version 2.1.1. https://CRAN.R-project.org/package=readr
##   - Hadley Wickham, Romain François, Lionel Henry and Kirill Müller (2021). dplyr: A Grammar of Data Manipulation. R package version 1.0.7. https://CRAN.R-project.org/package=dplyr
##   - Hao Zhu (2021). kableExtra: Construct Complex Table with 'kable' and Pipe Syntax. R package version 1.3.4. https://CRAN.R-project.org/package=kableExtra
##   - Kirill Müller and Hadley Wickham (2021). tibble: Simple Data Frames. R package version 3.1.6. https://CRAN.R-project.org/package=tibble
##   - Kuznetsova A, Brockhoff PB, Christensen RHB (2017). "lmerTest Package:Tests in Linear Mixed Effects Models." _Journal of StatisticalSoftware_, *82*(13), 1-26. doi: 10.18637/jss.v082.i13 (URL:https://doi.org/10.18637/jss.v082.i13).
##   - Lionel Henry and Hadley Wickham (2020). purrr: Functional Programming Tools. R package version 0.3.4. https://CRAN.R-project.org/package=purrr
##   - Makowski, D., Ben-Shachar, M.S., Patil, I. & Lüdecke, D. (2020). Automated Results Reporting as a Practical Tool to Improve Reproducibility and Methodological Best Practices Adoption. CRAN. Available from https://github.com/easystats/report. doi: .
##   - R Core Team (2021). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.
##   - Wickham et al., (2019). Welcome to the tidyverse. Journal of Open Source Software, 4(43), 1686, https://doi.org/10.21105/joss.01686
##   - Yihui Xie (2021). knitr: A General-Purpose Package for Dynamic Report Generation in R. R package version 1.37.

define aesthetics

palette = c("#001219", "#005F73", "#0A9396", "#94D2BD", "#E9D8A6", "#EE9B00", "#CA6702", "#BB3E03", "#AE2012")
palette_sharing = c("#0a9396", "#EE9B00")
palette_study = c("#001219", "#005F73", "#94D2BD", "#E9D8A6", "#EE9B00", "#AE2012")

plot_aes = theme_minimal() +
  theme(legend.position = "top",
        legend.text = element_text(size = 12),
        text = element_text(size = 16, family = "Futura Medium"),
        axis.text = element_text(color = "black"),
        axis.line = element_line(colour = "black"),
        axis.ticks.y = element_blank())

load and merge data

# cleaned study data
study1 = read.csv("../data/study1.csv", stringsAsFactors = FALSE)

study2 = read.csv("../data/study2.csv", stringsAsFactors = FALSE)

study3 = read.csv("../data/study3.csv", stringsAsFactors = FALSE)

study4 = read.csv("../data/study4.csv", stringsAsFactors = FALSE)

study5 = read.csv("../data/study5.csv", stringsAsFactors = FALSE)

study6 = read.csv("../data/study6.csv", stringsAsFactors = FALSE) %>%
  select(-article_cond)

# merge dataframes and z-score within study and sharing type
merged = bind_rows(study1, study2, study3, study4, study5, study6) %>%
  group_by(study, sharing_type) %>%
  mutate(msg_share_std = scale(msg_share, scale = TRUE, center = TRUE))

message-level

In these analyses, select a subset of messages that have correlations between self and social relevance < .7.

correlations

descriptives

Describe the correlations between self and social relevance by study and content type.

across content

cors_spread = merged %>%
  ungroup() %>%
  select(study, item, msg_rel_self, msg_rel_social) %>%
  unique()

cors = cors_spread %>%
  nest(-c(study, item)) %>%
  mutate(test = map(data, possibly(~ cor.test(.$msg_rel_self, .$msg_rel_social), otherwise = NULL))) %>%
  filter(!test == "NULL") %>%
  mutate(coefs = map(test,
                     broom::tidy,
                     conf.int = TRUE,
                     conf.level = .95)) %>% 
  unnest(coefs, .drop = TRUE) %>%
  mutate_if(is.numeric, round, 2)

cors %>%
  group_by(study) %>%
  summarize(`mean correlation` = mean(estimate, na.rm = TRUE),
            `sd correlation` = sd(estimate, na.rm = TRUE),
            min = min(estimate, na.rm = TRUE),
            max = max(estimate, na.rm = TRUE)) %>%
  mutate(`range correlation` = sprintf("%.2f, %.2f", min, max)) %>%
  select(-min, -max) %>%
  kable(digits = 2) %>%
  kableExtra::kable_styling()
study mean correlation sd correlation range correlation
study 1 0.56 0.23 -0.12, 1.00
study 2 0.64 0.12 0.48, 0.82
study 3 0.63 0.14 0.39, 0.80
study 4 0.56 0.26 -0.18, 0.95
study 5 0.78 0.15 0.28, 0.95
study 6 0.75 0.15 0.23, 0.95

by content

message_content = merged %>%
  ungroup() %>%
  select(study, item, content) %>%
  unique()

cors %>%
  left_join(., message_content) %>%
  group_by(study, content) %>%
  summarize(`mean correlation` = mean(estimate, na.rm = TRUE),
            `sd correlation` = sd(estimate, na.rm = TRUE),
            min = min(estimate, na.rm = TRUE),
            max = max(estimate, na.rm = TRUE)) %>%
  mutate(`range correlation` = sprintf("%.2f, %.2f", min, max)) %>%
  select(-min, -max) %>%
  kable(digits = 2) %>%
  kableExtra::kable_styling()
study content mean correlation sd correlation range correlation
study 1 covid 0.56 0.23 -0.12, 1.00
study 2 voting 0.64 0.12 0.48, 0.82
study 3 voting 0.63 0.14 0.39, 0.80
study 4 health 0.56 0.26 -0.18, 0.95
study 5 climate 0.84 0.11 0.43, 0.95
study 5 covid 0.73 0.17 0.28, 0.95
study 6 climate 0.82 0.09 0.61, 0.95
study 6 health 0.67 0.16 0.23, 0.88

plot

This plot is reported in supplementary material Figure S1.

cors %>%
  arrange(study, item) %>%
  mutate(item = row_number(),
         V1 = sprintf("self_%s", row_number()),
         V2 = sprintf("social_%s", row_number())) %>%
  ggplot(aes(item, estimate, color = study)) +
  geom_point() +
  geom_hline(yintercept = .7) +
  scale_color_manual(values = palette_study) +
  labs(x = "\nmessage number", y = "correlation between\nself and social relevance\n") +
  plot_aes +
  theme(legend.text = element_text(size = 11))

number of messages per study with < .7 correlation

data_lower_cors = cors %>%
  filter(estimate < .7)

total_n = merged %>%
  ungroup() %>%
  select(study, item) %>%
  unique() %>%
  group_by(study) %>%
  summarize(`total n` = n())

data_lower_cors %>%
  group_by(study) %>%
  summarize(n = n()) %>%
  left_join(., total_n) %>%
  mutate(percent = (n / `total n`) * 100) %>%
  kable(digits = 2) %>%
  kableExtra::kable_styling()
study n total n percent
study 1 67 92 72.83
study 2 10 15 66.67
study 3 6 10 60.00
study 4 52 80 65.00
study 5 25 110 22.73
study 6 34 110 30.91

downsampled mega-analysis

Estimate the mega-analysis model in the downsampled dataset.

run model

data_downsample = merged %>%
  filter(item %in% data_lower_cors$item)

model = lmerTest::lmer(msg_share_std ~ 0 + msg_rel_self_between*sharing_type +
                                 msg_rel_self_within*sharing_type +
                                 msg_rel_social_between*sharing_type +
                                 msg_rel_social_within*sharing_type +
                                 (1 + msg_rel_self_within + msg_rel_social_within | SID) +
                                 (1 + msg_rel_self_within + msg_rel_social_within | item),
                               data = data_downsample,
                       control = lmerControl(optimizer = "bobyqa"))

summary(model)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: 
## msg_share_std ~ 0 + msg_rel_self_between * sharing_type + msg_rel_self_within *  
##     sharing_type + msg_rel_social_between * sharing_type + msg_rel_social_within *  
##     sharing_type + (1 + msg_rel_self_within + msg_rel_social_within |  
##     SID) + (1 + msg_rel_self_within + msg_rel_social_within |      item)
##    Data: data_downsample
## Control: lmerControl(optimizer = "bobyqa")
## 
## REML criterion at convergence: 35203.1
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -4.9599 -0.4382  0.0210  0.4450  5.5061 
## 
## Random effects:
##  Groups   Name                  Variance Std.Dev. Corr       
##  SID      (Intercept)           0.402033 0.63406             
##           msg_rel_self_within   0.021761 0.14752   0.11      
##           msg_rel_social_within 0.018463 0.13588   0.21 -0.12
##  item     (Intercept)           0.005053 0.07108             
##           msg_rel_self_within   0.006969 0.08348  -0.26      
##           msg_rel_social_within 0.001401 0.03742   0.02 -0.07
##  Residual                       0.225145 0.47449             
## Number of obs: 18522, groups:  SID, 3669; item, 193
## 
## Fixed effects:
##                                         Estimate   Std. Error           df
## msg_rel_self_between                    0.340424     0.020269  3683.115288
## sharing_type                            0.018225     0.011811 12764.560436
## msg_rel_self_within                     0.184613     0.010249   136.370986
## msg_rel_social_between                  0.183350     0.020199  3653.760626
## msg_rel_social_within                   0.128229     0.007972    77.552518
## msg_rel_self_between:sharing_type      -0.061184     0.021311 12786.351086
## sharing_type:msg_rel_self_within       -0.055172     0.013226  5772.550970
## sharing_type:msg_rel_social_between     0.081005     0.021510 12780.835894
## sharing_type:msg_rel_social_within      0.119355     0.013566  3203.957771
##                                     t value             Pr(>|t|)    
## msg_rel_self_between                 16.796 < 0.0000000000000002 ***
## sharing_type                          1.543             0.122825    
## msg_rel_self_within                  18.013 < 0.0000000000000002 ***
## msg_rel_social_between                9.077 < 0.0000000000000002 ***
## msg_rel_social_within                16.085 < 0.0000000000000002 ***
## msg_rel_self_between:sharing_type    -2.871             0.004099 ** 
## sharing_type:msg_rel_self_within     -4.171            0.0000307 ***
## sharing_type:msg_rel_social_between   3.766             0.000167 ***
## sharing_type:msg_rel_social_within    8.798 < 0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##                        msg_rl_slf_b shrng_ msg_rl_slf_w msg_rl_scl_b
## sharing_typ            -0.004                                       
## msg_rl_slf_w           -0.014       -0.021                          
## msg_rl_scl_b           -0.826        0.004  0.015                   
## msg_rl_scl_w            0.013        0.030 -0.316       -0.021      
## msg_rl_s_:_            -0.117        0.047  0.017        0.095      
## shrng_typ:msg_rl_sl_    0.008        0.077 -0.242       -0.009      
## shrng_typ:msg_rl_scl_b  0.094       -0.058 -0.017       -0.117      
## shrng_typ:msg_rl_scl_w -0.008       -0.096  0.123        0.007      
##                        msg_rl_scl_w m___:_ shrng_typ:msg_rl_sl_
## sharing_typ                                                    
## msg_rl_slf_w                                                   
## msg_rl_scl_b                                                   
## msg_rl_scl_w                                                   
## msg_rl_s_:_            -0.023                                  
## shrng_typ:msg_rl_sl_    0.153       -0.083                     
## shrng_typ:msg_rl_scl_b  0.016       -0.832  0.079              
## shrng_typ:msg_rl_scl_w -0.280        0.089 -0.533              
##                        shrng_typ:msg_rl_scl_b
## sharing_typ                                  
## msg_rl_slf_w                                 
## msg_rl_scl_b                                 
## msg_rl_scl_w                                 
## msg_rl_s_:_                                  
## shrng_typ:msg_rl_sl_                         
## shrng_typ:msg_rl_scl_b                       
## shrng_typ:msg_rl_scl_w -0.063

plot

This plot is reported in supplementary material Figure S2.

predicted = ggeffects::ggpredict(model, c("msg_rel_self_between [-3:3]", "sharing_type")) %>%
  data.frame() %>%
  mutate(type = "self_between") %>%
  bind_rows(ggeffects::ggpredict(model, c("msg_rel_self_within [-3:3]", "sharing_type")) %>%
              data.frame() %>%
              mutate(type = "self_within")) %>%
  bind_rows(ggeffects::ggpredict(model, c("msg_rel_social_between [-3:3]", "sharing_type")) %>%
              data.frame() %>%
              mutate(type = "social_between")) %>%
  bind_rows(ggeffects::ggpredict(model, c("msg_rel_social_within [-3:3]", "sharing_type")) %>%
              data.frame() %>%
              mutate(type = "social_within"))

points = data_downsample %>%
  select(-group) %>%
  rename("group" = sharing_type,
         "predicted" = msg_share_std) %>%
  select(study, SID, group, predicted, contains("within"), contains("between")) %>%
  gather(type, x, contains("msg")) %>%
  mutate(type = gsub("msg_rel_", "", type),
         group = ifelse(group == 0, "broadcast", "narrowcast")) %>%
  extract(type, c("variable", "type"), "(.*)_(.*)") %>%
  filter(x < 3 & x > -3)

predicted %>%
  mutate(group = ifelse(group == 0, "broadcast", "narrowcast")) %>%
  extract(type, c("variable", "type"), "(.*)_(.*)") %>%
  ggplot(aes(x, predicted, color = group, fill = group, linetype = type)) +
  geom_point(data = points, aes(x, predicted), alpha = .02, size = .25) +
  geom_ribbon(aes(ymin = conf.low, ymax = conf.high), alpha = .2, color = NA) +
  geom_line(size = 1) +
  facet_grid(~variable) +
  scale_color_manual(name = "", values = palette_sharing) +
  scale_fill_manual(name = "", values = palette_sharing) +
  scale_linetype_manual(name = "", values = c("solid", "dashed")) +
  guides(linetype = guide_legend(override.aes = list(fill = NA))) +
  labs(x = "\nstandardized relevance rating", y = "predicted standardized sharing intention rating\n") +
  plot_aes  +
  theme(legend.position = "top",
        legend.key.width=unit(2,"cm"))

model summary table

model %>%
  broom.mixed::tidy(conf.int = TRUE) %>%
  filter(effect == "fixed") %>%
  rename("SE" = std.error,
         "t" = statistic,
         "p" = p.value) %>%
  select(-group, -effect) %>%
  mutate_at(vars(-contains("term"), -contains("p.value")), round, 2) %>%
  mutate(term = gsub(":", " x ", term),
         term = gsub("msg_", "", term),
         term = gsub("_", " ", term),
         term = gsub("within", "within", term),
         term = gsub("between", "between", term),
         term = gsub("rel self", "self relevance", term),
         term = gsub("rel social", "social relevance", term),
         term = gsub("sharing type", "sharing type (narrowcast)", term),
         p = ifelse(p < .001, "< .001",
                    ifelse(p == 1, "1.000", gsub("0.(.*)", ".\\1", sprintf("%.3f", p)))),
         `b [95% CI]` = sprintf("%.2f [%0.2f, %.2f]", estimate, conf.low, conf.high)) %>%
  select(term, `b [95% CI]`, df, t, p) %>%
  kable()  %>%
  kableExtra::kable_styling()
term b [95% CI] df t p
self relevance between 0.34 [0.30, 0.38] 3683.12 16.80 < .001
sharing type (narrowcast) 0.02 [-0.00, 0.04] 12764.56 1.54 .120
self relevance within 0.18 [0.16, 0.20] 136.37 18.01 < .001
social relevance between 0.18 [0.14, 0.22] 3653.76 9.08 < .001
social relevance within 0.13 [0.11, 0.14] 77.55 16.08 < .001
self relevance between x sharing type (narrowcast) -0.06 [-0.10, -0.02] 12786.35 -2.87 < .001
sharing type (narrowcast) x self relevance within -0.06 [-0.08, -0.03] 5772.55 -4.17 < .001
sharing type (narrowcast) x social relevance between 0.08 [0.04, 0.12] 12780.84 3.77 < .001
sharing type (narrowcast) x social relevance within 0.12 [0.09, 0.15] 3203.96 8.80 < .001

person-level

In these analyses, select a subset of people that have correlations between self and social relevance < .7.

Because participants tended to only rate a few messages, this approach to downsampling is likely more unstable. Therefore, these analyses are supplementary and not reported in the manuscript.

correlations

descriptives

Describe the correlations between self and social relevance by study and content type.

across content

cors_spread = merged %>%
  ungroup() %>%
  select(study, SID, msg_rel_self, msg_rel_social) %>%
  unique()

cors = cors_spread %>%
  nest(-c(study, SID)) %>%
  mutate(test = map(data, possibly(~ cor.test(.$msg_rel_self, .$msg_rel_social), otherwise = NULL))) %>%
  filter(!test == "NULL") %>%
  mutate(coefs = map(test,
                     broom::tidy,
                     conf.int = TRUE,
                     conf.level = .95)) %>% 
  unnest(coefs, .drop = TRUE) %>%
  mutate_if(is.numeric, round, 2)

cors %>%
  group_by(study) %>%
  summarize(`mean correlation` = mean(estimate, na.rm = TRUE),
            `sd correlation` = sd(estimate, na.rm = TRUE),
            min = min(estimate, na.rm = TRUE),
            max = max(estimate, na.rm = TRUE)) %>%
  mutate(`range correlation` = sprintf("%.2f, %.2f", min, max)) %>%
  select(-min, -max) %>%
  kable(digits = 2) %>%
  kableExtra::kable_styling()
study mean correlation sd correlation range correlation
study 1 0.57 0.47 -0.97, 1.00
study 2 0.50 0.53 -1.00, 1.00
study 3 0.64 0.47 -0.86, 1.00
study 4 0.51 0.36 -0.88, 0.99
study 5 0.49 0.45 -0.94, 1.00
study 6 0.56 0.40 -0.72, 1.00

plot

cors %>%
  arrange(study, SID) %>%
  mutate(item = row_number(),
         V1 = sprintf("self_%s", row_number()),
         V2 = sprintf("social_%s", row_number())) %>%
  ggplot(aes(item, estimate, color = study)) +
  geom_point() +
  geom_hline(yintercept = .7) +
  scale_color_manual(values = palette_study) +
  labs(x = "\nmessage number", y = "correlation between\nself and social relevance\n") +
  plot_aes +
  theme(legend.text = element_text(size = 11))

number of messages per study with < .7 correlation

data_lower_cors = cors %>%
  filter(estimate < .7)

total_n = merged %>%
  ungroup() %>%
  select(study, SID) %>%
  unique() %>%
  group_by(study) %>%
  summarize(`total n` = n())

data_lower_cors %>%
  group_by(study) %>%
  summarize(n = n()) %>%
  left_join(., total_n) %>%
  mutate(percent = (n / `total n`) * 100) %>%
  kable(digits = 2) %>%
  kableExtra::kable_styling()
study n total n percent
study 1 532 2081 25.56
study 2 257 547 46.98
study 3 79 248 31.85
study 4 91 139 65.47
study 5 178 315 56.51
study 6 198 397 49.87

downsampled mega-analysis

Estimate the mega-analysis model in the downsampled dataset.

run model

data_downsample = merged %>%
  filter(SID %in% data_lower_cors$SID)

model = lmerTest::lmer(msg_share_std ~ 0 + msg_rel_self_between*sharing_type +
                                 msg_rel_self_within*sharing_type +
                                 msg_rel_social_between*sharing_type +
                                 msg_rel_social_within*sharing_type +
                                 (1 + msg_rel_self_within + msg_rel_social_within | SID) +
                                 (1 + msg_rel_self_within + msg_rel_social_within | item),
                               data = data_downsample,
                       control = lmerControl(optimizer = "bobyqa"))

car::vif(model)
##                msg_rel_self_between                        sharing_type 
##                            2.153936                            1.023945 
##                 msg_rel_self_within              msg_rel_social_between 
##                            1.129519                            2.153773 
##               msg_rel_social_within   msg_rel_self_between:sharing_type 
##                            1.142870                            3.639040 
##    sharing_type:msg_rel_self_within sharing_type:msg_rel_social_between 
##                            1.271816                            3.673000 
##  sharing_type:msg_rel_social_within 
##                            1.283590

plot

predicted = ggeffects::ggpredict(model, c("msg_rel_self_between [-3:3]", "sharing_type")) %>%
  data.frame() %>%
  mutate(type = "self_between") %>%
  bind_rows(ggeffects::ggpredict(model, c("msg_rel_self_within [-3:3]", "sharing_type")) %>%
              data.frame() %>%
              mutate(type = "self_within")) %>%
  bind_rows(ggeffects::ggpredict(model, c("msg_rel_social_between [-3:3]", "sharing_type")) %>%
              data.frame() %>%
              mutate(type = "social_between")) %>%
  bind_rows(ggeffects::ggpredict(model, c("msg_rel_social_within [-3:3]", "sharing_type")) %>%
              data.frame() %>%
              mutate(type = "social_within"))

points = data_downsample %>%
  select(-group) %>%
  rename("group" = sharing_type,
         "predicted" = msg_share_std) %>%
  select(study, SID, group, predicted, contains("within"), contains("between")) %>%
  gather(type, x, contains("msg")) %>%
  mutate(type = gsub("msg_rel_", "", type),
         group = ifelse(group == 0, "broadcast", "narrowcast")) %>%
  extract(type, c("variable", "type"), "(.*)_(.*)") %>%
  filter(x < 3 & x > -3)

(fig3_alt = predicted %>%
  mutate(group = ifelse(group == 0, "broadcast", "narrowcast")) %>%
  extract(type, c("variable", "type"), "(.*)_(.*)") %>%
  ggplot(aes(x, predicted, color = group, fill = group, linetype = type)) +
  geom_point(data = points, aes(x, predicted), alpha = .02, size = .25) +
  geom_ribbon(aes(ymin = conf.low, ymax = conf.high), alpha = .2, color = NA) +
  geom_line(size = 1) +
  facet_grid(~variable) +
  scale_color_manual(name = "", values = palette_sharing) +
  scale_fill_manual(name = "", values = palette_sharing) +
  scale_linetype_manual(name = "", values = c("solid", "dotted")) +
  guides(linetype = guide_legend(override.aes = list(fill = NA))) +
  labs(x = "\nstandardized relevance rating", y = "predicted standardized sharing intention rating\n") +
  plot_aes  +
  theme(legend.position = "top",
        legend.key.width=unit(2,"cm")))

model summary table

model %>%
  broom.mixed::tidy(conf.int = TRUE) %>%
  filter(effect == "fixed") %>%
  rename("SE" = std.error,
         "t" = statistic,
         "p" = p.value) %>%
  select(-group, -effect) %>%
  mutate_at(vars(-contains("term"), -contains("p.value")), round, 2) %>%
  mutate(term = gsub(":", " x ", term),
         term = gsub("msg_", "", term),
         term = gsub("_", " ", term),
         term = gsub("within", "within", term),
         term = gsub("between", "between", term),
         term = gsub("rel self", "self relevance", term),
         term = gsub("rel social", "social relevance", term),
         term = gsub("sharing type", "sharing type (narrowcast)", term),
         p = ifelse(p < .001, "< .001",
                    ifelse(p == 1, "1.000", gsub("0.(.*)", ".\\1", sprintf("%.3f", p)))),
         `b [95% CI]` = sprintf("%.2f [%0.2f, %.2f]", estimate, conf.low, conf.high)) %>%
  select(term, `b [95% CI]`, df, t, p) %>%
  kable()  %>%
  kableExtra::kable_styling()
term b [95% CI] df t p
self relevance between 0.42 [0.37, 0.46] 1369.13 17.05 < .001
sharing type (narrowcast) -0.02 [-0.04, -0.00] 9751.51 -2.04 .040
self relevance within 0.16 [0.14, 0.18] 323.35 15.97 < .001
social relevance between 0.17 [0.12, 0.22] 1345.78 6.51 < .001
social relevance within 0.11 [0.09, 0.13] 291.11 11.62 < .001
self relevance between x sharing type (narrowcast) -0.12 [-0.16, -0.09] 9640.58 -6.87 < .001
sharing type (narrowcast) x self relevance within -0.08 [-0.10, -0.06] 8596.93 -6.81 < .001
sharing type (narrowcast) x social relevance between 0.11 [0.07, 0.15] 9631.67 5.84 < .001
sharing type (narrowcast) x social relevance within 0.12 [0.09, 0.14] 7891.28 9.69 < .001