4  Computing Raking Weights to the Distribution of a Target Population

4.1 About raking weights

This chapter is a reproducible example on how to incorporate raking weights to match distributions of a target population in multiple imputation > matching/weighting > balance assessment > outcome analysis workflows.

In brief, raking is a procedure to compute weights for multiple variables of interest at the same time to re-weight a population to match pre-specified distributions in complex survey designs. The raking procedure is implemented in the anesrake package. Here, the anesrake function iteratively adjusts the weights to make the weighted sample percentages match the target population percentages for the selected variables. It does this by multiplying the current weight for each case by a factor based on the ratio of the target population proportion to the weighted sample proportion for a given category. This adjustment is performed sequentially for each category of each selected variable. Because adjusting for one variable can disrupt the match for previous variables, the process is repeated through all selected variables in cycles. This iterative process minimizes the Kullback-Leibler (KL) divergence and continues until the weighted sample proportions match the target population proportions for all categories (“full convergence”), or until no further change occurs.

Raking weights could be seen as an alternative to matching-adjusted indirect comparisons (MAIC) which are often used to adjust for differences in baseline characteristics between a trial and a real-world population. However, raking weights are not the same as MAIC, as they do not require a model to estimate the treatment effect in the target population. Instead, raking weights adjust the sample to match the target population without estimating a treatment effect.

4.2 Objective

This chapter aims to introduce the raking_weights() function, which performs the raking procedure in multiply imputed and matched (mimids) datasets. The function is a wrapper for the anesrake() function from the anesrake package and can be used in combination with multiple imputation and propensity score matching/weighting.

library(here)
library(dplyr)
library(survival)
library(mice)
library(MatchThem)
library(MatchIt)
library(survey)
library(gtsummary)
library(encore.analytics)

source(here("functions", "covariate_vectors.R"))

# track time
runtime <- tictoc::tic()

4.3 Data generation

We use the simulate_data() function to simulate a realistic oncology comparative effectiveness cohort analytic dataset.

# load example dataset with missing observations
data_miss <- simulate_data(
  n_total = 3500, 
  seed = 42, 
  include_id = FALSE, 
  imposeNA = TRUE,
  propNA = .33
  )

If it is desired ro rake categorical variables, the function works best of those variables are encoded as factor variables.

In this example, we aim to estimate raking weights for an EHR-derived real-world dataset that aims to mimick the distributions of the FLAURA trial population, which is one of the prioritized clinical trials to be emulated in ENCORE.

4.4 Defining target distributions

Before estimating raking weights, we need to define the target distributions of patient characteristics that we want to match from the clinical trial using the raking procedure. The following distributions are taken from Table 1 of the FLAURA trial.

# Define FLAURA distributions for key covariates --------------------------
# order is as in Table 1

## age (taken from https://www.tagrissohcp.com/metastatic/flaura/efficacy.html)
# less than 65 years (54%, TRUE) to 65+ (46%, FALSE)
age_target <- c(.54, .46)
names(age_target) <- c("<65", "65+")

## sex ---------------------------------------------------------------------

# female (0) to male (1) proportion:
sex_target <- c(.63, .37) 
names(sex_target) <- c("Female", "Male")

## race --------------------------------------------------------------------
# asian, non-asian
# asian (TRUE) to non-asian (FALSE) proportion
# note: logical variables in dataframe can be matched to a numeric vector of length 2 and ordered with the TRUE target as the first element and the FALSE target as the second element.
race_target <- c(.62, .38)
names(race_target) <- c("Asian", "Non-Asian")

## smoking -----------------------------------------------------------------

# current/former smoker (TRUE) to never smoker (FALSE) proportion
# note: logical variables in dataframe can be matched to a numeric vector of length 2 and ordered with the TRUE target as the first element and the FALSE target as the second element.
smoker_target <- c(.35, .65)
names(smoker_target) <- c("Current/former", "Never")

## ecog --------------------------------------------------------------------

# ecog 0 to ecog 1 proportion
ecog_target <- c(.41, .59)
names(ecog_target) <- c("0", "1")

# summarize target distributions in a named list vector --------------
targets <- list(age_target, sex_target, race_target, smoker_target, ecog_target)
names(targets) <- c("dem_age_lt65", "dem_sex_cont", "dem_race", "c_smoking_history", "c_ecog_cont")

