/*

Deterring collusion with a reserve price: an auction experiment 
Experimental Economics

Pacharasut Sujarittanonta, Chulalongkorn University
Ajalavat Viriyavipart, American University of Sharjah

*/

//Table 1=======================================================================
	//Table 1: All observations
	use "Sujarittanonta-Viriyavipart-Deterring-Collusion", clear
	replace offer_amount=0 if offer_amount==-1
	collapse (max) offer_amount (max) offer_amount_accepted (max) offer_accepted, by(treatment cohort group period)
	collapse (mean) offer_amount (mean) offer_amount_accepted (mean) offer_accepted, by(treatment cohort)

	//Cohort averages
	bys treatment: tabstat offer_amount offer_amount_accepted offer_accepted, by(cohort) s(mean sd) format(%9.2f)
	
	//Rank-sum tests
	ranksum offer_amount, by(treatment)
	ranksum offer_amount_accepted, by(treatment)
	ranksum offer_accepted, by(treatment)

	//Table 1: Proposer's value >= 500
	use "Sujarittanonta-Viriyavipart-Deterring-Collusion", clear
	replace offer_amount=0 if offer_amount==-1
	gen value_proposer_temp=value if role==1
	bys treatment cohort period group: egen value_proposer=max(value_proposer_temp)
	keep if value_proposer>=500

	//Cohort averages
	collapse (max) offer_amount (max) offer_amount_accepted (max) offer_accepted, by(treatment cohort group period)
	collapse (mean) offer_amount (mean) offer_amount_accepted (mean) offer_accepted, by(treatment cohort)
	bys treatment: tabstat offer_amount offer_amount_accepted offer_accepted, by(cohort) s(mean sd) format(%9.2f)

	//Rank-sum tests
	ranksum offer_amount, by(treatment)
	ranksum offer_amount_accepted, by(treatment)
	ranksum offer_accepted, by(treatment)

//Table 2=======================================================================
	use "Sujarittanonta-Viriyavipart-Deterring-Collusion", clear
	keep if role==1
	gen value_500 = value>=500
	gen offer_classification="No offer" if offer_amount==-1
	replace offer_classification="Offer = 0" if offer_amount==0
	replace offer_classification="0 < offer <= value - reserve price" if offer_amount>0 & offer_amount <= value - reserve_price
	replace offer_classification="Offer > value - reserve price" if offer_amount>0 & offer_amount > value - reserve_price
	
	//Table 2: Without a reserve price
	tabstat offer_amount if treatment==1, by(offer_classification) s(N)
	//Table 2: With a reserve price
	bys value_500: tabstat offer_amount if treatment==2, by(offer_classification) s(N)

