1 FUNCTIONS

2 DATA PREPARATION

2.1 Load all sheets of an Excel

Sheets <- rio::import_list("https://drive.google.com/uc?id=1eWmXuL3uXAHMZesaCuiSQcuMD8djEKNc&export=download")
#Sheets <-rio::import_list("C:\\Users\\S\\Documents\\WXWork\\1688851821252719\\Cache\\File\\2024-09\\Matrix-overall.xlsx")
#as.data.frame(Sheets$Template)
#as.data.frame(Sheets$`C-r`)
#names(Sheets$r`C-r`)

Sheets <- lapply(Sheets, function(df) {
  # 删除第一列
  df <- df[, -1]
  # 返回修改后的 df
  # 添加新列 Yi,填充为 NA
  df <- df %>%
    mutate(Yi = NA)
  # 将对角线的值填充为 1
  diag(df) <- 1
  
  return(df)
})

# 使用 lapply 将 Sheets 中的每个数据框转换为 data.table,并替换缺失值
Sheets <- lapply(Sheets, function(df) {
  # 替换所有缺失值为 -999
  df[is.na(df)] <- -999
  # 返回修改后的 df
  return(df)
})

Sheets <- lapply(Sheets, function(df) {
  # 替换列名
  df <- df %>%
    dplyr::rename(X = `INPUT`, Mp = `TEAM PROCESS`, Ms = `EMERGENT STATES`, Yt = `Team effectiveness`)
  
  # 返回修改后的数据框
  return(df)
})

2.2 Convert all data in wide-format within one sheet

result_list <- lapply(Sheets, function(sheet) Matrix.toDT(sheet, title = ""))
#result_list <- result_list[!names(result_list) %in% "Sources"]
#result_list$Sources[[1]]
df <- bind_rows(lapply(result_list, function(x) x[[1]]))%>%
  setDT%>%
  .[, MatrixName := names(result_list)]%>%
  .[MatrixName != "Sources", ]%>%
  .[MatrixName != "Template" , ]  #%>%  .[, lapply(.SD, as.numeric), .SDcols = setdiff(names(df), "MatrixName")]

# 将除了 "MatrixName" 之外的所有列转换为数值类型
cols_to_convert <- setdiff(names(df), "MatrixName")
df=df[, (cols_to_convert) := lapply(.SD, as.numeric), .SDcols = cols_to_convert]
# 使用 gsub() 交换横线两边的字母位置
#names(df) <- gsub("^(.*)-(.*)$", "\\2-\\1", names(df))

# 查看修改后的变量名
#print(names(df))

#ncol(df)

#MatrixName=df$MatrixName  

#df[] <- lapSources#df[] <- lapply(df, as.numeric)
#df=df[, names(df) := lapply(.SD, as.numeric)]

#names(df)
#unique(df$MatrixName)
#print_table(df)
#View(df)
# 查看合并后的数据框
#export(combined_df,"JPJSrow.xlsx")
#data <-read_sheet("https://docs.google.com/spreadsheets/d/1Q8OUSBQ9a1R0jJ14PtEH3w74aTmwyru3u3uIOst3DC4/edit?usp=sharing")
#View(data)

2.3 Convert all data in matrix format

cor_matrices <- Matrix.fromDT(as.data.frame(df),"Mp-X", "Yi-Yt", "MatrixName")
## 正在处理行:  r 
## 正在处理行:  C-r 
## 正在处理行:  SD-r 
## 正在处理行:  SD-cr 
## 正在处理行:  Sample size 
## 正在处理行:  K Size 
## 正在处理行:  95%CI-L 
## 正在处理行:  95%CI-U
P <- cor_matrices$`C-r`#cor_matrices$r
#print_table(as.data.frame(p))
Nnum=Matrix.Stats(Sheets$`Sample size`)
## Statistics of matrix
## ────────────────────────────
##    harmonic_mean         sum
## ────────────────────────────
## 1      26688.743 1665319.286
## ────────────────────────────
## Descriptive Statistics:
## ────────────────────────────────────────────────────────────────────────
##     N      Mean        SD |   Median     Min       Max Skewness Kurtosis
## ────────────────────────────────────────────────────────────────────────
##    10 166531.93 279212.22 | 69520.14 6647.00 936177.57     2.03     2.81
## ────────────────────────────────────────────────────────────────────────
Knum=Matrix.Stats(Sheets$`K Size`)
## Statistics of matrix
## ──────────────────────────
##    harmonic_mean       sum
## ──────────────────────────
## 1        143.080 10395.000
## ──────────────────────────
## Descriptive Statistics:
## ──────────────────────────────────────────────────────────────
##     N    Mean      SD | Median   Min     Max Skewness Kurtosis
## ──────────────────────────────────────────────────────────────
##    10 1039.50 1373.53 | 603.00 37.00 4543.00     1.53     1.34
## ──────────────────────────────────────────────────────────────
Nhar=Nnum$harmonic_mean#round(Nnum$sum/Knum$sum,0)#

