Beck Depression Inventory (BDI)

library(questionnaires)

Background

Beck Depression Inventory-II (BDI-II) is one of the most widely used instruments for measuring the severity of self-reported depression in adolescents and adults. As a general rule, BDI-II is administrated in LCBC to adults with an upper cut off around 60 years, while depression in older adults is assessed with the Geriatric Depression Scale (GDS). However, please consult the instructions for each project, as this guideline has been implemented at different time points across the projects.

Scoring

The questionnaire consists of 21 statements, each reflecting a depression symptom or attitude which could be rated from 0 to 3 in terms of intensity. The answers should be based the participant´s feelings throughout the last week, including the day of filling out the form. The sum of the scores of the items (0-3) yields one total score, with a possible range between 0 and 62.

Interpretation of the scores (Total scores)

Score Category
0-10 These ups and downs are considered to be normal
11-16 Mild mood disturbance
17 – 20 Borderline clinical disturbance
21 – 30 Moderate depression
31 – 40 Severe depression
Above 40 Extreme depression

If a participant scores >= 17, we should consider contacting the participant to follow up on this and offer making a note for the participant’s doctor describing the scores.

Questionnaire items

1: Sadness
2: Pessimism
3: Past failure
4: Loss of pleasure
5: Guilty feelings
6: punishment feelings
7: Self-dislike
8: Self-criticalness
9: Suicidal thought or wishes*
10: Crying
11: Agitation
12: Loss of interest
13: Indecisiveness
14: Worthlessness
15: Loss of energy
16: Changes in sleep pattern
17: Irritability
18: Changes in appetite (including specification of weight loss intentions if applicable)
19: Concentration difficulty
20: Tiredness or fatigue
21: Loss of interest in sex

Weight loss format:
For item 18, weight loss intention if applicable should be punched as numbers with decimals.

Suicidality

Please note that this questionnaire includes one question (q 9) regarding suicidal thoughts. In the case of scores above 1 on this item, the participant should be contacted to for a follow up. This should be described in the clinical observation document . If the participant scores 3 on this question (“Jeg vil ta livet mitt om jeg fikk sjansen” / “I would killl my self if I had the chance”), this should obviously be taken very seriously, and the participant should be contacted immediately.

Data requirements

Column names

By default, the functions assume that columns have names in the manner of bdi_XX where XX is a zero-padded (i.e. zero in front of numbers below 9, eg. 09) question number of the inventory. You may have column names in another format, but in that case you will need to supply to the functions the names of those columns using tidy-selectors (see the tidyverse packages for this). The columns should adhere to some naming logic that is easy to specify.

Data values

The values in the columns should be the item number of the question that was answered (i.e. 0, 1, 2, or 3). The inventory allows subjects to respond to several options per question, in the case of this, the mean of the responded alternatives should be applied.

Using the bdi functions

There are two main bdi functions: bdi_compute_sum and bdi_factorise. If you have MOAS-like data they can be applied directly without any other specification.

# Creates a vector with the BDI sums, given they are in the dataset
bdi_sum <- bdi_compute_sum(yourData)

# Creates a vector of BDI clasification based on the sums from above
bdi_factorise(bdi_sum)

Some participants may have missed answering some questions. By default, the bdi_compute_sum function allows no missing values for a participant, and will give NA if there are any. This is to ensure you are fully aware of what is happening to the output. You can alter the number of missing for a participant you allow through the max_missing argument.

# Allows each participant to have at most two missing questions
bdi_sum <- bdi_compute_sum(yourData, max_missing = 2)

If you are working with non-MOAS data, the naming of columns might be different. Hopefully, the naming is consistent in some way so you easily can you tidy-selectors.

# Base calculation on columns with names that start with "bdi"
otherData %>% 
  bdi_compute_sum(cols = starts_with("bdi"))

# Base calculation on columns with names that contain the string "Beck"
otherData %>% 
  bdi_compute_sum(cols = contains("Beck"))

# Base calculation on columns with names matching a regular expression
otherData %>% 
  bdi_compute_sum(cols = matches("bdi_[0-9][0-9]$"))

