Unstandardized Estimates

In general, the PLS-SEM framework and the pls() function assume that the model is fully standardized (i.e., all observed and latent variables have zero mean and unit variance). However, it is possible to get unstandardized estimates for your models using a post-estimation procedure. This can be done either by using the unstandardized_estimates() function or by passing unstandardized = TRUE to the summary() function. Here is an example using summary().

m <- '
  X =~ x1 + x2 + x3
  Z =~ z1 + z2 + z3
  Y =~ y1 + y2 + y3

  Y ~ X + Z + X:Z + X:X
'

fit <- pls(m, modsem::oneInt, bootstrap = TRUE, boot.R = 100)
summary(fit, unstandardized = TRUE)
#> plssem (0.1.3) ended normally after 3 iterations
#>   Estimator                                       PLSc
#>   Link                                          LINEAR
#>                                                       
#>   Number of observations                          2000
#>   Number of iterations                               3
#>   Number of latent variables                         3
#>   Number of observed variables                       9
#> 
#> Fit Measures:
#>   Chi-Square                                    56.757
#>   Degrees of Freedom                                24
#>   SRMR                                           0.006
#>   RMSEA                                          0.026
#> 
#> R-squared (indicators):
#>   x1                                             0.863
#>   x2                                             0.819
#>   x3                                             0.809
#>   z1                                             0.830
#>   z2                                             0.827
#>   z3                                             0.843
#>   y1                                             0.934
#>   y2                                             0.919
#>   y3                                             0.923
#> 
#> R-squared (latents):
#>   Y                                              0.604
#> 
#> Latent Variables:
#>                  Estimate  Std.Error  z.value  P(>|z|)   Unstd
#>   X =~          
#>     x1              0.929      0.013   70.308    0.000   1.000
#>     x2              0.905      0.013   68.790    0.000   0.814
#>     x3              0.899      0.014   62.599    0.000   0.900
#>   Z =~          
#>     z1              0.911      0.015   60.165    0.000   1.000
#>     z2              0.909      0.014   63.106    0.000   0.835
#>     z3              0.918      0.015   61.661    0.000   0.902
#>   Y =~          
#>     y1              0.966      0.006  161.677    0.000   1.000
#>     y2              0.959      0.007  135.655    0.000   0.804
#>     y3              0.961      0.007  145.015    0.000   0.901
#> 
#> Regressions:
#>                  Estimate  Std.Error  z.value  P(>|z|)   Unstd
#>   Y ~           
#>     X               0.423      0.017   25.461    0.000   0.670
#>     Z               0.361      0.016   22.977    0.000   0.572
#>     X:Z             0.454      0.016   29.051    0.000   0.726
#>     X:X            -0.005      0.020   -0.261    0.794  -0.008
#> 
#> Covariances:
#>                  Estimate  Std.Error  z.value  P(>|z|)   Unstd
#>   X ~~          
#>     Z               0.201      0.026    7.865    0.000   0.197
#>     X:Z             0.018      0.038    0.478    0.633   0.018
#>     X:X             0.030      0.077    0.386    0.700   0.029
#>   Z ~~          
#>     X:Z             0.060      0.047    1.291    0.197   0.059
#>     X:X             0.018      0.038    0.478    0.633   0.018
#>   X:Z ~~        
#>     X:X             0.372      0.062    5.955    0.000   0.360
#> 
#> Variances:
#>                  Estimate  Std.Error  z.value  P(>|z|)   Unstd
#>     X               1.000      0.028   36.061    0.000   0.985
#>     Z               1.000      0.030   33.155    0.000   0.983
#>    .Y               0.396      0.015   25.956    0.000   0.980
#>     X:Z             1.013      0.066   15.261    0.000   0.980
#>     X:X             1.740      0.180    9.645    0.000   1.687
#>    .x1              0.137      0.025    5.590    0.000   0.157
#>    .x2              0.181      0.024    7.605    0.000   0.144
#>    .x3              0.191      0.026    7.414    0.000   0.188
#>    .z1              0.170      0.027    6.221    0.000   0.202
#>    .z2              0.173      0.026    6.581    0.000   0.143
#>    .z3              0.157      0.027    5.743    0.000   0.149
#>    .y1              0.066      0.012    5.725    0.000   0.175
#>    .y2              0.081      0.014    5.981    0.000   0.141
#>    .y3              0.077      0.013    6.090    0.000   0.168

To get more detailed results, including standard errors, we can use the unstandardized_estimates() function directly.