# print
targets
$dem_age_lt65
 <65  65+ 
0.54 0.46 

$dem_sex_cont
Female   Male 
  0.63   0.37 

$dem_race
    Asian Non-Asian 
     0.62      0.38 

$c_smoking_history
Current/former          Never 
          0.35           0.65 

$c_ecog_cont
   0    1 
0.41 0.59 

Accordingly, we need to convert the categorical target variables in our simulated dataset into factors. The following code chunk shows how to do this for the data_miss dataset.

data_miss <- data_miss |> 
 # anesrake works best with factor variables
  # create age category with age less than 65
  mutate(dem_age_lt65 = factor(ifelse(dem_age_index_cont < 65, "<65", "65+"))) |> 
  # convert dem_race into a binary Asian vs. non-Asian 
  mutate(dem_race = factor(ifelse(dem_race == "Asian", "Asian", "Non-Asian"))) |>
  # convert dem_sex_cont into a factor 
  mutate(dem_sex_cont = factor(ifelse(dem_sex_cont == "1", "Male", "Female"))) |> 
  # convert dem_sex_cont into a factor 
  mutate(c_smoking_history = factor(ifelse(c_smoking_history == TRUE, "Current/former", "Never"))) |> 
  # convert c_ecog_cont into a factor 
  mutate(across(c(c_ecog_cont), function(x) factor(as.character(x))))

4.5 Multiple imputation

Since we operate on a simulated dataset with missing observations, we first impute the missing data before performing the propensity score matching and raking. We use the mice package for this purpose.

# impute data
data_imp <- futuremice(
  parallelseed = 42,
  n.core = parallel::detectCores()-1,
  data = data_miss,
  method = "rf",
  m = 10,
  print = FALSE
  )

4.6 Propensity score matching/weighting

In the next step, we create mimids and wimids object which contain the imputed and 1:1 propensity score matched/SMR-weighted datasets that will serve as the input for the raking procedure. The propensity score model is specified as follows:

# apply propensity score matching on mids object
ps_form <- as.formula(paste("treat ~", paste(covariates_for_ps, collapse = " + ")))
ps_form
treat ~ dem_age_index_cont + dem_sex_cont + c_smoking_history + 
    c_number_met_sites + c_hemoglobin_g_dl_cont + c_urea_nitrogen_mg_dl_cont + 
    c_platelets_10_9_l_cont + c_calcium_mg_dl_cont + c_glucose_mg_dl_cont + 
    c_lymphocyte_leukocyte_ratio_cont + c_alp_u_l_cont + c_protein_g_l_cont + 
    c_alt_u_l_cont + c_albumin_g_l_cont + c_bilirubin_mg_dl_cont + 
    c_chloride_mmol_l_cont + c_monocytes_10_9_l_cont + c_eosinophils_leukocytes_ratio_cont + 
    c_ldh_u_l_cont + c_hr_cont + c_sbp_cont + c_oxygen_cont + 
    c_ecog_cont + c_neutrophil_lymphocyte_ratio_cont + c_bmi_cont + 
    c_ast_alt_ratio_cont + c_stage_initial_dx_cont + dem_race + 
    dem_region + dem_ses + c_time_dx_to_index

As already covered in the previous chapters, we can use the matchthem() function to perform the matching and weighting.

# matching
mimids_data <- matchthem(
  formula = ps_form,
  datasets = data_imp,
  approach = 'within',
  method = 'nearest',
  distance = "glm",
  link = "logit",
  caliper = 0.01,
  ratio = 1,
  replace = F
  )

