If we have two variables, $X$ and $M$, which follow a multivariate normal distribution, have a mean of 0, are correlated ($r_{XM}$), and have known reliabilities ($\rho_X$ and $\rho_M$), then the reliability of the interaction term $XM$ ($XM = X * M$) is:
$\rho_{XM} = \frac{\rho_X*\rho_M + r_{XM}^2 }{1 +r_{XM}^2} $
See link1 (Eq. 10), link2 (Eq. 19). Reliability can be thought of as a latent property of a measurement that is estimated. This tutorial is a good resource. It is generally defined as the fraction of an observed score variance that was not error:
Reliability of $X$ = $\rho_X = 1 - \frac{\sigma^2_\epsilon}{V_x}$
Where $\sigma^2_\epsilon$ is variance of the measurement error and $V_X$ is the observed variance. In practice, how reliability is estimated will vary depending on what kind of measurement we are interested. See this extensive tutorial that reviews some of the most common methods. Note that how reliability was estimated is not germane to my question, only that it exists and is known.
Now, my question is: If we add a third variable $Z$, following all the assumptions above, which is correlated with both $X$ and $M$, with a known reliability ($\rho_Z$), what is the reliability of the interaction term $XMZ$ ($XMZ = X*M*Z$)?
Edits:
As an example, we can simulate some data and compute the reliability of the terms and interaction terms (note that in this simulation I'm assuming that $cor(X,MZ) = cor(M,XZ) = cor(Z,XM) = 0$, which may not actually be the case in truth, this is why I'd like to know the formula for the reliability.
add.noise = function(x,rel){
x2 = base::scale(x = (x+stats::rnorm(length(x), 0, sqrt((1-rel)/rel))),
center = TRUE, scale = TRUE)
return(x2)
}
estimate_three_way_rel=function(r.X.M,r.X.Z,r.M.Z,rel.X,rel.M,rel.Z,N){
# Simulate two identical data sets
cor.mat = matrix(data = c(1,r.X.M,r.X.Z,
r.X.M,1,r.M.Z,
r.X.Z,r.M.Z,1),nrow = 3,byrow = TRUE)
d1 = MASS::mvrnorm(n=N, mu=rep(0,3), Sigma=cor.mat, empirical=TRUE)
d2 = d1
# add in random noise proportional to the reliability
d1[,1] = add.noise(x = d1[,1],rel = rel.X)
d1[,2] = add.noise(x = d1[,2],rel = rel.M)
d1[,3] = add.noise(x = d1[,3],rel = rel.Z)
d2[,1] = add.noise(x = d2[,1],rel = rel.X)
d2[,2] = add.noise(x = d2[,2],rel = rel.M)
d2[,3] = add.noise(x = d2[,3],rel = rel.Z)
# compute reliabilities
rel.x = cor(d1[,1],d2[,1])
rel.m = cor(d1[,2],d2[,2])
rel.z = cor(d1[,3],d2[,3])
rel.xm = cor(c(d1[,1]*d1[,2]),c(d2[,1]*d2[,2]))
rel.xz = cor(c(d1[,1]*d1[,3]),c(d2[,1]*d2[,3]))
rel.mz = cor(c(d1[,2]*d1[,3]),c(d2[,2]*d2[,3]))
rel.xmz = cor(c(d1[,1]*d1[,2]*d1[,3]),c(d2[,1]*d2[,2]*d2[,3]))
# return reliabilities
return(c(rel.x,rel.m,rel.z,rel.xm,rel.xz,rel.mz,rel.xmz))
}
Now compute the reliabilities for a simulated data set:
demo.int = estimate_three_way_rel(
r.X.M=.3,
r.X.Z=.5,
r.M.Z=.1,
rel.X=.8,
rel.M=.5,
rel.Z=.2,
N=100000)
> demo.int[c(1:3)]
[1] 0.7989486 0.4997133 0.2002855
The reliability of the $X$, $M$, and $Z$ terms match with that was specified.
The formula for two-way reliability yields:
adjust.cor = function(cor1,rel1,rel2){
newcor = cor1*sqrt(rel1*rel2)
return(newcor)
}
two.way.rel = function(cor1,rel1,rel2){
newrel=((rel1*rel2)+cor1^2)/(1+cor1^2)
return(newrel)
}
interaction.rel = function(r.X.M,r.X.Z,r.M.Z,rel.X,rel.M,rel.Z){
r.X.M.new=adjust.cor(cor1 = r.X.M, rel1 = rel.X, rel2 = rel.M)
r.X.Z.new=adjust.cor(cor1 = r.X.Z, rel1 = rel.X, rel2 = rel.Z)
r.M.Z.new=adjust.cor(cor1 = r.M.Z, rel1 = rel.M, rel2 = rel.Z)
rel.XM = two.way.rel(cor1 = r.X.M.new, rel1 = rel.X, rel2 = rel.M)
rel.XZ = two.way.rel(cor1 = r.X.Z.new, rel1 = rel.X, rel2 = rel.Z)
rel.MZ = two.way.rel(cor1 = r.M.Z.new, rel1 = rel.M, rel2 = rel.Z)
return(c(rel.XM,rel.XZ,rel.MZ))
}
interaction.rel( r.X.M=.3,
r.X.Z=.5,
r.M.Z=.1,
rel.X=.8,
rel.M=.5,
rel.Z=.2)
[1] 0.4208494 0.1923077 0.1008991
This matches the reliability of the two-way interaction terms from the simulated data set:
demo.int[c(4:6)]
[1] 0.41461804 0.18411966 0.09994802
Now, the reliability of the three-way interaction term in this simulation is:
demo.int[7]
[1] 0.1125685
I'd like to know this value without having to run a simulation.