/* 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