Skip to content

QC of implementation in new API #41

@mattsecrest

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()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions