--- title: "Partners or Strangers? Cooperation, Monetary Trade, and the Choice of Scale of Interaction" output: html_document date: '2023-01-27' --- ```{r setup, include=FALSE} # load packages library(haven) library(dplyr) library(tidyverse) library(ggplot2) library(ggpubr) library(knitr) library(Rtools) library(devtools) devtools::install_github("nicolash2/ggbrace") library(ggbrace) library(mfx) library(stargazer) knitr::opts_chunk$set(echo = TRUE) knitr::opts_chunk$set(error = TRUE) options(dplyr.summarise.inform = FALSE) ``` # R Markdown This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see . When you click the **Knit** button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this: # Overview: load data and set up all important variables ```{r} data <- read_dta("data/stata/elaborations/data_money_partners_strangers.dta") # only number of people in group given (2, 12 or 24), convert to group size small or large data$groupSize <- NA data$groupSize[data$numInGroup == 2] <- "partnership" data$groupSize[data$numInGroup > 2] <- "large" # define ResonseTime as sum over all response times data$ResponseTime = rowSums(data[33:42]) # delete unneccessary columns data <- data %>% dplyr::select(session, treatment, cycle, periodCycle, Subject, numInGroup, type, choice, otherChoice, outcome, Profit, order, pref, gender, groupSize, RightAnswers, ResponseTime) # impression of data view <- as.data.frame(data) head(view) ``` The variables are declared as follows: session: session of the experiment treatment: 1=token condition, 2=control cycle: cycle of the session, 6 cycles per session, where 1-4 are training phase periodCycle: periods in cycle, cycles end randomly after period 16 Subject: ID for person participating in the experiment type: 1=consumer, 2=producer choice: 0=no choice, for producer: 1=do not help, 2=give help, 3=give help if consumer gives token only for consumer: 4=keep ticket, 5=give ticket, 7=give ticket if producer gives help only otherChoice: choice of partner outcome: 0=no cooperation 1=cooperation Profit: profit in periodCycle order: order of group size in training (12-2-12-2 or 2-12-2-12), 0=start with large group 1=start with partnership pref: preference for large groups, 1=fixed pair, 2=random groups of 24 gender: 1=female, 2=male groupSize: partnership (2) or large (12 or 24) RightAnswers: amount of right answers in comprehension test on the experimental instructions ResponseTime: response time for all questions in comprehension test on the experimental instructions # CHAPTER A: TRAINING PHASE We want to analyze the difference between cooperation rates and efficiency and the willingness to help in token and control group. Result 1: Average cooperation rates were higher in partnerships than in large groups. However, partnerships did not create significantly more surplus. Result 2: In control give help (unconditional Z) was the predominant choice. Result 3: In tokens producers were reluctant to help without being concurrently compensated and most of them choose to give help only in exchange for a token. ```{r} # result 1 knitr::kable(data %>% # kable function for nicer output filter(cycle<=4 & periodCycle<=16) %>% # set cycle to training phase group_by(treatment, numInGroup) %>% # differentiate by treatment and group size summarize( cooperation = mean(outcome), efficiency = mean((Profit-4.5)/4.5) # normalize by 4.5 # 4.5 corresponds to payoff if no one cooperates (see p. 200 in paper) )) # result 2 bp1 <- data %>% filter(cycle<=4 & periodCycle<=16 & treatment==2) %>% # training, control filter(type==2) %>% # producer count(choice) %>% # get percentages of decisions mutate(freq=n/sum(n)) %>% group_by(choice) # 0.597 give help # make a barplot for illustration knitr::kable(bp1) bp1 <- as.data.frame(bp1) bp1$help <- ifelse(bp1$choice==1, "no help", "help") # rename for plot barplot(height=bp1$freq, names=bp1$help, xlab="Choice", ylab="Frequency of Choice") # result 3 bp2 <- data %>% filter(cycle<=4 & periodCycle<=16 & treatment==1) %>% # training, token filter((type==2 & otherChoice!=0) |(type==1 & choice != 0)) %>% # do not include no choice group_by(type) %>% count(choice) %>% # get percentages of decisions mutate(freq=n/sum(n)) %>% group_by(choice) # 0.634 of producers choose help if give knitr::kable(bp2) bp2 <- filter(bp2, type==2) bp2 <- as.data.frame(bp2) bp2$help <- ifelse(bp2$choice==1, "help", ifelse(bp2$choice==2, "no help", "help if token")) barplot(height=bp2$freq, names=bp2$help, xlab="Choice", ylab="Frequency of Choice") ``` # TABLE 4: HOW MONEY AND GROUP SIZE INFLUENCE EFFICIENCY Let us verify the observations by running a regression. We need cooperation and efficiency rates for tokens and control for the training phase as well as group sizes and transform all categorical variables to dummy variables. Then fit two regressions, one where cooperation is the dependent variable and one where efficiency is the dependent variable. ```{r results="asis"} # get data for training phase for token and control and group size data_t4 <- data %>% filter(cycle<=4 & periodCycle<=16) %>% group_by(treatment,groupSize, periodCycle, cycle) %>% summarize( cooperation = mean(outcome), efficiency = mean((Profit-4.5)/4.5) ) # transform in dummy variables with interaction for treatment and group size control <- ifelse(data_t4$treatment == 2, 1, 0) tokens <- ifelse(data_t4$treatment == 1, 1, 0) partnership <- ifelse(data_t4$groupSize == "partnership", 1, 0) large <- ifelse(data_t4$groupSize == "large", 1, 0) data_t4$tokens_x_small=tokens * partnership data_t4$tokens_x_large=tokens * large data_t4$control_x_large=control * large data_t4$c1<-ifelse(data_t4$cycle == 1, 1, 0) data_t4$c2<-ifelse(data_t4$cycle == 2, 1, 0) data_t4$c3<-ifelse(data_t4$cycle == 3, 1, 0) data_t4$c4<-ifelse(data_t4$cycle == 4, 1, 0) # delete dummy for cycle 4 as cycle 4 is a linear combination of cyles 1&2&3 data_t4 <- subset(data_t4, select = -c(c1)) # fit lm models m1 <- lm(cooperation ~ control_x_large + tokens_x_small + tokens_x_large + c2+c3+c4, data=data_t4) m2 <- lm(efficiency ~ control_x_large + tokens_x_small + tokens_x_large + c2+c3+c4, data=data_t4) # compare models in stargazer stargazer(m1, m2, type="html", colums.labels = c("Model 1", "Model 2") ) ``` We indeed see that cooperation rates in partnerships were higher than in groups, however, efficiency was higher in groups. We also see that participants in tokens selected to interact in large groups more frequently than in control. 0.557 of participants in tokens prefer large groups, but only 0.393 in control. ```{r} # result 2 knitr::kable(data %>% filter(cycle==4 | cycle==5) %>% # we want to look at cycles 5&6, # but prefs are expressed the cycle before, so filter cycles 4&5 group_by(treatment) %>% summarize( pref_for_large_groups = mean(pref-1, na.rm=TRUE) # -1 as pref is coded 1/2 )) # 0.557 vs 0.393 ``` # TABLE 5: SHARE OF PREFERENCE FOR LARGE GROUPS We want to explore the preference for large groups in control and token condition. Result 1: Over all cycles the preference for large groups is higher in tokens than in control. Result 2: Looking only at the selection phase, that is cycles 5 and 6, the preference for large groups was 0.432 and 0.354 in control and 0.574 and 0.542 in tokens. ```{r} # result 1 knitr::kable(data %>% group_by(treatment) %>% summarize( pref_for_large_groups = mean(pref-1, na.rm=TRUE) )) # 0.421 and 0.546 # result 2 # selection phase only, as choices are made the cycle before, filter for 4&5 instead of 5&6 bp3 <- data %>% filter(cycle==4 | cycle==5) %>% group_by(cycle,treatment) %>% summarize( pref_for_large_groups = mean(pref-1, na.rm=TRUE) ) # 0.432 and 0.573, 0.354 and 0.542 knitr::kable(bp3) bp3 <- filter(bp3, cycle==5) bp3 <- as.data.frame(bp3) bp3$treat <- ifelse(bp3$treatment==1, "token", "control") barplot(height=bp3$pref_for_large_groups, names=bp3$treat, xlab="Treatment", ylab="Mean preference for large groups") ``` We see that participants choose to interact in groups more frequently in tokens than in control. # TABLE 6: HOW MONEY AFFECTS PREFERENCES FOR LARGE GROUPS We want to show that the result above is robust to separately considering cycles 5 and 6 and controlling for order, sex and understanding of the experiment, expressed by the amount of right answers and the response time on the comprehension test. ```{r} data_t6 <- data %>% filter(cycle==4|cycle==5) %>% group_by(session, Subject, treatment, groupSize, cycle, order, RightAnswers, ResponseTime, gender) %>% summarize( pref_for_large_groups = mean(pref-1, na.rm=TRUE) ) # dummy coding data_t6$tokens = ifelse(data_t6$treatment == 2, 0, 1) data_t6$cycle6 = ifelse(data_t6$cycle == 5, 1, 0) # use probitmfx function for panel probit regression, cluster for sessions probitmfx(pref_for_large_groups ~ tokens + cycle6 + order + RightAnswers + ResponseTime + gender, clustervar1 = "session", data = data_t6) ``` The tokens coefficient is significant, meaning that subjects in tokens more often preferred to interact in large groups. # FIGURE 1: DISTRIBUTION OF HELP IMBALANCE As cooperation rates were not significantly different between conditions as seen above, the exposure to tokens must be the reason for the preference of large groups. We will show that the experience of full cooperation, that is, a subject received the same amount of help they gave, and help imbalance influenced the decisions for large groups. To compute the help imbalance we compare the times that a subject received help and the times they gave help. That is, we have an imbalance if the amount of giving and receiving help differed. Full cooperation is attained if help is always exchanged and the imbalance is 0. Help imbalance is -1 if help was always given but never received and +1 vice versa. While subjects have the ability to punish their counterpart for exploiting behaviour in partnerships, this is not possible in large groups where subjects are matched with new partners each time. The question is whether tokens can mitigate this exploitation hazard. Let us look at the plots for fixed pairs and large groups in control and tokens condition regarding the help imbalance. ```{r} # get data for individual graphs # top left # fixed pairs in control a = data %>% filter(cycle<=4 & periodCycle<=16 & treatment==2 & numInGroup==2) %>% group_by(Subject, session, cycle) %>% summarize( N_help_received=sum(outcome==1&type==1), N_help_given=sum(outcome==1&type==2), imbalance=(N_help_received-N_help_given)/8, # each cycle consists of 16 periods, where each subject is 8 times consumer and 8 times producer # therefore /8 to get shares full_coop=imbalance==0 & N_help_received/8==1, # share of help received==1 panel="a" ) # top right # fixed pairs in tokens b = data %>% filter(cycle<=4 & periodCycle<=16 & treatment==1 & numInGroup==2) %>% group_by(Subject, session, cycle) %>% summarize( N_help_received=sum(outcome==1&type==1), N_help_given=sum(outcome==1&type==2), imbalance=(N_help_received-N_help_given)/8, full_coop=imbalance==0 & N_help_received/8==1, panel="b" ) # bottom left # large groups in control c = data %>% filter(cycle<=4 & periodCycle<=16 & treatment==2 & numInGroup>2) %>% group_by(Subject, session, cycle) %>% summarize( N_help_received=sum(outcome==1&type==1), N_help_given=sum(outcome==1&type==2), imbalance=(N_help_received-N_help_given)/8, full_coop=imbalance==0 & N_help_received/8==1, panel="c" ) # bottom right # large groups in tokens d = data %>% filter(cycle<=4 & periodCycle<=16 & treatment==1 & numInGroup>2) %>% group_by(Subject, session, cycle) %>% summarize( N_help_received=sum(outcome==1&type==1), N_help_given=sum(outcome==1&type==2), imbalance=(N_help_received-N_help_given)/8, full_coop=imbalance==0 & N_help_received/8==1, panel="d" ) # combine data abcd = rbind(a,b,c,d) # count imbalance per panel hist_count <- abcd %>% group_by(panel, imbalance) %>% count(imbalance) # plot all graphs with shares of imbalance # use geom_brace from ggbrace package from github to plot nice braces with shares pa <- ggplot(data=a, aes(x=imbalance, fill=full_coop)) + geom_histogram(aes(y = after_stat(count / sum(count))), binwidth=0.125, center=0) + ylim(0,0.65) + ggtitle("Control condition") + ylab("Fixed pairs") + xlab("") + scale_fill_discrete("", labels=c("Partial or no cooperation", "Full cooperation")) + geom_brace(aes(c(-1,-0.1),c(0.2,0.22), # defines position and size of brace # get data from a where imb<0, compute share of imb<0 label=round(sum(hist_count$n[(hist_count$panel=="a")==1 & (hist_count$imbalance<0)==1])/sum(hist_count$n[(hist_count$panel=="a")]),3)), inherit.data=F, labelsize = 3) + geom_brace(aes(c(0.1,1),c(0.2,0.22), # get data from a where imb>0, compute share of imb>0 label=round(sum(hist_count$n[(hist_count$panel=="a")==1 & (hist_count$imbalance>0)==1])/sum(hist_count$n[(hist_count$panel=="a")]),3)), inherit.data=F, labelsize = 3) # repeat for b,c,d pb <- ggplot(data=b, aes(x=imbalance, fill=full_coop)) + geom_histogram(aes(y = after_stat(count / sum(count))), binwidth=0.125, center=0) + ylim(0,0.65) + ggtitle("Token condition") + ylab("") + xlab("") + geom_brace(aes(c(-1,-0.1),c(0.2,0.22), label=round(sum(hist_count$n[(hist_count$panel=="b")==1 & (hist_count$imbalance<0)==1])/sum(hist_count$n[(hist_count$panel=="b")]),3)), inherit.data=F, labelsize = 3) + geom_brace(aes(c(0.1,1),c(0.2,0.22), label=round(sum(hist_count$n[(hist_count$panel=="b")==1 & (hist_count$imbalance>0)==1])/sum(hist_count$n[(hist_count$panel=="b")]),3)), inherit.data=F, labelsize = 3) pc <- ggplot(data=c, aes(x=imbalance)) + geom_histogram(aes(y = after_stat(count / sum(count))), binwidth=0.125, center=0) + ylim(0,0.65) + xlab("Help imbalance") + ylab("Large groups") + geom_brace(aes(c(-1,-0.1),c(0.2,0.22), label=round(sum(hist_count$n[(hist_count$panel=="c")==1 & (hist_count$imbalance<0)==1])/sum(hist_count$n[(hist_count$panel=="c")]),3)), inherit.data=F, labelsize = 3) + geom_brace(aes(c(0.1,1),c(0.2,0.22), label=round(sum(hist_count$n[(hist_count$panel=="c")==1 & (hist_count$imbalance>0)==1])/sum(hist_count$n[(hist_count$panel=="c")]),3)), inherit.data=F, labelsize = 3) pd <- ggplot(data=d, aes(x=imbalance)) + geom_histogram(aes(y = after_stat(count / sum(count))), binwidth=0.125, center=0) + ylim(0,0.65) + xlab("Help imbalance") + ylab("") + geom_brace(aes(c(-1,-0.1),c(0.2,0.22), label=round(sum(hist_count$n[(hist_count$panel=="d")==1 & (hist_count$imbalance<0)==1])/sum(hist_count$n[(hist_count$panel=="d")]),3)), inherit.data=F, labelsize = 3) + geom_brace(aes(c(0.1,1),c(0.2,0.22), label=round(sum(hist_count$n[(hist_count$panel=="d")==1 & (hist_count$imbalance>0)==1])/sum(hist_count$n[(hist_count$panel=="d")]),3)), inherit.data=F, labelsize = 3) # combine all graphs and plot ggarrange( pa, pb, pc, pd, common.legend=TRUE, legend="bottom" ) # amount of 0 help imbalance knitr::kable(data %>% filter(cycle<=4 & periodCycle<=16) %>% group_by(treatment, groupSize, Subject, session, cycle) %>% summarize( N_help_received=sum(outcome==1&type==1), N_help_given=sum(outcome==1&type==2), imbalance=(N_help_received-N_help_given )/8 ) %>% group_by(treatment, groupSize) %>% count(treatment, imbalance==0) %>% # count how often 0 imb was attained per treatment summarize( share_imbalance_yes_vs_no = n/sum(n) # compute shares )) # 0.563 vs 0.156, 0.609 vs 0.299 ``` We see that a zero imbalance was more common in partnerships than large groups and also more common in tokens than control. Also note that in large groups more people were exploited than in large groups. # TABLE 7 Let us look at how the experiences during the training phase impacted the preference for large groups in the selection phase. Therefore look at the preferences for cycles 5 and 6 as well as experienced imbalances in pairs vs groups and experienced full cooperation rate. (I did not obtain the same result as in the paper, therefore these aggregations are likely not completely accurate.) ```{r} pref4 <- data %>% filter(cycle==4) %>% # choice for cycle 5 group_by(session, Subject) %>% summarize( pref4 = mean(pref-1, na.rm=TRUE) ) pref5 <- data %>% filter(cycle==5) %>% # choice for cycle 6 group_by(session, Subject) %>% summarize( pref5 = mean(pref-1, na.r=TRUE) ) imb <- data %>% filter(cycle<=4 & periodCycle<=16) %>% group_by(Subject, session) %>% summarize( treatment=treatment, N_gift_received=sum(outcome==1&type==1), N_gift_given=sum(outcome==1&type==2), imbalance=(N_gift_received - N_gift_given )/8 ) imb <- distinct(imb) fc <- data %>% filter(cycle<=4 & periodCycle<=16) %>% group_by(Subject, session) %>% summarize( full_coop=mean(outcome) ) merge1 <- merge(pref4, pref5, by=c("session", "Subject")) merge2 <- merge(merge1, imb, by=c("session", "Subject")) merge3 <- merge(merge2, fc, by=c("session", "Subject")) data_t7 <- data %>% filter(cycle==4|cycle==5) %>% filter(periodCycle<=16) %>% group_by(session, Subject, treatment, numInGroup, cycle, order, RightAnswers, ResponseTime, gender) %>% summarize( pref_for_large_groups = mean(pref-1, na.rm=TRUE) ) merge4 <- merge(merge3, data_t7, by=c("session", "Subject")) data_t7 <- merge4 tokens <- ifelse(data_t7$treatment.x == 1, 1, 0) cycle6 <- ifelse(data_t7$cycle == 5, 1, 0) data_t7$cycle6 <- ifelse(data_t7$cycle == 5, 1, 0) data_t7$tokens_x_cycle5=tokens * !cycle6 data_t7$tokens_x_cycle6=tokens * cycle6 full_coop_dummy <- ifelse(data_t7$full_coop >0, 1, 0) partnership <- ifelse(data_t7$numInGroup == 2, 1, 0) data_t7$full_coop2 <- full_coop_dummy * partnership data_t7$imbalance2 <- data_t7$imbalance * partnership data_t7$imbalance12 <- data_t7$imbalance * !partnership probitmfx(pref_for_large_groups ~ tokens_x_cycle5 +tokens_x_cycle6 + cycle6 + imbalance2 + imbalance12 + full_coop2 + order + RightAnswers + ResponseTime + gender, clustervar1 = "session", data = data_t7) ``` Note that although the coefficients are not the same as in the paper, they go in the same direction. Full_coop2 is the exception, however, the coefficient is not significant in this model. This regression shows that subjects who had a positive imbalance, that is, received more help than they gave, were more likely to choose large groups, while those that were exploited and had a negative help imbalance were more likely to prefer partnerships. This makes sense as in partnerships it is possible to directly punish the other player. # TABLE 8: HOW MONETARY TRADE AND GROUP SIZE INFLUENCE EFFICIENCY Lastly, we want to analyze differences in efficiency and cooperation rates between group sizes and treatment in the selection phase. Efficiency in partnerships are quite similar around 55% for both conditions, but in groups efficiency was significantly higher in tokens than in control. We run a linear regression for the selection phase where select treatment, group size, cycle and session from the data. ```{r} knitr::kable(data %>% filter(cycle==5|cycle==6) %>% # selection phase only filter(periodCycle<=16) %>% group_by(treatment, groupSize) %>% summarize( efficiency = mean((Profit-4.5)/4.5) )) data_t8 <- data %>% filter(cycle==5|cycle==6) %>% # selection phase only filter(periodCycle<=16) %>% group_by(treatment, groupSize, cycle, session) %>% summarize( cooperation = mean(outcome), efficiency = mean((Profit-4.5)/4.5) # normalize profit ) # dummy coding control <- ifelse(data_t8$treatment == 2, 1, 0) tokens <- ifelse(data_t8$treatment == 1, 1, 0) partnership <- ifelse(data_t8$groupSize == "partnership", 1, 0) large <- ifelse(data_t8$groupSize == "large", 1, 0) data_t8$tokens_x_small=tokens * partnership data_t8$tokens_x_large=tokens * large data_t8$control_x_large=control * large data_t8$cycle6 <- ifelse(data_t8$cycle == 6, 1, 0) # fit linear model t8 <- lm(efficiency ~ control_x_large + tokens_x_small + tokens_x_large + cycle6, data=data_t8) summary(t8) ``` The linear regression shows how efficiency varies with group sizes and treatment. The default condition is control and partnerships. We can verify that in partnerships efficiency was similar but in large groups a higher efficiency was attained in tokens. # TABLE 9: COOPERATION IN THE SELECTION PHASE Cooperation rates in partnerships are also quite similar at around 85% for both conditions, but in groups the average cooperation rate was significantly higher in tokens than in control. Using the same data as above we can also run a linear regression for cooperation rates. Again, the default condition is control and partnerships. ```{r} knitr::kable(data %>% filter(cycle==5|cycle==6) %>% # selection phase only filter(periodCycle<=16) %>% group_by(treatment, groupSize) %>% summarize( cooperation = mean(outcome) )) # fit linear model t9 <- lm(cooperation ~ control_x_large + tokens_x_small + tokens_x_large + cycle6, data=data_t8) summary(t9) ``` Our first impressions are again verified. In partnerships cooperation rates are statistically similar across conditions. We see that in both tokens and control cooperation rates drop when looking at large groups. However, they drop significantly lower in control than in tokens.