Skip to content

QC of implementation in new API #41

Description

@mattsecrest

Equation-to-code QC checklist

EC-IPW (.ec_ipw_borrow_core() in R/ec_ipw.R)

Reference: Zhou et al. (2024b), JRSS-A

  • Eq 4 — density ratio W00 = pi_S(X)(1-pi_S) / (1-pi_S(X))pi_S: rx <- (pi_SX / (1 - pi_SX)) * ((1 - pi_S) / pi_S)
  • Def 1, Eq 6mu_hat_11: mu1 <- colSums(potential[S==1 & A==1,]) / sum(S*A/w11)
  • Def 1, Eq 6mu_hat_10: mu10 <- colSums(potential[S==1 & A==0,]) / sum(S*(1-A)/w10)
  • Def 1, Eq 6mu_hat_00: mu00 <- colSums(potential[S==0,]) / sum((1-S)*w00)
  • Eq 11 — optimal weight: w_opt <- num / (num + denom)
  • Def 1 — ATE: tau <- mu1 - ((1-borrow_weight)*mu10 + borrow_weight*mu00)

Sandwich variance (.ec_ipw_sandwich())

  • Theorem 3, Eq 12 — bread matrix blocks A11, A22, A33, A34, A44
  • Theorem 3, Eq 12 — influence functions Psi_1 through Psi_4
  • Eq 13 — sandwich: A_inv %*% B %*% t(A_inv)

EC-AIPW (.ec_aipw_core() in R/ec_aipw.R)

Reference: Zhou et al. (2024b), JRSS-A

  • Theorem 2 — outcome model on controls: lm(..., data=df[A==0,])
  • Theorem 2 — residuals Y-tilde = Y - mu(X): Yr <- Y - Y0
  • Def 2, Eq 7mu_hat_11 through mu_hat_00 (same as IPW but on residuals)
  • Eq 11 — optimal weight (same formula as IPW)
  • Def 2 — ATE on residuals

Sandwich variance (.ec_aipw_sandwich())

  • Theorem 4, Eq 15 — bread: extends IPW with outcome model Jacobian blocks (Phi1_gamma, Phi2_gamma, Phi3_gamma)
  • Theorem 4, Eq 15 — bread: outcome model Hessian (Y0_gamma)
  • Theorem 4, Eq 15 — meat: adds Psi_5 for outcome model params
  • Eq 16 — sandwich with augmented blocks

DID-EC-IPW (.did_ec_ipw_core() in R/did_ec_ipw.R)

Reference: Zhou et al. (2024a), J Biopharm Stats

  • Eq 4 — PS model pi_S(X) and treatment model pi_A(X)
  • Eq 4 — weights W11 = 1/pi_A, W10 = 1/(1-pi_A), W0 = density ratio
  • Eq 4Delta_trial: treated OLE weighted mean minus RCT control pre-crossover mean
  • Eq 4Delta_EC: EC OLE weighted mean minus EC pre-crossover mean
  • Eq 4tau = Delta_trial - Delta_EC: mu_S1A1 - mu_S0A0 - bias

DID-EC-AIPW (.did_ec_aipw_core() in R/did_ec_aipw.R)

Reference: Zhou et al. (2024a), J Biopharm Stats

  • Eq 5 — outcome model on external controls: lm(..., data=df[S==0,])
  • Eq 5 — residuals Y-tilde = Y - mu(X,S=0,A=0,t): Yr <- Y - Y0
  • Eq 5 — same DID structure as IPW applied to residuals
  • Eq 5tau = Delta_trial - Delta_EC on residuals

DID-EC-OR (.did_ec_or_core() in R/did_ec_or.R)

Reference: Zhou et al. (2024a), J Biopharm Stats

  • Eq 3 — EC outcome models: lm(outcome_formula_ext[t], data=df[S==0,])
  • Eq 3 — RCT control models (pre-crossover): lm(outcome_formula_rct_ctrl[t], data=df[S==1 & A==0,])
  • Eq 3 — RCT treated models (OLE): lm(outcome_formula_rct_trt[t], data=df[S==1 & A==1,])
  • Eq 3Delta_trial = avg_S1[OLE] - mean(avg_S1[pre])
  • Eq 3Delta_EC = avg_S0A0[OLE] - mean(avg_S0A0[pre])
  • Eq 3tau = Delta_trial - Delta_EC

SCM (.scm_subject_sc() + .scm_lambdacv() in R/scm.R)

Reference: Zhou et al. (2024a), J Biopharm Stats

  • Eq 7 — penalized SC optimization: loss + lambda * penalty with sum(w)==1, w>=0
  • Eq 7z_i = stacked covariates + pre-crossover outcomes (matching variables)
  • Eq 8 — synthetic control prediction: X00[long_term,] %*% wt_est
  • Eq 9 — ATE: Y_trt - colMeans(y_est_mat)
  • Remark 4 — LOOCV lambda selection in .scm_lambdacv()

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions