1 Instalasi & Load Package

install.packages("lavaan")
install.packages("semPlot")
install.packages("readxl")
install.packages("psych")
install.packages("MVN")
install.packages("car")
library(lavaan)
library(semPlot)
library(readxl)
library(psych)
library(MVN)
library(car)

2 Load & Eksplorasi Data

data_sem <- read_excel("2. Response.xlsx")
cat("Dimensi data:", nrow(data_sem), "baris x", ncol(data_sem), "kolom\n\n")
## Dimensi data: 876 baris x 23 kolom
str(data_sem)
## tibble [876 × 23] (S3: tbl_df/tbl/data.frame)
##  $ TSC1: num [1:876] 4 4 4 4 4 4 1 1 2 2 ...
##  $ TSC2: num [1:876] 4 4 4 4 5 5 4 4 2 2 ...
##  $ TSC3: num [1:876] 4 4 5 5 3 3 4 4 2 2 ...
##  $ TSC4: num [1:876] 4 4 4 4 4 4 4 4 2 2 ...
##  $ TSC5: num [1:876] 4 4 5 5 4 4 4 4 2 2 ...
##  $ TE1 : num [1:876] 4 4 5 5 4 4 3 3 1 1 ...
##  $ TE2 : num [1:876] 4 4 4 4 4 4 3 3 2 2 ...
##  $ TE3 : num [1:876] 4 4 4 4 4 4 3 3 1 1 ...
##  $ TE4 : num [1:876] 4 4 5 5 4 4 3 3 1 1 ...
##  $ TE5 : num [1:876] 4 4 4 4 4 4 3 3 1 1 ...
##  $ EE1 : num [1:876] 4 4 4 4 4 4 4 4 1 1 ...
##  $ EE2 : num [1:876] 4 4 5 5 4 4 4 4 1 1 ...
##  $ EE3 : num [1:876] 4 4 5 5 4 4 4 4 1 1 ...
##  $ EE4 : num [1:876] 4 4 4 4 4 4 4 4 1 1 ...
##  $ EE5 : num [1:876] 4 4 5 5 4 4 3 3 1 1 ...
##  $ DE1 : num [1:876] 4 4 5 5 4 4 1 1 3 3 ...
##  $ DE2 : num [1:876] 4 4 5 5 4 4 1 1 2 2 ...
##  $ DE3 : num [1:876] 4 4 5 5 4 4 4 4 2 2 ...
##  $ RPA1: num [1:876] 4 4 5 5 4 4 3 3 2 2 ...
##  $ RPA2: num [1:876] 4 4 4 4 4 4 3 3 1 2 ...
##  $ RPA3: num [1:876] 4 4 5 5 4 4 3 4 2 1 ...
##  $ RPA4: num [1:876] 4 4 4 4 4 4 4 3 2 2 ...
##  $ RPA5: num [1:876] 4 4 5 5 4 4 4 4 1 1 ...
summary(data_sem)
##       TSC1            TSC2            TSC3            TSC4      
##  Min.   :1.000   Min.   :2.000   Min.   :2.000   Min.   :2.000  
##  1st Qu.:3.000   1st Qu.:3.000   1st Qu.:3.000   1st Qu.:3.000  
##  Median :4.000   Median :4.000   Median :4.000   Median :4.000  
##  Mean   :3.653   Mean   :3.809   Mean   :3.732   Mean   :3.709  
##  3rd Qu.:4.000   3rd Qu.:4.000   3rd Qu.:4.000   3rd Qu.:4.000  
##  Max.   :5.000   Max.   :5.000   Max.   :5.000   Max.   :5.000  
##       TSC5            TE1             TE2             TE3       
##  Min.   :2.000   Min.   :1.000   Min.   :2.000   Min.   :1.000  
##  1st Qu.:3.000   1st Qu.:4.000   1st Qu.:4.000   1st Qu.:4.000  
##  Median :4.000   Median :4.000   Median :4.000   Median :4.000  
##  Mean   :3.822   Mean   :4.061   Mean   :4.043   Mean   :4.121  
##  3rd Qu.:4.000   3rd Qu.:5.000   3rd Qu.:5.000   3rd Qu.:5.000  
##  Max.   :5.000   Max.   :5.000   Max.   :5.000   Max.   :5.000  
##       TE4             TE5             EE1             EE2       
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:4.000   1st Qu.:3.000   1st Qu.:3.000   1st Qu.:3.000  
##  Median :4.000   Median :4.000   Median :4.000   Median :4.000  
##  Mean   :4.105   Mean   :3.902   Mean   :3.812   Mean   :3.727  
##  3rd Qu.:5.000   3rd Qu.:4.000   3rd Qu.:4.000   3rd Qu.:4.000  
##  Max.   :5.000   Max.   :5.000   Max.   :5.000   Max.   :5.000  
##       EE3             EE4             EE5             DE1       
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:3.000   1st Qu.:3.000   1st Qu.:3.000   1st Qu.:4.000  
##  Median :4.000   Median :4.000   Median :4.000   Median :4.000  
##  Mean   :3.878   Mean   :3.687   Mean   :3.987   Mean   :3.925  
##  3rd Qu.:4.000   3rd Qu.:4.000   3rd Qu.:5.000   3rd Qu.:4.000  
##  Max.   :5.000   Max.   :5.000   Max.   :5.000   Max.   :5.000  
##       DE2             DE3             RPA1            RPA2      
##  Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:3.000   1st Qu.:3.000   1st Qu.:3.000   1st Qu.:4.000  
##  Median :4.000   Median :4.000   Median :4.000   Median :4.000  
##  Mean   :3.596   Mean   :3.817   Mean   :3.933   Mean   :3.941  
##  3rd Qu.:4.000   3rd Qu.:4.000   3rd Qu.:5.000   3rd Qu.:4.000  
##  Max.   :5.000   Max.   :5.000   Max.   :5.000   Max.   :5.000  
##       RPA3            RPA4            RPA5      
##  Min.   :1.000   Min.   :1.000   Min.   :1.000  
##  1st Qu.:3.000   1st Qu.:3.000   1st Qu.:3.000  
##  Median :4.000   Median :4.000   Median :4.000  
##  Mean   :3.884   Mean   :3.869   Mean   :3.842  
##  3rd Qu.:4.000   3rd Qu.:4.000   3rd Qu.:4.000  
##  Max.   :5.000   Max.   :5.000   Max.   :5.000

