#############################################################################
### Latent Iteractions in Structural Equation Models
#############################################################################

### load packages and data
library(lavaan)
library(semTools)

data(HolzingerSwineford1939)

dat <- HolzingerSwineford1939[, 7:15]

## assume x1,x2,x3, and x4,x5,x6, independent, and x7,x8,x9 dependent
names(dat)[7:9] <- paste0("y", 1:3)
head(dat)
##         x1   x2    x3       x4   x5        x6       y1   y2       y3
## 1 3.333333 7.75 0.375 2.333333 5.75 1.2857143 3.391304 5.75 6.361111
## 2 5.333333 5.25 2.125 1.666667 3.00 1.2857143 3.782609 6.25 7.916667
## 3 4.500000 5.25 1.875 1.000000 1.75 0.4285714 3.260870 3.90 4.416667
## 4 5.333333 7.75 3.000 2.666667 4.50 2.4285714 3.000000 5.30 4.861111
## 5 4.833333 4.75 0.875 2.666667 4.00 2.5714286 3.695652 6.30 5.916667
## 6 5.333333 5.00 2.250 1.000000 3.00 0.8571429 4.347826 6.65 7.500000
## mean-center all x's
dat.mc <- cbind(scale(dat[, 1:6], scale = FALSE), dat[, 7:9])
head(dat.mc)
##           x1         x2            x3         x4         x5         x6
## 1 -1.6024364  1.6619601 -1.8754152824 -0.7275748  1.4094684 -0.8998576
## 2  0.3975636 -0.8380399 -0.1254152824 -1.3942414 -1.3405316 -0.8998576
## 3 -0.4357697 -0.8380399 -0.3754152824 -2.0609081 -2.5905316 -1.7570005
## 4  0.3975636  1.6619601  0.7495847176 -0.3942414  0.1594684  0.2429995
## 5 -0.1024364 -1.3380399 -1.3754152824 -0.3942414 -0.3405316  0.3858567
## 6  0.3975636 -1.0880399 -0.0004152824 -2.0609081 -1.3405316 -1.3284290
##         y1   y2       y3
## 1 3.391304 5.75 6.361111
## 2 3.782609 6.25 7.916667
## 3 3.260870 3.90 4.416667
## 4 3.000000 5.30 4.861111
## 5 3.695652 6.30 5.916667
## 6 4.347826 6.65 7.500000
## define var1 and var2, and fit measures for later
var1 <- c("x1","x2","x3")
var2 <- c("x4","x5","x6")
fm <-  c("cfi", "tli", "rmsea", "srmr")

####################################################################
### unconstrained mean-centered approach as in Marsh (2004)
####################################################################

## indicators are not centered -> include mean-structure in sem model
dat1 <- indProd(dat,    var1, var2, match = TRUE, meanC = TRUE)
head(dat1)
##         x1   x2    x3       x4   x5        x6       y1   y2       y3
## 1 3.333333 7.75 0.375 2.333333 5.75 1.2857143 3.391304 5.75 6.361111
## 2 5.333333 5.25 2.125 1.666667 3.00 1.2857143 3.782609 6.25 7.916667
## 3 4.500000 5.25 1.875 1.000000 1.75 0.4285714 3.260870 3.90 4.416667
## 4 5.333333 7.75 3.000 2.666667 4.50 2.4285714 3.000000 5.30 4.861111
## 5 4.833333 4.75 0.875 2.666667 4.00 2.5714286 3.695652 6.30 5.916667
## 6 5.333333 5.00 2.250 1.000000 3.00 0.8571429 4.347826 6.65 7.500000
##        x1.x4      x2.x5       x3.x6
## 1  0.6610573 2.13138928  1.44349772
## 2 -1.0591347 0.91232782 -0.13125309
## 3  0.3932462 1.95987765  0.41549585
## 4 -0.6615710 0.05393911 -0.06196027
## 5 -0.4644503 0.24455373 -0.77482218
## 6 -1.3241771 1.24746071 -0.24355731
## all independent indicators are centered
## meanC = TRUE or meanC = FALSE does not matter, since x's are centered
dat2 <- indProd(dat.mc, var1, var2, match = TRUE)
head(dat2)
##           x1         x2            x3         x4         x5         x6
## 1 -1.6024364  1.6619601 -1.8754152824 -0.7275748  1.4094684 -0.8998576
## 2  0.3975636 -0.8380399 -0.1254152824 -1.3942414 -1.3405316 -0.8998576
## 3 -0.4357697 -0.8380399 -0.3754152824 -2.0609081 -2.5905316 -1.7570005
## 4  0.3975636  1.6619601  0.7495847176 -0.3942414  0.1594684  0.2429995
## 5 -0.1024364 -1.3380399 -1.3754152824 -0.3942414 -0.3405316  0.3858567
## 6  0.3975636 -1.0880399 -0.0004152824 -2.0609081 -1.3405316 -1.3284290
##         y1   y2       y3      x1.x4      x2.x5       x3.x6
## 1 3.391304 5.75 6.361111  0.6610573 2.13138928  1.44349772
## 2 3.782609 6.25 7.916667 -1.0591347 0.91232782 -0.13125309
## 3 3.260870 3.90 4.416667  0.3932462 1.95987765  0.41549585
## 4 3.000000 5.30 4.861111 -0.6615710 0.05393911 -0.06196027
## 5 3.695652 6.30 5.916667 -0.4644503 0.24455373 -0.77482218
## 6 4.347826 6.65 7.500000 -1.3241771 1.24746071 -0.24355731
## sem model
## all interaction terms are modelled using the 3-match approach
model <- '
  ## define latent variable
  xi1  =~ x1 + x2 + x3
  xi2  =~ x4 + x5 + x6
  xi12 =~ x1.x4 + x2.x5 + x3.x6
  eta  =~ y1 + y2 + y3
  ## regression
  eta ~ xi1 + xi2 + xi12
'

## fit
fit.mc1 <- sem(model, dat1, meanstructure = TRUE)
fit.mc2 <- sem(model, dat2, meanstructure = FALSE)

