How to generate ipsative scores from a test with normative Likert-type items? Some constructs in psychology are sometimes conceptualised ipsatively. I.e., where the sum of the scales adds up to a constant (e.g., personal values; coping styles). The aim of such measures is often to show the relative position on such scales. In some cases, such scales are created by their response format (e.g., participants respond to questions that require some form of rank ordering of constructs). However, it is also possible to score tests with normative items (e.g., 20 items each on 1 to 5 scale, measuring 4 constructs) in an ipsative way. 

However, I recently ran into confusion about exactly how such ipsatised scores should be computed. I can think of a few different ways (e.g., subtracting the mean across all items from each item; dividing scale scores by sum of scale scores; saving residuals where scale is predicted by total score, etc.). I imagine many of these approaches yield similar variables. However, if you need to write a paper using ipsatised scores, you need to justify your particular approach.

Is there a standard way of performing ipsatisation on scales made up of normative likert-type items?
Baron (1996) writes:


  Scores on a multi-scale measure are ipsative when raw scale scores sum to a constant for any individual.
  An ipsative score can be thought of as the normative equivalent controlled for overall total score across scales.


Meade (2004) describes perhaps the most common form of ipsatisation based on normative scores as "deviational ipsative" (Radcliffe, 1963):


  normative data (e.g., Likert scales) can be made to be ipsative by simply subtracting the grand mean of each individual’s scale scores (averaged across all scales) from each of his or her individual scale scores (i.e., ipsatized data, Cattell, 1944; additive ipsative data (AID), Chan &amp; Bentler, 1993);


But it seems that there are range of other ways to create ipsative scores (i.e., that satisfy the formal requirement). 


The above substraction method can also involve dividing by the within-person population standard deviation.
Save the residuals of a regression model predicting each scale from the mean of all scales


I ran quick comparison on some personality data and it seemed like the residual regression and the deviation approach achieved very similar results (see R code at the bottom of post. Thus, it makes sense that the simpler to calculate deviation approach is often applied.

References


Radcliffe, J. A. (1963). Some properties of ipsative score matrices and their relevance for some current interest tests. Australian Journal of Psychology, 15(1), 1-11.
Meade, A.W. (2004). Psychometric problems and issues involved with creating and using ipsative measures for selection. Journal of Occupational and Organizational Psychology (2004), 77, 531–552.
Baron, H. (1996). Strengths and limitations of ipsative measurement. Journal of Occupational and Organizational Psychology, 69(1), 49-56.


R code

&gt; # load some personality data
&gt; library(psych)
&gt; data(bfi)
&gt; scales &lt;- c("a1", "a2", "a3")
&gt; names(bfi) &lt;- tolower(names(bfi))
&gt; bfi &lt;- bfi[,scales]
&gt; bfi &lt;- na.omit(bfi)
&gt; head(bfi)
      a1 a2 a3
61617  2  4  3
61618  2  4  5
61620  5  4  5
61621  4  4  6
61622  2  3  3
61623  6  6  5
&gt; # calculate overall mean
&gt; bfi$omean &lt;- apply(bfi[,scales], 1, mean)
&gt; # calculate ipsative scores based regression residuals
&gt; bfi$res_a1 &lt;- resid(lm(a1 ~ omean, bfi))
&gt; bfi$res_a2 &lt;- resid(lm(a2 ~ omean, bfi))
&gt; bfi$res_a3 &lt;- resid(lm(a3 ~ omean,bfi))
&gt; # calculate devaiation ipsative scores
&gt; bfi$dev_a1 &lt;- bfi$a1 - bfi$omean
&gt; bfi$dev_a2 &lt;- bfi$a2 - bfi$omean
&gt; bfi$dev_a3 &lt;- bfi$a3 - bfi$omean
&gt; # check that both satisfy ipsatisation requirement
&gt; all(round(apply(bfi[,paste0("res_", scales)], 1, sum), 6) == 0)
[1] TRUE
&gt; all(round(apply(bfi[,paste0("dev_", scales)], 1, sum), 6) == 0)
[1] TRUE
&gt; # Examine similarities between approaches (see diagonal)
&gt; round(cor(bfi[paste0("res_", scales)], bfi[paste0("dev_", scales)]), 3)
       dev_a1 dev_a2 dev_a3
res_a1  0.981 -0.729 -0.711
res_a2 -0.716  0.999  0.065
res_a3 -0.718  0.067  0.971