3 Seleksi Variabel Indikator

Dipilih 23 indikator yang merepresentasikan 5 konstruk laten:

indikator <- data_sem[, c(
  "TSC1","TSC2","TSC3","TSC4","TSC5",   # Teaching Self-Confidence
  "TE1","TE2","TE3","TE4","TE5",         # Teaching Enjoyment
  "EE1","EE2","EE3","EE4","EE5",         # Emotional Exhaustion
  "DE1","DE2","DE3",                     # Depersonalization
  "RPA1","RPA2","RPA3","RPA4","RPA5"     # Reduced Personal Accomplishment
)]

cat("Jumlah indikator terpilih:", ncol(indikator), "\n")
## Jumlah indikator terpilih: 23
cat("Jumlah responden:", nrow(indikator), "\n")
## Jumlah responden: 876

4 Uji Asumsi

4.1 Uji Normalitas Multivariat (Mardia’s Test)

Normalitas multivariat diuji menggunakan Mardia’s Test yang mencakup uji skewness dan kurtosis multivariat. SEM dengan estimator MLR (Maximum Likelihood Robust) cukup toleran terhadap pelanggaran normalitas, namun uji ini tetap penting dilakukan.

set.seed(123)

mvn_result <- tryCatch({
  mvn(data = indikator, mvnTest = "mardia")        # MVN >= 5.x
}, error = function(e) {
  mvn(data = as.data.frame(indikator), mvn_test = "mardia")  # MVN < 5.x
})

mv_norm <- if (!is.null(mvn_result$multivariateNormality)) {
  mvn_result$multivariateNormality
} else {
  mvn_result$multivariate_normality
}

print(mv_norm)
##              Test Statistic p.value     Method          MVN
## 1 Mardia Skewness  7517.654  <0.001 asymptotic ✗ Not normal
## 2 Mardia Kurtosis    37.429  <0.001 asymptotic ✗ Not normal

4.2 Uji KMO / Measure of Sampling Adequacy (MSA)

Uji Kaiser-Meyer-Olkin (KMO) mengukur kecukupan sampel untuk analisis faktor. Nilai MSA overall > 0.5 diperlukan agar analisis SEM dapat dilanjutkan.

kmo_result <- KMO(cor(indikator))

# Tampilkan Overall MSA
cat("Overall MSA:", round(kmo_result$MSA, 4), "\n\n")
## Overall MSA: 0.9413
# Tampilkan MSA per indikator
msa_df <- data.frame(
  Indikator = names(kmo_result$MSAi),
  MSA       = round(kmo_result$MSAi, 4)
)