# print summary for matched dataset #1
mimids_data
A `matchit` object
 - method: 1:1 nearest neighbor matching without replacement
 - distance: Propensity score [caliper]

             - estimated with logistic regression
 - caliper: <distance> (0.001)
 - number of obs.: 3500 (original), 2728 (matched)
 - target estimand: ATT
 - covariates: dem_age_index_cont, dem_sex_cont, c_smoking_history, c_number_met_sites, c_hemoglobin_g_dl_cont, c_urea_nitrogen_mg_dl_cont, c_platelets_10_9_l_cont, c_calcium_mg_dl_cont, c_glucose_mg_dl_cont, c_lymphocyte_leukocyte_ratio_cont, c_alp_u_l_cont, c_protein_g_l_cont, c_alt_u_l_cont, c_albumin_g_l_cont, c_bilirubin_mg_dl_cont, c_chloride_mmol_l_cont, c_monocytes_10_9_l_cont, c_eosinophils_leukocytes_ratio_cont, c_ldh_u_l_cont, c_hr_cont, c_sbp_cont, c_oxygen_cont, c_ecog_cont, c_neutrophil_lymphocyte_ratio_cont, c_bmi_cont, c_ast_alt_ratio_cont, c_stage_initial_dx_cont, dem_race, dem_region, dem_ses, c_time_dx_to_index
# SMR weighting
wimids_data <- weightthem(
  formula = ps_form,
  datasets = data_imp,
  approach = 'within',
  method = "glm",
  estimand = "ATT"
  )

# trim extreme weights
wimids_data <- trim(
  x = wimids_data, 
  at = .95, 
  lower = TRUE
  )

wimids_data
A weightit object
 - method: "glm" (propensity score weighting with GLM)
 - number of obs.: 3500
 - sampling weights: none
 - treatment: 2-category
 - estimand: ATT (focal: 1)
 - covariates: dem_age_index_cont, dem_sex_cont, c_smoking_history, c_number_met_sites, c_hemoglobin_g_dl_cont, c_urea_nitrogen_mg_dl_cont, c_platelets_10_9_l_cont, c_calcium_mg_dl_cont, c_glucose_mg_dl_cont, c_lymphocyte_leukocyte_ratio_cont, c_alp_u_l_cont, c_protein_g_l_cont, c_alt_u_l_cont, c_albumin_g_l_cont, c_bilirubin_mg_dl_cont, c_chloride_mmol_l_cont, c_monocytes_10_9_l_cont, c_eosinophils_leukocytes_ratio_cont, c_ldh_u_l_cont, c_hr_cont, c_sbp_cont, c_oxygen_cont, c_ecog_cont, c_neutrophil_lymphocyte_ratio_cont, c_bmi_cont, c_ast_alt_ratio_cont, c_stage_initial_dx_cont, dem_race, dem_region, dem_ses, c_time_dx_to_index
 - weights trimmed at 5% and 95%

4.6.1 Raking procedure

The raking_weights() function as implemented in encore.analytics takes the mimids and wimids objects and the target distributions as input and returns a list of imputed, matched/SMR-weighted, and raked datasets. The function uses the anesrake() function from the anesrake package to perform the raking procedure. The only two inputs it needs is the multiply imputed and matched/SMR-weighted datasets that results from the matchthem() function and the target distributions which are defined in a named list. The function will then iterate over the datasets and apply the raking procedure to each dataset. The raking procedure is performed by calling the anesrake() function for each dataset in the mimids and wimids object.

After successful raking, the function returns list of imputed, matched and re-weighted datasets (which we refer to here as mirwds and wirwds) with an (updated) column weights which includes the raking weights.

# raking on the imputed and 1:1 propensity score-matched datasets
mirwds <- raking_weights(
  x = mimids_data, 
  targets = targets
  )
[1] "Raking converged in 9 iterations"
[1] "Raking converged in 11 iterations"
[1] "Raking converged in 10 iterations"
[1] "Raking converged in 10 iterations"
[1] "Raking converged in 11 iterations"
[1] "Raking converged in 11 iterations"
[1] "Raking converged in 11 iterations"
[1] "Raking converged in 12 iterations"
[1] "Raking converged in 12 iterations"
[1] "Raking converged in 10 iterations"
[1] "Raking converged in 10 iterations"
# raking on the imputed and SMR-weighted datasets
wirwds <- raking_weights(
  x = wimids_data, 
  targets = targets
  )
[1] "Raking converged in 12 iterations"
[1] "Raking converged in 11 iterations"
[1] "Raking converged in 12 iterations"
[1] "Raking converged in 12 iterations"
[1] "Raking converged in 15 iterations"
[1] "Raking converged in 15 iterations"
[1] "Raking converged in 13 iterations"
[1] "Raking converged in 14 iterations"
[1] "Raking converged in 12 iterations"
[1] "Raking converged in 13 iterations"

4.7 Comparing the final distributions in Table 1

