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")
P <- cor_matrices$r
#cor_matrices$`C-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

  # 间接效应
  # 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
'
IV.F <- sem(model,sample.cov = P,sample.nobs = Nhar)
lavaan_summary(IV.F)
## 
## Fit Measures (lavaan):
## χ²(1, N = 26688) = 1752.614, p < 1e-99 ***
## χ²/df = 1752.614
## AIC = 296132.760 (Akaike Information Criterion)
## BIC = 296239.256 (Bayesian Information Criterion)
## CFI = 0.796 (Comparative Fit Index)
## TLI = -1.041 (Tucker-Lewis Index; Non-Normed Fit Index, NNFI)
## NFI = 0.796 (Normed Fit Index)
## IFI = 0.796 (Incremental Fit Index)
## GFI = 0.969 (Goodness-of-Fit Index)
## AGFI = 0.536 (Adjusted Goodness-of-Fit Index)
## RMSEA = 0.256, 90% CI [0.246, 0.266] (Root Mean Square Error of Approximation)
## SRMR = 0.068 (Standardized Root Mean Square Residual)
## 
## Model Estimates (lavaan):
## ──────────────────────────────────────────────────────────────────────────
##                    Estimate    S.E.       z     p       LLCI   ULCI   Beta
## ──────────────────────────────────────────────────────────────────────────
## Regression Paths:                                                         
##   Mp <- X (Xp)        0.159 (0.006)  26.242 <.001 ***  0.147  0.170  0.159
##   Ms <- X (Xs)        0.134 (0.006)  22.105 <.001 ***  0.122  0.146  0.134
##   Yi <- X (Xi)        0.042 (0.006)   7.106 <.001 ***  0.031  0.054  0.043
##   Yi <- Mp (Yip)      0.121 (0.006)  20.498 <.001 ***  0.109  0.132  0.122
##   Yi <- Ms (Yis)      0.245 (0.006)  41.681 <.001 ***  0.233  0.256  0.247
##   Yt <- X (Xt)        0.063 (0.006)  10.485 <.001 ***  0.051  0.074  0.063
##   Yt <- Mp (Ytp)      0.104 (0.006)  17.603 <.001 ***  0.093  0.116  0.105
##   Yt <- Ms (Yts)      0.232 (0.006)  39.306 <.001 ***  0.220  0.243  0.233
## Defined Effects:                                                          
##   XMdiff              0.025 (0.009)   2.862  .004 **   0.008  0.041  0.025
##   XYdiff             -0.020 (0.008)  -2.609  .009 **  -0.036 -0.005 -0.020
##   YMidiff            -0.124 (0.008) -14.898 <.001 *** -0.140 -0.108 -0.125
##   YMtdiff            -0.128 (0.008) -15.272 <.001 *** -0.144 -0.111 -0.128
##   MedMpYi             0.019 (0.001)  16.154 <.001 ***  0.017  0.021  0.019
##   MedMpYt             0.017 (0.001)  14.619 <.001 ***  0.014  0.019  0.017
##   MedMsYi             0.033 (0.002)  19.529 <.001 ***  0.030  0.036  0.033
##   MedMsYt             0.031 (0.002)  19.267 <.001 ***  0.028  0.034  0.031
##   MdifYi             -0.014 (0.002)  -6.640 <.001 *** -0.018 -0.010 -0.014
##   MdifYt             -0.015 (0.002)  -7.390 <.001 *** -0.018 -0.011 -0.015
## ──────────────────────────────────────────────────────────────────────────
## 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[, .(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     1752.614     1.000         0.000 0.796 0.068                           
## 2  Model 2     1760.806     2.000         0.000 0.795 0.068      8.192   1.000   0.004
## 3  Model 3     1918.091     2.000         0.000 0.777 0.070    165.477   1.000   0.000
## 4  Model 4     1926.479     2.000         0.000 0.776 0.070    173.865   1.000   0.000
## ──────────────────────────────────────────────────────────────────────────────────────