print(msa_df)
##      Indikator    MSA
## TSC1      TSC1 0.9579
## TSC2      TSC2 0.9600
## TSC3      TSC3 0.9481
## TSC4      TSC4 0.9441
## TSC5      TSC5 0.9607
## TE1        TE1 0.9348
## TE2        TE2 0.9551
## TE3        TE3 0.9388
## TE4        TE4 0.9352
## TE5        TE5 0.9627
## EE1        EE1 0.9544
## EE2        EE2 0.9381
## EE3        EE3 0.9513
## EE4        EE4 0.9374
## EE5        EE5 0.9737
## DE1        DE1 0.8729
## DE2        DE2 0.8645
## DE3        DE3 0.9189
## RPA1      RPA1 0.9124
## RPA2      RPA2 0.9098
## RPA3      RPA3 0.9499
## RPA4      RPA4 0.9442
## RPA5      RPA5 0.9588

4.3 Uji Multikolinearitas (VIF)

Multikolinearitas antar variabel eksogen dideteksi menggunakan Variance Inflation Factor (VIF). Nilai VIF < 3.3 menandakan tidak ada multikolinearitas serius (threshold ketat untuk SEM).

vif_model <- lm(
  RPA1 ~ TSC1 + TE1 + EE1 + DE1,
  data = data_sem
)

vif_values <- vif(vif_model)

vif_df <- data.frame(
  Prediktor = names(vif_values),
  VIF       = round(vif_values, 4),
  Status    = ifelse(vif_values < 3.3, "Aman", "Perlu Perhatian")
)

print(vif_df)
##      Prediktor    VIF Status
## TSC1      TSC1 1.2305   Aman
## TE1        TE1 1.3438   Aman
## EE1        EE1 1.3333   Aman
## DE1        DE1 1.1604   Aman

5 Spesifikasi Model SEM

5.1 Model Pengukuran (Measurement Model)

Setiap konstruk laten diukur oleh indikator-indikatornya melalui model reflektif:

model_sem <- '

# MEASUREMENT MODEL (Model Pengukuran)


# TSC: Teaching Self-Confidence
TSC =~ TSC1 + TSC2 + TSC3 + TSC4 + TSC5

# TE: Teaching Enjoyment
TE  =~ TE1 + TE2 + TE3 + TE4 + TE5

# EE: Emotional Exhaustion
EE  =~ EE1 + EE2 + EE3 + EE4 + EE5

# DE: Depersonalization
DE  =~ DE1 + DE2 + DE3

# RPA: Reduced Personal Accomplishment
RPA =~ RPA1 + RPA2 + RPA3 + RPA4 + RPA5


# STRUCTURAL MODEL (Model Struktural)


# TSC mempengaruhi TE (Teaching Enjoyment sebagai mediator)
TE  ~ TSC

# Dimensi burnout dipengaruhi oleh TSC dan TE
EE  ~ TSC + TE
DE  ~ TSC + TE
RPA ~ TSC + TE
'

cat("Model SEM berhasil didefinisikan.\n")
## Model SEM berhasil didefinisikan.
cat("Konstruk eksogen : TSC\n")
## Konstruk eksogen : TSC
cat("Konstruk endogen : TE, EE, DE, RPA\n")
## Konstruk endogen : TE, EE, DE, RPA

6 Estimasi Model SEM

Model diestimasi menggunakan Maximum Likelihood Robust (MLR) yang tahan terhadap non-normalitas data.

fit_sem <- sem(
  model    = model_sem,
  data     = data_sem,
  estimator = "MLR"
)

cat("Model berhasil diestimasi dengan estimator MLR.\n")
## Model berhasil diestimasi dengan estimator MLR.

7 Evaluasi Goodness of Fit

7.1 Indeks Fit Model

fit_idx <- fitMeasures(
  fit_sem,
  c("chisq","df","pvalue","cfi","tli","rmsea","rmsea.ci.lower","rmsea.ci.upper","srmr")
)