To assess the balance of the covariates before and after raking, we can use the tbl_summary() and tbl_svysummary functions from the gtsummary package. To illustrate the distributions in the datasets before and after raking, we use the first imputed and matched dataset before and after raking as an example.

Reminder : The target distributions look like this

targets
$dem_age_lt65
 <65  65+ 
0.54 0.46 

$dem_sex_cont
Female   Male 
  0.63   0.37 

$dem_race
    Asian Non-Asian 
     0.62      0.38 

$c_smoking_history
Current/former          Never 
          0.35           0.65 

$c_ecog_cont
   0    1 
0.41 0.59 
# extract the first imputed and matched dataset BEFORE raking
first_dataset <- MatchThem::complete(mimids_data, action = 1, all = FALSE)

# print
first_dataset |>
  tbl_summary(
    by = treat,
    include = c(dem_age_index_cont, names(targets))
    ) |> 
  add_difference(test = dplyr::everything() ~ "smd") |>
  add_overall() |>
  modify_column_hide(columns = "conf.low") |> 
  modify_header(
    label ~ "**Patient characteristic**",
    stat_0 ~ "**Total** <br> N = {round(N, 2)}",
    stat_1 ~ "**{level}** <br> N = {round(n, 2)} <br> ({style_percent(p, digits=1)}%)",
    stat_2 ~ "**{level}** <br> N = {round(n, 2)} <br> ({style_percent(p, digits=1)}%)"
    ) |>
  modify_spanning_header(c("stat_1", "stat_2") ~ "**Treatment received**")
Table 4.1: Table 1 BEFORE raking (1:1 propensity score-matched data)
Patient characteristic Total
N = 27281
Treatment received
Difference2
0
N = 1364
(50.0%)1
1
N = 1364
(50.0%)1
dem_age_index_cont 69 (64, 74) 69 (64, 74) 69 (63, 74) 0.00
dem_age_lt65


0.01
    <65 849 (31%) 428 (31%) 421 (31%)
    65+ 1,879 (69%) 936 (69%) 943 (69%)
dem_sex_cont


0.01
    Female 1,830 (67%) 919 (67%) 911 (67%)
    Male 898 (33%) 445 (33%) 453 (33%)
dem_race


0.02
    Asian 969 (36%) 490 (36%) 479 (35%)
    Non-Asian 1,759 (64%) 874 (64%) 885 (65%)
c_smoking_history


0.01
    Current/former 1,279 (47%) 636 (47%) 643 (47%)
    Never 1,449 (53%) 728 (53%) 721 (53%)
c_ecog_cont


0.02
    0 1,122 (41%) 555 (41%) 567 (42%)
    1 1,606 (59%) 809 (59%) 797 (58%)
1 Median (Q1, Q3); n (%)
2 Standardized Mean Difference
Abbreviation: CI = Confidence Interval
# create survey object 
data_svy <- svydesign(ids = ~ 1, weights = ~ weights, data = mirwds[[1]])

# print
data_svy |>
  tbl_svysummary(
    by = treat,
    include = c(dem_age_index_cont, names(targets))
    ) |> 
  add_difference(test = dplyr::everything() ~ "smd") |>
  add_overall() |>
  modify_column_hide(columns = "conf.low") |> 
  modify_header(
    label ~ "**Patient characteristic**",
    stat_0 ~ "**Total** <br> N = {round(N, 2)}",
    stat_1 ~ "**{level}** <br> N = {round(n, 2)} <br> ({style_percent(p, digits=1)}%)",
    stat_2 ~ "**{level}** <br> N = {round(n, 2)} <br> ({style_percent(p, digits=1)}%)"
    ) |>
  modify_spanning_header(c("stat_1", "stat_2") ~ "**Treatment received**")
Table 4.2: Table 1 AFTER raking (1:1 propensity score-matched data)
Patient characteristic Total
N = 27281
Treatment received
Difference2
0
N = 1381.87
(50.7%)1
1
N = 1346.13
(49.3%)1
dem_age_index_cont 65 (60, 71) 65 (60, 71) 64 (60, 72) -0.02
dem_age_lt65


0.04
    <65 1,473 (54%) 759 (55%) 714 (53%)
    65+ 1,255 (46%) 623 (45%) 632 (47%)
