Prepare a summary estimation of the interview duration.
Source:R/fct_interview_duration.R
fct_interview_duration.Rd
When designing a questionnaire, it is key to keep the interview duration under control. Ideally less than 20 minutes for a phone interview and less than 40 minutes for a face to face interview.
The function is designed to provide a rough estimate (aka a guesstimate...) of the interview duration in order to assess this element of questionnaire design quality. If the questionnaire takes too long, then one needs to trim it or split it into multiple ones...
The estimations provided in that function are based on a series of assumptions and accounts for the following elements:
* the time needed to read the label of the questions - or the note - Questions hint are not accounted for as they tips for enumerator and not to be read to respondent;
* the time needed to read the question modalities - as there's nothing in xlsform that tells whether the enumerator is expected to read loudly the potential answers in case of closed question, the function has a parameter to account for it;
* the time need to answer the question - here we are accounting for 3 distinct situations, each of them with a different potential duration: - close questions - open questions and open questions set up under skip logic so typically - the "if other, specify" - each comes with distinct response time;
* the time needed when we have a "repeat" block - typically questions repeated for a family roster;
Usage
fct_interview_duration(
xlsformpath,
label_language = NULL,
wpm = 180,
maxmodalities = 7,
resptimeclose = 4,
resptimecondopen = 7,
resptimeopen = 10,
avrgrepeat = 3
)
Arguments
- xlsformpath
path to the file with xlsform
- label_language
Language to be used in case you have more than one. If not specified, the 'default_language' in the 'settings' worksheet is used. If that is not specified and more than one language is in the XlsForm, the language that comes first within column order will be used.
- wpm
word per minute - an average 180 word per minute (per default) required to read loudly the text
- maxmodalities
if more than 7 potential answers for a select question (per default)- then we assume that those modalities will not be read by the enumerator - but rather selected based on an open answer - and not be accounted for the modalities duration estimation
- resptimeclose
an average 4 seconds (per default) for respondent to reply for closed questions
- resptimecondopen
an average of 7 seconds (per default) to reply to conditional text question (accounting for question type of "other, please specify").
- resptimeopen
an average of 10 seconds (per default) to reply to open text question.
- avrgrepeat
In case of repeat questions, an average 3 repeat (per default) is accounted for.
Examples
## Generate the summary chart
result <- fct_interview_duration(
xlsformpath = system.file("demo.xlsx", package = "XlsFormUtil"),
label_language = NULL,
# wpm word per minute - an average 180 word per minute (per default) required
#to read loudly the text
wpm = 180,
# maxmodalities if more than 7 potential answers for a select question
#(per default)- then we assume that those modalities will not be read by the
# enumerator - but rather selected based on an open answer - and not be
# accounted for the modalities duration estimation
maxmodalities = 7 ,
# resptimeclose an average 4 seconds (per default) for respondent to reply for
# closed questions
resptimeclose = 4,
# resptimecondopen an average of 7 seconds (per default) to reply to conditional
# text question (accounting for question type of "other, please specify").
resptimecondopen = 7,
# resptimeopen an average of 10 seconds (per default) to reply to open text
# question.
resptimeopen = 10,
# avrgrepeat In case of repeat questions, an average 3 repeat (per default) is
# accounted for.
avrgrepeat = 3
)
#> ! You did not set up any language requirement to launch the functions... Are you sure your xlsform does not include any language specifification like `English (eng)` or `Español (es)` or `Français (fr)`
result[["plot"]]
result[["totaldur"]]
#> [1] 12
knitr::kable(head(result[["variables"]], 15))
#>
#>
#> |type |list_name |name |label |label::Tigirigna |label::Amharic |label::Oromiffa |hint |hint::Tigirigna |hint::Amharic |hint::Oromiffa |testing |required |test_arbitrary_strings |relevant |calculation |constraint_message |read_only |appearance |constraint |repeatvar |type2 | label_duration| count| num_word| readtime| modality_duration| response_duration| repeat_duration| question_duration| question_duration_sum| order|seq |is_repeated |is_note |is_question |
#> |:---------------|:---------------------|:--------------------------|:-----------------------------------------------------------------------------------------------------------------|:----------------|:--------------|:---------------|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------|:-------------|:--------------|:-------|:--------|:----------------------|:---------------------------------------------------|:-----------|:------------------|:---------|:----------|:----------|:---------|:------|--------------:|-----:|--------:|----------:|-----------------:|-----------------:|---------------:|-----------------:|---------------------:|-----:|:------------------|:-----------|:-------|:-----------|
#> |text |NA |your_name |001b. Enter your name below. bla bla bla bla |NA |NA |NA |Please record your name |NA |NA |NA |hello |true |1 |NA |NA |NA |NA |NA |NA | |text | 3.0000000| NA| NA| NA| 0.0000000| 7| 0| 10.0000000| 0.1666667| 1|1_text |once |no |yes |
#> |select_one |school_list |school_level_001 |Whoa - does this question sync? 2 |NA |NA |NA |NA |NA |NA |NA |hello |true |27 |(${begin_interview}='yes') and (${available}='yes') |NA |NA |NA |NA |NA | |select | 2.3333333| 12| 19| 6.3333333| 0.0000000| 4| 0| 6.3333333| 0.2722222| 2|2_select_one |once |no |yes |
#> |text |NA |name_typed |001b. Enter your name below. |NA |NA |NA |Please record your name |NA |NA |NA |hello |true |2 |NA |NA |NA |NA |NA |NA | |text | 1.6666667| NA| NA| NA| 0.0000000| 7| 0| 8.6666667| 0.4166667| 3|3_text |once |no |yes |
#> |note |NA |level1 |003a. Region |NA |NA |NA |NA |NA |NA |NA |hello |false |5 |NA |NA |NA |NA |NA |NA | |note | 0.6666667| NA| NA| NA| 0.0000000| 0| 0| 0.6666667| 0.4277778| 4|4_note |once |yes |no |
#> |note |NA |level2 |003b. Zone |NA |NA |NA |NA |NA |NA |NA |hello |false |6 |NA |NA |NA |NA |NA |NA | |note | 0.6666667| NA| NA| NA| 0.0000000| 0| 0| 0.6666667| 0.4388889| 5|5_note |once |yes |no |
#> |note |NA |level3 |003c. District |NA |NA |NA |NA |NA |NA |NA |hello |false |7 |NA |NA |NA |NA |NA |NA | |note | 0.6666667| NA| NA| NA| 0.0000000| 0| 0| 0.6666667| 0.4500000| 6|6_note |once |yes |no |
#> |note |NA |level4 |003d. Locality name |NA |NA |NA |NA |NA |NA |NA |hello |false |8 |NA |NA |NA |NA |NA |NA | |note | 1.0000000| NA| NA| NA| 0.0000000| 0| 0| 1.0000000| 0.4666667| 7|7_note |once |yes |no |
#> |note |NA |EA |004. Enumeration area |NA |NA |NA |NA |NA |NA |NA |hello |false |9 |NA |NA |NA |NA |NA |NA | |note | 1.0000000| NA| NA| NA| 0.0000000| 0| 0| 1.0000000| 0.4833333| 8|8_note |once |yes |no |
#> |integer |NA |structure |005. Structure number |NA |NA |NA |Please record the structure number from the household listing form. |NA |NA |NA |hello |true |10 |NA |NA |Invalid response. |NA |NA |NA | |number | 1.0000000| NA| NA| NA| 0.0000000| 4| 0| 5.0000000| 0.5666667| 9|9_integer |once |no |yes |
#> |integer |NA |household |006. Household number |NA |NA |NA |Please record the household number from the household listing form. |NA |NA |NA |hello |true |11 |NA |NA |Invalid response. |NA |NA |NA | |number | 1.0000000| NA| NA| NA| 0.0000000| 4| 0| 5.0000000| 0.6500000| 10|10_integer |once |no |yes |
#> |select_one |yes_no_list |hh_duplicate_check |CHECK: Have you already sent a form for this structure and household? |NA |NA |NA |DO NOT DUPLICATE ANY FORM UNLESS YOU ARE CORRECTING A MISTAKE IN AN EARLIER FORM. |NA |NA |NA |hello |true |12 |NA |NA |NA |NA |NA |NA | |select | 4.0000000| 2| 2| 0.6666667| 0.6666667| 4| 0| 8.6666667| 0.7944444| 11|11_select_one |once |no |yes |
#> |note |NA |duplicate_warning |WARNING: Please ensure that the data processing team is aware of the duplication. |NA |NA |NA |NA |NA |NA |NA |hello |false |13 |(${hh_duplicate_check} = 'yes') |NA |NA |yes |NA |NA | |note | 4.3333333| NA| NA| NA| 0.0000000| 0| 0| 4.3333333| 0.8666667| 12|12_note |once |yes |no |
#> |select_multiple |resubmit_reasons_list |resubmit_reasons |CHECK: Why are you resending this form? |NA |NA |NA |Choose all that apply. |NA |NA |NA |hello |true |14 |(${hh_duplicate_check} = 'yes') |NA |NA |NA |NA |NA | |select | 2.3333333| 5| 45| 15.0000000| 15.0000000| 4| 0| 21.3333333| 1.2222222| 13|13_select_multiple |once |no |yes |
#> |note |NA |duplicate_warning_hhmember |WARNING: Each household should have ONLY ONE household roster with all household members listed on the same form. |NA |NA |NA |Please contact the central staff before sending this form. |NA |NA |NA |hello |false |15 |selected (${resubmit_reasons}, 'new_members') |NA |NA |yes |NA |NA | |note | 6.0000000| NA| NA| NA| 0.0000000| 0| 0| 6.0000000| 1.3222222| 14|14_note |once |yes |no |
#> |select_one |yes_no_list |available |009. Is a member of the household and competent respondent present and available to be interviewed today? |NA |NA |NA |You should try 2 times to find the same respondent that did the original HH interview. After a second failed attempt you may interview a different household member. |NA |NA |NA |hello |true |16 |NA |NA |NA |NA |NA |NA | |select | 5.6666667| 2| 2| 0.6666667| 0.6666667| 4| 0| 10.3333333| 1.4944444| 15|15_select_one |once |no |yes |