unstandardized_estimates(fit)
#>    lhs op rhs    est    se      z pvalue ci.lower ci.upper
#> 1    X =~  x1  1.000    NA     NA     NA       NA       NA
#> 2    X =~  x2  0.814 0.020 41.568  0.000    0.776    0.853
#> 3    X =~  x3  0.900 0.023 38.373  0.000    0.854    0.946
#> 4    Z =~  z1  1.000    NA     NA     NA       NA       NA
#> 5    Z =~  z2  0.835 0.024 34.902  0.000    0.788    0.882
#> 6    Z =~  z3  0.902 0.025 36.375  0.000    0.853    0.951
#> 7    Y =~  y1  1.000    NA     NA     NA       NA       NA
#> 8    Y =~  y2  0.804 0.009 88.470  0.000    0.786    0.822
#> 9    Y =~  y3  0.901 0.009 97.027  0.000    0.883    0.919
#> 10   Y  ~   X  0.670 0.029 22.857  0.000    0.612    0.727
#> 11   Y  ~   Z  0.572 0.028 20.730  0.000    0.518    0.626
#> 12   Y  ~ X:Z  0.726 0.031 23.451  0.000    0.665    0.787
#> 13   Y  ~ X:X -0.008 0.032 -0.261  0.794   -0.072    0.055
#> 14   X ~~   X  0.985 0.040 24.393  0.000    0.906    1.064
#> 15   X ~~   Z  0.197 0.025  7.749  0.000    0.147    0.247
#> 16   X ~~ X:Z  0.018 0.037  0.478  0.632   -0.055    0.090
#> 17   X ~~ X:X  0.029 0.075  0.387  0.699   -0.118    0.176
#> 18   Z ~~   Z  0.983 0.046 21.172  0.000    0.892    1.074
#> 19   Z ~~ X:Z  0.059 0.046  1.285  0.199   -0.031    0.148
#> 20   Z ~~ X:X  0.018 0.037  0.478  0.632   -0.055    0.090
#> 21   Y ~~   Y  0.980 0.041 24.146  0.000    0.900    1.060
#> 22 X:Z ~~ X:Z  0.980 0.081 12.115  0.000    0.822    1.139
#> 23 X:Z ~~ X:X  0.360 0.063  5.742  0.000    0.237    0.483
#> 24 X:X ~~ X:X  1.687 0.202  8.372  0.000    1.292    2.082
#> 25  x1 ~~  x1  0.157 0.028  5.590  0.000    0.102    0.212
#> 26  x2 ~~  x2  0.144 0.019  7.605  0.000    0.107    0.181
#> 27  x3 ~~  x3  0.188 0.025  7.414  0.000    0.139    0.238
#> 28  z1 ~~  z1  0.202 0.032  6.221  0.000    0.138    0.266
#> 29  z2 ~~  z2  0.143 0.022  6.581  0.000    0.101    0.186
#> 30  z3 ~~  z3  0.149 0.026  5.743  0.000    0.098    0.200
#> 31  y1 ~~  y1  0.175 0.031  5.725  0.000    0.115    0.235
#> 32  y2 ~~  y2  0.141 0.024  5.981  0.000    0.095    0.187
#> 33  y3 ~~  y3  0.168 0.028  6.090  0.000    0.114    0.222

It is also possible to pass a vector of variable names, detailing which variables should be unstandardized. The rules for different variables are as follows:

Note that the observed and latent variables can be standardized separately. This has implications for latent variables. Since we unstandardize latent/composite variables by fixing the first loading/weight to 1, their scale is inherited from the first indicator. That means that we will get a different result depending on whether the first indicator gets unstandardized or not.

Here, for example, we can see that we get different results if we do not unstandardize x1 when unstandardizing X.

# x1 is unstandardized
subset(
  unstandardized_estimates(fit, unstandardized = c("x1", "X")),
  lhs == "X" | rhs == "X"
)
#>    lhs op rhs   est    se      z pvalue ci.lower ci.upper
#> 1    X =~  x1 1.000    NA     NA     NA       NA       NA
#> 2    X =~  x2 0.912 0.022 41.568  0.000    0.869    0.955
#> 3    X =~  x3 0.906 0.024 38.373  0.000    0.860    0.953
#> 10   Y  ~   X 0.426 0.018 23.566  0.000    0.391    0.461
#> 14   X ~~   X 0.985 0.040 24.393  0.000    0.906    1.064
#> 15   X ~~   Z 0.199 0.025  7.842  0.000    0.149    0.249
#> 16   X ~~ X:Z 0.018 0.037  0.479  0.632   -0.055    0.091
#> 17   X ~~ X:X 0.029 0.075  0.387  0.699   -0.118    0.176

# x1 is standardized
subset(
  unstandardized_estimates(fit, unstandardized = "X"),
  lhs == "X" | rhs == "X"
)
#>    lhs op rhs   est    se      z pvalue ci.lower ci.upper
#> 1    X =~  x1 1.000    NA     NA     NA       NA       NA
#> 2    X =~  x2 0.974 0.023 41.568  0.000    0.928    1.020
#> 3    X =~  x3 0.968 0.025 38.373  0.000    0.919    1.018
#> 10   Y  ~   X 0.455 0.019 23.566  0.000    0.417    0.493
#> 14   X ~~   X 0.863 0.035 24.393  0.000    0.793    0.932
#> 15   X ~~   Z 0.186 0.024  7.842  0.000    0.140    0.233
#> 16   X ~~ X:Z 0.016 0.033  0.479  0.632   -0.048    0.079
#> 17   X ~~ X:X 0.024 0.062  0.387  0.699   -0.097    0.145