dem_sex_cont


0.02
    Female 1,719 (63%) 865 (63%) 854 (63%)
    Male 1,009 (37%) 517 (37%) 493 (37%)
dem_race


0.02
    Asian 1,691 (62%) 865 (63%) 827 (61%)
    Non-Asian 1,037 (38%) 517 (37%) 520 (39%)
c_smoking_history


0.01
    Current/former 955 (35%) 482 (35%) 473 (35%)
    Never 1,773 (65%) 900 (65%) 873 (65%)
c_ecog_cont


0.02
    0 1,131 (41%) 580 (42%) 551 (41%)
    1 1,597 (59%) 802 (58%) 795 (59%)
1 Median (Q1, Q3); n (%)
2 Standardized Mean Difference
Abbreviation: CI = Confidence Interval
# extract the first imputed and matched dataset BEFORE raking
first_dataset <- MatchThem::complete(wimids_data, action = 1, all = FALSE)

# print
first_dataset |>
  tbl_summary(
    by = treat,
    include = c(dem_age_index_cont, names(targets))
    ) |> 
  add_difference(test = dplyr::everything() ~ "smd") |>
  add_overall() |>
  modify_column_hide(columns = "conf.low") |> 
  modify_header(
    label ~ "**Patient characteristic**",
    stat_0 ~ "**Total** <br> N = {round(N, 2)}",
    stat_1 ~ "**{level}** <br> N = {round(n, 2)} <br> ({style_percent(p, digits=1)}%)",
    stat_2 ~ "**{level}** <br> N = {round(n, 2)} <br> ({style_percent(p, digits=1)}%)"
    ) |>
  modify_spanning_header(c("stat_1", "stat_2") ~ "**Treatment received**")
Table 4.3: Table 1 BEFORE raking (SMR-weighted data)
Patient characteristic Total
N = 35001
Treatment received
Difference2
0
N = 1487
(42.5%)1
1
N = 2013
(57.5%)1
dem_age_index_cont 69 (64, 74) 69 (64, 74) 69 (64, 74) -0.04
dem_age_lt65


0.03
    <65 1,085 (31%) 472 (32%) 613 (30%)
    65+ 2,415 (69%) 1,015 (68%) 1,400 (70%)
dem_sex_cont


0.02
    Female 2,354 (67%) 993 (67%) 1,361 (68%)
    Male 1,146 (33%) 494 (33%) 652 (32%)
dem_race


0.01
    Asian 1,262 (36%) 539 (36%) 723 (36%)
    Non-Asian 2,238 (64%) 948 (64%) 1,290 (64%)
c_smoking_history


0.14
    Current/former 1,558 (45%) 723 (49%) 835 (41%)
    Never 1,942 (55%) 764 (51%) 1,178 (59%)
c_ecog_cont


0.08
    0 1,482 (42%) 595 (40%) 887 (44%)
    1 2,018 (58%) 892 (60%) 1,126 (56%)
1 Median (Q1, Q3); n (%)
2 Standardized Mean Difference
Abbreviation: CI = Confidence Interval
# create survey object 
data_svy <- svydesign(ids = ~ 1, weights = ~ weights, data = wirwds[[1]])

# print
data_svy |>
  tbl_svysummary(
    by = treat,
    include = c(dem_age_index_cont, names(targets))
    ) |> 
  add_difference(test = dplyr::everything() ~ "smd") |>
  add_overall() |>
  modify_column_hide(columns = "conf.low") |> 
  modify_header(
    label ~ "**Patient characteristic**",
    stat_0 ~ "**Total** <br> N = {round(N, 2)}",
    stat_1 ~ "**{level}** <br> N = {round(n, 2)} <br> ({style_percent(p, digits=1)}%)",
    stat_2 ~ "**{level}** <br> N = {round(n, 2)} <br> ({style_percent(p, digits=1)}%)"
    ) |>
  modify_spanning_header(c("stat_1", "stat_2") ~ "**Treatment received**")
Table 4.4: Table 1 AFTER raking (SMR-weighted data)
Patient characteristic Total
N = 35001
Treatment received
Difference2
0
N = 1747.03
(49.9%)1
1
N = 1752.97
(50.1%)1
dem_age_index_cont 65 (60, 72) 65 (61, 71) 64 (60, 72) -0.02
dem_age_lt65