fit_df <- data.frame(
  Indeks    = c("Chi-Square (χ²)", "Degrees of Freedom", "p-value",
                "CFI", "TLI", "RMSEA", "RMSEA CI Lower", "RMSEA CI Upper", "SRMR"),
  Nilai     = round(fit_idx, 4),
  Kriteria  = c("> 0.05 (p-value)", "—", "> 0.05",
                "> 0.95 (good) / > 0.90 (acceptable)",
                "> 0.95 (good) / > 0.90 (acceptable)",
                "< 0.05 (good) / < 0.08 (acceptable)",
                "—", "—",
                "< 0.08"),
  Status    = c(
    ifelse(fit_idx["pvalue"] > 0.05, "✓ Baik", "✗ Tidak Baik"),
    "—",
    ifelse(fit_idx["pvalue"] > 0.05, "✓ Baik", "✗ Tidak Baik"),
    ifelse(fit_idx["cfi"] > 0.95, "✓ Baik",
           ifelse(fit_idx["cfi"] > 0.90, "~ Acceptable", "✗ Kurang")),
    ifelse(fit_idx["tli"] > 0.95, "✓ Baik",
           ifelse(fit_idx["tli"] > 0.90, "~ Acceptable", "✗ Kurang")),
    ifelse(fit_idx["rmsea"] < 0.05, "✓ Baik",
           ifelse(fit_idx["rmsea"] < 0.08, "~ Acceptable", "✗ Kurang")),
    "—", "—",
    ifelse(fit_idx["srmr"] < 0.08, "✓ Baik", "✗ Kurang")
  )
)

print(fit_df)
##                            Indeks    Nilai                            Kriteria
## chisq             Chi-Square (χ²) 863.8841                    > 0.05 (p-value)
## df             Degrees of Freedom 220.0000                                   —
## pvalue                    p-value   0.0000                              > 0.05
## cfi                           CFI   0.9367 > 0.95 (good) / > 0.90 (acceptable)
## tli                           TLI   0.9272 > 0.95 (good) / > 0.90 (acceptable)
## rmsea                       RMSEA   0.0578 < 0.05 (good) / < 0.08 (acceptable)
## rmsea.ci.lower     RMSEA CI Lower   0.0538                                   —
## rmsea.ci.upper     RMSEA CI Upper   0.0619                                   —
## srmr                         SRMR   0.0404                              < 0.08
##                      Status
## chisq          ✗ Tidak Baik
## df                        —
## pvalue         ✗ Tidak Baik
## cfi            ~ Acceptable
## tli            ~ Acceptable
## rmsea          ~ Acceptable
## rmsea.ci.lower            —
## rmsea.ci.upper            —
## srmr                 ✓ Baik

Panduan Interpretasi:

Indeks Kriteria Baik Kriteria Acceptable
CFI > 0.95 > 0.90
TLI > 0.95 > 0.90
RMSEA < 0.05 < 0.08
SRMR < 0.05 < 0.08

8 Hasil Model Pengukuran (Measurement Model)

8.1 Loading Faktor (Factor Loadings)

# Ambil parameter estimasi
param_all <- parameterestimates(fit_sem, standardized = TRUE)

# Filter measurement model (=~)
loadings <- param_all[param_all$op == "=~", 
                      c("lhs","rhs","est","se","z","pvalue","std.all")]
names(loadings) <- c("Konstruk","Indikator","Estimate","SE","z-value","p-value","Std. Loading")

loadings$`p-value` <- round(loadings$`p-value`, 4)
loadings$`Std. Loading` <- round(loadings$`Std. Loading`, 4)
loadings$Signifikan <- ifelse(loadings$`p-value` < 0.05, "✓ Ya", "✗ Tidak")

print(loadings)
##    Konstruk Indikator Estimate    SE z.value p.value Std..Loading Signifikan
## 1       TSC      TSC1    1.000 0.000      NA      NA        0.660       <NA>
## 2       TSC      TSC2    0.993 0.047  20.990       0        0.703       ✓ Ya
## 3       TSC      TSC3    0.938 0.053  17.726       0        0.663       ✓ Ya
## 4       TSC      TSC4    0.923 0.058  15.963       0        0.620       ✓ Ya
## 5       TSC      TSC5    1.026 0.048  21.198       0        0.712       ✓ Ya
## 6        TE       TE1    1.000 0.000      NA      NA        0.770       <NA>
## 7        TE       TE2    0.925 0.038  24.597       0        0.727       ✓ Ya
## 8        TE       TE3    1.033 0.041  25.223       0        0.804       ✓ Ya
## 9        TE       TE4    1.086 0.031  34.702       0        0.864       ✓ Ya
## 10       TE       TE5    0.903 0.044  20.620       0        0.657       ✓ Ya
## 11       EE       EE1    1.000 0.000      NA      NA        0.748       <NA>
## 12       EE       EE2    1.135 0.045  25.432       0        0.759       ✓ Ya
## 13       EE       EE3    1.154 0.052  22.345       0        0.791       ✓ Ya
## 14       EE       EE4    1.069 0.049  21.620       0        0.762       ✓ Ya
## 15       EE       EE5    1.094 0.049  22.369       0        0.766       ✓ Ya
## 16       DE       DE1    1.000 0.000      NA      NA        0.670       <NA>
## 17       DE       DE2    0.981 0.068  14.496       0        0.653       ✓ Ya
## 18       DE       DE3    1.150 0.098  11.794       0        0.748       ✓ Ya
## 19      RPA      RPA1    1.000 0.000      NA      NA        0.839       <NA>
## 20      RPA      RPA2    0.980 0.029  33.806       0        0.852       ✓ Ya
## 21      RPA      RPA3    0.848 0.049  17.150       0        0.752       ✓ Ya
## 22      RPA      RPA4    0.678 0.051  13.258       0        0.620       ✓ Ya
## 23      RPA      RPA5    0.616 0.054  11.459       0        0.548       ✓ Ya