//Figure 1======================================================================
	use "Sujarittanonta-Viriyavipart-Deterring-Collusion", clear
	keep if role==1
	replace offer_amount=0 if offer_amount==-1	
	
	//Figure 1a
	tobit offer_amount value if treatment==1, ll(0) vce(cluster subject_id)
	graph twoway (scatter offer_amount value if treatment==1, ///
			msize(small) msymbol(Oh) mlw(0.2) mlc(eltblue)) ///
		(function Actual=_b[_cons]+_b[value]*x, ///
			range(value) lp(solid) lw(0.4) lc(orange) ) ///
		, title("(a) Without a reserve price", size(medium)) legend(order(1 "Actual" 2 "Estimate") rows(1) size(small)) ///
		ytitle("Offer amount") xtitle("Value") xlabel(#5, grid format(%9.0gc)) ///
		ylabel(#5, grid format(%9.0gc) angle(horizontal)) graphregion(color(white)) ///
		name(offer_without_reserve, replace)
		
	//Figure 1b
	tobit offer_amount value if treatment==2, vce(cluster subject_id) ll(0)
	graph twoway (scatter offer_amount value if treatment==2, ///
			msize(small) msymbol(Oh) mlw(0.2) mlc(eltblue)) ///
		(function Actual=max(_b[_cons]+_b[value]*x,0), ///
			range(0 1000) lp(solid) lw(0.4) lc(orange) ) ///
		, title("(b) With a reserve price", size(medium)) legend(order(1 "Actual" 2 "Estimate")) ///
		ytitle("Offer amount") xtitle("Value") xlabel(#5, grid format(%9.0gc)) ///
		ylabel(#5, grid format(%9.0gc) angle(horizontal)) graphregion(color(white)) ///
		name(offer_with_reserve, replace)
	grc1leg offer_without_reserve offer_with_reserve, graphregion(color(white)) ///
		legendfrom(offer_without_reserve) scale(0.8) ysize(1) xsize(1.7) 
		
//Table 3=======================================================================
	use "Sujarittanonta-Viriyavipart-Deterring-Collusion", clear
	replace offer_amount=0 if offer_amount==-1	
	tobit offer_amount value if treatment==1 & role==1, vce(cluster subject_id) ll(0)
	tobit offer_amount value if treatment==2 & role==1, vce(cluster subject_id) ll(0)

	
//Table 4=======================================================================
	use "Sujarittanonta-Viriyavipart-Deterring-Collusion", clear
	keep if role==0
	gen value_500 = value>=500
	gen mao_classification="MAO = 0" if mao==0
	replace mao_classification="MAO > 0" if mao > 0
	replace mao_classification="0 < MAO < value - reserve price" if mao>0 & mao < value - reserve_price
	replace mao_classification="MAO = value - reserve price" if mao>0 & mao == value - reserve_price
	replace mao_classification="MAO > value - reserve price" if mao>0 & mao > value - reserve_price
	
	//Table 2: Without a reserve price
	tabstat mao if treatment==1, by(mao_classification) s(N)
	//Table 2: With a reserve price
	bys value_500: tabstat mao if treatment==2, by(mao_classification) s(N)

//Figure 2======================================================================
	use "Sujarittanonta-Viriyavipart-Deterring-Collusion", clear
	keep if role==0
	
	//Figure 2a
	tobit mao value if treatment==1, ll(0) vce(cluster subject_id)
	graph twoway (scatter mao value if treatment==1, ///
			msize(small) msymbol(Oh) mlw(0.2) mlc(eltblue)) ///
		(function Actual=_b[_cons]+_b[value]*x, ///
			range(value) lp(solid) lw(0.4) lc(orange) ) ///
		, title("(a) Without a reserve price", size(medium)) legend(order(1 "Actual" 2 "Estimate") rows(1) size(small)) ///
		ytitle("Minimum acceptable offer") xtitle("Value") xlabel(#5, grid format(%9.0gc)) ///
		ylabel(#5, grid format(%9.0gc) angle(horizontal)) graphregion(color(white)) ///
		name(mao_without_reserve, replace)
		
	//Figure 2b
	tobit mao value if treatment==2, ll(0) vce(cluster subject_id)
	graph twoway (scatter mao value if treatment==2, ///
			msize(small) msymbol(Oh) mlw(0.2) mlc(eltblue)) ///
		(function Actual=max(0,_b[_cons]+_b[value]*x), ///
			range(value) lp(solid) lw(0.4) lc(orange) ) ///
		, title("(b) With a reserve price", size(medium)) legend(order(1 "Actual" 2 "Estimate") rows(1) size(small)) ///
		ytitle("Minimum acceptable offer") xtitle("Value") xlabel(#5, grid format(%9.0gc)) ///
		ylabel(#5, grid format(%9.0gc) angle(horizontal)) graphregion(color(white)) ///
		name(mao_with_reserve, replace)	
	grc1leg mao_without_reserve mao_with_reserve, graphregion(color(white)) ///
		legendfrom(mao_without_reserve) scale(0.8) ysize(2) xsize(1.7) 
		
//Table 5=======================================================================
	use "Sujarittanonta-Viriyavipart-Deterring-Collusion", clear
	keep if role==0
	tobit mao value if treatment==1, ll(0) vce(cluster subject_id)
	tobit mao value if treatment==2, ll(0) vce(cluster subject_id)

//Table 6=======================================================================
	use "Sujarittanonta-Viriyavipart-Deterring-Collusion", clear
	replace offer_amount=0 if offer_amount==-1	
	gen relative_offer_amount = offer_amount/(value-reserve_price) if role==1 & value>=500
	gen relative_mao = mao/(value-reserve_price) if role==0 & value>=500
	tabstat relative_offer_amount relative_mao, by(treatment) s(median mean sd N) longstub nototal format(%9.3f) 

	//Rank-sum test
	collapse (mean) relative_offer_amount (mean) relative_mao, by(treatment cohort)
	ranksum relative_offer_amount, by(treatment)
	ranksum relative_mao, by(treatment)

//Table 7 & 8===================================================================
	use "Sujarittanonta-Viriyavipart-Deterring-Collusion", clear
	keep if bid>=0
	gen bid_ratio=bid/(value+(reserve_price^2)/value)

	//Table 7: Column 1
	reg bid_ratio if role==1 & treatment==1, vce(cluster subject_id)
	//Table 7: Column 2
	reg bid_ratio if role==0 & treatment==1, vce(cluster subject_id)
	//Table 7: Column 3
	reg bid_ratio offer_amount if role==1 & treatment==1, vce(cluster subject_id)
	//Table 7: Column 4
	reg bid_ratio offer_amount if role==0 & treatment==1, vce(cluster subject_id)
	
	//Table 8: Column 5
	reg bid_ratio if role==1 & treatment==2 & value>=500, vce(cluster subject_id)
	//Table 8: Column 6
	reg bid_ratio if role==0 & treatment==2 & value>=500, vce(cluster subject_id)	
	//Table 8: Column 7
	reg bid_ratio offer_amount if role==1 & treatment==2 & value>=500, vce(cluster subject_id)
	//Table 8: Column 8
	reg bid_ratio offer_amount if role==0 & treatment==2 & value>=500, vce(cluster subject_id)



//Figure 3======================================================================
	
	forvalues i = 1/2 {
		forvalues j = 0/1 {
			use "Sujarittanonta-Viriyavipart-Deterring-Collusion", clear
			disp "Calculate optimal bids for Treatment `i' and role `j'"
			keep if treatment==`i' & role==`j'
			
			duplicates drop value, force
			keep if value>=reserve_price
			keep value
			sort value
			save value_temp, replace
			
			use "Sujarittanonta-Viriyavipart-Deterring-Collusion", clear		
			keep if treatment==`i' & role==1-`j' & bid!=. & bid!=-1
			keep bid
			sort bid
			egen count = count(bid)
			gen prob_win = _n/count
			drop count
			
			cross using value_temp
			gen profit = prob_win*(value-bid)
			gsort value -profit
			by value: gen profit_rank=_n
			keep if profit_rank==1
			drop profit_rank
			ren profit optimal_mao
			ren bid optimal_bid
			save optimal, replace
			
			use "Sujarittanonta-Viriyavipart-Deterring-Collusion", clear
			keep if treatment==`i' & role==`j' & bid!=. & bid!=-1
			keep treatment role value bid mao
			ren bid actual_bid
			ren mao actual_mao
			merge m:1 value using optimal, nogen
			save br_`i'_`j', replace
		}
	}
	clear
	forvalues i = 1/2 {
		forvalues j = 0/1 {
			append using br_`i'_`j'
		}
	}

	//Figure 3a & 3b
	gen value_int = int(value/50)*50+25
	collapse (mean) actual_bid optimal_bid actual_mao optimal_mao, by(treatment role value_int)
	drop if value_int<500 & treatment==2
	sort treatment role value_int
	graph twoway (line actual_mao value_int if role==0 & treatment==1, ///
				lp(solid) lw(0.4) lc(eltblue)) ///	
			(line optimal_mao value_int if role==0 & treatment==1, ///
				lp(dash) lw(0.4) lc(orange)) ///
		, title("(a) Without a reserve price", size(medium)) ///
		legend(order(1 "Average" 2 "Optimal") rows(1) size(small)) ///
		ytitle("Minimum acceptable offer") xtitle("Value") xlabel(#5, grid format(%9.0gc)) ///
		ylabel(0 200 400 600 800 1000 , grid format(%9.0gc) angle(horizontal)) graphregion(color(white)) ///
		name(br_mao_noreserve, replace)	
	graph twoway (line actual_mao value_int if role==0 & treatment==2, ///
				lp(solid) lw(0.4) lc(eltblue)) ///	
			(line optimal_mao value_int if role==0 & treatment==2, ///
				lp(dash) lw(0.4) lc(orange)) ///
		, title("(b) With a reserve price", size(medium)) ///
		legend(order(1 "Average" 2 "Optimal") rows(1) size(small)) ///
		ytitle("Minimum acceptable offer") xtitle("Value") xlabel(#5, grid format(%9.0gc)) ///
		ylabel(0 200 400 600 800 1000 , grid format(%9.0gc) angle(horizontal)) graphregion(color(white)) ///
		name(br_mao_reserve, replace)	
	grc1leg br_mao_noreserve br_mao_reserve , graphregion(color(white)) ///
		legendfrom(br_mao_noreserve) scale(0.8) ysize(2) xsize(1.7) 
	//Figure 3c & 3d
	graph twoway (line actual_bid value_int if role==1 & treatment==1, ///
				lp(solid) lw(0.4) lc(eltblue)) ///	
			(line optimal_bid value_int if role==1 & treatment==1, ///
				lp(dash) lw(0.4) lc(orange)) ///
		, title("(a) Without a reserve price, proposer", size(medium)) ///
		legend(order(1 "Average" 2 "Optimal") rows(1) size(small)) ///
		ytitle("Bid") xtitle("Value") xlabel(#5, grid format(%9.0gc)) ///
		ylabel(0 200 400 600 800 1000 , grid format(%9.0gc) angle(horizontal)) graphregion(color(white)) ///
		name(br_proposer_noreserve, replace)	
	graph twoway (line actual_bid value_int if role==0 & treatment==1, ///
				lp(solid) lw(0.4) lc(eltblue)) ///	
			(line optimal_bid value_int if role==0 & treatment==1, ///
				lp(dash) lw(0.4) lc(orange)) ///
		, title("(b) Without a reserve price, responder", size(medium)) ///
		legend(order(1 "Average" 2 "Optimal") rows(1) size(small)) ///
		ytitle("Bid") xtitle("Value") xlabel(#5, grid format(%9.0gc)) ///
		ylabel(0 200 400 600 800 1000 , grid format(%9.0gc) angle(horizontal)) graphregion(color(white)) ///
		name(br_responder_noreserve, replace)	
	grc1leg br_proposer_noreserve br_responder_noreserve , graphregion(color(white)) ///
		legendfrom(br_proposer_noreserve) scale(0.8) ysize(2) xsize(1.7) 
		
//Figure 4======================================================================
	graph twoway (line actual_bid value_int if role==1 & treatment==2, ///
				lp(solid) lw(0.4) lc(eltblue)) ///	
			(line optimal_bid value_int if role==1 & treatment==2, ///
				lp(dash) lw(0.4) lc(orange)) ///
		, title("(c) With a reserve price, proposer", size(medium)) ///
		legend(order(1 "Average" 2 "Optimal") rows(1) size(small)) ///
		ytitle("Bid") xtitle("Value") xlabel(#5, grid format(%9.0gc)) ///
		ylabel(500 600 700 800 900 1000 , grid format(%9.0gc) angle(horizontal)) graphregion(color(white)) ///
		name(br_proposer_reserve, replace)	
	graph twoway (line actual_bid value_int if role==0 & treatment==2, ///
				lp(solid) lw(0.4) lc(eltblue)) ///	
			(line optimal_bid value_int if role==0 & treatment==2, ///
				lp(dash) lw(0.4) lc(orange)) ///
		, title("(d) With a reserve price, responder", size(medium)) ///
		legend(order(1 "Average" 2 "Optimal") rows(1) size(small)) ///
		ytitle("Bid") xtitle("Value") xlabel(#5, grid format(%9.0gc)) ///
		ylabel(500 600 700 800 900 1000 , grid format(%9.0gc) angle(horizontal)) graphregion(color(white)) ///
		name(br_responder_reserve, replace)	
	grc1leg br_proposer_reserve br_responder_reserve, graphregion(color(white)) ///
		legendfrom(br_proposer_reserve) scale(0.8) ysize(2) xsize(1.7) 
	
//Table 9=======================================================================
	
	//Table 9: All observations
	use "Sujarittanonta-Viriyavipart-Deterring-Collusion", clear
	bys treatment cohort period group: egen max_value=max(value)
	gen efficient_winner=value==max_value
	gen efficiency=winner==efficient_winner if efficient_winner==1
	gen gft=winner*value if winner==1
	gen max_gft=efficient_winner*value if efficient_winner==1
	gen payoff_proposer=payoff if role==1
	gen payoff_responder=payoff if role==0
	collapse (max) efficiency (max) gft ///
		(max) max_gft (max) revenue (max) payoff_proposer (max) payoff_responder, by(treatment cohort group period)
	recode * (.=0)
	collapse (mean) efficiency (mean) gft (sum) total_gft=gft (sum) max_gft (mean) revenue  ///
		(mean) payoff_proposer (mean) payoff_responder , by(treatment cohort)
	gen rgft=total_gft/max_gft
	tabstat efficiency rgft gft revenue payoff_proposer payoff_responder, by(treatment) s(mean sd) longstub nototal format(%9.3f) 
	
	ranksum efficiency, by(treatment)
	ranksum rgft, by(treatment)
	ranksum gft, by(treatment)
	ranksum revenue, by(treatment)
	ranksum payoff_proposer, by(treatment)
	ranksum payoff_responder, by(treatment)
	
	//Table 9: Offer accepted
	use "Sujarittanonta-Viriyavipart-Deterring-Collusion", clear
	bys treatment cohort period group: egen max_value=max(value)
	gen efficient_winner=value==max_value
	gen efficiency=winner==efficient_winner if efficient_winner==1
	gen gft=winner*value if winner==1
	gen max_gft=efficient_winner*value if efficient_winner==1
	gen payoff_proposer=payoff if role==1
	gen payoff_responder=payoff if role==0
	collapse (max) offer_accepted (max) efficiency (max) gft ///
		(max) max_gft (max) revenue (max) payoff_proposer (max) payoff_responder, by(treatment cohort group period)
	recode * (.=0)
	keep if offer_accepted==1
	collapse (mean) efficiency (mean) gft (sum) total_gft=gft (sum) max_gft (mean) revenue  ///
		(mean) payoff_proposer (mean) payoff_responder , by(treatment cohort)
	gen rgft=total_gft/max_gft
	tabstat efficiency rgft gft revenue payoff_proposer payoff_responder, by(treatment) s(mean sd) longstub nototal format(%9.3f) 
	
	ranksum efficiency, by(treatment)
	ranksum rgft, by(treatment)
	ranksum gft, by(treatment)
	ranksum revenue, by(treatment)
	ranksum payoff_proposer, by(treatment)
	ranksum payoff_responder, by(treatment)
	
//Table 10======================================================================
	use "Sujarittanonta-Viriyavipart-Deterring-Collusion", clear
	replace offer_amount=0 if offer_amount==-1	
	gen relative_offer_amount = offer_amount/(value-reserve_price) if role==1 & value>=500
	gen relative_mao = mao/(value-reserve_price) if role==0 & value>=500
	tabstat relative_offer_amount relative_mao, by(treatment) s(median mean sd N) longstub format(%9.3f) nototal
	collapse (mean) relative_offer_amount (mean) relative_mao, by(treatment cohort)
	bys treatment: tabstat relative_offer_amount relative_mao, by(cohort) s(mean) format(%9.3f)

	
//Table 11======================================================================

	//Table 11: All observations
	use "Sujarittanonta-Viriyavipart-Deterring-Collusion", clear
	bys treatment cohort period group: egen max_value=max(value)
	gen efficient_winner=value==max_value
	gen efficiency=winner==efficient_winner if efficient_winner==1
	gen gft=winner*value if winner==1
	gen max_gft=efficient_winner*value if efficient_winner==1
	gen payoff_proposer=payoff if role==1
	gen payoff_responder=payoff if role==0
	collapse (max) efficiency (max) gft (max) max_gft (max) revenue (max) payoff_proposer (max) payoff_responder, by(treatment cohort group period)
	recode * (.=0)
	collapse (mean) efficiency (mean) gft (sum) total_gft=gft (sum) max_gft (mean) revenue (mean) payoff_proposer (mean) payoff_responder, by(treatment cohort)
	gen rgft=total_gft/max_gft
	drop total_gft max_gft
	order treatment cohort efficiency rgft gft revenue payoff_proposer payoff_responder
	
	//Table 11: Offer accepted
	use "Sujarittanonta-Viriyavipart-Deterring-Collusion", clear
	bys treatment cohort period group: egen max_value=max(value)
	gen efficient_winner=value==max_value
	gen efficiency=winner==efficient_winner if efficient_winner==1
	gen gft=winner*value if winner==1
	gen max_gft=efficient_winner*value if efficient_winner==1
	gen payoff_proposer=payoff if role==1
	gen payoff_responder=payoff if role==0
	collapse (max) offer_accepted (max) efficiency (max) payoff_proposer (max) payoff_responder (max) gft ///
		(max) max_gft (max) revenue, by(treatment cohort group period)
	recode * (.=0)
	keep if offer_accepted==1
	collapse (mean) efficiency (mean) payoff_proposer (mean) payoff_responder (mean) gft (sum) total_gft=gft (sum) max_gft (mean) revenue  ///
		, by(treatment cohort)
	gen rgft=total_gft/max_gft
	drop total_gft max_gft
	order treatment cohort efficiency rgft gft revenue payoff_proposer payoff_responder