summary(fit.mc1, fit.measures=TRUE)
## lavaan 0.6-2 ended normally after 48 iterations
## 
##   Optimization method                           NLMINB
##   Number of free parameters                         42
## 
##   Number of observations                           301
## 
##   Estimator                                         ML
##   Model Fit Test Statistic                     122.868
##   Degrees of freedom                                48
##   P-value (Chi-square)                           0.000
## 
## Model test baseline model:
## 
##   Minimum Function Test Statistic             1060.354
##   Degrees of freedom                                66
##   P-value                                        0.000
## 
## User model versus baseline model:
## 
##   Comparative Fit Index (CFI)                    0.925
##   Tucker-Lewis Index (TLI)                       0.896
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)              -5326.599
##   Loglikelihood unrestricted model (H1)      -5265.165
## 
##   Number of free parameters                         42
##   Akaike (AIC)                               10737.198
##   Bayesian (BIC)                             10892.897
##   Sample-size adjusted Bayesian (BIC)        10759.697
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.072
##   90 Percent Confidence Interval          0.056  0.088
##   P-value RMSEA <= 0.05                          0.012
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.052
## 
## Parameter Estimates:
## 
##   Information                                 Expected
##   Information saturated (h1) model          Structured
##   Standard Errors                             Standard
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   xi1 =~                                              
##     x1                1.000                           
##     x2                0.554    0.100    5.562    0.000
##     x3                0.730    0.109    6.705    0.000
##   xi2 =~                                              
##     x4                1.000                           
##     x5                1.116    0.066   16.887    0.000
##     x6                0.945    0.056   16.840    0.000
##   xi12 =~                                             
##     x1.x4             1.000                           
##     x2.x5             0.924    0.192    4.809    0.000
##     x3.x6             1.435    0.318    4.506    0.000
##   eta =~                                              
##     y1                1.000                           
##     y2                1.182    0.166    7.138    0.000
##     y3                1.095    0.153    7.138    0.000
## 
## Regressions:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   eta ~                                               
##     xi1               0.299    0.078    3.824    0.000
##     xi2               0.035    0.058    0.608    0.543
##     xi12              0.063    0.076    0.830    0.407
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   xi1 ~~                                              
##     xi2               0.406    0.073    5.560    0.000
##     xi12              0.103    0.059    1.738    0.082
##   xi2 ~~                                              
##     xi12              0.262    0.073    3.576    0.000
## 
## Intercepts:
##                    Estimate  Std.Err  z-value  P(>|z|)
##    .x1                4.936    0.067   73.473    0.000
##    .x2                6.088    0.068   89.855    0.000
##    .x3                2.250    0.065   34.579    0.000
##    .x4                3.061    0.067   45.694    0.000
##    .x5                4.341    0.074   58.452    0.000
##    .x6                2.186    0.063   34.667    0.000
##    .x1.x4             0.000    0.092    0.000    1.000
##    .x2.x5            -0.000    0.088   -0.000    1.000
##    .x3.x6            -0.000    0.078   -0.000    1.000
##    .y1                4.186    0.063   66.766    0.000
##    .y2                5.527    0.058   94.854    0.000
##    .y3                5.374    0.058   92.546    0.000
##     xi1               0.000                           
##     xi2               0.000                           
##     xi12              0.000                           
##    .eta               0.000                           
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##    .x1                0.550    0.113    4.861    0.000
##    .x2                1.134    0.102   11.148    0.000
##    .x3                0.844    0.091    9.320    0.000
##    .x4                0.386    0.048    8.093    0.000
##    .x5                0.458    0.058    7.869    0.000
##    .x6                0.335    0.042    7.964    0.000
##    .x1.x4             2.011    0.199   10.102    0.000
##    .x2.x5             1.889    0.182   10.352    0.000
##    .x3.x6             0.749    0.224    3.344    0.001
##    .y1                0.804    0.081    9.874    0.000
##    .y2                0.492    0.074    6.662    0.000
##    .y3                0.560    0.071    7.912    0.000
##     xi1               0.808    0.145    5.572    0.000
##     xi2               0.964    0.111    8.653    0.000
##     xi12              0.528    0.169    3.116    0.002
##    .eta               0.290    0.069    4.218    0.000
summary(fit.mc2, fit.measures=TRUE)
## lavaan 0.6-2 ended normally after 48 iterations
## 
##   Optimization method                           NLMINB
##   Number of free parameters                         30
## 
##   Number of observations                           301
## 
##   Estimator                                         ML
##   Model Fit Test Statistic                     122.868
##   Degrees of freedom                                48
##   P-value (Chi-square)                           0.000
## 
## Model test baseline model:
## 
##   Minimum Function Test Statistic             1060.354
##   Degrees of freedom                                66
##   P-value                                        0.000
## 
## User model versus baseline model:
## 
##   Comparative Fit Index (CFI)                    0.925
##   Tucker-Lewis Index (TLI)                       0.896
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)              -5326.599
##   Loglikelihood unrestricted model (H1)      -5265.165
## 
##   Number of free parameters                         30
##   Akaike (AIC)                               10713.198
##   Bayesian (BIC)                             10824.411
##   Sample-size adjusted Bayesian (BIC)        10729.268
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.072
##   90 Percent Confidence Interval          0.056  0.088
##   P-value RMSEA <= 0.05                          0.012
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.056
## 
## Parameter Estimates:
## 
##   Information                                 Expected
##   Information saturated (h1) model          Structured
##   Standard Errors                             Standard
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   xi1 =~                                              
##     x1                1.000                           
##     x2                0.554    0.100    5.562    0.000
##     x3                0.730    0.109    6.705    0.000
##   xi2 =~                                              
##     x4                1.000                           
##     x5                1.116    0.066   16.887    0.000
##     x6                0.945    0.056   16.840    0.000
##   xi12 =~                                             
##     x1.x4             1.000                           
##     x2.x5             0.924    0.192    4.809    0.000
##     x3.x6             1.435    0.318    4.506    0.000
##   eta =~                                              
##     y1                1.000                           
##     y2                1.182    0.166    7.138    0.000
##     y3                1.095    0.153    7.138    0.000
## 
## Regressions:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   eta ~                                               
##     xi1               0.299    0.078    3.824    0.000
##     xi2               0.035    0.058    0.608    0.543
##     xi12              0.063    0.076    0.830    0.407
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   xi1 ~~                                              
##     xi2               0.406    0.073    5.560    0.000
##     xi12              0.103    0.059    1.738    0.082
##   xi2 ~~                                              
##     xi12              0.262    0.073    3.576    0.000
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##    .x1                0.550    0.113    4.861    0.000
##    .x2                1.134    0.102   11.148    0.000
##    .x3                0.844    0.091    9.320    0.000
##    .x4                0.386    0.048    8.093    0.000
##    .x5                0.458    0.058    7.869    0.000
##    .x6                0.335    0.042    7.964    0.000
##    .x1.x4             2.011    0.199   10.102    0.000
##    .x2.x5             1.889    0.182   10.352    0.000
##    .x3.x6             0.749    0.224    3.344    0.001
##    .y1                0.804    0.081    9.874    0.000
##    .y2                0.492    0.074    6.662    0.000
##    .y3                0.560    0.071    7.912    0.000
##     xi1               0.808    0.145    5.572    0.000
##     xi2               0.964    0.111    8.653    0.000
##     xi12              0.528    0.169    3.116    0.002
##    .eta               0.290    0.069    4.218    0.000
fitmeasures(fit.mc1, fm)
##   cfi   tli rmsea  srmr 
## 0.925 0.896 0.072 0.052
fitmeasures(fit.mc2, fm)
##   cfi   tli rmsea  srmr 
## 0.925 0.896 0.072 0.056
###########################################
### orthogonalizing as in Lin (2010)
###########################################

