성향 점수 추정 및 가중치 적용 방법

choyunjeong·2025년 1월 11일

1. Fit multinomial logistic regression

library(VGAM)

# fit multinomial logistic regression
resVglm <- vglm(formula = formula,
                 data    = data,
                 family  = multinomial(parallel = FALSE))
  
# Calculate PS
psData <- as.data.frame(predict(resVglm, type = "response"))
names(psData) <- paste0("PS_", names(psData))
data = cbind(data, psData)

2. Weight methods

- PS for assigned treatment among counterfactual treatment\text{PS for assigned treatment among counterfactual treatment}

# Treatment indicator data frame (any number of groups allowed)
dfAssign <- as.data.frame(lapply(c(0,1,2), function(tx_k) {
	       as.numeric(data['Tr'] == tx_k)
}))

# Name of PS Treatment indicator
colnames(dfAssign) <- paste0('Tr', c(0,1,2))

# Name of PS variables
psVars <- paste0('PS_', c(0,1,2))

# PS for assigned treatment
data$PSassign <- rowSums(data[psVars] * dfAssign)

\\[20pt]

- Calculate IPTW\text{Calculate IPTW}

data$iptw <- exp(- log(data$PSassign))

\\[10pt]

IPTW=1ej(x)\text{IPTW} = \dfrac{1}{e_j(x)}

\\[20pt]

- Calculate stabilized IPTW\text{Calculate stabilized IPTW}

# Calculate marginal prevalence of assigned treatment
txProp <- prop.table(table(data[,'Tr']))

# marginal prevalence for assigned treatment
txPropAssign <- as.numeric(as.matrix(dfAssign) %*% txProp)

# Calculate stabilized iptw
data$st_iptw <- exp(log(txPropAssign) - log(data$PSassign))

\\[10pt]

stabilized IPTW=P(Z=j)ej(x)\text{stabilized IPTW} = \dfrac{P(Z=j)}{e_j(x)}

\\[20pt]

- Calculate matching weight\text{Calculate matching weight}

# Pick numerator for MW (smallest of all PS)
data$PSmin <- do.call(pmin, data[psVars])

# Calculate matching weight
data$mw <- exp(log(data$PSmin) - log(data$PSassign))

\\[10pt]

matching weight=min1kJ{ek(x)}ej(x)\text{matching weight} = \dfrac{\text{min}_{1\le k\le J}\{e_k(x)\} }{e_j(x)}

\\[20pt]

- Generate adjusted datasets\text{Generate adjusted datasets}

library(survey)
data      = data
iptwData  = svydesign(ids = ~ ID, weights = ~ st_iptw, data = data)
mwData    = svydesign(ids = ~ ID, weights = ~ mw,      data = data)

참고

  • Yoshida K, Hernández-Díaz S, Solomon DH, et al. Matching weights to simultaneously compare three treatment groups: comparison to three-way matching. Epidemiology. 2017;28(3):387-395. https://github.com/kaz-yos/mw

0개의 댓글