Interpretasi: Loading faktor standar ≥ 0.5 (idealnya ≥ 0.7) menunjukkan indikator valid mengukur konstruknya. Semua indikator signifikan (p < 0.05) menandakan kontribusi nyata terhadap konstruk laten.


9 Hasil Model Struktural (Structural Model)

9.1 Koefisien Jalur (Path Coefficients)

# Filter structural model (~)
paths <- param_all[param_all$op == "~", 
                   c("lhs","rhs","est","se","z","pvalue","std.all")]
names(paths) <- c("Endogen","Eksogen","Estimate","SE","z-value","p-value","Std. Beta")

paths$`p-value`  <- round(paths$`p-value`, 4)
paths$`Std. Beta` <- round(paths$`Std. Beta`, 4)
paths$Hipotesis  <- c("H1","H2","H3","H4","H5","H6","H7")
paths$Signifikan <- ifelse(paths$`p-value` < 0.05, "✓ Didukung", "✗ Ditolak")

print(paths[, c("Hipotesis","Eksogen","Endogen","Std. Beta","p-value","Signifikan")])
##    Hipotesis Eksogen Endogen Std..Beta p.value Signifikan
## 24        H1     TSC      TE     0.662       0 ✓ Didukung
## 25        H2     TSC      EE     0.544       0 ✓ Didukung
## 26        H3      TE      EE     0.364       0 ✓ Didukung
## 27        H4     TSC      DE     0.398       0 ✓ Didukung
## 28        H5      TE      DE     0.290       0 ✓ Didukung
## 29        H6     TSC     RPA     0.415       0 ✓ Didukung
## 30        H7      TE     RPA     0.366       0 ✓ Didukung

Interpretasi koefisien jalur:

  • Positif & signifikan: konstruk eksogen meningkatkan konstruk endogen
  • Negatif & signifikan: konstruk eksogen menurunkan konstruk endogen
  • Tidak signifikan (p > 0.05): tidak ada bukti cukup untuk mendukung hipotesis

9.2 R-Square (Varians yang Dijelaskan)

rsq <- inspect(fit_sem, "r2")

rsq_df <- data.frame(
  Konstruk   = names(rsq),
  R_Square   = round(rsq, 4),
  Persentase = paste0(round(rsq * 100, 2), "%"),
  Kualitas   = ifelse(rsq >= 0.67, "Tinggi (Substansial)",
               ifelse(rsq >= 0.33, "Moderat",
               ifelse(rsq >= 0.19, "Lemah", "Sangat Lemah")))
)

print(rsq_df)
##      Konstruk R_Square Persentase             Kualitas
## TSC1     TSC1   0.4358     43.58%              Moderat
## TSC2     TSC2   0.4939     49.39%              Moderat
## TSC3     TSC3   0.4396     43.96%              Moderat
## TSC4     TSC4   0.3842     38.42%              Moderat
## TSC5     TSC5   0.5062     50.62%              Moderat
## TE1       TE1   0.5937     59.37%              Moderat
## TE2       TE2   0.5289     52.89%              Moderat
## TE3       TE3   0.6459     64.59%              Moderat
## TE4       TE4   0.7459     74.59% Tinggi (Substansial)
## TE5       TE5   0.4314     43.14%              Moderat
## EE1       EE1   0.5593     55.93%              Moderat
## EE2       EE2   0.5765     57.65%              Moderat
## EE3       EE3   0.6255     62.55%              Moderat
## EE4       EE4   0.5810      58.1%              Moderat
## EE5       EE5   0.5865     58.65%              Moderat
## DE1       DE1   0.4495     44.95%              Moderat
## DE2       DE2   0.4261     42.61%              Moderat
## DE3       DE3   0.5591     55.91%              Moderat
## RPA1     RPA1   0.7031     70.31% Tinggi (Substansial)
## RPA2     RPA2   0.7252     72.52% Tinggi (Substansial)
## RPA3     RPA3   0.5655     56.55%              Moderat
## RPA4     RPA4   0.3845     38.45%              Moderat
## RPA5     RPA5   0.3007     30.07%                Lemah
## TE         TE   0.4379     43.79%              Moderat
## EE         EE   0.6916     69.16% Tinggi (Substansial)
## DE         DE   0.3957     39.57%              Moderat
## RPA       RPA   0.5072     50.72%              Moderat

