data(nuclear, package='boot')
##-- A re-ordering of row names helps to illustrate
##-- the complications that makedist() wards off.
row.names(nuclear)[nuclear$pr==1 & nuclear$pt==0] <- LETTERS[1:7]
row.names(nuclear)[nuclear$pr!=1 & nuclear$pt==0] <- LETTERS[8:26]
row.names(nuclear)[nuclear$pr==1 & nuclear$pt==1] <- letters[1:3]
row.names(nuclear)[nuclear$pr!=1 & nuclear$pt==1] <- letters[4:6]
##-- A distance function used in P. Rosenbaum's (2002) book
rankdiffs <- function(trtvar, dat, vars)
{
dmt <- matrix(0,sum(trtvar), sum(!trtvar))
for (vv in vars) {
vvr <- rank(dat[names(trtvar),vv])
dmt <- dmt + abs(outer(vvr[trtvar], vvr[!trtvar],"-"))
}
round(dmt)
}
##-- Gives a warning because this fn doesn't assign dimnames
(rdd1 <- makedist(pr~1, nuclear[nuclear$pt==0,], rankdiffs, c("cap","date")))
fullmatch(rdd1)
##-- fullmatch() knows its value should be ordered as the nuclear data set is
rdd1$m
##-- now fullmatch() doesn't know the proper order of units and has to guess
fullmatch(rdd1$m)
(rdd2 <- makedist(pr~pt, nuclear, rankdiffs, c("cap","date")))
fullmatch(rdd2)
##- Distance on a propensity score
scalardiffs <- function(trtvar,data,scalarname) {
sclr <- data[names(trtvar), scalarname]
names(sclr) <- names(trtvar)
abs(outer(sclr[trtvar],sclr[!trtvar], '-'))
}
nuclear$pscore <- glm(pr~.-(pr+cost), family=binomial(),
data=nuclear)$linear.predictors
##-- Distance for propensity score matching w/o prior stratification
psd1 <- makedist(pr~1, nuclear, scalardiffs, "pscore")
fullmatch(psd1)
##-- Distance for propensity score matching within levels of "pt"
psd2 <- makedist(pr~pt, nuclear, scalardiffs, "pscore")
fullmatch(psd2)Run the code above in your browser using DataLab