This report checks whether the bot-generated data were allocated evenly across treatment arms and whether a small set of demographics is balanced across treatments. In this export, the treatment variable is c_0001.
analysis_data %>%filter(!is.na(age)) %>%ggplot(aes(x = treatment, y = age, fill = treatment)) +geom_boxplot(show.legend =FALSE, alpha =0.8) +labs(title ="Age by Treatment",x =NULL,y ="Age" ) +theme_minimal(base_size =12)
Manipulation Check Across Arms
The codebook identifies v_57 as the manipulation-check item: “Worum ging es in dem Text hauptsaechlich?” In these data, treatment 1 has no valid v_57 responses, so the response-distribution test is run across arms 2 to 4.
mnpltn_data <- analysis_data %>%mutate(mnpltnchck =case_when( v_57 ==1~"Facts about kindergartens in Duisburg", v_57 ==2~"Experiences of a Duisburg family with childcare", v_57 ==3~"Role of taxpayers in financing kindergarten places", v_57 ==4~"Daily routine in kindergartens in Duisburg", v_57 ==5~"Quality of kindergarten care in Duisburg",TRUE~NA_character_ ) )mnpltn_missing <- mnpltn_data %>%group_by(treatment) %>%summarise(n_total =n(),n_answered =sum(!is.na(mnpltnchck)),n_missing =sum(is.na(mnpltnchck)) )mnpltn_counts <- mnpltn_data %>%filter(!is.na(mnpltnchck)) %>%count(treatment, mnpltnchck, name ="n") %>%group_by(treatment) %>%mutate(share_within_treatment = n /sum(n)) %>%ungroup()mnpltn_test <- mnpltn_data %>%filter(!is.na(mnpltnchck), treatment !="Arm 1") %>%mutate(treatment = forcats::fct_drop(treatment)) %>%with(chisq.test(table(treatment, mnpltnchck)))mnpltn_missing %>%kable(col.names =c("Treatment", "Total", "Answered", "Missing"))
Role of taxpayers in financing kindergarten places
39
19.1%
Arm 3
Daily routine in kindergartens in Duisburg
36
20.8%
Arm 3
Experiences of a Duisburg family with childcare
32
18.5%
Arm 3
Facts about kindergartens in Duisburg
33
19.1%
Arm 3
Quality of kindergarten care in Duisburg
30
17.3%
Arm 3
Role of taxpayers in financing kindergarten places
42
24.3%
Arm 4
Daily routine in kindergartens in Duisburg
33
18.1%
Arm 4
Experiences of a Duisburg family with childcare
42
23.1%
Arm 4
Facts about kindergartens in Duisburg
34
18.7%
Arm 4
Quality of kindergarten care in Duisburg
34
18.7%
Arm 4
Role of taxpayers in financing kindergarten places
39
21.4%
tibble(test ="Chi-square test of manipulation-check responses by treatment (Arms 2-4)",statistic =unname(mnpltn_test$statistic),df =unname(mnpltn_test$parameter),p_value = mnpltn_test$p.value) %>%mutate(statistic =round(statistic, 3),p_value =round(p_value, 4) ) %>%kable()
test
statistic
df
p_value
Chi-square test of manipulation-check responses by treatment (Arms 2-4)
2.992
8
0.9349
mnpltn_counts %>%ggplot(aes(x = treatment, y = share_within_treatment, fill = mnpltnchck)) +geom_col(position ="fill", width =0.7) +scale_y_continuous(labels = scales::percent_format()) +labs(title ="Manipulation-Check Responses by Treatment",x =NULL,y ="Share within treatment",fill ="Response" ) +theme_minimal(base_size =12)
Flow Consistency Checks
The codebook contains several explicit filter pages. Those make good sanity checks for whether the bot export follows the intended survey routing. The checks below use the raw export so that skip codes like -77, -66, and -99 are preserved.
timestamp_shown <-function(x) !is.na(x) & x !=""& x !="0"& x !="-77"response_present <-function(x) !is.na(x) & x !=""& x !="-77"flow_checks <-tibble(check =c("Manipulation check `v_57` skipped in Arm 1","Empathy treatment page timing appears only in Arm 2","Community treatment page timing appears only in Arm 3","Thematic-prime treatment page timing appears only in Arm 4","Empathy debrief timing appears only in Arm 2","Fairness follow-up `v_66` skipped when `v_65 == 6`","Country-culture follow-up `v_102` skipped when `v_99` is 4, 88, or 99","Recontact page `v_135` to `v_137` skipped when `v_108 == 2`" ),expected =c("No valid `v_57` answers in Arm 1","No nonzero `rts7571736` outside Arm 2","No nonzero `rts7576345` outside Arm 3","No nonzero `rts7571738` outside Arm 4","No nonzero `rts7601898` outside Arm 2","No shown `v_66` when fairness1 is exactly 6","No shown `v_102` when migration status says no roots / DK / refuse","No shown recontact page when respondent declines recontact" ),violations =c( flow_data %>%filter(c_0001 =="1", !is.na(v_57), v_57 !="", v_57 !="-77") %>%nrow(), flow_data %>%filter(c_0001 %in%c("1", "3", "4"), timestamp_shown(rts7571736)) %>%nrow(), flow_data %>%filter(c_0001 %in%c("1", "2", "4"), timestamp_shown(rts7576345)) %>%nrow(), flow_data %>%filter(c_0001 %in%c("1", "2", "3"), timestamp_shown(rts7571738)) %>%nrow(), flow_data %>%filter(c_0001 %in%c("1", "3", "4"), timestamp_shown(rts7601898)) %>%nrow(), flow_data %>%filter(v_65 =="6", response_present(v_66)) %>%nrow(), flow_data %>%filter(v_99 %in%c("4", "88", "99"), response_present(v_102)) %>%nrow(), flow_data %>%filter(v_108 =="2", response_present(v_135) |response_present(v_137)) %>%nrow() )) %>%mutate(result =if_else(violations ==0, "Pass", "Check"))flow_checks %>%select(check, expected, violations, result) %>%kable()
check
expected
violations
result
Manipulation check v_57 skipped in Arm 1
No valid v_57 answers in Arm 1
0
Pass
Empathy treatment page timing appears only in Arm 2
No nonzero rts7571736 outside Arm 2
0
Pass
Community treatment page timing appears only in Arm 3
No nonzero rts7576345 outside Arm 3
0
Pass
Thematic-prime treatment page timing appears only in Arm 4
No nonzero rts7571738 outside Arm 4
0
Pass
Empathy debrief timing appears only in Arm 2
No nonzero rts7601898 outside Arm 2
0
Pass
Fairness follow-up v_66 skipped when v_65 == 6
No shown v_66 when fairness1 is exactly 6
0
Pass
Country-culture follow-up v_102 skipped when v_99 is 4, 88, or 99
No shown v_102 when migration status says no roots / DK / refuse
0
Pass
Recontact page v_135 to v_137 skipped when v_108 == 2
No shown recontact page when respondent declines recontact