The function can be used within dplyr:mutate but requires the use of the special . to work, as it needs the entire data frame to do calculations. the . within a mutate (or other dplyr function) means “insert piped object in here”, and thus the below example the entire data object is placed where the . is. In this case, you would make a new column in the piped data called bdi_sum, and using that column also create the factorised version in a column named bdi_fact.

data %>% 
  mutate(
    bdi_sum = bdi_compute_sum(., cols = matches("bdi_[0-9][0-9]$")),
    bdi_fact = bdi_factorise(bdi_sum))

This last part can also be done in a single step with the bdi_compute function. This function will return a data.frame with columns BDI (the sum) and bdi_Coded (the factor), based on the given data set. By default, these two columns will be added to the end of the dataset provided, and use the default arguments to the two other bdi functions it calls.

data %>% 
  bdi_compute()

You may also choose to only have the two computed columns returned by setting keep_all to FALSE

data %>% 
  bdi_compute(keep_all = FALSE)

Lastly, this function also takes a predicate, a logical statement (of length 1 or the number of rows of the data) for the calculation of the sum. For instance, in the MOAS, we do not have the single question answers for projects before nettskjema implementation. That means that we have a pre-calculated sum in the data, and the sum cannot be calculated based on single question data. In this case, we use the predicate !is.na(bdi_01), so that the bdi_compute_sum function is only run on data that actually has single question data. If we don’t do this, the punched BDI score will be overwritten with NA.

data %>% 
  bdi_compute(predicate = !is.na(bdi_01))

Nettskjema special case

Data collected through nettskjema has some special features because of the way the data gets structured with you can choose multiple options. For this reason, a special function to handle the way Nettskjema data is structures is made bdi_restructure. If data come from Nettskjema, the structure is in wide format, with each question option as columns, creating 21*4 columns of data. This function allows you to gather and create single columns for questions.

The columns must adhere to some specific logic to work. It is recommended that the column names are in the format bdi_01_2 bdi_01_3, where the first two numbers are the question number, and the last number is the option number. The bdi_restructure function transforms the last numbers in the column name a cell value, as this is the BDI score for that option, and then calculates the mean of all options per question answered.

dat <- data.frame(
    ID = 1:4, 
    bdi_01_0 = c(NA,1, NA, NA),
    bdi_01_1 = c(1, NA, 1, NA),
    bdi_01_2 = c(NA, NA, 1, NA),
    bdi_01_3 = c(NA, NA, NA, NA),
    bdi_02_0 = c(1, NA, NA, NA),
    bdi_02_1 = c(NA,NA, NA, NA),
    bdi_02_2 = c(NA,1, NA, NA),
    bdi_02_3 = c(NA, NA, NA, 1)
  )

dat
#>   ID bdi_01_0 bdi_01_1 bdi_01_2 bdi_01_3 bdi_02_0 bdi_02_1 bdi_02_2 bdi_02_3
#> 1  1       NA        1       NA       NA        1       NA       NA       NA
#> 2  2        1       NA       NA       NA       NA       NA        1       NA
#> 3  3       NA        1        1       NA       NA       NA       NA       NA
#> 4  4       NA       NA       NA       NA       NA       NA       NA        1

bdi_restructure(dat)
#> # A tibble: 4 × 3
#>      ID bdi_01 bdi_02
#>   <int>  <dbl>  <dbl>
#> 1     1    1        0
#> 2     2    0        2
#> 3     3    1.5     NA
#> 4     4   NA        3

References

Aaron T.Beck, Robert A.Steer, Margery G.Carbin (1988) Psychometric properties of the Beck Depression Inventory: Twenty-five years of evaluation, Clinical Psychology Review, Volume 8, Issue 1, Pages 77-100, doi: 10.1016/0272-7358(88)90050-5

Robert A.Steer, David J.Rissmiller, Aaron T.Beck (2000) Use of the Beck Depression Inventory-II with depressed geriatric inpatients Behaviour Research and Therapy Volume 38, Issue 3,Pages 311-318, doi: https://doi.org/10.1016/S0005-7967(99)00068-6

Groth-Marnat G. (1990). The handbook of psychological assessment (2nd ed.). New York: John Wiley & Sons.