I present using dummy data for an example, see below for R code to replicate data.
Imagine that I have collected data on how much mail 500 people receive. In my survey there are 250 men and 250 women, so $n$ = 500. I asked each respondent to categorise & count the mail they received, over the course of one week, in to one of three classes; junk, bills, and personal.
What I want to test is the amount of variation in mail received as explained by each of the three classes. Assuming that all mail received falls in to one of the three classes, I would think that I could generate a variance-covariance matrix (using MCMCglmm in R) and then derive correlations. The correlations would then act as estimates of how much variance is explained by each class of mail.
$\rho_{ij} = \frac{cov_{total, class_i}}{\sqrt{\sigma^2_{total} * \sigma^2_{class_i}}}$
$Percentage$ $variance$ $explained = 100 * \rho_{ij}$
Where $\rho_{ij}$ is the correlation between total received and the category of interest. For example, I might show that the correlation between total mail received and junk mail received, as defined above, is 0.7, thus conclude that the amount of junk mail one receives explains 70% of the variation in mail received. Further, I might sum together junk and bills in to a new class called "businesses" which might explain 85% of the variance is the correlation, as defined above, is 0.85.
Would this be an appropriate approach or is it a terribly flawed idea? I've read that using correlation coefficients as a way to measure "explained variation" can be controversial, but I think in this case it is appropriate because the value total can only be determined by the 3 constituents, thus there are no more variables that can explain variation in the total.
# Clear workspace
rm(list = ls())
set.seed(1123)
# Number of people surveyed
m = 250 # males
f = 250 # females
n = m + f
# Distributions
junk = rpois(n, 3)
personal = rpois(n, 2)
bills = rpois(n, 3)
# Dataframe
mail = data.frame(as.factor(1:n), as.factor(rep(c("m","f"), each = m)),
sample(junk, replace=TRUE, size = n), sample(bills, replace=TRUE, size = n), sample(personal, replace=TRUE, size = n))
colnames(mail) = c("person", "sex", "junk", "bills", "personal")
mail$total = apply(mail[,3:5],1,sum)
mail$junk = as.factor(mail$junk); mail$bills = as.factor(mail$bills); mail$personal = as.factor(mail$personal); mail$total = as.factor(mail$total)