Skip to content

Using Circumplex Instruments

Source: https://circumplex.jmgirard.com/articles/using-instruments.html

from great_tables import GT

import circumplex

%load_ext autoreload
%autoreload 2

Although the circumplex package is capable of analyzing and visualizing data in a “source-agnostic” manner (i.e., without knowing what the numbers correspond to), it can be helpful to both the user and the package to have more contextual information about which information/questionnaire the data come from. For example, knowing the specific instrument used can enable the package to automatically score item-level responses and standardize these scores using normative data. Furthermore, a centralized repository of information about circumplex instruments would provide a convenient and accessible way for users to discover and begin using new instruments.

The first part of this tutorial will discuss how to preview the instruments currently available in the circumplex package, how to load information about a specific instrument for use in analysis, and how to extract general and specific information about that instrument. The following functions will be discussed: instruments(), instrument(), print(), summary(), scales(), items(), anchors(), norms(), and View().

The second part of this tutorial will discuss how to use the information about an instrument to transform and summarize circumplex data. It will demonstrate how to ipsatize item-level responses (i.e. apply deviation scoring across variables), how to calculate scale scores from item-level responses (with or without imputing/prorating missing values), and how to standardize scale scores using normative/comparison data. The following functions will be discussed: ipsatize(), score(), and standardize().

2. Loading and Examining Instrument Objects

Previewing the available instruments

You can preview the list of currently available instruments using the instruments() function. This function will print the abbreviation, name, and (in parentheses) the “code” for each available instrument. We will return to the code in the next section.

circumplex.show_instruments()
          The circumplex package currently includes 3 instruments          
┏━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃    Abbreviation  Name                                                 ┃
┡━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ 1 │ CSIG          Circumplex Scales of Interpersonal Goals             │
│ 2 │ IIPSC         Inventory of Interpersonal Problems Short Circumplex │
│ 3 │ IPIPIPC       IPIP Interpersonal Circumplex                        │
└───┴──────────────┴──────────────────────────────────────────────────────┘

Loading a specific instrument

To reduce loading time and memory usage, instrument information is not loaded into memory when the circumplex package is loaded. Instead, instruments should be loaded into memory on an as-needed bases. As demonstrated below, this can be done by passing an instrument’s code (which we saw how to find in the last section) to the load_instrument() function. We can then examine that instrument data using the print() function.

csig = circumplex.get_instrument("csig")
print(csig)
CSIG: Circumplex Scales of Interpersonal Goals
32 items, 8 scales, 1 normative data sets
Lock (2014)
< https://doi.org/10.1177/0146167213514280 >

Examining an instrument in-depth

To examine the information available about a loaded instrument, there are several options. To print a long list of formatted information about the instrument, use the summary() function. This will return the same information returned by print(), followed by information about the instrument’s scales, rating scale anchors, items, and normative data set(s). The summary of each instrument is also available from the package reference page.

csig.info()
CSIG: Circumplex Scales of Interpersonal Goals
32 items, 8 scales, 1 normative data sets
Lock (2014)
< https://doi.org/10.1177/0146167213514280 >


The CSIG contains 8 scales:
├── PA (90°): Be authoritative
├── BC (135°): Be tough
├── DE (180°): Be self-protective
├── FG (225°): Be wary
├── HI (270°): Be conflict-avoidant
├── JK (315°): Be cooperative
├── LM (360°): Be understanding
└── NO (45°): Be respected


The CSIG is rated using the following 5-point scale:
  0. It is not at all important that...
  1. It is somewhat important that...
  2. It is moderately important that...
  3. It is very important that...
  4. It is extremely important that...



The CSIG currently has 1 normative data set(s):

1. 665 MTurkers from US, Canada, and India about interactions between nations
   Lock (2014)
   https://doi.org/10.1177/0146167213514280

Specific subsections of this output can be returned individually by printing the scales, anchors, items, and norms attributes of the instrument object. These functions are especially useful when you need to know a specific bit of information about an instrument and don’t want the console to be flooded with unneeded information.

csig.info_anchors()
The CSIG is rated using the following 5-point scale:
  0. It is not at all important that...
  1. It is somewhat important that...
  2. It is moderately important that...
  3. It is very important that...
  4. It is extremely important that...

Some of these attributes also have additional methods to customize their output. For instance, the scales attribute has a .show() method which includes the option to display the items for each scale.

csig.info_scales(items=True)
The CSIG contains 8 scales:
├── PA (90°): Be authoritative
│   ├── 8. We are assertive
│   ├── 16. We appear confident
│   ├── 24. We are decisive
│   └── 32. They see us as capable
├── BC (135°): Be tough
│   ├── 5. We show that we can be tough
│   ├── 12. They not get angry with us
│   ├── 21. We are aggressive if necessary
│   └── 29. We not show our weaknesses
├── DE (180°): Be self-protective
│   ├── 2. We are the winners in any argument or dispute
│   ├── 10. We do whatever is in our best interest
│   ├── 18. We are better than them
│   └── 26. We keep our guard up
├── FG (225°): Be wary
│   ├── 7. We let them fend for themselves
│   ├── 15. They stay out of our business
│   ├── 23. We not trust them
│   └── 31. We not get entangled in their affairs
├── HI (270°): Be conflict-avoidant
│   ├── 4. We avoid conflict
│   ├── 12. They not get angry with us
│   ├── 20. We not get into arguments
│   └── 28. We not make them angry
├── JK (315°): Be cooperative
│   ├── 1. We are friendly
│   ├── 9. We celebrate their achievements
│   ├── 17. They feel we are all on the same team
│   └── 25. We are cooperative
├── LM (360°): Be understanding
│   ├── 6. We appreciate what they have to offer
│   ├── 14. We understand their point of view
│   ├── 22. We show concern for their welfare
│   └── 30. We are able to compromise
└── NO (45°): Be respected
    ├── 3. They respect what we have to say
    ├── 11. We get the chance to express our views
    ├── 19. They listen to what we have to say
    └── 27. They see us as responsible