0.03
    <65 1,890 (54%) 954 (55%) 936 (53%)
    65+ 1,610 (46%) 793 (45%) 817 (47%)
dem_sex_cont


0.03
    Female 2,205 (63%) 1,086 (62%) 1,119 (64%)
    Male 1,295 (37%) 661 (38%) 634 (36%)
dem_race


0.00
    Asian 2,170 (62%) 1,084 (62%) 1,086 (62%)
    Non-Asian 1,330 (38%) 664 (38%) 666 (38%)
c_smoking_history


0.02
    Current/former 1,225 (35%) 620 (36%) 605 (34%)
    Never 2,275 (65%) 1,127 (64%) 1,148 (66%)
c_ecog_cont


0.02
    0 1,435 (41%) 726 (42%) 709 (40%)
    1 2,065 (59%) 1,021 (58%) 1,044 (60%)
1 Median (Q1, Q3); n (%)
2 Standardized Mean Difference
Abbreviation: CI = Confidence Interval

4.8 Estimating final treatment effects

In the final step, the cox_pooling() function that comes with encore.analytics is used to fit and pool the results of a Cox proportional hazards model on the imputed, matched, and raked datasets. The function takes list of imputed data frames with weights and cluster (matching) information (= our matched/smr-weighted and raked datasets) and a formula for the Cox proportional hazards model. The data frames must have column names weights and subclass (for matched datasets to indicate the cluster membership).

The cox_pooling() function is a convenience wrapper for fitting Cox models to multiple imputed datasets which do not come as a mimids or wimids object. This is useful when there are intermediate steps in the analysis pipeline, such as computing raking weights via raking_weights() which are so far not straightforward to implement in a mimids or wimids object.

The function follows the following logic:

  1. Fit a Cox proportional hazards model to each imputed dataset. If a column is present, it is used as a cluster variable for matched pairs.
  2. Convert the list of fitted models into a object using .
  3. Pool the results using , which applies Rubin’s rules for combining estimates and variances across imputations.
  4. Format the pooled results, including exponentiating the hazard ratios and calculating confidence intervals.

Our fitted Cox proportional hazards model is specified as follows:

# fit a survival model
cox_fit <- as.formula(survival::Surv(fu_itt_months, death_itt) ~ treat)
cox_fit
survival::Surv(fu_itt_months, death_itt) ~ treat

4.8.1 Estimate treatment effects on matched and raked list of datasets

# fit and pool Cox proportional hazards model results
cox_pooling(mirwds, surv_formula = cox_fit)
   term  estimate  std.error statistic     p.value  conf.low conf.high
1 treat 0.7642522 0.05829845 -4.611742 1.22833e-05 0.6807403 0.8580092
             b       df dfcom      fmi    lambda  m       riv        ubar
1 0.0009202197 96.29668  2696 0.311974 0.2978312 10 0.4241589 0.002386468

4.8.2 Estimate treatment effects on SMR-weighted and raked list of datasets

# fit and pool Cox proportional hazards model results
cox_pooling(wirwds, surv_formula = cox_fit)
   term  estimate  std.error statistic      p.value  conf.low conf.high
1 treat 0.7627418 0.04809302 -5.631498 5.642614e-08 0.6937536 0.8385903
             b       df dfcom       fmi    lambda  m       riv        ubar
1 0.0004167056 211.6559  3459 0.2056499 0.1981791 10 0.2471614 0.001854562

4.9 References

4.10 Session info

Script runtime: 1.20 minutes.

pander::pander(subset(data.frame(sessioninfo::package_info()), attached==TRUE, c(package, loadedversion)))
  package loadedversion
dplyr dplyr 1.1.4
encore.analytics encore.analytics 0.2.1
gtsummary gtsummary 2.5.0
here here 1.0.2
MatchIt MatchIt 4.7.2
MatchThem MatchThem 1.2.1
Matrix Matrix 1.7-3
mice mice 3.19.0
survey survey 4.4-8
survival survival 3.8-3
pander::pander(sessionInfo())

R version 4.5.1 (2025-06-13)

Platform: x86_64-pc-linux-gnu

