*! version v1.0 14 March 2024
*! Alejandro Ome (alejandro.ome@gmail.com)
*! Treatment effect bounds assuming stochastic dominance


program define stocdom, rclass
version 18.0

tempvar panel valid_sample0 id_temp0 valid_sample1 id_temp1

qui {
gen byte `panel' = `1' !=.


**Lower bound: 


	*Lower bound for Treatment group

	sum `1' if `2' == 1
	 
	local y1=r(mean)


	*Upper bound for Control group: In this case the max of defiers is the fraction of the treatment that is not observed (Assumes there are no Nevers)

	gen `valid_sample0'=`1'!=. & `2' == 0

	gsort -`valid_sample0' `1'

	gen `id_temp0'=_n if `valid_sample0'==1


	tabstat `panel' ,  by(`2') save
	tabstatmat panels


	sum `2' if `2'==0
	local p = (1 - panels[2,1] )*`r(N)'


	display `p'


	replace `valid_sample0' = . if `id_temp0'<=`p'

	sum `1' if `2'==0 & `valid_sample0'==1
	local y0=r(mean)


	local lower_imp = `y1' - `y0'

	display `lower_imp'




**Upper bound: 

			

	*Upper bound for Treatment group

	gen `valid_sample1'=`1'!=. & `2'==1
	gsort -`valid_sample1' `1'
	gen `id_temp1'=_n if `valid_sample1'==1

	sum `2' if `2'==1
	local p = (1 - panels[1,1] )*`r(N)'


	display `p'


	replace `valid_sample1' = . if `id_temp1'<=`p'

	sum `1' if `2'==1 & `valid_sample1'==1
	local y1=r(mean)


	*Lower bound for C: Mean Y of Always is at least as high as Defiers' so mean Y of always is mean of all Control


	sum `1' if `2'==0
	local y0=r(mean)



	local upper_imp = `y1' - `y0'

	display `upper_imp'


mat temp=( `lower_imp' , `upper_imp' )
mat colnames temp = lower upper

tempname bb


matrix `bb'=temp



ereturn post `bb'


}

matlist temp

end