dat3 <- orthogonalize(dat,    var1, var2, match = TRUE)
head(dat3)
##         x1   x2    x3       x4   x5        x6       y1   y2       y3
## 1 3.333333 7.75 0.375 2.333333 5.75 1.2857143 3.391304 5.75 6.361111
## 2 5.333333 5.25 2.125 1.666667 3.00 1.2857143 3.782609 6.25 7.916667
## 3 4.500000 5.25 1.875 1.000000 1.75 0.4285714 3.260870 3.90 4.416667
## 4 5.333333 7.75 3.000 2.666667 4.50 2.4285714 3.000000 5.30 4.861111
## 5 4.833333 4.75 0.875 2.666667 4.00 2.5714286 3.695652 6.30 5.916667
## 6 5.333333 5.00 2.250 1.000000 3.00 0.8571429 4.347826 6.65 7.500000
##        x1.x4     x2.x5      x3.x6
## 1  1.1442639 2.1708355  1.6528853
## 2 -0.9052523 1.1806856  0.2004161
## 3  0.6310476 2.4801798  1.0869799
## 4 -0.6236064 0.1002397 -0.3186492
## 5 -0.6300572 0.1035617 -0.9721019
## 6 -0.9672133 1.6082691  0.2302153
dat4 <- orthogonalize(dat.mc, var1, var2, match = TRUE)
head(dat4)
##           x1         x2            x3         x4         x5         x6
## 1 -1.6024364  1.6619601 -1.8754152824 -0.7275748  1.4094684 -0.8998576
## 2  0.3975636 -0.8380399 -0.1254152824 -1.3942414 -1.3405316 -0.8998576
## 3 -0.4357697 -0.8380399 -0.3754152824 -2.0609081 -2.5905316 -1.7570005
## 4  0.3975636  1.6619601  0.7495847176 -0.3942414  0.1594684  0.2429995
## 5 -0.1024364 -1.3380399 -1.3754152824 -0.3942414 -0.3405316  0.3858567
## 6  0.3975636 -1.0880399 -0.0004152824 -2.0609081 -1.3405316 -1.3284290
##         y1   y2       y3      x1.x4     x2.x5      x3.x6
## 1 3.391304 5.75 6.361111  1.1442639 2.1708355  1.6528853
## 2 3.782609 6.25 7.916667 -0.9052523 1.1806856  0.2004161
## 3 3.260870 3.90 4.416667  0.6310476 2.4801798  1.0869799
## 4 3.000000 5.30 4.861111 -0.6236064 0.1002397 -0.3186492
## 5 3.695652 6.30 5.916667 -0.6300572 0.1035617 -0.9721019
## 6 4.347826 6.65 7.500000 -0.9672133 1.6082691  0.2302153
## check what happened with orthogonalize()
fit.xx <- lm(cbind(x1*x4, x2*x5, x3*x6) ~ x1 + x2 + x3 + x4 + x5 + x6, dat)

res <- fit.xx$residuals
sum(dat3$x1.x4 == res[,1]) == nrow(dat3)
## [1] TRUE
sum(dat3$x2.x5 == res[,2]) == nrow(dat3)
## [1] TRUE
sum(dat3$x3.x6 == res[,3]) == nrow(dat3)
## [1] TRUE
## check if interactions in dat3 and dat4 are all equal, up to 11 digits
sum(round(dat3[, 10:12], 11) == round(dat4[, 10:12], 11)) == 3*nrow(dat3)
## [1] TRUE
## fit
fit.o1 <- sem(model, dat3, meanstructure = TRUE)
fit.o2 <- sem(model, dat4, meanstructure = FALSE)