Interpretasi R²: Nilai R² menunjukkan proporsi varians konstruk endogen yang dijelaskan oleh konstruk eksogen dalam model. Hair et al. (2014) menyarankan R² ≥ 0.19 (lemah), ≥ 0.33 (moderat), ≥ 0.67 (substansial).


10 Ringkasan Lengkap Output SEM

summary(
  fit_sem,
  fit.measures  = TRUE,
  standardized  = TRUE,
  rsquare       = TRUE
)
## lavaan 0.6-21 ended normally after 60 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        56
## 
##   Number of observations                           876
## 
## Model Test User Model:
##                                               Standard      Scaled
##   Test Statistic                               863.884     770.948
##   Degrees of freedom                               220         220
##   P-value (Chi-square)                           0.000       0.000
##   Scaling correction factor                                  1.121
##     Yuan-Bentler correction (Mplus variant)                       
## 
## Model Test Baseline Model:
## 
##   Test statistic                             10422.842    9011.931
##   Degrees of freedom                               253         253
##   P-value                                        0.000       0.000
##   Scaling correction factor                                  1.157
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.937       0.937
##   Tucker-Lewis Index (TLI)                       0.927       0.928
##                                                                   
##   Robust Comparative Fit Index (CFI)                         0.939
##   Robust Tucker-Lewis Index (TLI)                            0.930
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)             -17541.444  -17541.444
##   Scaling correction factor                                  1.292
##       for the MLR correction                                      
##   Loglikelihood unrestricted model (H1)     -17109.502  -17109.502
##   Scaling correction factor                                  1.155
##       for the MLR correction                                      
##                                                                   
##   Akaike (AIC)                               35194.889   35194.889
##   Bayesian (BIC)                             35462.309   35462.309
##   Sample-size adjusted Bayesian (SABIC)      35284.466   35284.466
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.058       0.053
##   90 Percent confidence interval - lower         0.054       0.050
##   90 Percent confidence interval - upper         0.062       0.057
##   P-value H_0: RMSEA <= 0.050                    0.001       0.069
##   P-value H_0: RMSEA >= 0.080                    0.000       0.000
##                                                                   
##   Robust RMSEA                                               0.057
##   90 Percent confidence interval - lower                     0.052
##   90 Percent confidence interval - upper                     0.061
##   P-value H_0: Robust RMSEA <= 0.050                         0.006
##   P-value H_0: Robust RMSEA >= 0.080                         0.000
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.040       0.040
## 
## Parameter Estimates:
## 
##   Standard errors                             Sandwich
##   Information bread                           Observed
##   Observed information based on                Hessian
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   TSC =~                                                                
##     TSC1              1.000                               0.452    0.660
##     TSC2              0.993    0.047   20.990    0.000    0.449    0.703
##     TSC3              0.938    0.053   17.726    0.000    0.424    0.663
##     TSC4              0.923    0.058   15.963    0.000    0.417    0.620
##     TSC5              1.026    0.048   21.198    0.000    0.464    0.711
##   TE =~                                                                 
##     TE1               1.000                               0.548    0.771
##     TE2               0.925    0.038   24.597    0.000    0.507    0.727
##     TE3               1.033    0.041   25.223    0.000    0.566    0.804
##     TE4               1.086    0.031   34.702    0.000    0.595    0.864
##     TE5               0.903    0.044   20.620    0.000    0.495    0.657
##   EE =~                                                                 
##     EE1               1.000                               0.567    0.748
##     EE2               1.135    0.045   25.432    0.000    0.644    0.759
##     EE3               1.154    0.052   22.345    0.000    0.654    0.791
##     EE4               1.069    0.049   21.620    0.000    0.606    0.762
##     EE5               1.094    0.049   22.369    0.000    0.620    0.766
##   DE =~                                                                 
##     DE1               1.000                               0.454    0.670
##     DE2               0.981    0.068   14.496    0.000    0.445    0.653
##     DE3               1.150    0.098   11.794    0.000    0.522    0.748
##   RPA =~                                                                
##     RPA1              1.000                               0.699    0.839
##     RPA2              0.980    0.029   33.806    0.000    0.685    0.852
##     RPA3              0.848    0.049   17.150    0.000    0.593    0.752
##     RPA4              0.678    0.051   13.258    0.000    0.474    0.620
##     RPA5              0.616    0.054   11.459    0.000    0.431    0.548
## 
## Regressions:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   TE ~                                                                  
##     TSC               0.803    0.059   13.504    0.000    0.662    0.662
##   EE ~                                                                  
##     TSC               0.683    0.070    9.725    0.000    0.544    0.544
##     TE                0.377    0.055    6.820    0.000    0.364    0.364
##   DE ~                                                                  
##     TSC               0.400    0.062    6.490    0.000    0.398    0.398
##     TE                0.240    0.049    4.874    0.000    0.290    0.290
##   RPA ~                                                                 
##     TSC               0.642    0.080    8.065    0.000    0.415    0.415
##     TE                0.467    0.063    7.453    0.000    0.366    0.366
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##  .EE ~~                                                                 
##    .DE               -0.008    0.007   -1.041    0.298   -0.070   -0.070
##    .RPA               0.057    0.009    6.301    0.000    0.371    0.371
##  .DE ~~                                                                 
##    .RPA              -0.021    0.010   -2.224    0.026   -0.123   -0.123
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .TSC1              0.264    0.017   15.169    0.000    0.264    0.564
##    .TSC2              0.206    0.013   15.372    0.000    0.206    0.506
##    .TSC3              0.229    0.012   18.611    0.000    0.229    0.560
##    .TSC4              0.279    0.016   17.228    0.000    0.279    0.616
##    .TSC5              0.210    0.012   16.894    0.000    0.210    0.494
##    .TE1               0.206    0.014   14.660    0.000    0.206    0.406
##    .TE2               0.229    0.014   16.845    0.000    0.229    0.471
##    .TE3               0.176    0.013   13.842    0.000    0.176    0.354
##    .TE4               0.121    0.010   12.630    0.000    0.121    0.254
##    .TE5               0.323    0.020   16.049    0.000    0.323    0.569
##    .EE1               0.254    0.018   14.238    0.000    0.254    0.441
##    .EE2               0.305    0.024   12.858    0.000    0.305    0.424
##    .EE3               0.257    0.018   14.553    0.000    0.257    0.375
##    .EE4               0.265    0.019   14.038    0.000    0.265    0.419
##    .EE5               0.271    0.019   14.258    0.000    0.271    0.413
##    .DE1               0.252    0.017   14.538    0.000    0.252    0.550
##    .DE2               0.267    0.015   17.674    0.000    0.267    0.574
##    .DE3               0.215    0.022    9.838    0.000    0.215    0.441
##    .RPA1              0.206    0.017   12.373    0.000    0.206    0.297
##    .RPA2              0.178    0.016   11.248    0.000    0.178    0.275
##    .RPA3              0.270    0.030    8.929    0.000    0.270    0.434
##    .RPA4              0.360    0.030   12.047    0.000    0.360    0.615
##    .RPA5              0.431    0.032   13.593    0.000    0.431    0.699
##     TSC               0.204    0.019   10.876    0.000    1.000    1.000
##    .TE                0.169    0.016   10.280    0.000    0.562    0.562
##    .EE                0.099    0.011    8.934    0.000    0.308    0.308
##    .DE                0.124    0.019    6.608    0.000    0.604    0.604
##    .RPA               0.241    0.027    8.872    0.000    0.493    0.493
## 
## R-Square:
##                    Estimate
##     TSC1              0.436
##     TSC2              0.494
##     TSC3              0.440
##     TSC4              0.384
##     TSC5              0.506
##     TE1               0.594
##     TE2               0.529
##     TE3               0.646
##     TE4               0.746
##     TE5               0.431
##     EE1               0.559
##     EE2               0.576
##     EE3               0.625
##     EE4               0.581
##     EE5               0.587
##     DE1               0.450
##     DE2               0.426
##     DE3               0.559
##     RPA1              0.703
##     RPA2              0.725
##     RPA3              0.566
##     RPA4              0.385
##     RPA5              0.301
##     TE                0.438
##     EE                0.692
##     DE                0.396
##     RPA               0.507

