This section includes a number of commonly used EDC formulas.
Panel | ||
---|---|---|
| ||
Any formula that returns a value of TRUE or FALSE will be indicated with a 1 or 0 respectively in the report. |
Panel | ||
---|---|---|
| ||
Average |
The
‘Average’average formula is used to average all
responsesvalues for any given question.
Formula parameters include:Question Name
Precision of Calculation (optional, but required if a third parameter is added)
Type of Average (optional, but required if more parameters are added)
Panel | ||
---|---|---|
| ||
1 → Average all the values |
Based on the option selected in 3rd parameter (may or may not be required)
Based on the option selected in 3rd parameter (may or may not be required)
Note: If the 3rd parameter is part of the function call, then the corresponding parameters corresponding to that option become necessary.
Example:
Panel | ||
---|---|---|
| ||
Iff |
The ‘Iff’ formula is used to evaluate a certain condition and then further evaluate a formula based on how the condition is evaluated. Parameters include:
The “Iff” formula is used to evaluate a condition as TRUE/FALSE. Based on that evaluation, a value is assigned to the Calculated Field. Parameters include:
Code Block |
---|
Iff({Condition to check},"Value if TRUE","Value if FALSE")
Parameter 1. {Condition to check}
Parameter 2. "Value if TRUE"
Parameter 3. "Value if FALSE" |
Condition to check - a boolean equation that should result in a value of TRUE or FALSE
Value if TRUE - the value the Calculated Field Question will be if the Condition to check is TRUE
Value if FALSE - the value the Calculated Field Question will be if the Condition to check is FALSE
Examples
Iff((14 - 7) > 0, DateDiff('today', ‘yesterday', ‘h'), 50 / 2)
The “Condition to check” is “(14 - 7) > 0”
The “Value if TRUE” is “DateDiff(’today’, ‘yesterday’, 'h')” which is 24
The “Value if FALSE” is “50 / 2” which is 25
Since (14 - 7) > 0 is TRUE, the value assigned to the Calculated Field Question will be 24
Iff([RadioQ1] > 0, [RadioQ1] < 3, FALSE)
The “Condition to check” is “[RadioQ1] > 0”
The “Value if TRUE” is “[RadioQ1] < 3” which will be TRUE/FALSE depending on the value of [RadioQ1]
The “Value if FALSE” is “FALSE”
The table below will show what the Calculated Field Question value will be based on the value of [RadioQ1]
[RadioQ1] Value
Calculated Field Question Value
Reasoning
0
FALSE
Since [RadioQ1] = 0, then the “Condition to check” equates to FALSE since 0 is not greater than 0. Since it is FALSE, the “Value if FALSE” will be assigned to the Calculated Field Question, which is FALSE.
1
TRUE
The “Condition to check” will equate to TRUE since 1 is greater than 0. Since it is TRUE, the “Value if TRUE” will be assigned to the Calculated Field Question.
Since [RadioQ1] = 1, then the “Value if TRUE” will equal TRUE since 1 is less than 3. Therefore, the Calculated Field Question will be assigned a value of TRUE.
2
TRUE
The “Condition to check” will equate to TRUE since 2 is greater than 0. Since it is TRUE, the “Value if TRUE” will be assigned to the Calculated Field Question.
Since [RadioQ1] = 2, then the “Value if TRUE” will equal TRUE since 2 is less than 3. Therefore, the Calculated Field Question will be assigned a value of TRUE.
3
FALSE
The “Condition to check” will equate to TRUE since 3 is greater than 0. Since it is TRUE, the “Value if TRUE” will be assigned to the Calculated Field Question.
Since [RadioQ1] = 3, then the “Value if TRUE” will equal FALSE since 3 is NOT less than 3. Therefore, the Calculated Field Question will be assigned a value of FALSE.
Iff(Contains([QuestionOne], 2), 1, 0)
The “Condition to check” is “Contains([QuestionOne],2)”
The “Value if TRUE” is 1
The “Value if FALSE” is 0
If the participant included option value 2 in checkbox question [QuestionOne], then the “Condition to check” equates to TRUE and the “Value if TRUE” will be assigned to the Calculated Field Question, which is 1.
If the participant didn’t include option value 2 in checkbox question [QuestionOne], then the “Condition to check” equates to FALSE and the “Value if FALSE” will be assigned to the Calculated Field Question, which is 0.
Panel | ||
---|---|---|
| ||
DateDiff |
The ‘DateDiff’ formula is used to evaluate the difference between two Dates or two Times. Parameters include:
The Date or Time from which the other date will be subtracted from.
The Date or Time that will be subtracted from the first parameter.
For the above two parameters, the date can be optionally specified as the following strings:
'now' → Date and time at the moment logic is evaluated
'today' → Date on which the formula is evaluated
'yesterday' → Yesterday’s date (no time component)
'tomorrow' → Tomorrow’s date (no time component)The format in which the result is required.
The format can be:
'd' → total days
'h' → total hours
'm' → total minutes
's' → total seconds
Examples:
DateDiff('yesterday', ‘now', ‘m')
This calculates the total minutes between yesterday’s date (parameter 1) and the date and time for right now (parameter 2).
If yesterday's date is 07/10/2023 and we are evaluating this function for 07/11/2023 at 4:07p.m. then the results (in minutes) should look like: ‘yesterday’ (Parameter 1) minus ‘now’ (Parameter 2) = -2407.5039294216667
Using DateDiff to change stages:
When do I use DateDiff to change stages?
DateDiff can be used when you want to change to the next stage after a certain amount of time has elapsed and after the date question has been answered.
The following scenario can be interpreted as such:
Stage Name
Question Name
Question Type
Question Text
Response
StartStudy
nextstage
Radio
Would you like to start the study?
Yes = 1
No = 2
Baseline
pmpiq23
Radio
I like that nobody can tell when I am using a mobile phone intervention.
Strongly disagree = 1
Disagree = 2
Disagree a little = 3
Neither agree nor disagree = 4
Agree a little = 5
Agree = 6
Strongly agree = 7
Baseline
study_startdate
Date
Please select today’s date…
PT enters date on phone:
04/17/2024
The Formula Based “StartStudy” stage contains an assessment that includes a radio question type named “nextstage” and when answered with “yes”, it will transition to the “Baseline” stage.
The Formula Based “Baseline” stage contains a baseline assessment that includes a radio question type named “pmpiq23” and when answered (since all responses are greater than 0) will transition to the “FinalStage”. However, if the baseline assessment is not answered within 3 days (as shown in the example below), then the stage transition from “Baseline” to “FinalStage” will still occur.
The “FinalStage” stage is Time Based and will only be active for 1 day (24 hours) since the stage does not end at midnight.
datediff('today', [study_startdate],'d')>=3Current Date
Question Variable
Result
Interpretation
today = 04/17/2024
study_startdate = 04/17/2024
0
False - stays in the current stage
today = 04/17/2024
study_startdate = 04/12/224
5
True - transitions to next stage
Panel | ||
---|---|---|
| ||
Contains |
The ‘Contains’ formula is a TRUE/FALSE statement used to check if a particular option was selected in a checkbox question type. In CMS (platform v1), the way to do that is to write something like this: [checkboxq(value)] == 1. This has been changed up in V2. The new formula to check if a checkbox contains a specific value is:
Contains([questionName], 2)
This formula accepts two parameters:
The variable/question name
The value to check
Examples:
Contains([CheckboxQ1], 3)
The formula will get the last response(s) for the question “CheckboxQ1” and check if ‘3' was one of them. If ‘3’ was one of them the logic will return TRUE and if '3’ was not one of them the logic will return FALSE.
Panel | ||
---|---|---|
| ||
Checkbox Syntax |
Checkbox syntax from CMS is now supported. [CheckboxQuestion(1)] will result in 0 if the option with value “1” was not selected by participant and vice versa. This syntax doesn’t support default value format such as [RadioQuestion:-999] (which will result in a default value of -999 if no value was found for the question “RadioQuestion”]
Panel | ||
---|---|---|
| ||
ResponseExists/Exists |
This formula is used to check if a particular question has been recorded in the Database with a response or not. This formula accepts one parameter which is the question name. The formula returns true if a response was found and false if a response was not found.
Example
ResponseExists([RadioQ])
Exists([RadioQ])
Panel | ||
---|---|---|
| ||
Last |
Automatically returns the most recent response value when the variable name is put within brackets [ ] .
Panel | ||
---|---|---|
| ||
Default Values |
Default values (applied when a response for a question cannot be found) can be defined in the declaration of question name followed by a colon “:”.
Examples:
[colorblue:-1] → Value assumed for the variable “colorblue” is -1 if no response found in the database.
[study_startdate:2100-01-01] → Value assumed for the variable “study_startdate” is 2100-01-01 if not value found.
[RadioQ1:0] → If no response found, the value for “RadioQ1” is assumed to be 0.
Panel | ||
---|---|---|
| ||
Display PHI Information |
If a study is collecting PHI from participants, the information provided can be used to curate RichText and Email questions as desired. The table below shows what to use for each of the PHI fields offered in the EDC
EDC PHI Field | RichText/Email format |
---|
EDC PHI Field | RichText/Email format |
---|---|
First Name | {{Personalization.FirstName}} |
Middle Name | {{Personalization.MiddleName}} |
Last Name | {{Personalization.LastName}} |
Street Address | {{Personalization.AddressLn1}} |
Apartment Number | {{Personalization.AddressLn2}} |
City | {{Personalization.City}} |
State | {{Personalization.State}} |
Zip Code | {{Personalization.ZipCode}} |
Country | {{Personalization.Country}} |
Cell Number | {{Personalization.CellPhoneIntlCode}} |
Work Number | {{Personalization.WorkPhoneIntlCode}} |
Home Number | {{Personalization.HomePhoneIntlCode}} |
{{Personalization.Email}} | |
Ethnicity | {{Personalization.Ethnicity}} |
This could be useful if a study needs to keep a mailing address up to date to display what the current address is, and if it needs to be changed, the participant’s response can be emailed to researchers to update the PHI for that participant.
In the event of no response given for a question, it is not included in the average calculation.
Code Block |
---|
Average({Variable Name}, "Decimal point precision", "Average Type",
"Varied parameter based on Average Type", "Varied parameter based on Average Type")
Parameter 1. {Variable Name}
Parameter 2. "Decimal point precision"
Parameter 3. "Average Type"
Parameter 4 & 5. "Varied parameter based on Average Type" |
{Variable Name} - required parameter to find and average values
“Decimal point precision” - optional, but required if an average type is specified
“Average Type” - optional; explained below
“Varied parameter based on Average Type” - required based on average type parameter
Average Types
Below are explanations of each average type. The decimal point precision (parameter 2) will be 3, but it can be any number needed for your study.
Average all response values
Average([VariableName])
Average([VariableName], 3)
Average([VariableName], 3, 1)
If using example a, the decimal point precision is defaulted to 2.
Average last n days
Average([VariableName], 3, 2, n)
Parameter 4 specifies n number of days
Average n days starting from a specific date
Average([VariableName], 3, 3, n, ‘Date’)
Parameter 4 specifies n number of days
Parameter 5 specifies a start date. This can be in ‘YYYY-MM-DD’ notation or a Date question.
Average n days ending on a specific date
Average([VariableName], 3, 4, n, ‘Date’)
Parameter 4 specifies n number of days
Parameter 5 specifies an end date. This can be in ‘YYYY-MM-DD’ notation or a Date question. The responses recorded on this date are EXCLUDED from the calculation.
Average last n responses
Average([VariableName], 3, 5, n)
Parameter 4 specifies n number of responses
Average n responses starting from a specific date
Average([VariableName], 3, 6, n, ‘Date’)
Parameter 4 specifies n number of responses
Parameter 5 specifies a start date. This can be in ‘YYYY-MM-DD’ notation or a Date question.
Average n responses ending on a specific date
Average([VariableName], 3, 7, n, ‘Date’)
Parameter 4 specifies n number of responses
Parameter 5 specifies an end date. This can be in ‘YYYY-MM-DD’ notation or a Date question. The responses recorded on this date are EXCLUDED from the calculation.
Average since a specific date
Average([VariableName], 3, 8, ‘Date’)
Parameter 4 specifies a start date. This can be in ‘YYYY-MM-DD’ notation or a Date question.
Average until a specific date
Average([VariableName], 3, 9, ‘Date’)
Parameter 4 specifies an end date. This can be in ‘YYYY-MM-DD’ notation or a Date question. The responses recorded on this date are EXCLUDED from the calculation.
Average between a specified start and end date
Average([VariableName], 3, 10, ‘Start Date’, ‘End Date’)
Parameter 4 specifies a start date. This can be in ‘YYYY-MM-DD’ notation or a Date question.
Parameter 5 specifies an end date. This can be in ‘YYYY-MM-DD’ notation or a Date question. The responses recorded on this date are EXCLUDED from the calculation.
Suppose there’s a study that wants to check a participant’s average cigarette use after 20 days. The following table contains responses recorded in the dropdown question [CigarettesSmoked] over 20 days.
[CigarettesSmoked] = Dropdown question
How many cigarettes did you smoke?
0-10+
Date | Value(s) reported | Date | Value(s) reported |
---|---|---|---|
04/03/2024 | 6, 4, 5, 3, 1 | 04/13/2024 | 2, 2, 2, 2 |
04/04/2024 | 5, 7, 3, 1, 1 | 04/14/2024 | 3, 1, 2 |
04/05/2024 | 0, 4, 3, 6, 3 | 04/15/2024 | 2, 5 |
04/06/2024 | 0, 5, 6 | 04/16/2024 | 3, 3, 3, 2 |
04/07/2024 | 10, 1, 0, 1 | 04/17/2024 | 5 |
04/08/2024 | 6, 3, 4 | 04/18/2024 | |
04/09/2024 | 04/19/2024 | ||
04/10/2024 | 0 | 04/20/2024 | 1, 3, 4 |
04/11/2024 | 3, 2, 2 | 04/21/2024 | 3, 2 |
04/12/2024 | 1, 2 | 04/22/2024 | 1 |
Average Type 1: Average all response values
Average([CigarettesSmoked]) = 2.92
Average([CigarettesSmoked], 5) = 2.9157
Average([CigarettesSmoked], 3, 1) = 2.922
This average type will give the total average all recorded responses.
For this study, we may want to get the total average as a comparison for the participant, maybe to provide a monetary incentive or encouraging message for smoking less in a later part of the study.
Average Type 2: Average last n days
Date 04/07/2024: Average([CigarettesSmoked], 3, 2, 5) = 3.409
Date 04/12/2024: Average([CigarettesSmoked], 3, 2, 5) = 2.556
Date 04/17/2024: Average([CigarettesSmoked], 3, 2, 5) = 2.643
Date 04/22/2024: Average([CigarettesSmoked], 3, 2, 5) = 2.333
This average type will average all recorded values a number of days from the day it’s calculating.
For this study, we may want to get an average every 5 days as a way to measure the participant’s progress.
Average Type 3: Average n days starting from a specific date
[QuitDate] = 04/08/2024
Average([CigarettesSmoked], 3, 3, 7, [QuitDate]) = 2.313
This average type can be used to specify an average a number of days after the specified date.
For this study, we may want to see if a week after the participant specified a Quit Date if their average cigarette usage is lower than their total average. which could be used to add a bonus monetary incentive.
Average Type 4: Average n days ending on a specific date
Average([CigarettesSmoked], 3, 4, 7, [QuitDate]) = 3.409
This Average Type will average all values a number of days prior to the specified date. Remember that this average will exclude all values recorded on the specified date from the calculation.
For this study, we may want to get a baseline average of how many cigarettes the participant smoked prior to their specified Quit Date. We can use this value as a general guideline for the participant’s progress on smoking less or compare their average towards the end of the stage/study to the beginning.
Average Type 5: Average last n responses
Date 04/08/2024: Average([CigarettesSmoked], 3, 5, 13) = 3.692
Date 04/15/2024: Average([CigarettesSmoked], 3, 5, 13) = 2.154
Date 04/20/2024: Average([CigarettesSmoked], 3, 5, 13) = 2.846
This average type is similar to Average Type 2, but instead of specifying the number of days, it specifies the number of responses for the total average.
For this study, we may want to check the average number of cigarettes the participant reports smoking. In this case, we may want this calculation to go off randomly using a Random Number Generator question to trigger this calculation in the assessment.
Average Type 6: Average n responses starting from a specific date
Average([CigarettesSmoked], 3, 6, 25, [QuitDate]) = 2.56
This average type is similar to Average Type 3, but instead of specifying the number of days, it specifies the number of responses for the total average.
For this study, we may want to get an average based on the responses in order to get an idea of how many cigarettes the participant will report when they answer this question.
Average Type 7: Average n responses ending on a specific date
Average([CigarettesSmoked], 3, 7, 15, [QuitDate]) = 2.933
This average type is similar to Average Type 4, but instead of specifying the number of days, it specifies the number of responses for the total average.
Note |
---|
Remember that recorded responses made on this date are not considered part of the average calculation. |
For this study, we may want to get an idea of how many cigarettes the participant typically reported prior to their quit date.
Average Type 8: Average since specific date
[MidDate] = 04/13/2024
Average([CigarettesSmoked], 3, 8, [MidDate]) = 2.55
This average type will take the total average starting on a date up to the most recent response entered.
For this study, we may want to find the average cigarettes smoked reported after the midpoint of the study and compare it to the average before the midpoint.
Average Type 9: Average until a specific date
Average([CigarettesSmoked], 3, 9, [MidDate]) = 3.161
This average type will take the total average starting on the first recorded response up to the specified date.
Note |
---|
Remember that recorded responses made on this date are not considered part of the average calculation. |
For this study, we may want to find the average cigarettes smoked reported before the midpoint of the study and compare it to the average after the midpoint.
Average Type 10: Average between a specified start and end date
Average([CigarettesSmoked], 3, 10, [QuitDate], [MidDate]) = 2.556
This average type will take the total average from the start date up to the quit date.
Note |
---|
Remember that recorded responses made on the end date are not considered part of the average calculation. |
For this study, we may want to check if the participant is on a downward trend from their Quit Date up to the Mid Date. This can be used to predict if the participant will be successful in reducing their smoking habit.
Panel | ||
---|---|---|
| ||
Iff |
The ‘Iff’ formula is used to evaluate a certain condition and then further evaluate a formula based on how the condition is evaluated. Parameters include:
The “Iff” formula is used to evaluate a condition as TRUE/FALSE. Based on that evaluation, a value is assigned to the Calculated Field. Parameters include:
Code Block |
---|
Iff({Condition to check},"Value if TRUE","Value if FALSE")
Parameter 1. {Condition to check}
Parameter 2. "Value if TRUE"
Parameter 3. "Value if FALSE" |
Condition to check - a boolean equation that should result in a value of TRUE or FALSE
Value if TRUE - the value the Calculated Field Question will be if the Condition to check is TRUE
Value if FALSE - the value the Calculated Field Question will be if the Condition to check is FALSE
Examples
Iff((14 - 7) > 0, DateDiff('today', ‘yesterday', ‘h'), 50 / 2)
The “Condition to check” is “(14 - 7) > 0”
The “Value if TRUE” is “DateDiff(’today’, ‘yesterday’, 'h')” which is 24
The “Value if FALSE” is “50 / 2” which is 25
Since (14 - 7) > 0 is TRUE, the value assigned to the Calculated Field Question will be 24
Iff([RadioQ1] > 0, [RadioQ1] < 3, FALSE)
The “Condition to check” is “[RadioQ1] > 0”
The “Value if TRUE” is “[RadioQ1] < 3” which will be TRUE/FALSE depending on the value of [RadioQ1]
The “Value if FALSE” is “FALSE”
The table below will show what the Calculated Field Question value will be based on the value of [RadioQ1]
[RadioQ1] Value | Calculated Field Question Value | Reasoning |
---|---|---|
0 | FALSE | Since [RadioQ1] = 0, then the “Condition to check” equates to FALSE since 0 is not greater than 0. Since it is FALSE, the “Value if FALSE” will be assigned to the Calculated Field Question, which is FALSE. |
1 | TRUE | The “Condition to check” will equate to TRUE since 1 is greater than 0. Since it is TRUE, the “Value if TRUE” will be assigned to the Calculated Field Question. Since [RadioQ1] = 1, then the “Value if TRUE” will equal TRUE since 1 is less than 3. Therefore, the Calculated Field Question will be assigned a value of TRUE. |
2 | TRUE | The “Condition to check” will equate to TRUE since 2 is greater than 0. Since it is TRUE, the “Value if TRUE” will be assigned to the Calculated Field Question. Since [RadioQ1] = 2, then the “Value if TRUE” will equal TRUE since 2 is less than 3. Therefore, the Calculated Field Question will be assigned a value of TRUE. |
3 | FALSE | The “Condition to check” will equate to TRUE since 3 is greater than 0. Since it is TRUE, the “Value if TRUE” will be assigned to the Calculated Field Question. Since [RadioQ1] = 3, then the “Value if TRUE” will equal FALSE since 3 is NOT less than 3. Therefore, the Calculated Field Question will be assigned a value of FALSE. |
Iff(Contains([QuestionOne], 2), 1, 0)
The “Condition to check” is “Contains([QuestionOne],2)”
The “Value if TRUE” is 1
The “Value if FALSE” is 0
If the participant included option value 2 in checkbox question [QuestionOne], then the “Condition to check” equates to TRUE and the “Value if TRUE” will be assigned to the Calculated Field Question, which is 1.
If the participant didn’t include option value 2 in checkbox question [QuestionOne], then the “Condition to check” equates to FALSE and the “Value if FALSE” will be assigned to the Calculated Field Question, which is 0.
This formula can be used in any number of ways needed for a study which include, but is not limited to:
Trigger calculations dependent on participant responses
Save a specific value to display a question later on
Save a specific value to trigger the end of a stage
Panel | ||
---|---|---|
| ||
DateDiff |
The ‘DateDiff’ formula is used to evaluate the difference between two Dates or two Times. Parameters include:
Code Block |
---|
DateDiff({Date/Time Minuend}, {Date/Time Subtrahend}, 'Unit difference')
Parameter 1. {Date/Time Minuend}
Parameter 2. {Date/Time Subtrahend}
Parameter 3. 'Unit difference' |
Date/Time Minuend - The Date or Time from which the other date will be subtracted from.
Date/Time Subtrahend - The Date or Time that will be subtracted from the first parameter.
Unit Difference - The format in which the difference is required.
The format can be:
'd' → total days
'cd' → calendar days
'h' → total hours
'm' → total minutes
's' → total seconds
The difference between total days ‘d' and calendar days ‘cd’ is that ‘cd’ does not take into account the time difference. e.g. [date1] = ‘2024-07-31 11:35:22 PM’ and [date2] = ‘2024-08-01 12:15:17 AM’
DateDiff([date2], [date1], ‘d') = 0.2772
DateDiff([date2], [date1], 'cd’) = 1
Parameter 1 and Parameter 2 can have a manually input date or time following this format:
Date - ‘yyyy-MM-dd’ (example: 2024-08-17)
Time - ‘HH:mm:ss’ (example: 17:15:32)
They can also have a Date or Time variable as the input as well as the following key words:
'now' → Date and time at the moment logic is evaluated
'today' → Date on which the formula is evaluated
'yesterday' → Yesterday’s date
'tomorrow' → Tomorrow’s date
For the ‘today’, ‘yesterday’, and ‘tomorrow’ key words, the Time component is defaulted to midnight, 00:00:00.
I.E. if today is 05/01/2024 12:39:42 PM, then:
Keyword | Date | Time | Date and Time |
---|---|---|---|
‘now’ | ‘2024-05-01’ | ‘12:39:42’ | ‘2024-05-01 12:39:42’ |
‘today’ | ‘2024-05-01’ | ‘00:00:00’ | ‘2024-05-01 00:00:00’ |
‘yesterday’ | ‘2024-04-30’ | ‘00:00:00’ | ‘2024-04-30 00:00:00’ |
‘tomorrow’ | ‘2024-05-02’ | ‘00:00:00’ | ‘2024-05-02 00:00:00’ |
Examples:
DateDiff('yesterday', ‘now', ‘m')
This calculates the total minutes between yesterday’s date (parameter 1) and the date and time for right now (parameter 2).
If yesterday's date is 07/10/2023 and we are evaluating this function for 07/11/2023 at 4:07p.m. then the results (in minutes) should look like: ‘yesterday’ (Parameter 1) minus ‘now’ (Parameter 2) = -2407.5039294216667
Using DateDiff to change stages:
When do I use DateDiff to change stages?
DateDiff can be used when you want to change to the next stage after a certain amount of time has elapsed and after the date question has been answered.
The following scenario can be interpreted as such:
Stage Name | Question Name | Question Type | Question Text | Response |
---|---|---|---|---|
StartStudy | nextstage | Radio | Would you like to start the study? | Yes = 1 |
StartStudy | study_startdate | Date | Please select today’s date… | PT enters date on phone: |
Baseline | pmpiq23 | Radio | I like that nobody can tell when I am using a mobile phone intervention. | Strongly disagree = 1 |
The Formula Based “StartStudy” stage contains an assessment that includes a radio question type named “nextstage” and when answered with “yes”, it will transition to the “Baseline” stage.
The Formula Based “Baseline” stage contains a baseline assessment that includes a radio question type named “pmpiq23” and when answered (since all responses are greater than 0) will transition to the “FinalStage”. However, if the baseline assessment is not answered within 3 days (as shown in the example below), then the stage transition from “Baseline” to “FinalStage” will still occur.
The “FinalStage” stage is Time Based and will only be active for 1 day (24 hours) since the stage does not end at midnight.
| |||
---|---|---|---|
Current Date | Question Variable | Result | Interpretation |
today = 04/17/2024 | study_startdate = 04/17/2024 | 0 | False - stays in the current stage |
today = 04/22/2024 | study_startdate = 04/17/224 | 5 | True - transitions to next stage |
Panel | ||
---|---|---|
| ||
Contains |
The ‘Contains’ formula is a TRUE/FALSE statement used to check if a particular option was selected in a checkbox question type.
Code Block |
---|
Contains({Checkbox Question},'Response Value to check')
Parameter 1. {Checkbox Question}
Parameter 2. 'Response Value to check' |
Checkbox Question - Any checkbox question name
Response Value to check - a single number that matches the value of a response in the checkbox question. See example below.
Suppose a study wants to find a correlation of emotions to the amount of cigarettes a participant smokes. At the end of the day, the participant is presented with a checkbox question [FeelingToday] as follows:
Reflecting on today, which of these emotions did you feel? Check all that apply.
Then, in a calculated field question [Feeling], the following formula is calculated:
Iff(Contains([FeelingToday], 1), 1, 0) + Iff(Contains([FeelingToday], 2), 2, 0) +
Iff(Contains([FeelingToday], 3), 4, 0) + Iff(Contains([FeelingToday], 4), 8, 0) +
Iff(Contains([FeelingToday], 5), 16, 0) + Iff(Contains([FeelingToday], 6), 32, 0) = 17
Contains Calculation | Iff Formula Calculation |
---|---|
Contains([FeelingToday], 1) = TRUE | Iff(Contains([FeelingToday], 1), 1, 0) = 1 |
Contains([FeelingToday], 2) = FALSE | Iff(Contains([FeelingToday], 2), 2, 0) = 0 |
Contains([FeelingToday], 3) = FALSE | Iff(Contains([FeelingToday], 3), 4, 0) = 0 |
Contains([FeelingToday], 4) = FALSE | Iff(Contains([FeelingToday], 4), 8, 0) = 0 |
Contains([FeelingToday], 5) = TRUE | Iff(Contains([FeelingToday], 5), 16, 0) = 16 |
Contains([FeelingToday], 6) = FALSE | Iff(Contains([FeelingToday], 6), 32, 0) = 0 |
The purpose of this formula is to determine what emotion, or combination of emotions, is associated with the amount of cigarettes the participant smokes. This could be used in an Average calculation when the participant enters the next stage to present helpful tips to the participant if they report feeling one of these emotions.
Alternatively, if the study wants to present messages to the participant if they responded feeling “Sad” which has a value of 2, then the following formula can be used in the Display Logic for the message:
Contains([FeelingToday], 2)
This would evaluate to TRUE and display the desired message to the participant.
Panel | ||
---|---|---|
| ||
Checkbox Syntax |
Checkbox syntax from CMS is now supported. [CheckboxQuestion(1)] will result in 0 if the option with value “1” was not selected by participant and vice versa. This syntax doesn’t support default value format such as [RadioQuestion:-999] (which will result in a default value of -999 if no value was found for the question “RadioQuestion.”
Panel | ||
---|---|---|
| ||
ResponseExists/Exists |
This formula is used to check if a particular question has been recorded in the database with a response or not. This formula accepts one parameter which is the question name. The formula returns TRUE if a response was found and FALSE if a response was not found.
Code Block |
---|
Variant 1: ResponseExists({Variable Name})
Variant 2: Exists({Variable Name})
Parameter 1: {Variable Name} |
{Variable Name} - any question type that records a response from the participant
This formula can use either of the keywords “ResponseExists” or “Exists”
Suppose a baseline assessment contains two radio questions, [SmokerYN] and [VapeYN], asking the participant the following:
Display Logic | Question Name | Question Text | Response Text (Response Value) |
---|---|---|---|
(none) | [SmokerYN] | Do you currently smoke? | Yes (value 1) |
[SmokerYN] == 1 | [VapeYN] | Do you also vape? | Yes (value 1) |
If the participant answers “Yes” to [SmokerYN], then they’ll be presented [VapeYN] to answer, otherwise, they don’t get shown [VapeYN].
Suppose this participant responds “No” in the assessment. After completing the baseline, they are moved into the next stage that has an assessment containing questions dependent on the participant’s answer to [VapeYN].
However, since the participant in this example didn’t see [VapeYN], these questions should include the following formula in their Display Logic:
ResponseExists([VapeYN])
OR
Exists([VapeYN])
Alternatively, we can add a calculated field question that has the following formula to determine if the participant answered the Vape question:
Iff(ResponseExists([VapeYN], 1, 0)
Panel | ||
---|---|---|
| ||
Last Response Value |
Putting variable names in square brackets […] will automatically return the last response value a participant has input regardless of whether the variable is in the same assessment or from an assessment two stages prior. This is especially important for the formulas described in this section to be used in Calculated Field Questions, Display Logic in assessments, and ending FormulaBased stages.
Suppose in a Baseline assessment, the participant is asked a Radio Question [DailyCigs] that says:
How many cigarettes do you typically smoke daily?
0 - 3 (value 1)
4 - 6 (value 2)
7 - 9 (value 3)
10+ (value 4)
Then in an assessment in a different stage, it uses the value from [DailyCigs] to present certain questions to the participant or a calculated field question can use the value to calculate/keep track of the difference between the users reported cigarette usage and how many they said in [DailyCigs].
Panel | ||
---|---|---|
| ||
Default Values |
Default values (applied when a response for a question cannot be found) can be defined in the declaration of question name followed by a colon “:”.
Time Question types cannot be assigned a default value due to its use of colon. Attempting to assign a default value to a Time Question type will result in a conflict of function.
Examples:
[colorblue:-1] → Value assumed for the variable “colorblue” is -1 if no response found in the database.
[study_startdate:2100-01-01] → Value assumed for the variable “study_startdate” is 2100-01-01 if not value found.
[RadioQ1:0] → If no response found, the value for “RadioQ1” is assumed to be 0.
If no colon (:) is used, the following default values are used for the question types listed under them.
-999
Dropdown
Radio
Slider
RandomNumberGenerator
Video
Empty String
Text Field
Text Area
1970-01-01 00:00:00
Date
Time
Timestamp
Panel | ||
---|---|---|
| ||
Display PHI information |
If a study is collecting PHI from participants, the information provided can be used to curate RichText and Email questions as desired. The table below shows what to use for each of the PHI fields offered in the EDC.
Panel | ||
---|---|---|
| ||
If a field is called on but there is no data for that participant’s PHI field, then it’ll return blank. |
EDC PHI Field | RichText/Email format |
---|---|
Subject ID | {{Personalization.SubjectId}} |
First Name | {{Personalization.FirstName}} |
Middle Name | {{Personalization.MiddleName}} |
Last Name | {{Personalization.LastName}} |
Street Address | {{Personalization.AddressLn1}} |
Apartment Number | {{Personalization.AddressLn2}} |
City | {{Personalization.City}} |
State | {{Personalization.State}} |
Zip Code | {{Personalization.ZipCode}} |
Country | {{Personalization.Country}} |
Cell Number | {{Personalization.CellPhoneIntlCode}} |
Work Number | {{Personalization.WorkPhoneIntlCode}} |
Home Number | {{Personalization.HomePhoneIntlCode}} |
{{Personalization.Email}} | |
Ethnicity | {{Personalization.Ethnicity}} |
Suppose a study has an assessment that changes a participant’s mailing address. The following example shows what the RichText question will look like using the formulas and what will be displayed to the participant in the Insight app:
Code Block |
---|
Subject ID: PT015
First Name: John
Last Name: Doe
Street Address: 123 First St.
Apartment Number:
City: Townsville
State: IL
Zip Code: 12345 |
RichText Formula/Text | Insight App Display |
---|---|
Hello {{Personalization.FirstName}}. | Hello John. |
Now suppose the participant wants to change their address. They are shown a series of Text Field questions [NewStreetAddress], [NewApartmentNumber], [NewCity], [NewState], and [NewZipCode] as follows:
Question Name | Response |
---|---|
[NewStreetAddress] | 456 Main St. |
[NewApartmentNumber] | N/A |
[NewCity] | Villageton |
[NewState] | WV |
[NewZipCode] | 67890 |
The participant can then be presented with their responses to verify if they are correct:
RichText Formula/Text | Insight App Display |
---|---|
Your new address is now: | Your new address is now: |
This information can be used in an email to be sent to researchers as follows:
Email Formula/Text Body | Email Received Body |
---|---|
Participant {{Personalization.SubjectId}} has requested a change in address as follows: Please edit the appropriate PHI Fields as soon as possible at the earliest convenience. | Participant PT015 has requested a change in address as follows: Please edit the appropriate PHI Fields as soon as possible at the earliest convenience. |
Panel | ||
---|---|---|
| ||
Concat |
{{Concat([CheckboxQuestion], “Concatenation Type”, ‘Delimiter’)}}
Concat, short for “concatenation,” is a special formula that can list out the selected responses from a Checkbox question type. There are 3 concatenation types as explained below:
[Question] = Checkbox Question type
Concatenation type | List type | Formula | Displayed as |
---|---|---|---|
| Displays each item chosen in a bullet list | {{Concat([Question],1)}} |
|
| Displays each item chosen in a numbered list | {{Concat([Question], 2)}} |
|
| Displays each item as a linear list separated by the desired delimiter | {{Concat([Question], 3, ', ')}} | Item 1, Item 3, Item 4
|
This can be used to display a list of sample goals a participant can achieve in a RichText question and be an easier way to read a participant’s response in an Email.
Special Case - Concatenation Type 4
{{Concat([TextAreaQuestion], 4, “Add Header”, ‘Header Text’)}}
This is a special use case of the Concat function that will display all entries a participant enters into a Text Area Question type. The primary use case is to display past journal entries and/or responses.
Please see the following table for a brief explanation of each formula:
Formula | List type | Displayed as |
---|---|---|
{{Concat([TextAreaQuestion], 4)}} | Will display each response in [TextAreaQuestion] separated by a divider line | Entry 1 will be listed first Entry 2 will be listed second etc… |
{{Concat([TextAreaQuestion], 4, 0)}} | Will display each response in [TextAreaQuestion] separated by the default title “Journal Entry #:” where “#” is a count of each entry | Journal Entry 1:Entry 1 will be listed first Journal Entry 2:Entry 2 will be listed second Journal Entry…etc… |
{{Concat([TextAreaQuestion], 4, 1, ‘You said on day’)}} | Will display each response in [TextAreaQuestion] separated by a custom title. In this example, it will be separated by “You said on day #:” where “#” is a count of each entry | You said on day 1:Entry 1 will be listed first You said on day 2:Entry 2 will be listed second You said on day…etc… |
Panel | ||
---|---|---|
| ||
DateFormat |
{{DateFormat([Date/TimeQuestion], ‘Desired formatting’)}}
DateFormat is a special formula that formats a Date or Time question type. The table below explains and shows the different formatting that is possible:
[Date] = ‘2024-03-08’
[Time1] = ‘17:03:06’
[Time2] = ‘08:17:53’
Format | Explanation | Formula | Output |
---|---|---|---|
y | Displays month and year | {{DateFormat([Date], 'y')}} | March 2024 |
yy | Displays abbreviated year | {{DateFormat([Date], ‘yy’)}} | 24 |
yyyy | Displays year | {{DateFormat([Date], ‘yyyy’)}} | 2024 |
d | Displays date in short format | {{DateFormat([Date], ‘d’)}} | 3/8/2024 |
dd | Displays two-digit day | {{DateFormat([Date], ‘dd’)}} | 08 |
ddd | Displays abbreviated day of the week | {{DateFormat([Date], ‘ddd’)}} | Fri |
dddd | Displays day of the week | {{DateFormat([Date], ‘dddd’)}} | Friday |
M | Display month and day | {{DateFormat([Date], ‘M’)}} | March 8 |
MM | Displays two-digit month | {{DateFormat([Date], ‘MM’)}} | 03 |
MMM | Displays abbreviated month | {{DateFormat([Date], ‘MMM’)}} | Mar |
MMMM | Displays month | {{DateFormat([Date], ‘MMMM’)}} | March |
MM/dd/yyyy | Displays two-digit month and day and the full year | {{DateFormat([Date], ‘MM/dd/yyyy’)}} | 03/08/2024 |
dddd, MMMM dd yyyy | Displays day of the week, month, two-digit day, and year | {{DateFormat([Date], ‘dddd, MMMM dd yyyy)}} | Friday, March 08 2024 |
h | Displays hour | {{DateFormat([Time1], ‘h’)}} | 5 |
hh | Displays two-digit hour | {{DateFormat([Time1], ‘hh’)}} | 05 |
H | Displays hour in military time | {{DateFormat([Time2], ‘H’)}} | 8 |
HH | Displays two-digit hour in military time | {{DateFormat([Time2], ‘HH’)}} | 08 |
mm | Display two-digit minutes | {{DateFormat([Time1], ‘mm’)}} | 03 |
ss | Displays two-digit seconds | {{DateFormat([Time1], ‘ss’)}} | 06 |
t | Displays time with AM/PM | {{DateFormat([Time1], ‘t’)}} | 5:03 PM |
tt | Displays if time is AM or PM | {{DateFormat([Time2], ‘tt’)}} | AM |
h:m t | Displays, hour, minute with AM/PM | {{DateFormat([Time1], ‘h:m t’)}} | 5:3 PM |
HH:mm | Displays military time | {{DateFormat([Time1], ‘HH:mm’)}} | 17:03 |
Panel | ||
---|---|---|
| ||
Home | Submit a Ticket | SCC | Privacy |