summary(fit.o1, fit.measures=TRUE)
## lavaan 0.6-2 ended normally after 43 iterations
## 
##   Optimization method                           NLMINB
##   Number of free parameters                         42
## 
##   Number of observations                           301
## 
##   Estimator                                         ML
##   Model Fit Test Statistic                      98.206
##   Degrees of freedom                                48
##   P-value (Chi-square)                           0.000
## 
## Model test baseline model:
## 
##   Minimum Function Test Statistic             1001.102
##   Degrees of freedom                                66
##   P-value                                        0.000
## 
## User model versus baseline model:
## 
##   Comparative Fit Index (CFI)                    0.946
##   Tucker-Lewis Index (TLI)                       0.926
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)              -5314.268
##   Loglikelihood unrestricted model (H1)      -5265.165
## 
##   Number of free parameters                         42
##   Akaike (AIC)                               10712.536
##   Bayesian (BIC)                             10868.234
##   Sample-size adjusted Bayesian (BIC)        10735.034
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.059
##   90 Percent Confidence Interval          0.042  0.076
##   P-value RMSEA <= 0.05                          0.179
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.048
## 
## Parameter Estimates:
## 
##   Information                                 Expected
##   Information saturated (h1) model          Structured
##   Standard Errors                             Standard
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   xi1 =~                                              
##     x1                1.000                           
##     x2                0.554    0.100    5.562    0.000
##     x3                0.730    0.109    6.705    0.000
##   xi2 =~                                              
##     x4                1.000                           
##     x5                1.113    0.065   17.015    0.000
##     x6                0.926    0.055   16.702    0.000
##   xi12 =~                                             
##     x1.x4             1.000                           
##     x2.x5             0.825    0.191    4.325    0.000
##     x3.x6             1.179    0.333    3.541    0.000
##   eta =~                                              
##     y1                1.000                           
##     y2                1.179    0.165    7.133    0.000
##     y3                1.102    0.155    7.132    0.000
## 
## Regressions:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   eta ~                                               
##     xi1               0.299    0.078    3.838    0.000
##     xi2               0.053    0.053    0.995    0.320
##     xi12              0.071    0.069    1.026    0.305
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   xi1 ~~                                              
##     xi2               0.408    0.073    5.551    0.000
##     xi12              0.000    0.061    0.000    1.000
##   xi2 ~~                                              
##     xi12              0.000    0.059    0.000    1.000
## 
## Intercepts:
##                    Estimate  Std.Err  z-value  P(>|z|)
##    .x1                4.936    0.067   73.473    0.000
##    .x2                6.088    0.068   89.855    0.000
##    .x3                2.250    0.065   34.579    0.000
##    .x4                3.061    0.067   45.694    0.000
##    .x5                4.341    0.074   58.452    0.000
##    .x6                2.186    0.063   34.667    0.000
##    .x1.x4            -0.000    0.091   -0.000    1.000
##    .x2.x5            -0.000    0.087   -0.000    1.000
##    .x3.x6            -0.000    0.073   -0.000    1.000
##    .y1                4.186    0.063   66.766    0.000
##    .y2                5.527    0.058   94.854    0.000
##    .y3                5.374    0.058   92.546    0.000
##     xi1               0.000                           
##     xi2               0.000                           
##     xi12              0.000                           
##    .eta               0.000                           
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##    .x1                0.550    0.113    4.858    0.000
##    .x2                1.134    0.102   11.149    0.000
##    .x3                0.844    0.091    9.323    0.000
##    .x4                0.371    0.048    7.779    0.000
##    .x5                0.446    0.058    7.641    0.000
##    .x6                0.356    0.043    8.278    0.000
##    .x1.x4             1.895    0.222    8.533    0.000
##    .x2.x5             1.862    0.187    9.965    0.000
##    .x3.x6             0.807    0.231    3.500    0.000
##    .y1                0.805    0.081    9.888    0.000
##    .y2                0.497    0.074    6.755    0.000
##    .y3                0.556    0.071    7.840    0.000
##     xi1               0.809    0.145    5.573    0.000
##     xi2               0.979    0.112    8.737    0.000
##     xi12              0.576    0.205    2.805    0.005
##    .eta               0.287    0.068    4.202    0.000
summary(fit.o2, fit.measures=TRUE)
## lavaan 0.6-2 ended normally after 43 iterations
## 
##   Optimization method                           NLMINB
##   Number of free parameters                         30
## 
##   Number of observations                           301
## 
##   Estimator                                         ML
##   Model Fit Test Statistic                      98.206
##   Degrees of freedom                                48
##   P-value (Chi-square)                           0.000
## 
## Model test baseline model:
## 
##   Minimum Function Test Statistic             1001.102
##   Degrees of freedom                                66
##   P-value                                        0.000
## 
## User model versus baseline model:
## 
##   Comparative Fit Index (CFI)                    0.946
##   Tucker-Lewis Index (TLI)                       0.926
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)              -5314.268
##   Loglikelihood unrestricted model (H1)      -5265.165
## 
##   Number of free parameters                         30
##   Akaike (AIC)                               10688.536
##   Bayesian (BIC)                             10799.749
##   Sample-size adjusted Bayesian (BIC)        10704.606
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.059
##   90 Percent Confidence Interval          0.042  0.076
##   P-value RMSEA <= 0.05                          0.179
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.051
## 
## Parameter Estimates:
## 
##   Information                                 Expected
##   Information saturated (h1) model          Structured
##   Standard Errors                             Standard
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   xi1 =~                                              
##     x1                1.000                           
##     x2                0.554    0.100    5.562    0.000
##     x3                0.730    0.109    6.705    0.000
##   xi2 =~                                              
##     x4                1.000                           
##     x5                1.113    0.065   17.015    0.000
##     x6                0.926    0.055   16.702    0.000
##   xi12 =~                                             
##     x1.x4             1.000                           
##     x2.x5             0.825    0.191    4.325    0.000
##     x3.x6             1.179    0.333    3.541    0.000
##   eta =~                                              
##     y1                1.000                           
##     y2                1.179    0.165    7.133    0.000
##     y3                1.102    0.155    7.132    0.000
## 
## Regressions:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   eta ~                                               
##     xi1               0.299    0.078    3.838    0.000
##     xi2               0.053    0.053    0.995    0.320
##     xi12              0.071    0.069    1.026    0.305
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   xi1 ~~                                              
##     xi2               0.408    0.073    5.551    0.000
##     xi12              0.000    0.061    0.000    1.000
##   xi2 ~~                                              
##     xi12              0.000    0.059    0.000    1.000
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##    .x1                0.550    0.113    4.858    0.000
##    .x2                1.134    0.102   11.149    0.000
##    .x3                0.844    0.091    9.323    0.000
##    .x4                0.371    0.048    7.779    0.000
##    .x5                0.446    0.058    7.641    0.000
##    .x6                0.356    0.043    8.278    0.000
##    .x1.x4             1.895    0.222    8.533    0.000
##    .x2.x5             1.862    0.187    9.965    0.000
##    .x3.x6             0.807    0.231    3.500    0.000
##    .y1                0.805    0.081    9.888    0.000
##    .y2                0.497    0.074    6.755    0.000
##    .y3                0.556    0.071    7.840    0.000
##     xi1               0.809    0.145    5.573    0.000
##     xi2               0.979    0.112    8.737    0.000
##     xi12              0.576    0.205    2.805    0.005
##    .eta               0.287    0.068    4.202    0.000
fitmeasures(fit.o1, fm)
##   cfi   tli rmsea  srmr 
## 0.946 0.926 0.059 0.048
fitmeasures(fit.o2, fm)
##   cfi   tli rmsea  srmr 
## 0.946 0.926 0.059 0.051
################################################
### double-mean-centering as in Lin (2010)
################################################

