Init

library(kirkegaard)
## Loading required package: tidyverse
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
## Loading required package: magrittr
## 
## 
## Attaching package: 'magrittr'
## 
## 
## The following object is masked from 'package:purrr':
## 
##     set_names
## 
## 
## The following object is masked from 'package:tidyr':
## 
##     extract
## 
## 
## Loading required package: weights
## 
## Loading required package: Hmisc
## 
## 
## Attaching package: 'Hmisc'
## 
## 
## The following objects are masked from 'package:dplyr':
## 
##     src, summarize
## 
## 
## The following objects are masked from 'package:base':
## 
##     format.pval, units
## 
## 
## Loading required package: assertthat
## 
## 
## Attaching package: 'assertthat'
## 
## 
## The following object is masked from 'package:tibble':
## 
##     has_name
## 
## 
## Loading required package: psych
## 
## 
## Attaching package: 'psych'
## 
## 
## The following object is masked from 'package:Hmisc':
## 
##     describe
## 
## 
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
## 
## 
## 
## Attaching package: 'kirkegaard'
## 
## 
## The following object is masked from 'package:psych':
## 
##     rescale
## 
## 
## The following object is masked from 'package:assertthat':
## 
##     are_equal
## 
## 
## The following object is masked from 'package:purrr':
## 
##     is_logical
## 
## 
## The following object is masked from 'package:base':
## 
##     +
load_packages(
  haven
)

theme_set(theme_bw())

options(
    digits = 3
)

Data

https://www.thearda.com/data-archive?fid=PRRI1216

d = read_spss("data/PRRI December 2016 Survey.SAV")
vars = d %>% df_var_table()

Recode

d$blocked = d$Q2 %>% 
  case_match(
    1 ~ T,
    2 ~ F,
    .default = NA
  )

d$ideology = d$IDEO %>% 
  as_factor() %>% 
  case_when(
    . %in% c("Don't know", "Refused") ~ NA,
    .default = .
  ) %>% fct_drop() %>% 
  fct_relevel("Moderate")

d$highest_edu = d$EDUC %>% as_factor() %>% 
  case_when(
    . %in% c("Refused") ~ NA,
    .default = .
  ) %>% fct_drop() %>% 
  fct_relevel("Some college")

d$age = d$AGE %>% 
  as.numeric() %>% 
  case_when(
    . %in% c("99") ~ NA,
    .default = .
  )

d$sex = d$SEX %>% as_factor()

d$religion = d$RELIG %>% 
  as_factor() %>% 
  case_when(
    . %in% c("Don't know", "Refused") ~ NA,
    . %in% c("Nothing in particular",  "Atheist", "Agnostic") ~ "Non-religious",
    .default = .
  ) %>% 
  fct_lump_min(min = 20) %>% 
  fct_drop() %>% 
  fct_relevel("Catholic, Roman Catholic")

d$race = d$RACE %>% 
  as_factor() %>% 
  case_when(
    . %in% c("Don't know", "Refused") ~ NA,
    .default = .
  ) %>% fct_drop() %>% 
  fct_lump_min(min = 20)

d$region = d$DIVISION %>% 
  as_factor() %>% 
  case_when(
    . %in% c("Don't know", "Refused") ~ NA,
    .default = .
  ) %>% fct_drop()

Analysis

#main model
full_fit = compare_predictors(
  d %>% df_standardize(),
  outcome = "blocked",
  predictors = c("sex", "ideology", "highest_edu", "religion", "age", "region", "race"),
  family = "binomial"
) %>% mutate(
  term = term %>% factor(levels = unique(term) %>% rev())
)
## Skipped STATE because it is a character (string)
## Skipped RELIGOPEN because it is a character (string)
## Skipped DENOMOPEN because it is a character (string)
## Skipped Q5_1 because it is ranged from 0 to 1 (a proportion, maybe)
## Skipped Q5_2 because it is ranged from 0 to 1 (a proportion, maybe)
## Skipped Q5_3 because it is ranged from 0 to 1 (a proportion, maybe)
## Skipped Q5_4 because it is ranged from 0 to 1 (a proportion, maybe)
## Skipped Q5_5 because it is ranged from 0 to 1 (a proportion, maybe)
## Skipped Q5_6 because it is ranged from 0 to 1 (a proportion, maybe)
## Skipped Q5_7 because it is ranged from 0 to 1 (a proportion, maybe)
## Skipped Q5_8 because it is ranged from 0 to 1 (a proportion, maybe)
## Skipped blocked because it is a logical (boolean)
## Skipped ideology because it is class factor
## Skipped highest_edu because it is class factor
## Skipped sex because it is class factor
## Skipped religion because it is class factor
## Skipped race because it is class factor
## Skipped region because it is class factor
full_fit %>% 
  kirkegaard::GG_plot_models() +
  labs(
    title = "After the election, did you block, unfriend, or stop following someone on a social networking site
    because of what they posted about politics?",
    subtitle = "PRRI, December 2016 Survey, n = 1004, USA"
  )

