I have a set of z-scores corresponding to different tests taken by the same subjects. Can i take the average of the z-scores for each subject and compare the average z-scores as it was actual z-scores? (i.e. can I calculate a percentile for each subject based on the average of the set of z-scores?)


My goal is to calculate percentiles for a subject based on a set of z-scores for that subject. So far my approach has been to take the average of the z-scores of a subject, and then treat that average as a z-score and calculate the percentile based on that. I wonder if there is any problem with that approach?

  • $\begingroup$ Could you tell us more on your actual problem (what is your data, what are you trying to achieve)? In general, after converting to z-scores your samples have the same mean (=0) and standartd deviation (=1), so they are on the same scale, but it is hard to comment since your question is very vague. $\endgroup$
    – Tim
    Nov 8, 2017 at 10:18
  • $\begingroup$ Thanks! I tried to be as concise as possible, but maybe that made it vague. I edited the question now. Is it clearer? $\endgroup$
    – Frank5000
    Nov 8, 2017 at 15:21
  • $\begingroup$ What is your data? Why do you want to use z-scores at all? $\endgroup$
    – Tim
    Nov 8, 2017 at 15:24
  • $\begingroup$ My input data consists of z-scores from different tests testing the same latent variable. I have no further control over the data at this point. I want to divide the subjects in groups based on a normal distribution of the population, where the group is determined by different percentile levels. The groups will make more sense to practitioners looking at the data. So I want to present a group for each subject based on their aggregated z-scores. And the group is based on percentile-levels. $\endgroup$
    – Frank5000
    Nov 8, 2017 at 15:31
  • $\begingroup$ I would NOT make any statistical inferences based off of doing this, but for rhetorical value, you could do a median split and show mean levels for “low” and “high”? $\endgroup$
    – Mark White
    Nov 9, 2017 at 14:25

2 Answers 2


Maybe someone else can explain the math behind it, but consider this quick demonstration: I generate five vectors, each 100 numbers long. Each of these vectors is on a different scale, so I standardize them (i.e., create z-scored variables). That is, the mean is zero and the standard deviation is 1 for each of these five latent construct variables:


## create five different z-score variables that represent latent constructs
data <- data.frame(
  latent_construct_1 = scale(rnorm(100, 10, 4)),
  latent_construct_2 = scale(rnorm(100, 3, 18)),
  latent_construct_3 = scale(rnorm(100, -5, 7)),
  latent_construct_4 = scale(rnorm(100, 0, 8)),
  latent_construct_5 = scale(rnorm(100, 20, 20))

Let's check to make sure they are actually z-scores:

> sapply(data, mean)
latent_construct_1 latent_construct_2 latent_construct_3 latent_construct_4 latent_construct_5 
     -2.203951e-16       1.634435e-17       1.400464e-17      -1.449145e-17       7.852226e-17 
> sapply(data, sd)
latent_construct_1 latent_construct_2 latent_construct_3 latent_construct_4 latent_construct_5 
                 1                  1                  1                  1                  1 

So, now let's say we average all five of these together:

## make a mean of all of these latent constructs
data$mean_latent_construct <- rowMeans(data)

Is this new variable a z-score? We can check to see if the mean is zero and standard deviation is one:

> ## is the mean zero?
> mean(data$mean_latent_construct)
[1] -2.436148e-17
> ## is the standard deviation one?
> sd(data$mean_latent_construct)
[1] 0.4599126

The variable is not a z-score, because the standard deviation is not one. However, we could now z-score this mean variable. Let's do that and compare the distributions:

## z-score the mean latent construct
data$mean_latent_construct_z <- scale(data$mean_latent_construct)

## compare distributions
data <- data %>% 
  select(mean_latent_construct, mean_latent_construct_z) %>% 
  gather(variable, value)

ggplot(data, aes(x = value, fill = variable)) +
  geom_density(alpha = .7) +

enter image description here

The z-scored aggregate variable of z-scores looks a lot different from the aggregate variable of z-scores.

In short: No, a mean of z-scored variables is not a z-score itself.

  • $\begingroup$ Thank you! I will ask you the same question as I asked AdamO below. Looking at those two distributions in your plot, calculating a percentile for each subject in both of those should yield the exact same result right? So even if it is not formally a z-score, the percentile value might be the same? $\endgroup$
    – Frank5000
    Nov 9, 2017 at 12:24
  • $\begingroup$ If you really want a percentile, you could just rank people from low to high, and then take someone’s rank and divide it by the number of people you have? Or you could just z-score what you have and get percentiles from z-scores. $\endgroup$
    – Mark White
    Nov 9, 2017 at 14:23
  • $\begingroup$ Perfect! My customers will understand percentiles, that's why I want to present the results in percentiles. $\endgroup$
    – Frank5000
    Nov 10, 2017 at 9:13

Nope. The central limit theorem should provide some insight. Or you can appeal to the variance of a sum. If $X_1, X_2, \ldots, X_p$ comprise your $p$ independent z-scores to average together, (mean 0, variance 1), then the mean has variance:

$$\mbox{var} (\bar{X}) = \frac{1}{p^2} \sum_{i=1}^p \mbox{var}(X_i) = 1/p$$

This quantity could be scaled, however, since the sum of normals is normal, and this would meet the criteria of a Z-score.

  • 1
    $\begingroup$ Thanks! So the distribution of the mean would be similar to z-scores in all regards except the scale? In that case, as it is still normal and the scale shouldn't affect the percentiles, it should be possible to calculate a percentile for each subject anyway? $\endgroup$
    – Frank5000
    Nov 9, 2017 at 12:22
  • $\begingroup$ @Frank5000 Yes, if you center/scale the grand mean, you can apply percentiles or rank based comparisons. Inspect a QQ-plot, however, to verify the normality, however. Measurement invariance is a big deal. $\endgroup$
    – AdamO
    Nov 9, 2017 at 16:40
  • $\begingroup$ Alright! When you say measurement invariance is a big deal, what do you mean in this context? $\endgroup$
    – Frank5000
    Nov 10, 2017 at 9:11
  • $\begingroup$ @Frank5000 I'll leave it to you to do more thorough investigation. Measurement invariance is a whole field of methods. When you create a new scale, the properties of that scale should be investigated for measurement invariance. $\endgroup$
    – AdamO
    Nov 10, 2017 at 18:09
  • $\begingroup$ @Frank5000 have a look here: stats.stackexchange.com/questions/348192/… $\endgroup$
    – Marouen
    Apr 24, 2019 at 22:25

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.