3 FULL MODEL

# 1.1 model specification 
IV.S <- '
  Mp ON X (Xp);
  Ms ON X (Xs);
  Yi ON X 
  Mp (Yip)
  Ms (Yis);
  Yt ON X 
  Mp (Ytp)
  Ms (Yts);

MODEL INDIRECT:
    Yi IND X;
    Yt IND X;

MODEL CONSTRAINT:
        NEW(MXdif YiMdif YtMdif);
        MXdif = Xp - Xs;
        YiMdif = Yip - Yis;
        YtMdif = Ytp - Yts;
'
#IV <- mplus2lavaan.modelSyntax(IV.S)
#IVb <- mplus2lavaan.modelSyntax(IV.S)
#cat(IV)

# lavaan 模型代码
model <- '
  # 结构方程模型
Mp ~ Xp*X
Ms ~ Xs*X
Yi ~ Xi*X + Yip*Mp + Yis*Ms
Yt ~ Xt*X + Ytp*Mp + Yts*Ms
Mp ~~ Ms
Yi ~~ Yt

  # 间接效应
  # lavaan 中可以自动计算间接效应,如果需要的话
  # 你可以使用 := 定义间接效应
  
  # 约束条件
  XMdiff := Xp - Xs    # 计算 Xp 和 Xs 的差值
  XYdiff := Xi - Xt    # 计算 Xp 和 Xs 的差值
  YMidiff := Yip - Yis # 计算 Yip 和 Yis 的差值
  YMtdiff := Ytp - Yts # 计算 Ytp 和 Yts 的差值
  MedMpYi := Xp*Yip
  MedMpYt := Xp*Ytp
  MedMsYi := Xs*Yis
  MedMsYt := Xs*Yts
  MdifYi := MedMpYi - MedMsYi
  MdifYt := MedMpYt - MedMsYt
'