dat5 <- indProd(dat,    var1, var2, match = TRUE, doubleMC = TRUE)
head(dat5)
##         x1   x2    x3       x4   x5        x6       y1   y2       y3
## 1 3.333333 7.75 0.375 2.333333 5.75 1.2857143 3.391304 5.75 6.361111
## 2 5.333333 5.25 2.125 1.666667 3.00 1.2857143 3.782609 6.25 7.916667
## 3 4.500000 5.25 1.875 1.000000 1.75 0.4285714 3.260870 3.90 4.416667
## 4 5.333333 7.75 3.000 2.666667 4.50 2.4285714 3.000000 5.30 4.861111
## 5 4.833333 4.75 0.875 2.666667 4.00 2.5714286 3.695652 6.30 5.916667
## 6 5.333333 5.00 2.250 1.000000 3.00 0.8571429 4.347826 6.65 7.500000
##        x1.x4      x2.x5       x3.x6
## 1  0.6610573 2.13138928  1.44349772
## 2 -1.0591347 0.91232782 -0.13125309
## 3  0.3932462 1.95987765  0.41549585
## 4 -0.6615710 0.05393911 -0.06196027
## 5 -0.4644503 0.24455373 -0.77482218
## 6 -1.3241771 1.24746071 -0.24355731
dat6 <- indProd(dat.mc, var1, var2, match = TRUE, doubleMC = TRUE)
head(dat6)
##           x1         x2            x3         x4         x5         x6
## 1 -1.6024364  1.6619601 -1.8754152824 -0.7275748  1.4094684 -0.8998576
## 2  0.3975636 -0.8380399 -0.1254152824 -1.3942414 -1.3405316 -0.8998576
## 3 -0.4357697 -0.8380399 -0.3754152824 -2.0609081 -2.5905316 -1.7570005
## 4  0.3975636  1.6619601  0.7495847176 -0.3942414  0.1594684  0.2429995
## 5 -0.1024364 -1.3380399 -1.3754152824 -0.3942414 -0.3405316  0.3858567
## 6  0.3975636 -1.0880399 -0.0004152824 -2.0609081 -1.3405316 -1.3284290
##         y1   y2       y3      x1.x4      x2.x5       x3.x6
## 1 3.391304 5.75 6.361111  0.6610573 2.13138928  1.44349772
## 2 3.782609 6.25 7.916667 -1.0591347 0.91232782 -0.13125309
## 3 3.260870 3.90 4.416667  0.3932462 1.95987765  0.41549585
## 4 3.000000 5.30 4.861111 -0.6615710 0.05393911 -0.06196027
## 5 3.695652 6.30 5.916667 -0.4644503 0.24455373 -0.77482218
## 6 4.347826 6.65 7.500000 -1.3241771 1.24746071 -0.24355731
## check what happened, up to 13 digits
x14 <- scale(dat6$x1 * dat6$x4, scale=FALSE)
sum(round(x14, 13) == round(dat6$x1.x4, 13)) == nrow(dat6)
## [1] TRUE
## check if interactions in dat5 and dat6 are all equal, up to 11 digits
sum(round(dat5[, 10:12], 11) == round(dat6[, 10:12], 11)) == 3*nrow(dat5)
## [1] TRUE
## fit
fit.dmc1 <- sem(model, dat5, meanstructure = TRUE)
fit.dmc2 <- sem(model, dat6, meanstructure = FALSE)

summary(fit.dmc1, fit.measures=TRUE)
## lavaan 0.6-2 ended normally after 48 iterations
## 
##   Optimization method                           NLMINB
##   Number of free parameters                         42
## 
##   Number of observations                           301
## 
##   Estimator                                         ML
##   Model Fit Test Statistic                     122.868
##   Degrees of freedom                                48
##   P-value (Chi-square)                           0.000
## 
## Model test baseline model:
## 
##   Minimum Function Test Statistic             1060.354
##   Degrees of freedom                                66
##   P-value                                        0.000
## 
## User model versus baseline model:
## 
##   Comparative Fit Index (CFI)                    0.925
##   Tucker-Lewis Index (TLI)                       0.896
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)              -5326.599
##   Loglikelihood unrestricted model (H1)      -5265.165
## 
##   Number of free parameters                         42
##   Akaike (AIC)                               10737.198
##   Bayesian (BIC)                             10892.897
##   Sample-size adjusted Bayesian (BIC)        10759.697
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.072
##   90 Percent Confidence Interval          0.056  0.088
##   P-value RMSEA <= 0.05                          0.012
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.052
## 
## Parameter Estimates:
## 
##   Information                                 Expected
##   Information saturated (h1) model          Structured
##   Standard Errors                             Standard
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   xi1 =~                                              
##     x1                1.000                           
##     x2                0.554    0.100    5.562    0.000
##     x3                0.730    0.109    6.705    0.000
##   xi2 =~                                              
##     x4                1.000                           
##     x5                1.116    0.066   16.887    0.000
##     x6                0.945    0.056   16.840    0.000
##   xi12 =~                                             
##     x1.x4             1.000                           
##     x2.x5             0.924    0.192    4.809    0.000
##     x3.x6             1.435    0.318    4.506    0.000
##   eta =~                                              
##     y1                1.000                           
##     y2                1.182    0.166    7.138    0.000
##     y3                1.095    0.153    7.138    0.000
## 
## Regressions:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   eta ~                                               
##     xi1               0.299    0.078    3.824    0.000
##     xi2               0.035    0.058    0.608    0.543
##     xi12              0.063    0.076    0.830    0.407
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   xi1 ~~                                              
##     xi2               0.406    0.073    5.560    0.000
##     xi12              0.103    0.059    1.738    0.082
##   xi2 ~~                                              
##     xi12              0.262    0.073    3.576    0.000
## 
## Intercepts:
##                    Estimate  Std.Err  z-value  P(>|z|)
##    .x1                4.936    0.067   73.473    0.000
##    .x2                6.088    0.068   89.855    0.000
##    .x3                2.250    0.065   34.579    0.000
##    .x4                3.061    0.067   45.694    0.000
##    .x5                4.341    0.074   58.452    0.000
##    .x6                2.186    0.063   34.667    0.000
##    .x1.x4             0.000    0.092    0.000    1.000
##    .x2.x5            -0.000    0.088   -0.000    1.000
##    .x3.x6            -0.000    0.078   -0.000    1.000
##    .y1                4.186    0.063   66.766    0.000
##    .y2                5.527    0.058   94.854    0.000
##    .y3                5.374    0.058   92.546    0.000
##     xi1               0.000                           
##     xi2               0.000                           
##     xi12              0.000                           
##    .eta               0.000                           
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##    .x1                0.550    0.113    4.861    0.000
##    .x2                1.134    0.102   11.148    0.000
##    .x3                0.844    0.091    9.320    0.000
##    .x4                0.386    0.048    8.093    0.000
##    .x5                0.458    0.058    7.869    0.000
##    .x6                0.335    0.042    7.964    0.000
##    .x1.x4             2.011    0.199   10.102    0.000
##    .x2.x5             1.889    0.182   10.352    0.000
##    .x3.x6             0.749    0.224    3.344    0.001
##    .y1                0.804    0.081    9.874    0.000
##    .y2                0.492    0.074    6.662    0.000
##    .y3                0.560    0.071    7.912    0.000
##     xi1               0.808    0.145    5.572    0.000
##     xi2               0.964    0.111    8.653    0.000
##     xi12              0.528    0.169    3.116    0.002
##    .eta               0.290    0.069    4.218    0.000
summary(fit.dmc2, fit.measures=TRUE)
## lavaan 0.6-2 ended normally after 48 iterations
## 
##   Optimization method                           NLMINB
##   Number of free parameters                         30
## 
##   Number of observations                           301
## 
##   Estimator                                         ML
##   Model Fit Test Statistic                     122.868
##   Degrees of freedom                                48
##   P-value (Chi-square)                           0.000
## 
## Model test baseline model:
## 
##   Minimum Function Test Statistic             1060.354
##   Degrees of freedom                                66
##   P-value                                        0.000
## 
## User model versus baseline model:
## 
##   Comparative Fit Index (CFI)                    0.925
##   Tucker-Lewis Index (TLI)                       0.896
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)              -5326.599
##   Loglikelihood unrestricted model (H1)      -5265.165
## 
##   Number of free parameters                         30
##   Akaike (AIC)                               10713.198
##   Bayesian (BIC)                             10824.411
##   Sample-size adjusted Bayesian (BIC)        10729.268
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.072
##   90 Percent Confidence Interval          0.056  0.088
##   P-value RMSEA <= 0.05                          0.012
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.056
## 
## Parameter Estimates:
## 
##   Information                                 Expected
##   Information saturated (h1) model          Structured
##   Standard Errors                             Standard
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   xi1 =~                                              
##     x1                1.000                           
##     x2                0.554    0.100    5.562    0.000
##     x3                0.730    0.109    6.705    0.000
##   xi2 =~                                              
##     x4                1.000                           
##     x5                1.116    0.066   16.887    0.000
##     x6                0.945    0.056   16.840    0.000
##   xi12 =~                                             
##     x1.x4             1.000                           
##     x2.x5             0.924    0.192    4.809    0.000
##     x3.x6             1.435    0.318    4.506    0.000
##   eta =~                                              
##     y1                1.000                           
##     y2                1.182    0.166    7.138    0.000
##     y3                1.095    0.153    7.138    0.000
## 
## Regressions:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   eta ~                                               
##     xi1               0.299    0.078    3.824    0.000
##     xi2               0.035    0.058    0.608    0.543
##     xi12              0.063    0.076    0.830    0.407
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   xi1 ~~                                              
##     xi2               0.406    0.073    5.560    0.000
##     xi12              0.103    0.059    1.738    0.082
##   xi2 ~~                                              
##     xi12              0.262    0.073    3.576    0.000
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##    .x1                0.550    0.113    4.861    0.000
##    .x2                1.134    0.102   11.148    0.000
##    .x3                0.844    0.091    9.320    0.000
##    .x4                0.386    0.048    8.093    0.000
##    .x5                0.458    0.058    7.869    0.000
##    .x6                0.335    0.042    7.964    0.000
##    .x1.x4             2.011    0.199   10.102    0.000
##    .x2.x5             1.889    0.182   10.352    0.000
##    .x3.x6             0.749    0.224    3.344    0.001
##    .y1                0.804    0.081    9.874    0.000
##    .y2                0.492    0.074    6.662    0.000
##    .y3                0.560    0.071    7.912    0.000
##     xi1               0.808    0.145    5.572    0.000
##     xi2               0.964    0.111    8.653    0.000
##     xi12              0.528    0.169    3.116    0.002
##    .eta               0.290    0.069    4.218    0.000
fitmeasures(fit.dmc1, fm)
##   cfi   tli rmsea  srmr 
## 0.925 0.896 0.072 0.052
fitmeasures(fit.dmc2, fm)
##   cfi   tli rmsea  srmr 
## 0.925 0.896 0.072 0.056
##############################
### compare models
##############################
## fit measures
rbind(fitmeasures(fit.mc1, fm),
      fitmeasures(fit.mc2, fm),
      fitmeasures(fit.o1, fm),
      fitmeasures(fit.o2, fm),
      fitmeasures(fit.dmc1, fm),
      fitmeasures(fit.dmc2, fm)) ->.