11 Visualisasi Model SEM

library(qgraph)

# Ambil parameter standar
param <- parameterestimates(fit_sem, standardized = TRUE)

# --- Measurement loadings ---
load_df <- param[param$op == "=~", c("lhs","rhs","std.all")]

# --- Structural paths ---
path_df <- param[param$op == "~",  c("lhs","rhs","std.all")]

# Gabung semua edge: from -> to -> weight
edges <- rbind(
  data.frame(from = load_df$lhs, to = load_df$rhs, weight = round(load_df$std.all, 2)),
  data.frame(from = path_df$rhs, to = path_df$lhs, weight = round(path_df$std.all, 2))
)

# Semua node unik
all_nodes <- unique(c(as.character(edges$from), as.character(edges$to)))

# Posisi manual (x, y) — koordinat disesuaikan
node_pos <- matrix(c(
  # TSC (laten) — kiri tengah
  0,  0,
  # TE (laten)  — tengah bawah
  3.5, -3,
  # EE (laten)  — tengah
  3.5,  -1,
  # DE (laten)  — tengah atas
  3.5,  1,
  # RPA (laten) — tengah paling atas
  3.5,  3,
  # TSC indicators — kolom paling kiri
 -3,  3,   # TSC5
 -3,  1.5, # TSC4
 -3,  0,   # TSC3
 -3, -1.5, # TSC2
 -3, -3,   # TSC1
  # TE indicators — kolom kanan bawah
  7, -4.5, # TE1
  7, -3.75,# TE2
  7, -3,   # TE3
  7, -2.25,# TE4
  7, -1.5, # TE5
  # EE indicators
  7, -0.75,# EE1
  7,  0,   # EE2
  7,  0.75,# EE3
  7,  1.5, # EE4
  7,  2.25,# EE5
  # DE indicators
  7,  3,   # DE1
  7,  3.75,# DE2
  7,  4.5, # DE3
  # RPA indicators
  7,  5.25,# RPA1
  7,  6,   # RPA2
  7,  6.75,# RPA3
  7,  7.5, # RPA4
  7,  8.25 # RPA5
), ncol = 2, byrow = TRUE)

