CMatching-package {CMatching}R Documentation

Matching Algorithms for Causal Inference with Clustered Data


Provides functions to perform matching algorithms for causal inference with clustered data, as described in B. Arpino and M. Cannas (2016) <doi:10.1002/sim.6880>. Pure within-cluster and preferential within-cluster matching are implemented. Both algorithms provide causal estimates with cluster-adjusted estimates of standard errors.


Package: CMatching
Type: Package
Version: 2.3.0
Date: 2019-02-05
License: GPL version 3 or later

Several strategies have been suggested for adapting propensity score matching to clustered data. Depending on researcher's belief about the strength of unobserved cluster level covariates it is possible to take into account clustering either in the estimation of the propensity score model (through the inclusion of fixed or random effects, e.g. Arpino and Mealli (2011)) and/or in the implementation of the matching algorithm (see, e.g. Rickles and Seltzer (2014); Arpino and Cannas (2016)). This package contains main function CMatch to adapt classic matching algorithms for causal inference to clustered data and a customized summary function to analyze the output. Depending on the type argument function CMatch calls either MatchW implementing a pure within-cluster matching or MatchPW implementing an approach which can be called "preferential" within-cluster matching. This approach first looks for matchable units within the same cluster and - if no match is found - continues the search in the remaining clusters. The functions also provide causal estimands with cluster-adjusted standard errors from fitting a multilevel model on matched data. CMatch returns an object of class ”CMatch” which can be be summarized and used as input of the CMatchBalance function to examine how much the procedure resulted in improved covariate balance. Although CMatch has been designed for dealing with clustered data, these algorithms can be used to force a perfect balance or to improve the balance of categorical variables, respectively. In this case, the "clusters" correspond to the levels of the categorical variable(s). When used for this purpouse the user should ignore the standard error (if provided). Note that Matchby from package Matching can be used for the same purpouse.


Massimo Cannas [aut, cre], Bruno Arpino [ctb], Elena Colicino [ctb]. A special thanks to Thomas W. Yee for his precious help in updating to version 2.1.

Maintainer: Massimo Cannas <>


Sekhon, Jasjeet S. (2011). Multivariate and Propensity Score Matching Software with Automated Balance Optimization. Journal of Statistical Software, 42(7): 1-52.

Arpino, B., and Cannas, M. (2016). Propensity score matching with clustered data. An application to the estimation of the impact of caesarean section on the Apgar score. Statistics in Medicine, 35: 2074-2091. doi: 10.1002/sim.6880.

Rickles, J. H., and Seltzer, M. (2014). A Two-Stage Propensity Score Matching Strategy for Treatment Effect Estimation in a Multisite Observational Study. Journal of Educational and Behavioral Statistics, 39(6), 612-636. doi: 10.3102/1076998614559748

Arpino, B. and Mealli, F. (2011). The specification of the propensity score in multilevel observational studies. Computational Statistics & Data Analysis, 55(4), 1770-1780. doi: 10.1016/j.csda.2010.11.008

See Also

Match, MatchBalance


# a paper and pencil example with a few units

id  <- c(1,2,3,4,5, 6,7,8,9,10)
 x  <- c( 1,1,1.1,1.1,1.4, 2,1,1,1.3, 1.3 )
 t  <- c( 1,1,1,1,0, 0,0,0,0, 0 )
 g  <- c(1,1,2,2,1,1,2,2,2, 2 ) # two groups of four and six units
toy <- t(data.frame(id,g, t,x))

# reorder units by ascending group
 toyord <-toy[,order(g)] 
 x <-toyord["x",]
 t <-toyord["t",]
 g <- toyord["g",]

# pooled matching
pm <- Match(Y=NULL, Tr=t, X=x, caliper=2,ties=FALSE,replace=FALSE)
# within matching 
wm <- CMatch(type="within",Y=NULL, Tr=t, X=x, Group=g,caliper=2,ties=FALSE,replace=FALSE)
# preferential-within matching
pwm <- CMatch(type="pwithin",Y=NULL, Tr=t, X=x, Group=g, caliper=2,ties=FALSE,replace=FALSE)
# quick look at matched dataset (matched pairs are vertically aligned)
# pooled
# within
# pref within

[Package CMatching version 2.3.0 Index]