Code
import numpy as np
np.random.seed(0)
class selectiondata:
def __init__(self, n=1000, noisesd=1.0, ate=0.5):
self.Y0 = np.random.normal(size=n)
self.Y1 = np.random.normal(size=n) + ate
self.S0 = self.Y0 + np.random.normal(size=n)*noisesd
self.S1 = self.Y1 + np.random.normal(size=n)*noisesd
self.T = (self.S1 > self.S0).astype(int)
self.Y = self.Y0 * (1 - self.T) + self.Y1 * self.T
def APE(self):
return np.mean(self.Y[self.T==1]) - np.mean(self.Y[self.T==0])
def ATE(self):
return np.mean(self.Y1) - np.mean(self.Y0)
def selectionbias(self):
return (self.APE() - self.ATE())
def selectionbias0(self):
return np.mean( self.Y0[self.T==1]) - np.mean( self.Y0[self.T==0] )
def selectionbias1(self):
return np.mean( self.Y1[self.T==1]) - np.mean(self.Y1[self.T==0] )
s = 0.5
eate = 0.5
data = selectiondata(n=10_000,noisesd=s, ate=eate)
print("|APE|ATE|Selection Bias|\n" +
"|---|---|---|\n" +
f"|{data.APE():.2}|{data.ATE():.2}|{data.selectionbias():.2}|\n"
f"|σ={s:.2}|\n\n")