node_order <- c("TSC","TE","EE","DE","RPA",
                "TSC5","TSC4","TSC3","TSC2","TSC1",
                "TE1","TE2","TE3","TE4","TE5",
                "EE1","EE2","EE3","EE4","EE5",
                "DE1","DE2","DE3",
                "RPA1","RPA2","RPA3","RPA4","RPA5")

rownames(node_pos) <- node_order

# Warna node
node_color <- ifelse(node_order %in% c("TSC","TE","EE","DE","RPA"),
                     "#2E86C1", "#F39C12")
node_shape <- ifelse(node_order %in% c("TSC","TE","EE","DE","RPA"),
                     "circle", "square")

# Edge color: struktural = merah tua, pengukuran = abu
edge_color <- ifelse(
  paste(edges$from, edges$to) %in%
    paste(path_df$rhs, path_df$lhs),
  "#C0392B", "gray50"
)
edge_lwd <- ifelse(
  paste(edges$from, edges$to) %in%
    paste(path_df$rhs, path_df$lhs),
  2.5, 1.2
)

tmp_png <- tempfile(fileext = ".png")
png(tmp_png, width = 3200, height = 2000, res = 200)

qgraph(
  edges[, c("from","to","weight")],
  layout       = node_pos[node_order, ],
  labels       = node_order,
  shape        = node_shape,
  color        = node_color,
  vsize        = ifelse(node_order %in% c("TSC","TE","EE","DE","RPA"), 9, 5),
  label.cex    = 1.1,
  edge.labels  = TRUE,
  edge.label.cex = 0.85,
  edge.color   = edge_color,
  lwd          = edge_lwd,
  arrows       = TRUE,
  directed     = TRUE,
  fade         = FALSE,
  border.width = 1.5,
  mar          = c(5, 5, 7, 5)
)

title("Diagram Jalur SEM — Koefisien Standar\n(Merah = Jalur Struktural, Abu = Loading Pengukuran)",
      cex.main = 1.3, font.main = 2, line = 1)

dev.off()
## png 
##   2
knitr::include_graphics(tmp_png)

Keterangan diagram: Kotak oranye = indikator (variabel manifest), lingkaran biru = konstruk laten. Angka pada garis adalah koefisien jalur standar (standardized path coefficient).


12 Kesimpulan

##   Hipotesis     Jalur    Arah  Beta p_value  Keputusan
## 1        H1  TSC → TE Positif 0.662       0 ✓ Didukung
## 2        H2  TSC → EE Positif 0.544       0 ✓ Didukung
## 3        H3  TSC → DE Positif 0.364       0 ✓ Didukung
## 4        H4 TSC → RPA Positif 0.398       0 ✓ Didukung
## 5        H5  TE  → EE Positif 0.290       0 ✓ Didukung
## 6        H6  TE  → DE Positif 0.415       0 ✓ Didukung
## 7        H7 TE  → RPA Positif 0.366       0 ✓ Didukung