Adam Feldman’s blog Empirical SCOTUS has a recent post on which Supreme Court judges get interrupted most by the other judges, and another post on how much each judge speaks.
I’ve put the data in a github gist:
scotus<-read.csv("https://gist.githubusercontent.com/tslumley/287de14ec1bbf31785cc3b90a5f32fec/raw/a4b9ff93772f3cd1fea0c80e3d943550575112b8/scotus.csv")
scotus
## name words sentence utterances interrupted gender
## 1 Breyer 59981 1297 1454 36 M
## 2 Kagan 43043 967 1046 50 F
## 3 Roberts 36608 1424 1573 34 M
## 4 Sotomayor 35898 1391 1517 57 F
## 5 Alito 26422 682 718 30 M
## 6 Ginsburg 21647 715 740 31 F
## 7 Kennedy 20343 829 879 31 M
## 8 Scalia 18509 820 936 26 M
## 9 Thomas 299 11 11 0 M
Here’s a barchart of the raw count of interruptions.
par(las=1,mar=c(5.1,8.1,1,1))
with(scotus[order(scotus$interrupted),], barplot(interrupted, names=name, col=ifelse(gender=="F","purple","orange"),horiz=TRUE))
Pretty dramatic, huh?
The raw number of interruptions is highest for the two more-recent female appointees Elena Kagan and Sonia Sotomayor, but the amount of speaking matters. Clarence Thomas wasn’t interrupted at all, but that’s partly because he barely speaks.
Here’s the graph scaled by the amount each judge talks:
par(las=1,mar=c(5.1,8.1,1,1))
with(scotus[order(scotus$interrupted),],
barplot(1000*interrupted/words, names=name,
col=ifelse(gender=="F","purple","orange"),horiz=TRUE,
xlab="Per 1000 words"))
And scaled by ‘utterances’ – turns at speaking:
par(las=1,mar=c(5.1,8.1,1,1))
with(scotus[order(scotus$interrupted),],
barplot(100*interrupted/utterances, names=name,
col=ifelse(gender=="F","purple","orange"),horiz=TRUE,
xlab="Per 100 utterances"))
It still looks like there’s a gender effect, but it’s less dramatic. On the other hand, it now seems to apply even to Ruth Bader Ginsburg. The other thing to notice is that Supreme Court judges get a lot of deference: the highest interruption rate is under 5% of utterances.
So, lets model this, both raw and as rates per word or per utterance
summary(glm(interrupted~gender,family=poisson,data=scotus))
##
## Call:
## glm(formula = interrupted ~ gender, family = poisson, data = scotus)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -7.2342 -0.0326 0.7321 1.4631 1.8176
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.82864 0.08513 44.976 < 2e-16 ***
## genderM -0.56416 0.11669 -4.835 1.33e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 90.27 on 8 degrees of freedom
## Residual deviance: 67.47 on 7 degrees of freedom
## AIC: 114.8
##
## Number of Fisher Scoring iterations: 5
summary(glm(interrupted~offset(log(utterances))+gender,family=poisson,data=scotus))
##
## Call:
## glm(formula = interrupted ~ offset(log(utterances)) + gender,
## family = poisson, data = scotus)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.61846 -0.79395 -0.07378 0.93107 2.02425
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.17533 0.08513 -37.302 < 2e-16 ***
## genderM -0.39375 0.11669 -3.374 0.00074 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 22.174 on 8 degrees of freedom
## Residual deviance: 10.954 on 7 degrees of freedom
## AIC: 58.288
##
## Number of Fisher Scoring iterations: 4
summary(glm(interrupted~offset(log(words))+gender,family=poisson,data=scotus))
##
## Call:
## glm(formula = interrupted ~ offset(log(words)) + gender, family = poisson,
## data = scotus)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -3.1170 -0.7609 0.2372 1.0772 2.3482
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -6.59153 0.08513 -77.433 < 2e-16 ***
## genderM -0.34857 0.11669 -2.987 0.00282 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 31.279 on 8 degrees of freedom
## Residual deviance: 22.466 on 7 degrees of freedom
## AIC: 69.8
##
## Number of Fisher Scoring iterations: 4
The Poisson model with utterances in the denominator looks like a slightly better fit. Since an interruption will always bring an utterance to an end this sounds as though a Poisson distribution wouldn’t be a good fit, but we can consider the model as a model for a stopped Poisson process, which has the same likelihood.
Without considering the denominator, we’d say male judges are interrupted at 57% the rate of female judges. With the denominator, it’s 71% the rate per ‘utterance’. About a third of the difference is explained.
There’s still a bit of overdispersion, so we should look at either a sandwich estimator or an overdispersion estimator for the standard errors
summary(glm(interrupted~offset(log(utterances))+gender,family=quasipoisson,data=scotus))
##
## Call:
## glm(formula = interrupted ~ offset(log(utterances)) + gender,
## family = quasipoisson, data = scotus)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.61846 -0.79395 -0.07378 0.93107 2.02425
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -3.1753 0.1075 -29.548 1.31e-08 ***
## genderM -0.3938 0.1473 -2.673 0.0319 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for quasipoisson family taken to be 1.59371)
##
## Null deviance: 22.174 on 8 degrees of freedom
## Residual deviance: 10.954 on 7 degrees of freedom
## AIC: NA
##
## Number of Fisher Scoring iterations: 4
There’s still reasonable evidence of a difference, given the sample size, though of course I only looked at the data because @DrMel_T tweeted about a write-up in Mother Jones.
Finally, a better way to do the graph would take uncertainty into account. There’s a reasonably good confidence interval approximation for count data where you take the square root of the observed value, add and subtract 1 to get an interval, then square again.
par(las=1,mar=c(5.1,8.1,1,1))
scotus$low<-with(scotus, 100*(pmax(0,sqrt(interrupted)-1)^2)/utterances)
scotus$hi<-with(scotus, 100*(sqrt(interrupted)+1)^2/utterances)
with(scotus,plot(I(100*interrupted/utterances),1:9,pch=19,col=ifelse(gender=="F","purple","orange"),xlim=c(0,9),xlab="Interruptions per 100 utterances",ylab="",yaxt="n"))
with(scotus, segments(low,1:9,hi,1:9,col=ifelse(gender=="F","purple","orange")))
axis(2,at=1:9,labels=scotus$name)