This question is an interesting one, though not an easy one. I would love to see more discussion on this topic.
Anyway, let me share my two cents.
I use a 1-predictor regression for illustration.
y ~ x
Let:
The variance of x, x~~x, be v_x.
The coefficient of x to y be B.
The *error* variance of y, y~~y, be ev_y.
The variance of y, v_y, is not a parameter, but is equal to (B^2)v_x + ev_y.
The standardized coefficient of x to y (with std.all), beta, is then B*sqrt(v_x/v_y) = B*sqrt(v_x/((B^2)v_x + ev_y)
So, for a multiple-group model, as you already found, it is possible that even if a regression coefficient is constrained to be equal across groups, the standardized coefficients are still different across groups. In this simple scenario, the standardized coefficient depends on (is a function of) *three* parameters, not one. Even if the (unstandardized) coefficient are the same, differences in the variance of the predictor and the error variance of outcome can result in different standardized coefficients, unless
sqrt(v_x/((B^2)v_x + ev_y) is also the same across group.
Things get much more complicated when there are more than one predictor for a dependent variable.
This is an illustration in lavaan:
library(lavaan)
#> This is lavaan 0.6-15
#> lavaan is FREE software! Please report any bugs.
dat <- HolzingerSwineford1939
dat$x <- dat$x1
dat$y <- dat$x4
mod <-
"
y ~ c(B1, B2) * x
x ~~ c(v_x1, v_x2) * x
y ~~ c(ev_y1, ev_y2) * y
v_y1 := (B1^2) * v_x1 + ev_y1
v_y2 := (B2^2) * v_x2 + ev_y2
B1 == B2
beta1 := B1 * sqrt(v_x1 / v_y1)
beta2 := B2 * sqrt(v_x2 / v_y2)
"
fit <- sem(mod, data = dat, group = "school")
est <- parameterEstimates(fit, standardized = TRUE, ci = FALSE, se = FALSE)
est
#> lhs op rhs block group label est std.lv std.all std.nox
#> 1 y ~ x 1 1 B1 0.373 0.373 0.389 0.389
#> 2 x ~~ x 1 1 v_x1 1.395 1.395 1.000 1.000
#> 3 y ~~ y 1 1 ev_y1 1.090 1.090 0.849 0.849
#> 4 y ~1 1 1 0.979 0.979 0.864 0.864
#> 5 x ~1 1 1 4.941 4.941 4.183 4.183
#> 6 y ~ x 2 2 B2 0.373 0.373 0.376 0.376
#> 7 x ~~ x 2 2 v_x2 1.319 1.319 1.000 1.000
#> 8 y ~~ y 2 2 ev_y2 1.113 1.113 0.858 0.858
#> 9 y ~1 2 2 1.478 1.478 1.298 1.298
#> 10 x ~1 2 2 4.930 4.930 4.293 4.293
#> 11 v_y1 := (B1^2)*v_x1+ev_y1 0 0 v_y1 1.284 1.284 1.000 1.000
#> 12 v_y2 := (B2^2)*v_x2+ev_y2 0 0 v_y2 1.296 1.296 1.000 1.000
#> 14 beta1 := B1*sqrt(v_x1/v_y1) 0 0 beta1 0.389 0.389 0.389 0.389
#> 15 beta2 := B2*sqrt(v_x2/v_y2) 0 0 beta2 0.376 0.376 0.376 0.376
# Compare the lavaan std.all values and user-defined values
est[c(1, 6, 13, 14), ]
#> lhs op rhs block group label est std.lv std.all std.nox
#> 1 y ~ x 1 1 B1 0.373 0.373 0.389 0.389
#> 6 y ~ x 2 2 B2 0.373 0.373 0.376 0.376
#> 14 beta1 := B1*sqrt(v_x1/v_y1) 0 0 beta1 0.389 0.389 0.389 0.389
#> 15 beta2 := B2*sqrt(v_x2/v_y2) 0 0 beta2 0.376 0.376 0.376 0.376
No simple solution, and also nothing wrong with this phenomenon.
Assuming the error variance is also constrained to be the same, then the only parameter that can lead to the discrepancy between B and "beta" in the model above is the variance of x. So, even if the unstandardized effect of x is the same across group, a group difference in the variances, and so the SDs, of x certainly should lead to a difference in "beta" because "one SD increase of x" does not mean the same increase in x in its original unit across group.
But there is a possible solution. Constrain more parameters to be the same across groups. In the example above, if we also constrain the variances and the error variances to be equal across group, then both Bs and betas will be the same across groups (guarantee to be the same):
mod2 <-
"
y ~ c(B, B) * x
x ~~ c(v_x, v_x) * x
y ~~ c(ev_y, ev_y) * y
"
fit2 <- sem(mod2, data = dat, group = "school")
est2 <- parameterEstimates(fit2, standardized = TRUE, ci = FALSE, se = FALSE)
est2
#> lhs op rhs block group label est std.lv std.all std.nox
#> 1 y ~ x 1 1 B 0.373 0.373 0.382 0.382
#> 2 x ~~ x 1 1 v_x 1.358 1.358 1.000 1.000
#> 3 y ~~ y 1 1 ev_y 1.101 1.101 0.854 0.854
#> 4 y ~1 1 1 0.981 0.981 0.864 0.864
#> 5 x ~1 1 1 4.941 4.941 4.240 4.240
#> 6 y ~ x 2 2 B 0.373 0.373 0.382 0.382
#> 7 x ~~ x 2 2 v_x 1.358 1.358 1.000 1.000
#> 8 y ~~ y 2 2 ev_y 1.101 1.101 0.854 0.854
#> 9 y ~1 2 2 1.480 1.480 1.303 1.303
#> 10 x ~1 2 2 4.930 4.930 4.230 4.230
I rarely see researchers do this. The suggestion by Keith is much more common. Nevertheless, empirically, a model like this is possible. If you really want to have some unstandardized and standardized path coefficients to be the same across groups, and your data supports a model like this one, and you have theoretical reasons to fit this model, then I see no reason why you cannot try.
My two cents.
Regards,
Shu Fai Cheung (張樹輝)