View source: R/power_marginaleffect.R
| power_marginaleffect | R Documentation | 
The functions implements the algorithm for power estimation described in Powering RCTs for marginal effects with GLMs using prognostic score adjustment by Højbjerre-Frandsen et. al (2025). See a bit more context in details and all details in reference.
power_marginaleffect(
  response,
  predictions,
  target_effect,
  exposure_prob,
  var1 = NULL,
  kappa1_squared = NULL,
  estimand_fun = "ate",
  estimand_fun_deriv0 = NULL,
  estimand_fun_deriv1 = NULL,
  inv_estimand_fun = NULL,
  margin = estimand_fun(1, 1),
  alpha = 0.025,
  tolerance = 0.001,
  verbose = options::opt("verbose"),
  ...
)
| response | the response variable from comparator participants | 
| predictions | predictions of the response | 
| target_effect | a  | 
| exposure_prob | a  | 
| var1 | a  | 
| kappa1_squared | a  | 
| estimand_fun | a  | 
| estimand_fun_deriv0 | a  | 
| estimand_fun_deriv1 | a  | 
| inv_estimand_fun | (optional) a  | 
| margin | a  | 
| alpha | a  | 
| tolerance | passed to all.equal when comparing calculated  | 
| verbose | 
 | 
| ... | arguments passed to  | 
The reference in the description shows in its "Prospective power" section a derivation of a variance bound
v_\infty^{\uparrow 2} = r_0'^{\, 2}\sigma_0^2+
r_1'^{\, 2}\sigma_1^2+
\pi_0\pi_1\left(\frac{|r_0'|\kappa_0}{\pi_0} +
\frac{|r_1'|\kappa_1}{\pi_1} \right)^2
where r_a' is the derivative of the estimand_fun with respect to
\Psi_a, \sigma_a^2 is the variance of the potential outcome corresponding to
group a, \pi_a is the probability of being assigned to group a,
and \kappa_a is the expected mean-squared error when predicting the
potential outcome corresponding to group a.
The variance bound is then used for calculating a lower bound of the power using
the distributions corresponding to the null and alternative hypotheses
\mathcal{H}_0: \hat{\Psi} \sim F_0 = \mathcal{N}(\Delta ,v_\infty^{\uparrow 2} / n)
and
\mathcal{H}_1: \hat{\Psi} \sim F_1 = \mathcal{N}(\Psi,v_\infty^{\uparrow 2} / n).
See more details in the reference.
response: Used to obtain both \sigma_0^2 (by taking the sample
variance of the response) and \kappa_0.
predictions: Used when calculating the MSE \kappa_0.
var1: \sigma_1^2. As a default, chosen to be the same as
\sigma_0^2. Can specify differently through this argument fx. by
 Inflating or deflating the value of \sigma_0^2 by a scalar according
to prior beliefs. Fx. specify var1 = function(x) 1.2 * x to inflate
\sigma_0^2 by 1.2.
If historical data is available for group 1, an estimate of the variance from that data can be provided here.
kappa1_squared: \kappa_1. Same as for var1, default is to assume
the same value as kappa0_squared, which is found by using the response
and predictions vectors. Adjust the value according to prior beliefs if
relevant.
target_effect: \Psi.
exposure_prob: \pi_1
a numeric with the estimated power.
See power_linear for power approximation functionalities for linear models.
# Generate a data set to use as an example
n <- 100
exposure_prob <- .5
dat_gaus <- glm_data(Y ~ 1+2*X1-X2+3*A+1.6*A*X2,
                X1 = rnorm(n),
                X2 = rgamma(n, shape = 2),
                A = rbinom(n, size = 1, prob = exposure_prob),
                family = gaussian())
# ---------------------------------------------------------------------------
# Obtain out-of-sample (OOS) prediction using glm model
# ---------------------------------------------------------------------------
gaus1 <- dat_gaus[1:(n/2), ]
gaus2 <- dat_gaus[(n/2+1):n, ]
glm1 <- glm(Y ~ X1 + X2 + A, data = gaus1)
glm2 <- glm(Y ~ X1 + X2 + A, data = gaus2)
preds_glm1 <- predict(glm2, newdata = gaus1, type = "response")
preds_glm2 <- predict(glm1, newdata = gaus2, type = "response")
preds_glm <- c(preds_glm1, preds_glm2)
# Obtain power
power_marginaleffect(
  response = dat_gaus$Y,
  predictions = preds_glm,
  target_effect = 2,
  exposure_prob = exposure_prob
)
# ---------------------------------------------------------------------------
# Get OOS predictions using discrete super learner and adjust variance
# ---------------------------------------------------------------------------
learners <- list(
  mars = list(
    model = parsnip::set_engine(
      parsnip::mars(
        mode = "regression", prod_degree = 3
      ),
      "earth"
    )
 ),
    lm = list(
      model = parsnip::set_engine(
        parsnip::linear_reg(),
        "lm"
      )
    )
)
lrnr1 <- fit_best_learner(preproc = list(mod = Y ~ X1 + X2 + A),
                          data = gaus1,
                          learners = learners)
lrnr2 <- fit_best_learner(preproc = list(mod = Y ~ X1 + X2 + A),
                          data = gaus2,
                          learners = learners)
preds_lrnr1 <- dplyr::pull(predict(lrnr2, new_data = gaus1))
preds_lrnr2 <- dplyr::pull(predict(lrnr1, new_data = gaus2))
preds_lrnr <- c(preds_lrnr1, preds_lrnr2)
# Estimate the power AND adjust the assumed variance in the "unknown"
# group 1 to be 20% larger than in group 0
power_marginaleffect(
  response = dat_gaus$Y,
  predictions = preds_lrnr,
  target_effect = 2,
  exposure_prob = exposure_prob,
  var1 = function(var0) 1.2 * var0
)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.