locale: LC_CTYPE=C.UTF-8, LC_NUMERIC=C, LC_TIME=C.UTF-8, LC_COLLATE=C.UTF-8, LC_MONETARY=C.UTF-8, LC_MESSAGES=C.UTF-8, LC_PAPER=C.UTF-8, LC_NAME=C, LC_ADDRESS=C, LC_TELEPHONE=C, LC_MEASUREMENT=C.UTF-8 and LC_IDENTIFICATION=C

attached base packages: grid, stats, graphics, grDevices, datasets, utils, methods and base

other attached packages: encore.analytics(v.0.2.1), gtsummary(v.2.5.0), survey(v.4.4-8), Matrix(v.1.7-3), MatchIt(v.4.7.2), MatchThem(v.1.2.1), mice(v.3.19.0), survival(v.3.8-3), dplyr(v.1.1.4) and here(v.1.0.2)

loaded via a namespace (and not attached): Rdpack(v.2.6.4), DBI(v.1.2.3), gridExtra(v.2.3), sandwich(v.3.1-1), rlang(v.1.1.6), magrittr(v.2.0.4), furrr(v.0.3.1), compiler(v.4.5.1), gdata(v.3.0.1), vctrs(v.0.6.5), stringr(v.1.6.0), pkgconfig(v.2.0.3), shape(v.1.4.6.1), crayon(v.1.5.3), fastmap(v.1.2.0), backports(v.1.5.0), pander(v.0.6.6), rmarkdown(v.2.30), sessioninfo(v.1.2.3), markdown(v.2.0), nloptr(v.2.2.1), purrr(v.1.2.0), xfun(v.0.55), glmnet(v.4.1-10), jomo(v.2.7-6), litedown(v.0.9), anesrake(v.0.80), jsonlite(v.2.0.0), tictoc(v.1.2.1), chk(v.0.10.0), pan(v.1.9), broom(v.1.0.11), parallel(v.4.5.1), cluster(v.2.1.8.1), R6(v.2.6.1), simsurv(v.1.0.0), stringi(v.1.8.7), RColorBrewer(v.1.1-3), parallelly(v.1.46.0), boot(v.1.3-31), rpart(v.4.1.24), Rcpp(v.1.1.0), assertthat(v.0.2.1), iterators(v.1.0.14), knitr(v.1.51), zoo(v.1.8-15), base64enc(v.0.1-3), weights(v.1.1.2), splines(v.4.5.1), nnet(v.7.3-20), tidyselect(v.1.2.1), rstudioapi(v.0.17.1), yaml(v.2.3.12), codetools(v.0.2-20), listenv(v.0.10.0), lattice(v.0.22-7), tibble(v.3.3.0), withr(v.3.0.2), S7(v.0.2.1), evaluate(v.1.0.5), foreign(v.0.8-90), future(v.1.68.0), xml2(v.1.5.1), pillar(v.1.11.1), WeightIt(v.1.5.1), checkmate(v.2.3.3), renv(v.1.1.5), foreach(v.1.5.2), reformulas(v.0.4.3), generics(v.0.1.4), rprojroot(v.2.1.1), ggplot2(v.4.0.1), commonmark(v.2.0.0), scales(v.1.4.0), minqa(v.1.2.8), globals(v.0.18.0), gtools(v.3.9.5), glue(v.1.8.0), Hmisc(v.5.2-4), tools(v.4.5.1), data.table(v.1.17.8), lme4(v.1.1-38), locfit(v.1.5-9.12), fs(v.1.6.6), tidyr(v.1.3.2), mitools(v.2.4), rbibutils(v.2.4), cards(v.0.7.1), colorspace(v.2.1-2), nlme(v.3.1-168), cardx(v.0.3.1), htmlTable(v.2.4.3), Formula(v.1.2-5), cli(v.3.6.5), smd(v.0.8.0), gt(v.1.2.0), gtable(v.0.3.6), sass(v.0.4.10), digest(v.0.6.39), htmlwidgets(v.1.6.4), farver(v.2.1.2), htmltools(v.0.5.9), lifecycle(v.1.0.4), mitml(v.0.4-5) and MASS(v.7.3-65)

pander::pander(options('repos'))
  • repos:

    Table continues below
    CRAN
    https://cran.rstudio.com
    PositPackageManager
    https://packagemanager.posit.co/cran/linux/noble/latest