I'm getting a different p-value than is calculated in ri.py or commented in ri.do. I only know python (excited by the new python code added!) so I'll reference the py file.
p_value = p_value[p_value['ate'] == 1]
p_value['rank'].max() / n
This gives 0.4285.
The simplest code I can think to do the same thing is the following, though it's not the smartest because it relies on permutations instead of combinations.
from itertools import permutations
import pandas as pd
import numpy as np
url = 'https://github.com/scunning1975/mixtape/raw/master/ri.dta'
df = pd.read_stata(url, index_col = 'name')
observed_t_stat = 1
y_vec = df.y.values
# create vector of treatment assignments
# use -1 instead of 0 for dot product assist
d = np.concatenate( [np.ones(4), (-1)*np.ones(4)] )
t_stats = np.array([])
for d_vec in permutations(d):
t = np.dot(y_vec, d_vec) / 4 # signed t-stat
t_stats = np.append(t_stats, t)
p_value = (t_stats >= observed_t_stat).mean()
I'm making this an issue, because I want to check my own understanding (I'm self-studying) and I think there's also the issue of whether or not the code should be using absolute values for the t-statistics to match the book.