round(., 3)
##        cfi   tli rmsea  srmr
## [1,] 0.925 0.896 0.072 0.052
## [2,] 0.925 0.896 0.072 0.056
## [3,] 0.946 0.926 0.059 0.048
## [4,] 0.946 0.926 0.059 0.051
## [5,] 0.925 0.896 0.072 0.052
## [6,] 0.925 0.896 0.072 0.056
## regression coefficients
coef.reg <- c("eta~xi1", "eta~xi2", "eta~xi12")
rbind(coef(fit.mc1)[coef.reg],
      coef(fit.mc2)[coef.reg],
      coef(fit.o1)[coef.reg],
      coef(fit.o2)[coef.reg],
      coef(fit.dmc1)[coef.reg],
      coef(fit.dmc1)[coef.reg]) ->.
round(., 3)
##      eta~xi1 eta~xi2 eta~xi12
## [1,]   0.299   0.035    0.063
## [2,]   0.299   0.035    0.063
## [3,]   0.299   0.053    0.071
## [4,]   0.299   0.053    0.071
## [5,]   0.299   0.035    0.063
## [6,]   0.299   0.035    0.063
### references
## Marsh, 2004, Structural Equation Models of Latent Interactions: Evaluation of Alternative Estimation Strategies and Indicator Construction
## Lin, 2010, Structural Equation Models of Latent Interactions: Clarification of Orthogonalizing and Double-Mean-Centering Strategies

