## ----echo = FALSE, results = 'hide'-------------------------------------------
set.seed(2112)

## -----------------------------------------------------------------------------
boot.M = 10

## ----functions----------------------------------------------------------------
boot.matchit.random <- function(Tr, Y, X, X.trans, formu, ...) {
	boot.matchit(Tr = Tr, Y = Y, X = X, X.trans = X.trans, formu = formu, m.order = 'random', ...)
}

boot.matching.random <- function(Tr, Y, X, X.trans, formu, ...) {
	boot.matching(Tr = Tr, Y = Y, X = X, X.trans = X.trans, formu = formu, replace = FALSE)
}

SimpleMatch <- function(Tr, Y, X, X.trans, formu, caliper = 0.25, ...) {
	if(!is.logical(Tr)) {
		Tr <- as.logical(Tr)
	}
	formu <- update.formula(formu, 'treat ~ .')
	ps <- fitted(glm(formu, data = cbind(treat = Tr, X), family = binomial(logit)))
	matches <- data.frame(Treat = which(Tr), Treat.Y = Y[Tr], Treat.ps = ps[Tr],
						  Control = as.integer(NA), Control.Y = as.numeric(NA), 
						  Control.ps = as.numeric(NA))
	available.Control <- !Tr
	for(i in which(Tr)) {
		d <- abs(ps[i] - ps[!Tr & available.Control])
		if((min(d) / sd(ps)) < caliper)
			m <- which(!Tr & available.Control)[which(d == min(d))]
		if(length(m) > 1) {
			m <- m[1]
		}
		if(length(m) > 0) {
			matches[matches$Treat == i,]$Control <- m
			matches[matches$Treat == i,]$Control.Y <- Y[m]
			matches[matches$Treat == i,]$Control.ps <- ps[m]
			available.Control[m] <- FALSE
		}
	}
	match.t <- t.test(matches$Treat.Y, matches$Control.Y, paired = TRUE)

	return(list(
		summary = c(estimate = unname(match.t$estimate),
				  ci.min = match.t$conf.int[1],
				  ci.max = match.t$conf.int[2],
				  p = match.t$p.value,
				  t = unname(match.t$statistic)),
		details = c(Matches = matches, t.test = match.t),
		balance = balance.matching(matches$Treat, matches$Control, X.trans) ))
}

## ----setup, echo = FALSE, results = 'hide', message = FALSE-------------------
library(PSAboot)
library(reshape2)
library(ggplot2)

## ----laonde-------------------------------------------------------------------
data("lalonde", package = 'Matching')

## ----lalonde.psaboot, cache = FALSE, warning = FALSE--------------------------
lalonde.boot <- PSAboot(Tr = lalonde$treat,
						Y = lalonde$re78,
						X = lalonde[,c(1:8)],
						seed = 2112,
						M = boot.M,
						control.sample.size = 260, control.replace = FALSE,
						treated.sample.size = 185, treated.replace = FALSE,
						methods = c(getPSAbootMethods()[c('Matching','MatchIt')],
									'MatchingRandom' = boot.matching.random,
									'MatchItRandom' = boot.matchit.random,
									'NearestNeighbor' = SimpleMatch))

## ----lalonde-boxplot, fig.width = 12, fig.height = 4.0, warning = FALSE, message = FALSE----
boxplot(lalonde.boot)

## ----lalonde-balance, fig.width = 12, fig.height = 4, warning = FALSE---------
lalonde.bal <- balance(lalonde.boot)
tmp.bal <- melt(lalonde.bal$pooled)
tmp.est <- lalonde.boot$pooled.summary[,c('iter','method','estimate')]
tmp <- merge(tmp.bal, tmp.est, by.x = c('Var1','Var2'), by.y = c('iter','method'))
ggplot(tmp, aes(x = value, y = estimate, group = Var2)) + geom_point(alpha = .5) + 
	facet_wrap(~ Var2, nrow = 1) + xlab('Balance') + ylab('Estimate')

## ----tutoring-----------------------------------------------------------------
data(tutoring, package = 'TriMatch')
tutoring$treatbool <- tutoring$treat != 'Control'

## ----tutoring-psaboot, cache = FALSE, warning = FALSE-------------------------
tutoring.boot <- PSAboot(Tr = tutoring$treatbool, 
						 Y = tutoring$Grade, 
						 X = tutoring[,c('Gender', 'Ethnicity', 'Military', 'ESL',
						 			  'EdMother', 'EdFather', 'Age', 'Employment',
						 			  'Income', 'Transfer', 'GPA')], 
						 seed = 2112,
						 M = boot.M,
						 control.sample.size =918, control.replace  = FALSE,
						 treated.sample.size =224, treated.replace  = FALSE,
						 methods =c(getPSAbootMethods()[c('Matching','MatchIt')],
						 		  'MatchingRandom' = boot.matching.random,
						 		  'MatchItRandom' = boot.matchit.random,
						 		  'NearestNeighbor' = SimpleMatch))

## ----tutoring-boxplot, fig.width = 12, fig.height = 4.0, warning = FALSE, message = FALSE----
boxplot(tutoring.boot)

## ----tutoring-balance, fig.width = 12, fig.height = 4, warning = FALSE--------
tutoring.bal <- balance(tutoring.boot)
tmp.bal <- melt(tutoring.bal$pooled)
tmp.est <- tutoring.boot$pooled.summary[,c('iter','method','estimate')]
tmp <- merge(tmp.bal, tmp.est, by.x = c('Var1','Var2'), by.y = c('iter','method'))
ggplot(tmp, aes(x = value, y = estimate, group = Var2)) + geom_point(alpha = .5) + 
	facet_wrap(~ Var2, nrow = 1) + xlab('Balance') + ylab('Estimate')

