Basics

I’m a fifth-year PhD student in the Department of Political Science at Washington University – hence the wustl.edu. I study comparative politics with a special interest in the European Union. I also specialize in political methodology, and I find that the advanced industrial democracies are an especially rich source of data. My dissertation deals with the European Court of Justice, developing measures and models of outcomes and member state preferences. (See below)

In the Spring of 2009 I will be am in Paris with the Groupe Sociétés, Religions, Laïcités (GSRL which is part of CNRS, and also affiliated with the École Pratique des Hautes Études (EPHE). The French love alphabetisms. Besides eating beaucoup de croissants, I hope to conduct some useful fieldwork there as well as at the ECJ in Luxembourg.

My blog is mostly actually a log of stuff I read or run across that I want to be able to find later. It also frequently has a list of food I plan to make in a given week, so I can remember what I was excited to make when I bought all those ripe zucchini or that pair of rabbits. This site, malecki.wustl.edu, will grow over time with research projects and other stuff I’m working on.

Dissertation Abstract

Several features of the European Court of Justice have unduly hindered its study alongside other high courts. Its decisions are ostensibly en banc, with no written dissents and no judge-votes revealed. To date, most research on the Court's role in European integration has treated it as a unitary actor. However, like the other EU institutions, the Court is composed of individuals appointed by the member state governments. I argue that member states pay closer attention to appointing judges than previously thought, and that appointments constitute a hitherto unremarked indication of preferences over integration.

I develop an ecological item-response model of judges' preferences that exploits this hierarchical prior information, and the fact that the court’s organization into chambers systematically reveals information about individual behavior even though individual judge-votes are not observed. The model is applicable to other courts that hear cases in panels. Leverage is increased by treating outcomes as ordered (rather than binary) based on the Commission’s position revealed either as a litigant or through tendered observations. Finally, archival research probes the richness of member state observations as a dynamic indicator of integration preferences.

Other Projects

Current research projects include a paper on satisfaction with democracy at the European level and its interaction with national institutions and politics. Presented as a poster at APSA 2007; a draft of the paper will be available soon.

Estimating legislator preferences and party effects in the European Parliament, with Matt Gabel and Simon Hix. This paper uses my extension of MCMCpack, a hierarchical item-response theory (IRT) model with covariates on ideal points θ for exogenous preference and party. See below for implementation details and instructions on building and installing.

With Brian F. Crisp, I’m investigating how legislators operate in the unusual institutional context of a nationwide district with preference voting (a form of semi-open list). More to the point, do legislators cultivate geographic constituencies using these preference votes? Do parties?

Another project is an attempt to explore the empirical implications of informational cascades in the incidence of strikes. A draft of the paper is available here. How do union leaders and members decide to strike? What information do they have about the probability of success and of reprisal? Moreover, I argue that what they learn about these probabilities and others' assessments influences the course of events.

I am also assisting with data modeling, management, and collection with several professors' projects in the department.

R package apsrtable

apsrtable() for R, now finally a package, with documentation and everything! (example PDF). To install, just tell R:

install.pacakges("apsrtable")

It accepts lm and glm objects with either the standard or user-supplied variance-covariance matrix, placing standard errors below coefficients and in parentheses; it adorns estimates with either one or multiple glittering stars and other symbols; and uses dcolumn to align output, with the pleasant side effect of math-mode for model output (no xtable $-$ negative signs!). Model naming is flexible, either auto-numbering with an adjustable counter, or using a vector of user-supplied names; selected coefficients can be omitted from the output; and the order of coefficients is determined by the models supplied and several options for processing them. The latex it produces is formatted to be legible in tex source. It also plays well with Sweave. Here's the output from the example:

apsrtb>      apsrtable(lm.D90, lm.D9, digits=1, align="center", 
apsrtb+                stars="default", model.counter=0, order="rl")
\begin{table}[!ht]
\caption{}
\label{}
\begin{tabular}{cD{.}{.}{-1}D{.}{.}{-1}}\hline
 & \multicolumn{1}{c}{Model 0} & \multicolumn{1}{c}{Model 1}\\ 
%           & Model 0 & Model 1\\ 
(Intercept) &         & 5.0 ***\\ 
            &         & (0.2)  \\ 
groupTrt    & 4.7 *** & -0.4   \\ 
            & (0.2)   & (0.3)  \\ 
groupCtl    & 5.0 *** &        \\ 
            & (0.2)   &        \\ 
$N$         & 20      & 20     \\ 
$R^2$       & 1.0     & 0.1    \\ 
adj. $R^2$  & 1.0     & 0.0    \\\hline
\multicolumn{3}{l}{Standard errors in parentheses}\\
\end{table}

MCMCpack with hierarchical IRT

PolMeth 2008 Poster!

I made a poster for PolMeth 2008 about the model, perhaps a bit glib, but I liked it and had fun making it.

The devel version of MCMCpack includes my hierarchical model in “new” Scythe calls. This means: faster model fitting through very slick templating. However, you may still want to use the code below, which is built against old Scythe. Why? The database part described in this paper and this presentation. Because measurement models often have lots and lots of parameters and can take a very long time to converge (though this is faster than the canonical 1d irt model), and can quickly exceed even modern memory capacity. On the distant horizon is to create a flexible storage-and-replication model for MCMCpack.

modMCMCpack.tgz. I recommend installing this package into a sandbox lib.loc and not your main R library. MCMCirtHier1d has begun talks to join MCMCpack, but for now it's struggling with the acquis codebasaire.

wget http://malecki.wustl.edu/modMCMCpack.tgz
tar -zxvf modMCMCpack.tgz
R CMD INSTALL -l ~/R MCMCpack

A set of covariates Xj are used to predict ideal points θ ~ N(X'β, σ2) with standard Normal, IG prior on β and σ2. The full conditional distribution for (binary) θ is described in Fox 2007. a,b∈η is the typical IRT update. β and σ2 are Normal regression updates.

Prerequisites: Hier IRT also implements a new storage technique for MCMC draws. Thus SQLite3 and RSQLite are up to you to find and install. On a Mac, you can simply fink install sqlite3 sqlite3-dev and in ubuntu or debian it should be doable with apt-get install sqlite3 libsqlite3-dev. Similarly, in (sudo'd) R you should be able to install.packages("RSQLite"). Note that it defaults to storing both item (bill) and person parameters and that memory is no longer a limitation on storage.

Fitting a model: A data.frame with named covariates is expected. The following code fits a model to the MCMCpack SupremeCourt dataset using covariates for the party of the appointing president and for sex.

library(MCMCpack,lib.loc="~/R")
data(SupremeCourt)
file.remove("Hier1d.db")
presparty <- c(1,1,0,1,1,1,1,0,0)
sex <- c(0,0,1,0,0,0,0,1,0)
Xjdata <- data.frame(presparty=presparty,sex=sex)
   posterior1 <- MCMCirtHier1d(t(SupremeCourt),
                   alpha.start=.2, beta.start=.2,
                   burnin=500, mcmc=200000, thin=20, 
                   verbose=500,
                   Xjdata=Xjdata,
                   betastart=c(-.5,.5),sigmastart=1,
                   drop.tables=TRUE)
dbh <- dbConnect("SQLite","Hier1d.db")
beta <- dbReadTable(dbh,"beta")
theta <- dbReadTable(dbh,"theta")
a <- dbReadTable(dbh,"a")

The development version of the code puts bill parameters a,b into separate database tables because SQLite defines a maximum of 2000 columns per table. This means we can analyze a maximum of 2000 bills (1000 if η are both stored in one table). You can overcome this by installing sqlite3 and RSQLite with the configure variable SQLITE_MAX_COLUMN=n. RSQLite builds and installs its own SQLite library and is needed to create and work with the samples in R. I don't know which one is actually used by the #include <sqlite3.h> in MCMCirtHier1d.cc so I suggest doing it to both.

Code Snippets &c.

Here are code snippets I use all the time that may be of more general use.

Computers and Laziness

I am disinclined to do the same work more than once. This sort of precludes my participation in a lot of occupations where repetition is the order of the day. I use computers to help me avoid duplicating work. If you buy into the idea that lumper/splitter (searcher/sorter in GMail's terms) is a basic divide in how people approach problems and their world more generally, I am firmly in the Lumper category. I throw things together and let the computer sort it out later. Both GMail and Apple's Spotlight help me live in an unsorted world (and, in a much cruder way, so do locate and kpsewhere and which).

plants