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)
-
# 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)
-
data$iptw <- exp(- log(data$PSassign))
-
# 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))
-
# 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))
-
library(survey)
data = data
iptwData = svydesign(ids = ~ ID, weights = ~ st_iptw, data = data)
mwData = svydesign(ids = ~ ID, weights = ~ mw, data = data)
참고