Meta

#versions
write_sessioninfo()
## R version 4.4.2 (2024-10-31)
## Platform: x86_64-pc-linux-gnu
## Running under: Linux Mint 21.1
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.10.0 
## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.10.0
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
##  [5] LC_MONETARY=en_DK.UTF-8    LC_MESSAGES=en_US.UTF-8   
##  [7] LC_PAPER=en_DK.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=en_DK.UTF-8 LC_IDENTIFICATION=C       
## 
## time zone: Europe/Brussels
## tzcode source: system (glibc)
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] haven_2.5.4           kirkegaard_2024-11-25 psych_2.4.6.26       
##  [4] assertthat_0.2.1      weights_1.0.4         Hmisc_5.1-3          
##  [7] magrittr_2.0.3        lubridate_1.9.3       forcats_1.0.0        
## [10] stringr_1.5.1         dplyr_1.1.4           purrr_1.0.2          
## [13] readr_2.1.5           tidyr_1.3.1           tibble_3.2.1         
## [16] ggplot2_3.5.1         tidyverse_2.0.0      
## 
## loaded via a namespace (and not attached):
##  [1] tidyselect_1.2.1  farver_2.1.2      fastmap_1.2.0     digest_0.6.37    
##  [5] rpart_4.1.23      timechange_0.3.0  lifecycle_1.0.4   cluster_2.1.8    
##  [9] survival_3.7-0    gdata_3.0.0       compiler_4.4.2    rlang_1.1.4      
## [13] sass_0.4.9        tools_4.4.2       utf8_1.2.4        yaml_2.3.10      
## [17] data.table_1.16.0 knitr_1.48        labeling_0.4.3    htmlwidgets_1.6.4
## [21] mnormt_2.1.1      withr_3.0.1       foreign_0.8-87    nnet_7.3-19      
## [25] grid_4.4.2        fansi_1.0.6       jomo_2.7-6        colorspace_2.1-1 
## [29] mice_3.16.0       scales_1.3.0      gtools_3.9.5      iterators_1.0.14 
## [33] MASS_7.3-61       cli_3.6.3         rmarkdown_2.28    generics_0.1.3   
## [37] rstudioapi_0.16.0 tzdb_0.4.0        minqa_1.2.8       cachem_1.1.0     
## [41] splines_4.4.2     parallel_4.4.2    base64enc_0.1-3   vctrs_0.6.5      
## [45] boot_1.3-31       glmnet_4.1-8      Matrix_1.7-1      jsonlite_1.8.8   
## [49] hms_1.1.3         mitml_0.4-5       Formula_1.2-5     htmlTable_2.4.3  
## [53] foreach_1.5.2     jquerylib_0.1.4   glue_1.7.0        nloptr_2.1.1     
## [57] pan_1.9           codetools_0.2-19  stringi_1.8.4     gtable_0.3.5     
## [61] shape_1.4.6.1     lme4_1.1-35.5     munsell_0.5.1     pillar_1.9.0     
## [65] htmltools_0.5.8.1 R6_2.5.1          evaluate_0.24.0   lattice_0.22-5   
## [69] highr_0.11        backports_1.5.0   broom_1.0.6       bslib_0.8.0      
## [73] Rcpp_1.0.13       gridExtra_2.3     nlme_3.1-166      checkmate_2.3.2  
## [77] xfun_0.47         pkgconfig_2.0.3