### render script and publish
## rmarkdown::render("main.R", output_format=rmarkdown::html_document(code_download = TRUE))
## rsconnect::rpubsUpload("Latent Interactions in Structural Equation Models", "main.html", "main.R")
## id <- "https://api.rpubs.com/api/v1/document/417713/18214c2f12634a89bedce8bc869f4421"
## rsconnect::rpubsUpload("Latent Interactions in Structural Equation Models", "main.html", "main.R", id=id)
## browseURL("http://rpubs.com/candrea/417713")
IycgLS0tCiMnIHRpdGxlOiAiTGF0ZW50IEl0ZXJhY3Rpb25zIGluIFN0cnVjdHVyYWwgRXF1YXRpb24gTW9kZWxzIgojJyBhdXRob3I6ICJBbmRyZWEgQ2FudGllbmkiCiMnIGRhdGU6ICIyMDE4LTA5LTEyIgojJyAtLS0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyBMYXRlbnQgSXRlcmFjdGlvbnMgaW4gU3RydWN0dXJhbCBFcXVhdGlvbiBNb2RlbHMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMjIyBsb2FkIHBhY2thZ2VzIGFuZCBkYXRhCmxpYnJhcnkobGF2YWFuKQpsaWJyYXJ5KHNlbVRvb2xzKQoKZGF0YShIb2x6aW5nZXJTd2luZWZvcmQxOTM5KQoKZGF0IDwtIEhvbHppbmdlclN3aW5lZm9yZDE5MzlbLCA3OjE1XQoKIyMgYXNzdW1lIHgxLHgyLHgzLCBhbmQgeDQseDUseDYsIGluZGVwZW5kZW50LCBhbmQgeDcseDgseDkgZGVwZW5kZW50Cm5hbWVzKGRhdClbNzo5XSA8LSBwYXN0ZTAoInkiLCAxOjMpCmhlYWQoZGF0KQoKIyMgbWVhbi1jZW50ZXIgYWxsIHgncwpkYXQubWMgPC0gY2JpbmQoc2NhbGUoZGF0WywgMTo2XSwgc2NhbGUgPSBGQUxTRSksIGRhdFssIDc6OV0pCmhlYWQoZGF0Lm1jKQoKIyMgZGVmaW5lIHZhcjEgYW5kIHZhcjIsIGFuZCBmaXQgbWVhc3VyZXMgZm9yIGxhdGVyCnZhcjEgPC0gYygieDEiLCJ4MiIsIngzIikKdmFyMiA8LSBjKCJ4NCIsIng1IiwieDYiKQpmbSA8LSAgYygiY2ZpIiwgInRsaSIsICJybXNlYSIsICJzcm1yIikKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyB1bmNvbnN0cmFpbmVkIG1lYW4tY2VudGVyZWQgYXBwcm9hY2ggYXMgaW4gTWFyc2ggKDIwMDQpCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIyBpbmRpY2F0b3JzIGFyZSBub3QgY2VudGVyZWQgLT4gaW5jbHVkZSBtZWFuLXN0cnVjdHVyZSBpbiBzZW0gbW9kZWwKZGF0MSA8LSBpbmRQcm9kKGRhdCwgICAgdmFyMSwgdmFyMiwgbWF0Y2ggPSBUUlVFLCBtZWFuQyA9IFRSVUUpCmhlYWQoZGF0MSkKCiMjIGFsbCBpbmRlcGVuZGVudCBpbmRpY2F0b3JzIGFyZSBjZW50ZXJlZAojIyBtZWFuQyA9IFRSVUUgb3IgbWVhbkMgPSBGQUxTRSBkb2VzIG5vdCBtYXR0ZXIsIHNpbmNlIHgncyBhcmUgY2VudGVyZWQKZGF0MiA8LSBpbmRQcm9kKGRhdC5tYywgdmFyMSwgdmFyMiwgbWF0Y2ggPSBUUlVFKQpoZWFkKGRhdDIpCgojIyBzZW0gbW9kZWwKIyMgYWxsIGludGVyYWN0aW9uIHRlcm1zIGFyZSBtb2RlbGxlZCB1c2luZyB0aGUgMy1tYXRjaCBhcHByb2FjaAptb2RlbCA8LSAnCiAgIyMgZGVmaW5lIGxhdGVudCB2YXJpYWJsZQogIHhpMSAgPX4geDEgKyB4MiArIHgzCiAgeGkyICA9fiB4NCArIHg1ICsgeDYKICB4aTEyID1+IHgxLng0ICsgeDIueDUgKyB4My54NgogIGV0YSAgPX4geTEgKyB5MiArIHkzCiAgIyMgcmVncmVzc2lvbgogIGV0YSB+IHhpMSArIHhpMiArIHhpMTIKJwoKIyMgZml0CmZpdC5tYzEgPC0gc2VtKG1vZGVsLCBkYXQxLCBtZWFuc3RydWN0dXJlID0gVFJVRSkKZml0Lm1jMiA8LSBzZW0obW9kZWwsIGRhdDIsIG1lYW5zdHJ1Y3R1cmUgPSBGQUxTRSkKCnN1bW1hcnkoZml0Lm1jMSwgZml0Lm1lYXN1cmVzPVRSVUUpCnN1bW1hcnkoZml0Lm1jMiwgZml0Lm1lYXN1cmVzPVRSVUUpCgpmaXRtZWFzdXJlcyhmaXQubWMxLCBmbSkKZml0bWVhc3VyZXMoZml0Lm1jMiwgZm0pCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyBvcnRob2dvbmFsaXppbmcgYXMgaW4gTGluICgyMDEwKQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpkYXQzIDwtIG9ydGhvZ29uYWxpemUoZGF0LCAgICB2YXIxLCB2YXIyLCBtYXRjaCA9IFRSVUUpCmhlYWQoZGF0MykKCmRhdDQgPC0gb3J0aG9nb25hbGl6ZShkYXQubWMsIHZhcjEsIHZhcjIsIG1hdGNoID0gVFJVRSkKaGVhZChkYXQ0KQoKIyMgY2hlY2sgd2hhdCBoYXBwZW5lZCB3aXRoIG9ydGhvZ29uYWxpemUoKQpmaXQueHggPC0gbG0oY2JpbmQoeDEqeDQsIHgyKng1LCB4Myp4NikgfiB4MSArIHgyICsgeDMgKyB4NCArIHg1ICsgeDYsIGRhdCkKCnJlcyA8LSBmaXQueHgkcmVzaWR1YWxzCnN1bShkYXQzJHgxLng0ID09IHJlc1ssMV0pID09IG5yb3coZGF0MykKc3VtKGRhdDMkeDIueDUgPT0gcmVzWywyXSkgPT0gbnJvdyhkYXQzKQpzdW0oZGF0MyR4My54NiA9PSByZXNbLDNdKSA9PSBucm93KGRhdDMpCgojIyBjaGVjayBpZiBpbnRlcmFjdGlvbnMgaW4gZGF0MyBhbmQgZGF0NCBhcmUgYWxsIGVxdWFsLCB1cCB0byAxMSBkaWdpdHMKc3VtKHJvdW5kKGRhdDNbLCAxMDoxMl0sIDExKSA9PSByb3VuZChkYXQ0WywgMTA6MTJdLCAxMSkpID09IDMqbnJvdyhkYXQzKQoKIyMgZml0CmZpdC5vMSA8LSBzZW0obW9kZWwsIGRhdDMsIG1lYW5zdHJ1Y3R1cmUgPSBUUlVFKQpmaXQubzIgPC0gc2VtKG1vZGVsLCBkYXQ0LCBtZWFuc3RydWN0dXJlID0gRkFMU0UpCgpzdW1tYXJ5KGZpdC5vMSwgZml0Lm1lYXN1cmVzPVRSVUUpCnN1bW1hcnkoZml0Lm8yLCBmaXQubWVhc3VyZXM9VFJVRSkKCmZpdG1lYXN1cmVzKGZpdC5vMSwgZm0pCmZpdG1lYXN1cmVzKGZpdC5vMiwgZm0pCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIGRvdWJsZS1tZWFuLWNlbnRlcmluZyBhcyBpbiBMaW4gKDIwMTApCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZGF0NSA8LSBpbmRQcm9kKGRhdCwgICAgdmFyMSwgdmFyMiwgbWF0Y2ggPSBUUlVFLCBkb3VibGVNQyA9IFRSVUUpCmhlYWQoZGF0NSkKCmRhdDYgPC0gaW5kUHJvZChkYXQubWMsIHZhcjEsIHZhcjIsIG1hdGNoID0gVFJVRSwgZG91YmxlTUMgPSBUUlVFKQpoZWFkKGRhdDYpCgojIyBjaGVjayB3aGF0IGhhcHBlbmVkLCB1cCB0byAxMyBkaWdpdHMKeDE0IDwtIHNjYWxlKGRhdDYkeDEgKiBkYXQ2JHg0LCBzY2FsZT1GQUxTRSkKc3VtKHJvdW5kKHgxNCwgMTMpID09IHJvdW5kKGRhdDYkeDEueDQsIDEzKSkgPT0gbnJvdyhkYXQ2KQoKIyMgY2hlY2sgaWYgaW50ZXJhY3Rpb25zIGluIGRhdDUgYW5kIGRhdDYgYXJlIGFsbCBlcXVhbCwgdXAgdG8gMTEgZGlnaXRzCnN1bShyb3VuZChkYXQ1WywgMTA6MTJdLCAxMSkgPT0gcm91bmQoZGF0NlssIDEwOjEyXSwgMTEpKSA9PSAzKm5yb3coZGF0NSkKCiMjIGZpdApmaXQuZG1jMSA8LSBzZW0obW9kZWwsIGRhdDUsIG1lYW5zdHJ1Y3R1cmUgPSBUUlVFKQpmaXQuZG1jMiA8LSBzZW0obW9kZWwsIGRhdDYsIG1lYW5zdHJ1Y3R1cmUgPSBGQUxTRSkKCnN1bW1hcnkoZml0LmRtYzEsIGZpdC5tZWFzdXJlcz1UUlVFKQpzdW1tYXJ5KGZpdC5kbWMyLCBmaXQubWVhc3VyZXM9VFJVRSkKCmZpdG1lYXN1cmVzKGZpdC5kbWMxLCBmbSkKZml0bWVhc3VyZXMoZml0LmRtYzIsIGZtKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyBjb21wYXJlIG1vZGVscwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMgZml0IG1lYXN1cmVzCnJiaW5kKGZpdG1lYXN1cmVzKGZpdC5tYzEsIGZtKSwKICAgICAgZml0bWVhc3VyZXMoZml0Lm1jMiwgZm0pLAogICAgICBmaXRtZWFzdXJlcyhmaXQubzEsIGZtKSwKICAgICAgZml0bWVhc3VyZXMoZml0Lm8yLCBmbSksCiAgICAgIGZpdG1lYXN1cmVzKGZpdC5kbWMxLCBmbSksCiAgICAgIGZpdG1lYXN1cmVzKGZpdC5kbWMyLCBmbSkpIC0+Lgpyb3VuZCguLCAzKQoKIyMgcmVncmVzc2lvbiBjb2VmZmljaWVudHMKY29lZi5yZWcgPC0gYygiZXRhfnhpMSIsICJldGF+eGkyIiwgImV0YX54aTEyIikKcmJpbmQoY29lZihmaXQubWMxKVtjb2VmLnJlZ10sCiAgICAgIGNvZWYoZml0Lm1jMilbY29lZi5yZWddLAogICAgICBjb2VmKGZpdC5vMSlbY29lZi5yZWddLAogICAgICBjb2VmKGZpdC5vMilbY29lZi5yZWddLAogICAgICBjb2VmKGZpdC5kbWMxKVtjb2VmLnJlZ10sCiAgICAgIGNvZWYoZml0LmRtYzEpW2NvZWYucmVnXSkgLT4uCnJvdW5kKC4sIDMpCgojIyMgcmVmZXJlbmNlcwojIyBNYXJzaCwgMjAwNCwgU3RydWN0dXJhbCBFcXVhdGlvbiBNb2RlbHMgb2YgTGF0ZW50IEludGVyYWN0aW9uczogRXZhbHVhdGlvbiBvZiBBbHRlcm5hdGl2ZSBFc3RpbWF0aW9uIFN0cmF0ZWdpZXMgYW5kIEluZGljYXRvciBDb25zdHJ1Y3Rpb24KIyMgTGluLCAyMDEwLCBTdHJ1Y3R1cmFsIEVxdWF0aW9uIE1vZGVscyBvZiBMYXRlbnQgSW50ZXJhY3Rpb25zOiBDbGFyaWZpY2F0aW9uIG9mIE9ydGhvZ29uYWxpemluZyBhbmQgRG91YmxlLU1lYW4tQ2VudGVyaW5nIFN0cmF0ZWdpZXMKCiMjIyByZW5kZXIgc2NyaXB0IGFuZCBwdWJsaXNoCiMjIHJtYXJrZG93bjo6cmVuZGVyKCJtYWluLlIiLCBvdXRwdXRfZm9ybWF0PXJtYXJrZG93bjo6aHRtbF9kb2N1bWVudChjb2RlX2Rvd25sb2FkID0gVFJVRSkpCiMjIHJzY29ubmVjdDo6cnB1YnNVcGxvYWQoIkxhdGVudCBJbnRlcmFjdGlvbnMgaW4gU3RydWN0dXJhbCBFcXVhdGlvbiBNb2RlbHMiLCAibWFpbi5odG1sIiwgIm1haW4uUiIpCiMjIGlkIDwtICJodHRwczovL2FwaS5ycHVicy5jb20vYXBpL3YxL2RvY3VtZW50LzQxNzcxMy8xODIxNGMyZjEyNjM0YTg5YmVkY2U4YmM4NjlmNDQyMSIKIyMgcnNjb25uZWN0OjpycHVic1VwbG9hZCgiTGF0ZW50IEludGVyYWN0aW9ucyBpbiBTdHJ1Y3R1cmFsIEVxdWF0aW9uIE1vZGVscyIsICJtYWluLmh0bWwiLCAibWFpbi5SIiwgaWQ9aWQpCiMjIGJyb3dzZVVSTCgiaHR0cDovL3JwdWJzLmNvbS9jYW5kcmVhLzQxNzcxMyIpCg==