#############################################################################
### 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==