Funnel Statistics
Table 1: Summary of Results
This table presents an overview of funnel statistics at the ad-, chatbot-, and treatment-level.
Ad-level
All responses, regardless of treatment-level, are included. Note that here, we use the Facebook Ads definition of conversations.
ads %>%
mutate(cost_per_impression = form_cost(cost/impressions),
cost_per_consent = form_cost(cost/consents),
cost_per_click = form_cost(cost/clicks),
cost_per_completion = form_cost(cost/completions),
impressions = form_num(impressions),
clicks = form_num(clicks)) %>%
select("Ad" = ad_name,
"Impressions" = impressions,
"Clicks" = clicks,
"Conversations" = conversations,
"Consents" = consents,
"Completions" = completions,
"Cost per Impression" = cost_per_impression,
"Cost per Click" = cost_per_click,
"Cost per Consent" = cost_per_consent,
"Cost per Completion" = cost_per_completion) %>%
arrange(Ad) %>%
kable(escape = F) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
|
Ad
|
Impressions
|
Clicks
|
Conversations
|
Consents
|
Completions
|
Cost per Impression
|
Cost per Click
|
Cost per Consent
|
Cost per Completion
|
|
Attention 1
|
1,983
|
105
|
5
|
2
|
1
|
$0.04
|
$0.765
|
$40.155
|
$80.31
|
|
Attention 2
|
2,778
|
160
|
1
|
0
|
0
|
$0.03
|
$0.522
|
|
|
|
Fake
|
18,192
|
1,099
|
65
|
25
|
7
|
$0.042
|
$0.697
|
$30.644
|
$109.443
|
|
Fake News 1
|
1,148
|
97
|
1
|
0
|
0
|
$0.025
|
$0.301
|
|
|
|
Fake News 2
|
2,954
|
254
|
4
|
2
|
1
|
$0.019
|
$0.222
|
$28.17
|
$56.34
|
|
No Ad ID
|
|
|
5
|
4
|
2
|
|
|
|
|
|
Outrage 1
|
4,274
|
231
|
9
|
7
|
3
|
$0.037
|
$0.677
|
$22.353
|
$52.157
|
|
Outrage 2
|
12,629
|
711
|
25
|
11
|
4
|
$0.043
|
$0.767
|
$49.576
|
$136.335
|
|
Real 1
|
3,733
|
108
|
15
|
6
|
1
|
$0.027
|
$0.939
|
$16.908
|
$101.45
|
|
Real 2
|
6,185
|
305
|
13
|
3
|
2
|
$0.029
|
$0.595
|
$60.443
|
$90.665
|
Chatbot-level
All users who started a conversation are included.
Cost per Consent = total experiment costs / number of consents. Cost per Completion = total experiment costs / number of completions. Conversations = Number of chatfuel observations.
Note that here, we use the Chatfuel metric of conversations - the number of chatfuel observations. FB Ads Manager also records a conversations variable, but we assume the Chatfuel metric unless otherwise noted (i.e. in ads analyses).
total_cost <- sum(ads$cost, na.rm =T)
df %>%
select(intro_version, consent, full_completed) %>%
group_by(intro_version) %>%
# add consents and completions because they are binary
summarize(consents = sum(consent, na.rm = T),
completions = sum(full_completed, na.rm = T),
# number of chatfuel conversations
conversations = length(intro_version) ) %>%
mutate(cost_per_consent = form_cost(total_cost/consents),
cost_per_completion = form_cost(total_cost/completions),
treatment = "all") %>%
# Rename variables to titles
select("Chatbot" = intro_version,
"Treatment" = treatment,
"Conversations" = conversations,
"Consents" = consents,
"Completions" = completions,
"Cost per Consent" = cost_per_consent,
"Cost per Completion" = cost_per_completion
) %>%
kable(escape = F) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
|
Chatbot
|
Treatment
|
Conversations
|
Consents
|
Completions
|
Cost per Consent
|
Cost per Completion
|
|
1a
|
all
|
35
|
17
|
6
|
$117.647
|
$333.333
|
|
1b
|
all
|
36
|
20
|
8
|
$100
|
$250
|
|
2a
|
all
|
35
|
9
|
2
|
$222.222
|
$1000
|
|
2b
|
all
|
37
|
14
|
5
|
$142.857
|
$400
|
Treatment-level
All users who consented are included.
Cost per Consent = total experiment costs / consents. Cost per Completion = total experiment costs / completions.
# treatment level
df %>%
select(treatment, consent, full_completed) %>%
filter(treatment != "no treatment") %>%
group_by(treatment) %>%
summarize(consents = sum(consent, na.rm = T),
completions = sum(full_completed, na.rm = T)) %>%
mutate(cost_per_consent = form_cost(total_cost/consents),
cost_per_completion = form_cost(total_cost/completions),
treatment = label_fun(treatment)) %>%
# all treatments
rbind(df %>%
filter(!is.na(treatment)) %>%
select( consent, full_completed) %>%
summarize(consents = sum(consent, na.rm = T),
completions = sum(full_completed, na.rm = T)) %>%
mutate(cost_per_consent = form_cost(total_cost/consents),
cost_per_completion = form_cost(total_cost/completions),
treatment = "All")) %>%
# rename column names to titles
select("Treatment" = treatment,
"Consents" = consents,
"Completions" = completions,
"Cost per Consent" = cost_per_consent,
"Cost per Completion" = cost_per_completion) %>%
kable(escape = F) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
|
Treatment
|
Consents
|
Completions
|
Cost per Consent
|
Cost per Completion
|
|
Control
|
28
|
7
|
$71.429
|
$285.714
|
|
SMS
|
32
|
14
|
$62.5
|
$142.857
|
|
All
|
60
|
21
|
$33.333
|
$95.238
|
Table 2: Overall Funnel
This table shows the detailed funnel by all, treatment, and control participants. Here, “All” refers to all participants from the stage of ad impressions, including those who did not start a conversation or did not consent to participate in the study (these users were not assigned to an arm). “SMS participants” refer to consenting users who are assigned to the SMS intervention arm, and “Control participants” refer to consenting users who are assigned to the control arm.
Funnel Parameters
- Ad clickthrough (%) = #clicks / #impressions
- Conversation started (%) = #conversations / #clicks
- Consent obtained (%) = #consents / #conversations
- Treatment completed (%) = #forking section completed / # consents
- Outcome completed (%) = #outcome completed / #forking section completed
- Feedback completed (%) = #feedback section completed / #outcome completed
- Demographics Completed (%) = #demographic section completed / #feedback section completed
- Full survey completed (%) = #full survey completed / #demographic section completed
get_funnel <- function(group, ad = NULL){
# filter data for ad level analysis
if(!is.null(ad)){
df_temp <- df[df$ad_name == ad & !is.na(df$ad_name), ]
ads_temp <- ads[ads$ad_name == ad & !is.na(ads$ad_name), ]
} else{
df_temp <- df
ads_temp <- ads
}
# filter data for treatment level analysis
if(group == "sms"){
df_temp <- df_temp[df_temp$control == 0 & !is.na(df_temp$control), ]
} else if (group == "control"){
df_temp <- df_temp[df_temp$control == 1 & !is.na(df_temp$control), ]
} else if (group == "all"){
df_temp <- df_temp
}
# calculate total costs, impressions, clicks, and conversations
cost <- sum(ads_temp$cost, na.rm = T)
impressions <- sum(ads_temp$impressions, na.rm = T)
clicks <- sum(ads_temp$clicks, na.rm = T)
conversations <- nrow(df_temp)
consents <- sum(df_temp$consent, na.rm = T)
treatment_complete <- sum(df_temp$intervention_arms_completed) + sum(df_temp$control_arm_completed)
outcome_complete <- sum(!is.na(df_temp$sharing_misinfo), na.rm = T)
feedback_complete <- sum(df_temp$feedback_completed)
demog_complete <- sum(df_temp$demog_completed)
full_complete <- sum(df_temp$full_completed)
metric = c(
"Impressions",
"Ad Clickthrough",
"Conversation Started",
"Consent Obtained",
"Treatment Completed",
"Outcome Complete",
"Feedback Complete",
"Demographics Complete",
"Full Complete")
costs <- c(form_cost(cost/impressions),
form_cost(cost/clicks),
form_cost(cost/conversations),
form_cost(cost/consents),
form_cost(cost/treatment_complete),
form_cost(cost/outcome_complete),
form_cost(cost/feedback_complete),
form_cost(cost/demog_complete),
form_cost(cost/full_complete))
counts = c(scales::comma(impressions),
scales::comma(clicks),
scales::comma(conversations),
scales::comma(consents),
scales::comma(treatment_complete),
scales::comma(outcome_complete),
scales::comma(feedback_complete),
scales::comma(demog_complete),
scales::comma(full_complete))
percent = c(
# Impressions
"-",
# (1) Ad clickthrough (%) = #clicks / #impressions
form_percent(clicks / impressions),
# (2) Conversation started (%) = #conversations / #clicks
form_percent(conversations / clicks),
# (3) Consent obtained (%) = #consents / #conversations
form_percent(consents / conversations),
# (4) Core treatment completed (%) = #forking section completed / # consents
form_percent(treatment_complete / consents),
# (6) Demo questions completed (%) = #demographic section completed / #treatment section completed
form_percent(outcome_complete / treatment_complete),
# (7) Full survey completed (%) = #full chat completed / #demographic section completed
form_percent(feedback_complete / outcome_complete),
form_percent(demog_complete / feedback_complete),
form_percent(full_complete / demog_complete)
)
percent_of_impressions = c(
# Impressions
"-",
# (1) Ad clickthrough (%) = #clicks / #impressions
form_percent(clicks / impressions),
# (2) Conversation started (%) = #conversations / #clicks
form_percent(conversations / impressions),
# (3) Consent obtained (%) = #consents / #conversations
form_percent(consents / impressions),
# (5) Full treatment completed (%) = #treatment section completed / #forking section completed
form_percent(treatment_complete / impressions),
# (6) Demo questions completed (%) = #demographic section completed / #treatment section completed
form_percent(outcome_complete / impressions),
# (7) Full survey completed (%) = #full chat completed / #demographic section completed
form_percent(feedback_complete / impressions),
form_percent(demog_complete / impressions),
form_percent(full_complete / impressions)
)
percent_of_consents = c(
"-",
"-",
"-",
"-",
form_percent(treatment_complete / consents),
# (6) Demo questions completed (%) = #demographic section completed / #treatment section completed
form_percent(outcome_complete / consents),
# (7) Full survey completed (%) = #full chat completed / #demographic section completed
form_percent(feedback_complete / consents),
form_percent(demog_complete / consents),
form_percent(full_complete / consents)
)
if(group == "all" & is.null(ad)){
dropoff_1 <- data.frame(cbind(metric, counts, percent, percent_of_impressions, costs))
} else {
dropoff_1 <- data.frame(cbind(metric, counts, percent, percent_of_consents))
}
if(!is.null(ad)){
if(ad == "No Ad ID"){
dropoff_1[dropoff_1$metric == "Impressions", c("counts", "percent", "percent_of_consents") ] <- "-"
dropoff_1[dropoff_1$metric == "Ad Clickthrough", c("counts", "percent", "percent_of_consents")] <- "-"
dropoff_1[dropoff_1$metric == "Conversation Started", "percent"] <- "-"
}
}
if(group == "all" & is.null(ad)){
colnames(dropoff_1) <- c("Metric", "Number of Obs.",
"Percent of Previous", "Percent of Impressions", "Cost per Stage")
} else {
dropoff_1[dropoff_1$metric %in% c("Impressions", "Ad Clickthrough", "Conversation Started"), c("counts", "percent")] <- "-"
dropoff_1[dropoff_1$metric == "Consent Obtained", "percent"] <- "-"
colnames(dropoff_1) <- c("Metric", "Number of Obs.",
"Percent of Previous", "Percent of Consents")
}
print(kable(dropoff_1) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive")))
}
All Participants
get_funnel(group = "all")
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Impressions
|
Cost per Stage
|
|
Impressions
|
53,876
|
|
|
$0.037
|
|
Ad Clickthrough
|
3,070
|
5.7%
|
5.7%
|
$0.651
|
|
Conversation Started
|
143
|
4.66%
|
0.27%
|
$13.986
|
|
Consent Obtained
|
60
|
41.96%
|
0.11%
|
$33.333
|
|
Treatment Completed
|
35
|
58.33%
|
0.06%
|
$57.143
|
|
Outcome Complete
|
29
|
82.86%
|
0.05%
|
$68.966
|
|
Feedback Complete
|
24
|
82.76%
|
0.04%
|
$83.333
|
|
Demographics Complete
|
22
|
91.67%
|
0.04%
|
$90.909
|
|
Full Complete
|
21
|
95.45%
|
0.04%
|
$95.238
|
SMS Participants
get_funnel("sms")
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
32
|
|
|
|
Treatment Completed
|
18
|
56.25%
|
56.25%
|
|
Outcome Complete
|
16
|
88.89%
|
50%
|
|
Feedback Complete
|
14
|
87.5%
|
43.75%
|
|
Demographics Complete
|
14
|
100%
|
43.75%
|
|
Full Complete
|
14
|
100%
|
43.75%
|
Control Participants
get_funnel("control")
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
28
|
|
|
|
Treatment Completed
|
17
|
60.71%
|
60.71%
|
|
Outcome Complete
|
13
|
76.47%
|
46.43%
|
|
Feedback Complete
|
10
|
76.92%
|
35.71%
|
|
Demographics Complete
|
8
|
80%
|
28.57%
|
|
Full Complete
|
7
|
87.5%
|
25%
|
Table 3: Ad Split
This table shows the detailed funnel by ad split for all, treatment, and control participants. Here, “All” refers to all participants from the stage of ad impressions, including those who did not start a conversation or did not consent to participate in the study (these users were not assigned to an arm).
df <- merge(df, ads[, c("ad_id", "ad_name")], by = "ad_id", all.x = T)
for(i in sort(unique(df$ad_name))) {
cat("###", "Ad", i, "{.tabset} \n")
for(j in c("all", "sms", "control")){
cat("####", paste(label_fun(j), "Participants", sep = " "), " \n")
print(get_funnel(ad = i, group = j))
cat(" \n")
}
cat(" \n")
}
Ad Attention 1
All Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
2
|
|
|
|
Treatment Completed
|
2
|
100%
|
100%
|
|
Outcome Complete
|
2
|
100%
|
100%
|
|
Feedback Complete
|
2
|
100%
|
100%
|
|
Demographics Complete
|
2
|
100%
|
100%
|
|
Full Complete
|
1
|
50%
|
50%
|
NULL
SMS Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
1
|
|
|
|
Treatment Completed
|
1
|
100%
|
100%
|
|
Outcome Complete
|
1
|
100%
|
100%
|
|
Feedback Complete
|
1
|
100%
|
100%
|
|
Demographics Complete
|
1
|
100%
|
100%
|
|
Full Complete
|
1
|
100%
|
100%
|
NULL
Control Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
1
|
|
|
|
Treatment Completed
|
1
|
100%
|
100%
|
|
Outcome Complete
|
1
|
100%
|
100%
|
|
Feedback Complete
|
1
|
100%
|
100%
|
|
Demographics Complete
|
1
|
100%
|
100%
|
|
Full Complete
|
0
|
0%
|
0%
|
NULL
Ad Attention 2
All Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
0
|
|
|
|
Treatment Completed
|
0
|
|
|
|
Outcome Complete
|
0
|
|
|
|
Feedback Complete
|
0
|
|
|
|
Demographics Complete
|
0
|
|
|
|
Full Complete
|
0
|
|
|
NULL
SMS Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
0
|
|
|
|
Treatment Completed
|
0
|
|
|
|
Outcome Complete
|
0
|
|
|
|
Feedback Complete
|
0
|
|
|
|
Demographics Complete
|
0
|
|
|
|
Full Complete
|
0
|
|
|
NULL
Control Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
0
|
|
|
|
Treatment Completed
|
0
|
|
|
|
Outcome Complete
|
0
|
|
|
|
Feedback Complete
|
0
|
|
|
|
Demographics Complete
|
0
|
|
|
|
Full Complete
|
0
|
|
|
NULL
Ad Fake
All Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
25
|
|
|
|
Treatment Completed
|
11
|
44%
|
44%
|
|
Outcome Complete
|
8
|
72.73%
|
32%
|
|
Feedback Complete
|
8
|
100%
|
32%
|
|
Demographics Complete
|
7
|
87.5%
|
28%
|
|
Full Complete
|
7
|
100%
|
28%
|
NULL
SMS Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
11
|
|
|
|
Treatment Completed
|
5
|
45.45%
|
45.45%
|
|
Outcome Complete
|
4
|
80%
|
36.36%
|
|
Feedback Complete
|
4
|
100%
|
36.36%
|
|
Demographics Complete
|
4
|
100%
|
36.36%
|
|
Full Complete
|
4
|
100%
|
36.36%
|
NULL
Control Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
14
|
|
|
|
Treatment Completed
|
6
|
42.86%
|
42.86%
|
|
Outcome Complete
|
4
|
66.67%
|
28.57%
|
|
Feedback Complete
|
4
|
100%
|
28.57%
|
|
Demographics Complete
|
3
|
75%
|
21.43%
|
|
Full Complete
|
3
|
100%
|
21.43%
|
NULL
Ad Fake News 1
All Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
0
|
|
|
|
Treatment Completed
|
0
|
|
|
|
Outcome Complete
|
0
|
|
|
|
Feedback Complete
|
0
|
|
|
|
Demographics Complete
|
0
|
|
|
|
Full Complete
|
0
|
|
|
NULL
SMS Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
0
|
|
|
|
Treatment Completed
|
0
|
|
|
|
Outcome Complete
|
0
|
|
|
|
Feedback Complete
|
0
|
|
|
|
Demographics Complete
|
0
|
|
|
|
Full Complete
|
0
|
|
|
NULL
Control Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
0
|
|
|
|
Treatment Completed
|
0
|
|
|
|
Outcome Complete
|
0
|
|
|
|
Feedback Complete
|
0
|
|
|
|
Demographics Complete
|
0
|
|
|
|
Full Complete
|
0
|
|
|
NULL
Ad Fake News 2
All Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
2
|
|
|
|
Treatment Completed
|
1
|
50%
|
50%
|
|
Outcome Complete
|
1
|
100%
|
50%
|
|
Feedback Complete
|
1
|
100%
|
50%
|
|
Demographics Complete
|
1
|
100%
|
50%
|
|
Full Complete
|
1
|
100%
|
50%
|
NULL
SMS Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
2
|
|
|
|
Treatment Completed
|
1
|
50%
|
50%
|
|
Outcome Complete
|
1
|
100%
|
50%
|
|
Feedback Complete
|
1
|
100%
|
50%
|
|
Demographics Complete
|
1
|
100%
|
50%
|
|
Full Complete
|
1
|
100%
|
50%
|
NULL
Control Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
0
|
|
|
|
Treatment Completed
|
0
|
|
|
|
Outcome Complete
|
0
|
|
|
|
Feedback Complete
|
0
|
|
|
|
Demographics Complete
|
0
|
|
|
|
Full Complete
|
0
|
|
|
NULL
Ad No Ad ID
All Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
4
|
|
|
|
Treatment Completed
|
2
|
50%
|
50%
|
|
Outcome Complete
|
2
|
100%
|
50%
|
|
Feedback Complete
|
2
|
100%
|
50%
|
|
Demographics Complete
|
2
|
100%
|
50%
|
|
Full Complete
|
2
|
100%
|
50%
|
NULL
SMS Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
4
|
|
|
|
Treatment Completed
|
2
|
50%
|
50%
|
|
Outcome Complete
|
2
|
100%
|
50%
|
|
Feedback Complete
|
2
|
100%
|
50%
|
|
Demographics Complete
|
2
|
100%
|
50%
|
|
Full Complete
|
2
|
100%
|
50%
|
NULL
Control Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
0
|
|
|
|
Treatment Completed
|
0
|
|
|
|
Outcome Complete
|
0
|
|
|
|
Feedback Complete
|
0
|
|
|
|
Demographics Complete
|
0
|
|
|
|
Full Complete
|
0
|
|
|
NULL
Ad Outrage 1
All Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
7
|
|
|
|
Treatment Completed
|
5
|
71.43%
|
71.43%
|
|
Outcome Complete
|
5
|
100%
|
71.43%
|
|
Feedback Complete
|
3
|
60%
|
42.86%
|
|
Demographics Complete
|
3
|
100%
|
42.86%
|
|
Full Complete
|
3
|
100%
|
42.86%
|
NULL
SMS Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
4
|
|
|
|
Treatment Completed
|
3
|
75%
|
75%
|
|
Outcome Complete
|
3
|
100%
|
75%
|
|
Feedback Complete
|
2
|
66.67%
|
50%
|
|
Demographics Complete
|
2
|
100%
|
50%
|
|
Full Complete
|
2
|
100%
|
50%
|
NULL
Control Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
3
|
|
|
|
Treatment Completed
|
2
|
66.67%
|
66.67%
|
|
Outcome Complete
|
2
|
100%
|
66.67%
|
|
Feedback Complete
|
1
|
50%
|
33.33%
|
|
Demographics Complete
|
1
|
100%
|
33.33%
|
|
Full Complete
|
1
|
100%
|
33.33%
|
NULL
Ad Outrage 2
All Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
11
|
|
|
|
Treatment Completed
|
6
|
54.55%
|
54.55%
|
|
Outcome Complete
|
5
|
83.33%
|
45.45%
|
|
Feedback Complete
|
4
|
80%
|
36.36%
|
|
Demographics Complete
|
4
|
100%
|
36.36%
|
|
Full Complete
|
4
|
100%
|
36.36%
|
NULL
SMS Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
7
|
|
|
|
Treatment Completed
|
4
|
57.14%
|
57.14%
|
|
Outcome Complete
|
4
|
100%
|
57.14%
|
|
Feedback Complete
|
3
|
75%
|
42.86%
|
|
Demographics Complete
|
3
|
100%
|
42.86%
|
|
Full Complete
|
3
|
100%
|
42.86%
|
NULL
Control Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
4
|
|
|
|
Treatment Completed
|
2
|
50%
|
50%
|
|
Outcome Complete
|
1
|
50%
|
25%
|
|
Feedback Complete
|
1
|
100%
|
25%
|
|
Demographics Complete
|
1
|
100%
|
25%
|
|
Full Complete
|
1
|
100%
|
25%
|
NULL
Ad Real 1
All Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
6
|
|
|
|
Treatment Completed
|
5
|
83.33%
|
83.33%
|
|
Outcome Complete
|
3
|
60%
|
50%
|
|
Feedback Complete
|
2
|
66.67%
|
33.33%
|
|
Demographics Complete
|
1
|
50%
|
16.67%
|
|
Full Complete
|
1
|
100%
|
16.67%
|
NULL
SMS Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
2
|
|
|
|
Treatment Completed
|
1
|
50%
|
50%
|
|
Outcome Complete
|
0
|
0%
|
0%
|
|
Feedback Complete
|
0
|
|
0%
|
|
Demographics Complete
|
0
|
|
0%
|
|
Full Complete
|
0
|
|
0%
|
NULL
Control Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
4
|
|
|
|
Treatment Completed
|
4
|
100%
|
100%
|
|
Outcome Complete
|
3
|
75%
|
75%
|
|
Feedback Complete
|
2
|
66.67%
|
50%
|
|
Demographics Complete
|
1
|
50%
|
25%
|
|
Full Complete
|
1
|
100%
|
25%
|
NULL
Ad Real 2
All Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
3
|
|
|
|
Treatment Completed
|
3
|
100%
|
100%
|
|
Outcome Complete
|
3
|
100%
|
100%
|
|
Feedback Complete
|
2
|
66.67%
|
66.67%
|
|
Demographics Complete
|
2
|
100%
|
66.67%
|
|
Full Complete
|
2
|
100%
|
66.67%
|
NULL
SMS Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
1
|
|
|
|
Treatment Completed
|
1
|
100%
|
100%
|
|
Outcome Complete
|
1
|
100%
|
100%
|
|
Feedback Complete
|
1
|
100%
|
100%
|
|
Demographics Complete
|
1
|
100%
|
100%
|
|
Full Complete
|
1
|
100%
|
100%
|
NULL
Control Participants
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
|
Impressions
|
|
|
|
|
Ad Clickthrough
|
|
|
|
|
Conversation Started
|
|
|
|
|
Consent Obtained
|
2
|
|
|
|
Treatment Completed
|
2
|
100%
|
100%
|
|
Outcome Complete
|
2
|
100%
|
100%
|
|
Feedback Complete
|
1
|
50%
|
50%
|
|
Demographics Complete
|
1
|
100%
|
50%
|
|
Full Complete
|
1
|
100%
|
50%
|
NULL
Table 4: Chatbot Split
This table shows the detailed funnel by chatbot split. Note that all users who started a conversation are included.
get_stat_by_chatbot = function(chatbot_num) {
df_ads <- df[df$intro_version %in% chatbot_num,]
conversations <- nrow(df_ads)
consents <- sum(df_ads$consent, na.rm = T)
treatment_complete <- sum(df_ads$intervention_arms_completed) + sum(df_ads$control_arm_completed)
outcome_complete <- sum(!is.na(df_ads$sharing_misinfo), na.rm = T)
feedback_complete <- sum(df_ads$feedback_completed)
demog_complete <- sum(df_ads$demog_completed)
full_complete <- sum(df_ads$full_completed)
metric = c(
"Conversation Started",
"Consent Obtained",
"Treatment Completed",
"Outcome Complete",
"Feedback Complete",
"Demographics Complete",
"Full Complete")
costs <- c("-",
"-",
"-",
"-",
"-",
"-",
"-")
counts = c(conversations,
consents,
treatment_complete,
outcome_complete,
feedback_complete,
demog_complete,
full_complete)
prop = c( NA,
consents/conversations,
treatment_complete/consents,
outcome_complete/treatment_complete,
feedback_complete/outcome_complete,
demog_complete/feedback_complete,
full_complete/demog_complete
)
percent_of_consents <- c("-", "-",
form_percent(treatment_complete / consents),
form_percent(outcome_complete / consents),
form_percent(feedback_complete / consents),
form_percent(demog_complete / consents),
form_percent(full_complete / consents))
percent <- unlist(lapply(prop, form_percent))
final_counts <- unlist(lapply(counts, scales::comma))
dropoff_1 <- cbind("Metric" = metric,
final_counts, percent, percent_of_consents, costs
)
## prop table
proportion_table <- as.data.frame(
cbind("Metric" = c("Consents",
"Treatment Complete",
"Full Complete"),
"Numerator" = c(consents, treatment_complete, full_complete),
"Denominator" = c(conversations, consents, consents)))
colnames(dropoff_1) <- c(
"Metric",
"Number of Obs.",
"Percent of Previous",
"Percent of Consents",
"Cost")
return(list(dropoff_1, proportion_table))
}
Chatbot 1a
get_stat_by_chatbot("1a")[[1]] %>%
kable() %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
Cost
|
|
Conversation Started
|
35
|
|
|
|
|
Consent Obtained
|
17
|
48.57%
|
|
|
|
Treatment Completed
|
12
|
70.59%
|
70.59%
|
|
|
Outcome Complete
|
8
|
66.67%
|
47.06%
|
|
|
Feedback Complete
|
8
|
100%
|
47.06%
|
|
|
Demographics Complete
|
6
|
75%
|
35.29%
|
|
|
Full Complete
|
6
|
100%
|
35.29%
|
|
Chatbot 1b
get_stat_by_chatbot("1b")[[1]] %>%
kable() %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
Cost
|
|
Conversation Started
|
36
|
|
|
|
|
Consent Obtained
|
20
|
55.56%
|
|
|
|
Treatment Completed
|
11
|
55%
|
55%
|
|
|
Outcome Complete
|
11
|
100%
|
55%
|
|
|
Feedback Complete
|
9
|
81.82%
|
45%
|
|
|
Demographics Complete
|
9
|
100%
|
45%
|
|
|
Full Complete
|
8
|
88.89%
|
40%
|
|
Chatbot 2a
get_stat_by_chatbot("2a")[[1]] %>%
kable() %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
Cost
|
|
Conversation Started
|
35
|
|
|
|
|
Consent Obtained
|
9
|
25.71%
|
|
|
|
Treatment Completed
|
4
|
44.44%
|
44.44%
|
|
|
Outcome Complete
|
3
|
75%
|
33.33%
|
|
|
Feedback Complete
|
2
|
66.67%
|
22.22%
|
|
|
Demographics Complete
|
2
|
100%
|
22.22%
|
|
|
Full Complete
|
2
|
100%
|
22.22%
|
|
Chatbot 2b
get_stat_by_chatbot("2b")[[1]] %>%
kable() %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
|
Metric
|
Number of Obs.
|
Percent of Previous
|
Percent of Consents
|
Cost
|
|
Conversation Started
|
37
|
|
|
|
|
Consent Obtained
|
14
|
37.84%
|
|
|
|
Treatment Completed
|
8
|
57.14%
|
57.14%
|
|
|
Outcome Complete
|
7
|
87.5%
|
50%
|
|
|
Feedback Complete
|
5
|
71.43%
|
35.71%
|
|
|
Demographics Complete
|
5
|
100%
|
35.71%
|
|
|
Full Complete
|
5
|
100%
|
35.71%
|
|
Proportional Tests for Chatbots
In this table, we use a proportion test to compare the difference in means between chatbots. The chatbots are defined as follows:
| 1a |
Consent only |
no factoid |
no motivator |
| 1b |
Motivator |
no factoid |
motivator |
| 2a |
Factoid 1 |
factoid 1 |
no motivator |
| 2b |
Factoid 2 |
factoid 2 |
no motivator |
Metrics:
Consent Rate = #consents/ #conversations started
Treatment Completion Rate = #treatment section completed / #consents
Full Chatbot Completion Rate = #full chatbot completed / #consents
prop_out <- function(chatbot1, chatbot2){
props1 <- get_stat_by_chatbot(chatbot1)[[2]]
props2 <- get_stat_by_chatbot(chatbot2)[[2]]
out <- list()
for(metric in unique(props1$Metric)){
x1 = as.numeric(props1[props1$Metric == metric, "Numerator"])
x2 = as.numeric(props2[props2$Metric == metric, "Numerator"])
n1 = as.numeric(props1[props1$Metric == metric, "Denominator"])
n2 = as.numeric(props2[props2$Metric == metric, "Denominator"])
prop_test <- stats::prop.test(x = c(x1, x2), n = c(n1, n2), conf.level = 0.95, correct = F)
mean_difference <-paste(round_4(prop_test$estimate[1] - prop_test$estimate[2]))
se_difference <- round_4(sqrt((x1/n1)*(1 - (x1/n1))/n1 + (x2/n2)*(1 - (x2/n2))/n2))
p_val <- round_4(prop_test$p.value)
ci <- paste("(", paste(round_4(prop_test$conf.int), collapse = ", "), ")", sep = "")
if(metric == "Consents"){
metric <- "Consent Rate"
} else if(metric == "Treatment Complete"){
metric <- "Treatment Completion Rate"
} else if(metric == "Full Complete"){
metric <- "Full Chatbot Completion Rate"
}
out[[metric]] <- list(`Metric` = metric,
`Mean Difference` = mean_difference, `SE of the Difference` = se_difference, `p-value` = p_val, `95% Confidence Interval` = ci)
}
final <- as.data.frame(do.call(rbind, out))
return(final)
}
Consent Only Chatbot (1a) vs. Motivator Chatbot (1b)
Note: Mean Difference = 1a - 1b. Here, a positive mean difference indicates that 1a has a higher proportion than 1b, while a negative mean difference indicates that 1a has a smaller proportion than 1b. In other words, a positive mean difference indicates that 1a better performance than 1b, while and a negative mean difference indicates that 1b better performance than 1a.
prop_out("1a", "1b") %>%
kable(row.names = F) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
|
Metric
|
Mean Difference
|
SE of the Difference
|
p-value
|
95% Confidence Interval
|
|
Consent Rate
|
-0.0698
|
0.1183
|
0.5559
|
(-0.3017, 0.1620)
|
|
Treatment Completion Rate
|
0.1559
|
0.1568
|
0.3299
|
(-0.1514, 0.4632)
|
|
Full Chatbot Completion Rate
|
-0.0471
|
0.1595
|
0.7687
|
(-0.3596, 0.2655)
|
Consent Only Chatbot (1a) vs. Factoid 1 + Factoid 2 (2a + 2b)
Note: Mean Difference = 1a - (2a & 2b). A positive mean difference indicates that 1a better performance than 2a and 2b, while and a negative mean difference indicates that 2a and 2b better performance than 1a.
prop_out("1a", c("2a", "2b")) %>%
kable(row.names = F) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
|
Metric
|
Mean Difference
|
SE of the Difference
|
p-value
|
95% Confidence Interval
|
|
Consent Rate
|
0.1663
|
0.1008
|
0.0954
|
(-0.0313, 0.3638)
|
|
Treatment Completion Rate
|
0.1841
|
0.1519
|
0.2399
|
(-0.1135, 0.4818)
|
|
Full Chatbot Completion Rate
|
0.0486
|
0.1505
|
0.7457
|
(-0.2463, 0.3435)
|
Factoid 1 (2a) vs. Factoid 2 (2b)
Note: Mean Difference = 2a - 2b. A positive mean difference indicates that 2a better performance than 2b, while and a negative mean difference indicates that 2b better performance than 2a.
prop_out("2a", "2b") %>%
kable(row.names = F) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
|
Metric
|
Mean Difference
|
SE of the Difference
|
p-value
|
95% Confidence Interval
|
|
Consent Rate
|
-0.1212
|
0.1087
|
0.2701
|
(-0.3343, 0.0918)
|
|
Treatment Completion Rate
|
-0.1270
|
0.2120
|
0.5518
|
(-0.5424, 0.2885)
|
|
Full Chatbot Completion Rate
|
-0.1349
|
0.1887
|
0.4925
|
(-0.5047, 0.2349)
|
Chatbot-Treatment Questionwise Funnel
detailed_funnel_fun <- function(x){
if(any(is.na(x))){
sum(!is.na(x))
} else {
if(is.numeric(x)){
sum(x)
} else {
sum(!is.na(x))
}
}
}
for(treat in c("sms", "control")){
cat("###", paste(label_fun(treat), "{.tabset}", sep = " "), " \n")
for(chatbot in c("1a", "1b", "2a", "2b")){
cat("####", paste("Chatbot", chatbot, sep = " "), " \n")
filter_treat <- ifelse(treat == "control", 1, 0)
plot_df <- df %>%
filter(intro_version == chatbot & control == filter_treat) %>%
select(detailed_funnel[detailed_funnel$treatment == treat & detailed_funnel$version == chatbot, "variable"] %>%pull()) %>%
summarize_all(.funs =detailed_funnel_fun) %>%
pivot_longer(cols = everything(), values_to = "count") %>%
mutate(perc_of_consents = count/pull(.[.$name == "consent", "count"]))
consents <- plot_df %>% filter(name == "consent") %>% pull(count)
gg <- plot_df %>%
mutate(name = factor(name, levels = rev(name))) %>%
ggplot(aes(x = name, y = perc_of_consents, group = 1)) +
geom_point(size = 3) +
geom_line() +
coord_flip() +
theme_sarah() +
labs(x= "",
y = "Percent of Conversations",
title = paste("Number of Consents:", consents)) +
scale_y_continuous(limits = c(0, 1),
breaks = seq(0, 1, by = 0.2),
labels = scales::percent_format(accuracy = 1))
plot_df %>%
mutate(perc_of_consents = form_percent(perc_of_consents)) %>%
kable(col.names = c("Variable", "Number. of Obs", "Percent of Consents")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
print()
print(gg)
cat(" \n\n\n")
}
cat(" \n\n\n")
}
SMS
Chatbot 1a
|
Variable
|
Number. of Obs
|
Percent of Consents
|
|
cont_0
|
6
|
66.67%
|
|
consent
|
9
|
100%
|
|
what_bother
|
9
|
100%
|
|
self_affirmation_continue
|
8
|
88.89%
|
|
intro_go_on
|
5
|
55.56%
|
|
sms_quiz
|
5
|
55.56%
|
|
family_friend_check
|
4
|
44.44%
|
|
fear_quiz
|
4
|
44.44%
|
|
anger_quiz
|
4
|
44.44%
|
|
try_me
|
4
|
44.44%
|
|
headline1_answer
|
4
|
44.44%
|
|
headline2_answer
|
4
|
44.44%
|
|
per_unfollow
|
4
|
44.44%
|
|
dog_or_cat
|
4
|
44.44%
|
|
outcome_proxy_quiz1
|
4
|
44.44%
|
|
outcome_proxy_quiz2
|
4
|
44.44%
|
|
outcome_proxy_quiz3
|
4
|
44.44%
|
|
enjoy_most
|
4
|
44.44%
|
|
enjoy_least
|
4
|
44.44%
|
|
user_comments
|
4
|
44.44%
|
|
has_technical_issues
|
4
|
44.44%
|
|
demog_age
|
4
|
44.44%
|
|
demog_gender
|
4
|
44.44%
|
|
demog_race
|
4
|
44.44%
|
|
demog_ethnicity
|
4
|
44.44%
|
|
demog_income
|
3
|
33.33%
|
|
demog_education
|
4
|
44.44%
|
|
demog_political
|
4
|
44.44%
|
|
share_chatbot
|
4
|
44.44%
|

Chatbot 1b
|
Variable
|
Number. of Obs
|
Percent of Consents
|
|
cont_0
|
11
|
78.57%
|
|
consent
|
14
|
100%
|
|
what_bother
|
14
|
100%
|
|
self_affirmation_continue
|
13
|
92.86%
|
|
intro_go_on
|
10
|
71.43%
|
|
sms_quiz
|
10
|
71.43%
|
|
family_friend_check
|
9
|
64.29%
|
|
fear_quiz
|
8
|
57.14%
|
|
anger_quiz
|
8
|
57.14%
|
|
try_me
|
7
|
50%
|
|
headline1_answer
|
7
|
50%
|
|
headline2_answer
|
7
|
50%
|
|
per_unfollow
|
7
|
50%
|
|
dog_or_cat
|
7
|
50%
|
|
outcome_proxy_quiz1
|
7
|
50%
|
|
outcome_proxy_quiz2
|
7
|
50%
|
|
outcome_proxy_quiz3
|
7
|
50%
|
|
enjoy_most
|
7
|
50%
|
|
enjoy_least
|
6
|
42.86%
|
|
user_comments
|
6
|
42.86%
|
|
has_technical_issues
|
6
|
42.86%
|
|
demog_age
|
6
|
42.86%
|
|
demog_gender
|
6
|
42.86%
|
|
demog_race
|
6
|
42.86%
|
|
demog_ethnicity
|
6
|
42.86%
|
|
demog_income
|
6
|
42.86%
|
|
demog_education
|
6
|
42.86%
|
|
demog_political
|
6
|
42.86%
|
|
share_chatbot
|
6
|
42.86%
|

Chatbot 2a
|
Variable
|
Number. of Obs
|
Percent of Consents
|
|
eiffel_continue
|
1
|
100%
|
|
cont_1
|
1
|
100%
|
|
cont_2
|
1
|
100%
|
|
cont_3
|
1
|
100%
|
|
cont_4
|
1
|
100%
|
|
cont_5
|
1
|
100%
|
|
cont_6
|
1
|
100%
|
|
consent
|
1
|
100%
|
|
what_bother
|
1
|
100%
|
|
self_affirmation_continue
|
1
|
100%
|
|
intro_go_on
|
1
|
100%
|
|
sms_quiz
|
1
|
100%
|
|
family_friend_check
|
1
|
100%
|
|
fear_quiz
|
1
|
100%
|
|
anger_quiz
|
1
|
100%
|
|
try_me
|
0
|
0%
|
|
headline1_answer
|
0
|
0%
|
|
headline2_answer
|
0
|
0%
|
|
per_unfollow
|
0
|
0%
|
|
dog_or_cat
|
0
|
0%
|
|
outcome_proxy_quiz1
|
0
|
0%
|
|
outcome_proxy_quiz2
|
0
|
0%
|
|
outcome_proxy_quiz3
|
0
|
0%
|
|
enjoy_most
|
0
|
0%
|
|
enjoy_least
|
0
|
0%
|
|
user_comments
|
0
|
0%
|
|
has_technical_issues
|
0
|
0%
|
|
demog_age
|
0
|
0%
|
|
demog_gender
|
0
|
0%
|
|
demog_race
|
0
|
0%
|
|
demog_ethnicity
|
0
|
0%
|
|
demog_income
|
0
|
0%
|
|
demog_education
|
0
|
0%
|
|
demog_political
|
0
|
0%
|
|
share_chatbot
|
0
|
0%
|

Chatbot 2b
|
Variable
|
Number. of Obs
|
Percent of Consents
|
|
flight_continue
|
8
|
100%
|
|
cont_1
|
8
|
100%
|
|
cont_2
|
8
|
100%
|
|
cont_3
|
8
|
100%
|
|
cont_4
|
8
|
100%
|
|
cont_5
|
8
|
100%
|
|
cont_6
|
8
|
100%
|
|
consent
|
8
|
100%
|
|
what_bother
|
8
|
100%
|
|
self_affirmation_continue
|
7
|
87.5%
|
|
intro_go_on
|
6
|
75%
|
|
sms_quiz
|
6
|
75%
|
|
family_friend_check
|
6
|
75%
|
|
fear_quiz
|
6
|
75%
|
|
anger_quiz
|
6
|
75%
|
|
try_me
|
6
|
75%
|
|
headline1_answer
|
6
|
75%
|
|
headline2_answer
|
6
|
75%
|
|
per_unfollow
|
6
|
75%
|
|
dog_or_cat
|
5
|
62.5%
|
|
outcome_proxy_quiz1
|
5
|
62.5%
|
|
outcome_proxy_quiz2
|
5
|
62.5%
|
|
outcome_proxy_quiz3
|
5
|
62.5%
|
|
enjoy_most
|
5
|
62.5%
|
|
enjoy_least
|
4
|
50%
|
|
user_comments
|
4
|
50%
|
|
has_technical_issues
|
4
|
50%
|
|
demog_age
|
4
|
50%
|
|
demog_gender
|
4
|
50%
|
|
demog_race
|
4
|
50%
|
|
demog_ethnicity
|
4
|
50%
|
|
demog_income
|
4
|
50%
|
|
demog_education
|
4
|
50%
|
|
demog_political
|
4
|
50%
|
|
share_chatbot
|
4
|
50%
|

Control
Chatbot 1a
|
Variable
|
Number. of Obs
|
Percent of Consents
|
|
cont_0
|
8
|
100%
|
|
consent
|
8
|
100%
|
|
control_quiz_1
|
6
|
75%
|
|
control_quiz_2
|
6
|
75%
|
|
control_quiz_3
|
7
|
87.5%
|
|
control_quiz_4
|
6
|
75%
|
|
outcome_proxy_quiz1
|
4
|
50%
|
|
outcome_proxy_quiz2
|
4
|
50%
|
|
outcome_proxy_quiz3
|
4
|
50%
|
|
enjoy_most
|
4
|
50%
|
|
enjoy_least
|
4
|
50%
|
|
user_comments
|
4
|
50%
|
|
has_technical_issues
|
4
|
50%
|
|
demog_age
|
3
|
37.5%
|
|
demog_gender
|
2
|
25%
|
|
demog_race
|
2
|
25%
|
|
demog_ethnicity
|
2
|
25%
|
|
demog_income
|
2
|
25%
|
|
demog_education
|
2
|
25%
|
|
demog_political
|
2
|
25%
|
|
share_chatbot
|
2
|
25%
|

Chatbot 1b
|
Variable
|
Number. of Obs
|
Percent of Consents
|
|
cont_0
|
5
|
83.33%
|
|
consent
|
6
|
100%
|
|
control_quiz_1
|
5
|
83.33%
|
|
control_quiz_2
|
5
|
83.33%
|
|
control_quiz_3
|
4
|
66.67%
|
|
control_quiz_4
|
3
|
50%
|
|
outcome_proxy_quiz1
|
4
|
66.67%
|
|
outcome_proxy_quiz2
|
4
|
66.67%
|
|
outcome_proxy_quiz3
|
4
|
66.67%
|
|
enjoy_most
|
3
|
50%
|
|
enjoy_least
|
3
|
50%
|
|
user_comments
|
3
|
50%
|
|
has_technical_issues
|
3
|
50%
|
|
demog_age
|
3
|
50%
|
|
demog_gender
|
3
|
50%
|
|
demog_race
|
3
|
50%
|
|
demog_ethnicity
|
3
|
50%
|
|
demog_income
|
3
|
50%
|
|
demog_education
|
3
|
50%
|
|
demog_political
|
3
|
50%
|
|
share_chatbot
|
2
|
33.33%
|

Chatbot 2a
|
Variable
|
Number. of Obs
|
Percent of Consents
|
|
eiffel_continue
|
8
|
100%
|
|
cont_1
|
8
|
100%
|
|
cont_2
|
8
|
100%
|
|
cont_3
|
8
|
100%
|
|
cont_4
|
8
|
100%
|
|
cont_5
|
8
|
100%
|
|
cont_6
|
8
|
100%
|
|
consent
|
8
|
100%
|
|
control_quiz_1
|
7
|
87.5%
|
|
control_quiz_2
|
7
|
87.5%
|
|
control_quiz_3
|
6
|
75%
|
|
control_quiz_4
|
3
|
37.5%
|
|
outcome_proxy_quiz1
|
3
|
37.5%
|
|
outcome_proxy_quiz2
|
3
|
37.5%
|
|
outcome_proxy_quiz3
|
3
|
37.5%
|
|
enjoy_most
|
3
|
37.5%
|
|
enjoy_least
|
2
|
25%
|
|
user_comments
|
2
|
25%
|
|
has_technical_issues
|
2
|
25%
|
|
demog_age
|
2
|
25%
|
|
demog_gender
|
2
|
25%
|
|
demog_race
|
2
|
25%
|
|
demog_ethnicity
|
2
|
25%
|
|
demog_income
|
2
|
25%
|
|
demog_education
|
2
|
25%
|
|
demog_political
|
2
|
25%
|
|
share_chatbot
|
2
|
25%
|

Chatbot 2b
|
Variable
|
Number. of Obs
|
Percent of Consents
|
|
flight_continue
|
6
|
100%
|
|
cont_1
|
6
|
100%
|
|
cont_2
|
6
|
100%
|
|
cont_3
|
6
|
100%
|
|
cont_4
|
6
|
100%
|
|
cont_5
|
6
|
100%
|
|
cont_6
|
6
|
100%
|
|
consent
|
6
|
100%
|
|
control_quiz_1
|
6
|
100%
|
|
control_quiz_2
|
4
|
66.67%
|
|
control_quiz_3
|
4
|
66.67%
|
|
control_quiz_4
|
2
|
33.33%
|
|
outcome_proxy_quiz1
|
2
|
33.33%
|
|
outcome_proxy_quiz2
|
2
|
33.33%
|
|
outcome_proxy_quiz3
|
2
|
33.33%
|
|
enjoy_most
|
1
|
16.67%
|
|
enjoy_least
|
1
|
16.67%
|
|
user_comments
|
1
|
16.67%
|
|
has_technical_issues
|
1
|
16.67%
|
|
demog_age
|
1
|
16.67%
|
|
demog_gender
|
1
|
16.67%
|
|
demog_race
|
1
|
16.67%
|
|
demog_ethnicity
|
1
|
16.67%
|
|
demog_income
|
1
|
16.67%
|
|
demog_education
|
1
|
16.67%
|
|
demog_political
|
1
|
16.67%
|
|
share_chatbot
|
1
|
16.67%
|

Treatment Analysis
The following figures and tables compare the treatment effects between the SMS and control arms for three outcomes: sharing misinformation, sharing baseline, and sharing discernment. Participants are quizzed on three posts in some combination of misinformation and baseline posts. They are asked to rate if they would share the post on a scale of 1 to 5: 1: Definitely not 2: Probably not 3: Not sure 4: Probably yes 5: Definitely yes. To calculate sharing misinformation for each participant, we average the rating for misinformation post for each participants. To calculate sharing baseline for each participant, we average the rating for baseline post for each participants. To calculate sharing discernment, we subtract the average sharing ratings: sharing misinformation - sharing baseline.
A rating of greater than 3 for sharing misinformation and sharing baseline indicate the user would be amenable to sharing the post. Sharing discernment scores can range from -4 to 4. The closer the score is to 0, the less discernment an individual has between misinformation and baseline posts. Positive scores indicate the participants is more amenable to sharing misinformation posts. Negative scores incidate the participant is ore amenable to sharing the baseline post.
estimate_effect <- function(df, outcome, outcome_name){
# get mean and std. errors by group for plotting
eq <- as.formula(paste(outcome, " ~ 0+ treatment"))
lm <- lm_robust(eq, data = df[df$treatment != "no treatment", ])
plot <- tidy(lm)
gg <- ggplot(plot, aes(x = term, y = estimate)) +
geom_point(position = position_dodge(width = 0.5), size = 3) +
geom_pointrange(
aes(x = term,ymin = estimate - 1.96 * std.error,ymax = estimate + 1.96 * std.error),width = .1,position = position_dodge(width = 0.5)) +
theme(plot.title = element_text(hjust = 0.5),
axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)
) +
scale_x_discrete(labels = function(x){
label <- str_remove(x, "treatment")
label <- ifelse(nchar(label) >3, str_to_title(label), toupper(label))
return(label)
}) +
xlab('Treatment') +
ylab('Estimate') +
ggtitle(paste0('Treatment Effect Estimate on ', outcome_name)) +
theme_minimal() +
theme(plot.title = element_text(face = "bold", hjust = 0.5, size = 16), axis.text= element_text(size = 12),
axis.title = element_text(size = 16))
if(outcome != "sharing_disc"){
gg <- gg + scale_y_continuous(limits = c(0.5,5.5),
breaks = seq(1, 5, 1))
} else {
gg <- gg + scale_y_continuous(limits = c(-4, 4),
breaks = seq(-4, 4, 1))
}
print(gg)
# get difference between groups
eq <- as.formula(paste(outcome, " ~ treatment"))
lm2 <- lm_robust(eq, data = df)
out <- tidy(lm2)
sms_n = sum(df$treatment == "sms")
control_n = sum(df$treatment == "control")
out[2, ] %>%
cbind( plot %>%
select(term, estimate, std.error) %>%
pivot_wider(names_from = "term", values_from = c("estimate", "std.error"))
) %>%
mutate(estimate_treatmentsms = paste(round_4(estimate_treatmentsms), "\n(", round_4(std.error_treatmentsms), ")", sep = ""),
estimate_treatmentcontrol = paste(round_4(estimate_treatmentcontrol), "\n(", round_4(std.error_treatmentcontrol), ")", sep = ""),
estimate_difference = paste(round_4(estimate), "\n(", round_4(std.error), ")", sep = ""),
conf = paste("(", round_4(conf.low), ", ", round_4(conf.high), ")", sep = ""),
sms_n, control_n) %>%
select("SMS Mean" = estimate_treatmentsms,
"SMS N" = sms_n,
"Control Mean" = estimate_treatmentcontrol,
"Control N" = control_n,
"Difference" = estimate_difference,
"95% Conf. Int." = conf,
"p-value" = p.value) %>%
kable(row.names = F, escape = T) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
print()
}
Outcome 3: Sharing Discernment
estimate_effect(df, "sharing_disc", "Sharing Discernment")
|
SMS Mean
|
SMS N
|
Control Mean
|
Control N
|
Difference
|
95% Conf. Int.
|
p-value
|
|
-1.2500 (0.2776)
|
32
|
-0.2308 (0.2571)
|
28
|
-1.0192 (0.3784)
|
(-1.7956, -0.2429)
|
0.0119954
|