It is a good idea in practice to digitize and save each participant’s response to each item on an instrument, rather than just their scores on each scale. Having access to item-level data will make it easier to spot and correct mistakes, will enable more advanced analysis of missing data, and will enable latent variable models that account for measurement error (e.g. structural equation modelling). Furthermore, the functions described below will make it easy to transform and summarize such item-level data into scale scores.

First, however, we need to make sure the item-level data is in the expected format. Your data should be stored in a data frame where each row corresponds to one observation (e.g. participant, organization, or timepoint) and each column corresponds to one variable describing these observations (e.g. item responses, demographic characteristics, scale scores). The pandas package provides excellent tools for getting your data into this format from a variety of different file types and formats.

For the purpose of illustration, we will work with a small-scale data set, which includes item-level responses to the Inventory of Interpersonal Problems, Short Circumplex (IIP-SC) for just 10 participants. As will become important later on, this data set contains a small amount of missing values (represented as NA). This data set is included as part of the circumplex package and can be loaded and previewed as follows:

from circumplex import load_dataset

raw_jz2017 = load_dataset("jz2017")
GT(raw_jz2017.head())
Gender PA BC DE FG HI JK LM NO PARPD SCZPD SZTPD ASPD BORPD HISPD NARPD AVPD DPNPD OCPD
Female 1.5 1.5 1.25 1.0 2.0 2.5 2.25 2.5 4 3 7 7 8 4 6 3 4 6
Female 0.0 0.25 0.0 0.25 1.25 1.75 2.25 2.25 1 0 2 0 1 2 3 0 1 0
Female 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 1 0 4 1 5 4 0 0 1
Male 2.0 1.75 1.75 2.5 2.0 1.75 2.0 2.5 1 0 0 0 1 0 0 0 0 0
Female 0.25 0.5 0.25 0.0 0.0 0.0 0.0 0.0 0 0 0 0 1 0 0 1 0 0
iipsc = circumplex.get_instrument("iipsc")
iipsc.info(items=True)
IIP-SC: Inventory of Interpersonal Problems Short Circumplex
32 items, 8 scales, 2 normative data sets
Soldz, Budman, Demby, & Merry (1995)
< https://doi.org/10.1177/1073191195002001006 >


The IIP-SC contains 8 scales:
├── PA (90°): Domineering
│   ├── 1. ...point of view...
│   ├── 9. ...too aggressive toward...
│   ├── 17. ...control other people...
│   └── 25. ...argue with other...
├── BC (135°): Vindictive
│   ├── 2. ...supportive of another...
│   ├── 10. ...another person's happiness...
│   ├── 18. ...too suspicious of...
│   └── 26. ...revenge against people...
├── DE (180°): Cold
│   ├── 3. ...show affection to...
│   ├── 11. ...feeling of love...
│   ├── 19. ...feel close to...
│   └── 27. ...at a distance...
├── FG (225°): Socially avoidant
│   ├── 4. ...join in on...
│   ├── 12. ...introduce myself to...
│   ├── 20. ...socialize with other...
│   └── 28. ...get together socially...
├── HI (270°): Nonassertive
│   ├── 5. ...stop bothering me...
│   ├── 13. ...confront people with...
│   ├── 21. ...assertive with another...
│   └── 29. ...to be firm...
├── JK (315°): Exploitable
│   ├── 6. ...I am angry...
│   ├── 14. ...assertive without worrying...
│   ├── 22. ...too easily persuaded...
│   └── 30. ...people take advantage...
├── LM (360°): Overly nurturant
│   ├── 7. ...my own welfare...
│   ├── 15. ...please other people...
│   ├── 23. ...other people's needs...
│   └── 31. ...another person's misery...
└── NO (45°): Intrusive
    ├── 8. ...keep things private...
    ├── 16. ...open up to...
    ├── 24. ...noticed too much...
    └── 32. ...tell personal things...


The IIP-SC is rated using the following 5-point scale:
  0. Not at all
  1. Somewhat
  2. Moderately
  3. Very
  4. Extremely



The IIP-SC currently has 2 normative data set(s):

1. 872 American college students
   Hopwood, Pincus, DeMoor, & Koonce (2011)
   https://doi.org/10.1080/00223890802388665
2. 106 American psychiatric outpatients
   Soldz, Budman, Demby, & Merry (1995)
   https://doi.org/10.1177/1073191195002001006