ModelOnly <- '
Mp ~ Xp*X
Ms ~ Xs*X
Yi ~ Xi*X + Yip*Mp + Yis*Ms
Yt ~ Xt*X + Ytp*Mp + Yts*Ms
Mp ~~ Ms
Yi ~~ Yt
'
IV.F <- sem(model,sample.cov = P,sample.nobs = Nhar)
lavaan_summary(IV.F)
## 
## Fit Measures (lavaan):
## χ²(0, N = 26688) = 0.000, p = 1.000    
## χ²/df = Inf (saturated model)
## AIC = 291314.900 (Akaike Information Criterion)
## BIC = 291429.588 (Bayesian Information Criterion)
## CFI = 1.000 (Comparative Fit Index)
## TLI = 1.000 (Tucker-Lewis Index; Non-Normed Fit Index, NNFI)
## NFI = 1.000 (Normed Fit Index)
## IFI = 1.000 (Incremental Fit Index)
## GFI = 1.000 (Goodness-of-Fit Index)
## AGFI = 1.000 (Adjusted Goodness-of-Fit Index)
## RMSEA = 0.000, 90% CI [0.000, 0.000] (Root Mean Square Error of Approximation)
## SRMR = 0.000 (Standardized Root Mean Square Residual)
## 
## Model Estimates (lavaan):
## ──────────────────────────────────────────────────────────────────────────
##                    Estimate    S.E.       z     p       LLCI   ULCI   Beta
## ──────────────────────────────────────────────────────────────────────────
## Regression Paths:                                                         
##   Mp <- X (Xp)        0.188 (0.006)  31.253 <.001 ***  0.176  0.200  0.188
##   Ms <- X (Xs)        0.158 (0.006)  26.157 <.001 ***  0.146  0.170  0.158
##   Yi <- X (Xi)        0.033 (0.006)   5.684 <.001 ***  0.022  0.045  0.033
##   Yi <- Mp (Yip)      0.137 (0.006)  22.603 <.001 ***  0.126  0.149  0.137
##   Yi <- Ms (Yis)      0.285 (0.006)  47.115 <.001 ***  0.273  0.297  0.285
##   Yt <- X (Xt)        0.070 (0.006)  11.797 <.001 ***  0.058  0.081  0.070
##   Yt <- Mp (Ytp)      0.104 (0.006)  16.974 <.001 ***  0.092  0.116  0.104
##   Yt <- Ms (Yts)      0.271 (0.006)  44.504 <.001 ***  0.260  0.283  0.271
## Defined Effects:                                                          
##   XMdiff              0.030 (0.007)   4.162 <.001 ***  0.016  0.044  0.030
##   XYdiff             -0.036 (0.008)  -4.734 <.001 *** -0.051 -0.021 -0.036
##   YMidiff            -0.148 (0.010) -15.118 <.001 *** -0.167 -0.128 -0.148
##   YMtdiff            -0.167 (0.010) -17.007 <.001 *** -0.187 -0.148 -0.167
##   MedMpYi             0.026 (0.001)  18.315 <.001 ***  0.023  0.029  0.026
##   MedMpYt             0.020 (0.001)  14.916 <.001 ***  0.017  0.022  0.020
##   MedMsYi             0.045 (0.002)  22.869 <.001 ***  0.041  0.049  0.045
##   MedMsYt             0.043 (0.002)  22.550 <.001 ***  0.039  0.047  0.043
##   MdifYi             -0.019 (0.002)  -8.072 <.001 *** -0.024 -0.015 -0.019
##   MdifYt             -0.023 (0.002) -10.061 <.001 *** -0.028 -0.019 -0.023
## ──────────────────────────────────────────────────────────────────────────
## Note. Raw (Standard) Confidence Interval (CI) and SE.
lavaanPlot(model = IV.F, coefs = T, sig = 0.05)

4 COMPARE MS ON X

IV <- gsub("Mp ~ Xp*X", "Mp ~ Xps*X", ModelOnly, fixed = TRUE)
IV <- gsub("Ms ~ Xs*X", "Ms ~ Xps*X", IV, fixed = TRUE)
IV.MX <- sem(IV,sample.cov = P,sample.nobs = Nhar)

5 COMPARE YI ON MS

IV <- gsub("Yi ~ Xi*X + Yip*Mp + Yis*Ms", "Yi ~ Xi*X + Yips*Mp + Yips*Ms", ModelOnly, fixed = TRUE)
IV.YiM <- sem(IV,sample.cov = P,sample.nobs = Nhar)

6 COMPARE YT ON MS

IV <- gsub("Yt ~ Xt*X + Ytp*Mp + Yts*Ms", "Yt ~ Xt*X + Ytps*Mp + Ytps*Ms", ModelOnly, fixed = TRUE)
IV.YtM <- sem(IV,sample.cov = P,sample.nobs = Nhar)

7 FIT SUMMARY

model_list <- list(IV.F, IV.MX, IV.YiM, IV.YtM)
result <- SEM.FitCombine(model_list, Mplus = F,title = "")
#names(result)
print_table(result[[2]][, .(Model,ChiSqM_Value,ChiSqM_DF, ChiSqM_PValue, CFI,SRMR,ChiSq_Diff,DF_Diff,ChiSq_p)])
## ──────────────────────────────────────────────────────────────────────────────────────
##      Model ChiSqM_Value ChiSqM_DF ChiSqM_PValue   CFI  SRMR ChiSq_Diff DF_Diff ChiSq_p
## ──────────────────────────────────────────────────────────────────────────────────────
## 1  Model 1        0.000     0.000               1.000 0.000                           
## 2  Model 2       17.318     1.000         0.000 0.999 0.006     17.318   1.000   0.000
## 3  Model 3      227.572     1.000         0.000 0.981 0.019    227.572   1.000   0.000
## 4  Model 4      287.686     1.000         0.000 0.975 0.021    287.686   1.000   0.000
## ──────────────────────────────────────────────────────────────────────────────────────