These functions can be used to produce tables from LS means, e.g. from fit_mmrm_j()
or fit_ancova().
Arguments
- x
(
numeric)
vector of numbers we want to analyze.- ...
additional arguments for the lower level functions.
- df
(
data.frame)
data set containing all analysis variables.- .in_ref_col
(
logical)TRUEwhen working with the reference level,FALSEotherwise.- alternative
(
string)
whethertwo.sided, or one-sidedlessorgreaterp-value should be displayed.- show_relative
should the 'reduction' (
control - treatment, default) or the 'increase' (treatment - control) be shown for the relative change from baseline?- ref_path
(
character)
global reference group specification, seeget_ref_info().- .spl_context
(
data.frame)
gives information about ancestor split states that is passed byrtables.- .stats
(
character)
statistics to select for the table.- .formats
(named
characterorlist)
formats for the statistics. See Details inanalyze_varsfor more information on the'auto'setting.- .labels
(named
character)
labels for the statistics (without indent).- .indent_mods
(named
integer)
indent modifiers for the labels. Defaults to 0, which corresponds to the unmodified default behavior. Can be negative.
Value
for s_lsmeans, a list containing the same statistics returned by tern.mmrm::s_mmrm_lsmeans,
with the additional diff_mean_est_ci three-dimensional statistic. For a_lsmeans,
a VertalRowsSection as returned by rtables::in_rows.
Functions
tidy(tern_model): Helper method (forbroom::tidy()) to prepare adata.framefrom antern_modelobject containing the least-squares means and contrasts.s_lsmeans(): Statistics function which is extracting estimates from a tidied least-squares means data frame.a_lsmeans(): Formatted Analysis function to be used asafun
Note
These functions have been forked from the tern.mmrm package. Additional features
are:
Additional
ref_pathargument for tern.mmrm::summarize_lsmeans().The function is more general in that it also works for LS means results from ANCOVA
Additional statistic
diff_mean_est_ciis returnedP-value sidedness can be chosen
Examples
result <- fit_mmrm_j(
vars = list(
response = "FEV1",
covariates = c("RACE", "SEX"),
id = "USUBJID",
arm = "ARMCD",
visit = "AVISIT"
),
data = mmrm::fev_data,
cor_struct = "unstructured",
weights_emmeans = "equal"
)
df <- broom::tidy(result)
s_lsmeans(df[8, ], .in_ref_col = FALSE)
#> $n
#> [1] 67
#>
#> $adj_mean_se
#> [1] 52.78422 1.18776
#>
#> $adj_mean_ci
#> [1] 50.43481 55.13362
#> attr(,"label")
#> [1] "Adjusted Mean 95% CI"
#>
#> $adj_mean_est_ci
#> [1] 52.78422 50.43481 55.13362
#> attr(,"label")
#> [1] "Adjusted Mean (95% CI)"
#>
#> $diff_mean_se
#> [1] 4.398457 1.680545
#>
#> $diff_mean_ci
#> [1] 1.074493 7.722422
#> attr(,"label")
#> [1] "Difference in Adjusted Means 95% CI"
#>
#> $diff_mean_est_ci
#> [1] 4.398457 1.074493 7.722422
#> attr(,"label")
#> [1] "Difference in Adjusted Means (95% CI)"
#>
#> $change
#> [1] -0.09090396
#> attr(,"label")
#> [1] "Relative Reduction (%)"
#>
#> $p_value
#> [1] 0.009886854
#> attr(,"label")
#> [1] "2-sided p-value"
#>
s_lsmeans(df[8, ], .in_ref_col = FALSE, alternative = "greater", show_relative = "increase")
#> $n
#> [1] 67
#>
#> $adj_mean_se
#> [1] 52.78422 1.18776
#>
#> $adj_mean_ci
#> [1] 50.43481 55.13362
#> attr(,"label")
#> [1] "Adjusted Mean 95% CI"
#>
#> $adj_mean_est_ci
#> [1] 52.78422 50.43481 55.13362
#> attr(,"label")
#> [1] "Adjusted Mean (95% CI)"
#>
#> $diff_mean_se
#> [1] 4.398457 1.680545
#>
#> $diff_mean_ci
#> [1] 1.074493 7.722422
#> attr(,"label")
#> [1] "Difference in Adjusted Means 95% CI"
#>
#> $diff_mean_est_ci
#> [1] 4.398457 1.074493 7.722422
#> attr(,"label")
#> [1] "Difference in Adjusted Means (95% CI)"
#>
#> $change
#> [1] 0.09090396
#> attr(,"label")
#> [1] "Relative Increase (%)"
#>
#> $p_value
#> [1] 0.004943427
#> attr(,"label")
#> [1] "1-sided p-value (greater)"
#>
dat_adsl <- mmrm::fev_data |>
dplyr::select(USUBJID, ARMCD) |>
unique()
basic_table() |>
split_cols_by("ARMCD") |>
add_colcounts() |>
split_rows_by("AVISIT") |>
analyze(
"AVISIT",
afun = a_lsmeans,
show_labels = "hidden",
na_str = tern::default_na_str(),
extra_args = list(
.stats = c(
"n",
"adj_mean_se",
"adj_mean_ci",
"diff_mean_se",
"diff_mean_ci"
),
.labels = c(
adj_mean_se = "Adj. LS Mean (Std. Error)",
adj_mean_ci = "95% CI",
diff_mean_ci = "95% CI"
),
.formats = c(adj_mean_se = jjcsformat_xx("xx.x (xx.xx)")),
alternative = "greater",
ref_path = c("ARMCD", result$ref_level)
)
) |>
build_table(
df = broom::tidy(result),
alt_counts_df = dat_adsl
)
#> PBO TRT
#> (N=105) (N=95)
#> —————————————————————————————————————————————————————————————————————————
#> VIS1
#> n 68 66
#> Adj. LS Mean (Std. Error) 33.3 (0.76) 37.1 (0.76)
#> 95% CI (31.839, 34.825) (35.599, 38.613)
#> Difference in Adjusted Means (SE) 3.774 (1.074)
#> 95% CI (1.651, 5.897)
#> VIS2
#> n 69 71
#> Adj. LS Mean (Std. Error) 38.2 (0.61) 41.9 (0.60)
#> 95% CI (36.963, 39.380) (40.713, 43.094)
#> Difference in Adjusted Means (SE) 3.732 (0.859)
#> 95% CI (2.035, 5.430)
#> VIS3
#> n 71 58
#> Adj. LS Mean (Std. Error) 43.7 (0.46) 46.8 (0.51)
#> 95% CI (42.760, 44.588) (45.748, 47.761)
#> Difference in Adjusted Means (SE) 3.081 (0.690)
#> 95% CI (1.716, 4.445)
#> VIS4
#> n 67 67
#> Adj. LS Mean (Std. Error) 48.4 (1.19) 52.8 (1.19)
#> 95% CI (46.035, 50.737) (50.435, 55.134)
#> Difference in Adjusted Means (SE) 4.398 (1.681)
#> 95% CI (1.074, 7.722)
