1 Pendahuluan

1.1 Latar Belakang

Media sosial telah menjadi bagian integral dari kehidupan modern, dengan lebih dari 5 miliar pengguna aktif di seluruh dunia. Namun di balik konektivitas yang ditawarkan, berbagai penelitian menunjukkan bahwa intensitas penggunaan media sosial berkorelasi dengan meningkatnya gejala kecemasan (anxiety), penurunan harga diri (self-esteem), dan menurunnya kesejahteraan psikologis (wellbeing) penggunanya.

Fenomena ini erat kaitannya dengan Social Comparison Theory (Festinger, 1954), yang menjelaskan kecenderungan individu untuk membandingkan dirinya dengan orang lain—sebuah perilaku yang diperkuat secara masif oleh fitur-fitur media sosial seperti likes, followers, dan highlight reels. Perbandingan sosial yang berlebihan ini dapat memperburuk persepsi diri dan memicu gangguan kesehatan mental.

Untuk memahami hubungan kausal antar variabel laten yang tidak dapat diukur secara langsung ini, diperlukan pendekatan analisis yang komprehensif. Structural Equation Modeling (SEM) merupakan teknik analisis multivariat yang menggabungkan analisis faktor konfirmatori (CFA) dengan analisis jalur (path analysis), sehingga memungkinkan pengujian hubungan kausal antar konstruk laten secara simultan dalam satu model berbasis teori.

1.2 Tujuan Penelitian

  1. Mengukur pengaruh Social Media Use (SMU) terhadap Anxiety (ANX)
  2. Mengukur pengaruh Social Media Use (SMU) terhadap Self-Esteem (SE)
  3. Mengukur pengaruh Social Media Use (SMU), Anxiety (ANX), dan Self-Esteem (SE) terhadap Wellbeing (WB)
  4. Memvalidasi model pengukuran (outer model) menggunakan Confirmatory Factor Analysis (CFA)
  5. Menguji kesesuaian model struktural (inner model) secara keseluruhan

1.3 Hipotesis Penelitian

Kode Jalur Hipotesis
H1 SMU → ANX Social Media Use berpengaruh positif terhadap Anxiety
H2 SMU → SE Social Media Use berpengaruh negatif terhadap Self-Esteem
H3 SMU → WB Social Media Use berpengaruh negatif terhadap Wellbeing
H4 ANX → WB Anxiety berpengaruh negatif terhadap Wellbeing
H5 SE → WB Self-Esteem berpengaruh positif terhadap Wellbeing

2 Dataset

2.1 Sumber & Deskripsi Data

Dataset yang digunakan adalah “Social Media and Mental Health” yang tersedia secara publik di Kaggle. Dataset ini dikumpulkan melalui survei untuk menginvestigasi korelasi antara intensitas penggunaan media sosial dengan kondisi kesehatan mental responden.

2.2 Variabel & Konstruk Laten

Konstruk Laten Kode Indikator Keterangan
Social Media Use sm1 Q9 Penggunaan medsos tanpa tujuan
sm2 Q10 Distraksi medsos saat sedang sibuk
sm3 Q11 Gelisah jika tidak menggunakan medsos
sm4 Q8 Rata-rata waktu harian di medsos (1–6)
Anxiety anx1 Q12 Mudah terdistraksi
anx2 Q13 Terganggu oleh kekhawatiran
anx3 Q14 Sulit berkonsentrasi
Self-Esteem se1 Q15 Membandingkan diri dengan orang sukses
se2 Q16 Perasaan saat melakukan perbandingan
se3 Q17 Mencari validasi dari fitur medsos
Wellbeing wb1 Q18 Frekuensi merasa depresi/sedih
wb2 Q19 Fluktuasi minat aktivitas harian
wb3 Q20 Gangguan tidur

Semua konstruk menggunakan bentuk hubungan reflektif (konstruk → indikator), karena indikator merupakan cerminan dari konstruk latennya.

2.3 Model Konseptual

Social Media Use (SMU) ──→ Anxiety (ANX)
Social Media Use (SMU) ──→ Self-Esteem (SE)
Social Media Use (SMU) ──→ Wellbeing (WB)
           Anxiety (ANX) ──→ Wellbeing (WB)
        Self-Esteem (SE) ──→ Wellbeing (WB)

3 Persiapan

3.1 Load Library

# install.packages(c("lavaan","semPlot","psych","car",
#                    "corrplot","tidyverse","kableExtra"))

library(lavaan)
library(semTools)   # reliability() untuk objek lavaan (CR, AVE, omega)
library(semPlot)
library(psych)
library(car)
library(corrplot)
library(tidyverse)
library(kableExtra)

3.2 Import & Preprocessing Data

raw <- read.csv("smmh.csv", stringsAsFactors = FALSE)

# Rename kolom
colnames(raw) <- c(
  "timestamp", "age", "gender", "rel_status", "occupation",
  "org_type", "use_sm", "platforms", "daily_time",
  "Q9_purposeless", "Q10_distracted_busy", "Q11_restless",
  "Q12_easily_distracted", "Q13_bothered_worries", "Q14_diff_concentrate",
  "Q15_compare_others", "Q16_feel_comparison", "Q17_seek_validation",
  "Q18_feel_depressed", "Q19_interest_fluctuate", "Q20_sleep_issues"
)

# Encode daily_time → numerik ordinal 1–6
time_map <- c(
  "Less than an Hour"     = 1,
  "Between 1 and 2 hours" = 2,
  "Between 2 and 3 hours" = 3,
  "Between 3 and 4 hours" = 4,
  "Between 4 and 5 hours" = 5,
  "More than 5 hours"     = 6
)
raw$sm_time <- as.numeric(time_map[raw$daily_time])

# Filter pengguna medsos aktif & pilih indikator
df <- raw %>%
  filter(use_sm == "Yes") %>%
  select(
    sm1  = Q9_purposeless,
    sm2  = Q10_distracted_busy,
    sm3  = Q11_restless,
    sm4  = sm_time,
    anx1 = Q12_easily_distracted,
    anx2 = Q13_bothered_worries,
    anx3 = Q14_diff_concentrate,
    se1  = Q15_compare_others,
    se2  = Q16_feel_comparison,
    se3  = Q17_seek_validation,
    wb1  = Q18_feel_depressed,
    wb2  = Q19_interest_fluctuate,
    wb3  = Q20_sleep_issues
  ) %>%
  na.omit()

cat("Observasi setelah cleaning :", nrow(df), "\n")
## Observasi setelah cleaning : 478
cat("Jumlah variabel indikator   :", ncol(df), "\n")
## Jumlah variabel indikator   : 13
head(df, 5)

4 Uji Asumsi

4.1 1. Normalitas Multivariat (Mardia Test)

Salah satu asumsi CB-SEM adalah normalitas multivariat. Uji Mardia mengevaluasi skewness dan kurtosis secara multivariat. Pelanggaran asumsi ini diatasi dengan estimator MLR (Robust Maximum Likelihood dengan koreksi Satorra-Bentler).

mardia_result <- mardia(df, na.rm = TRUE)

data.frame(
  Test      = c("Mardia Skewness", "Mardia Kurtosis"),
  Statistic = c(round(mardia_result$b1p, 4), round(mardia_result$b2p, 4)),
  p_value   = c(round(mardia_result$p.skew, 4), round(mardia_result$p.kurt, 4)),
  Result    = c(
    ifelse(mardia_result$p.skew < 0.05, "Tidak Normal", "Normal"),
    ifelse(mardia_result$p.kurt < 0.05, "Tidak Normal", "Normal")
  )
) %>%
  kable(caption = "Uji Normalitas Multivariat — Mardia Test") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE) %>%
  column_spec(4, bold = TRUE,
              color = ifelse(
                c(mardia_result$p.skew, mardia_result$p.kurt) < 0.05,
                "red", "darkgreen"
              ))
Uji Normalitas Multivariat — Mardia Test
Test Statistic p_value Result
Mardia Skewness 8.7619 0 Tidak Normal
Mardia Kurtosis 203.5982 0 Tidak Normal

Interpretasi: Jika p-value < 0.05 pada skewness atau kurtosis, data tidak berdistribusi normal multivariat. Estimator MLR digunakan sebagai solusi karena robust terhadap pelanggaran normalitas.

4.2 2. Kecukupan Data (KMO Test)

Nilai Kaiser-Meyer-Olkin (KMO) / Overall MSA > 0.5 menunjukkan korelasi antar indikator cukup kuat untuk analisis faktor.

r_matrix  <- cor(df)
kmo_result <- KMO(r_matrix)

cat("Overall MSA (KMO):", round(kmo_result$MSA, 4), "\n\n")
## Overall MSA (KMO): 0.8887
cat("MSA per indikator:\n")
## MSA per indikator:
print(round(kmo_result$MSAi, 3))
##   sm1   sm2   sm3   sm4  anx1  anx2  anx3   se1   se2   se3   wb1   wb2   wb3 
## 0.869 0.889 0.914 0.907 0.872 0.893 0.899 0.860 0.537 0.797 0.895 0.935 0.916
kmo_val <- round(kmo_result$MSA, 3)
kmo_ket <- case_when(
  kmo_val >= 0.90 ~ "Marvelous (sangat baik sekali)",
  kmo_val >= 0.80 ~ "Meritorious (sangat baik)",
  kmo_val >= 0.70 ~ "Middling (baik)",
  kmo_val >= 0.60 ~ "Mediocre (cukup)",
  kmo_val >= 0.50 ~ "Miserable (lemah tapi masih diterima)",
  TRUE            ~ "Unacceptable (tidak layak)"
)
cat(sprintf("KMO = %.3f → %s\n", kmo_val, kmo_ket))
## KMO = 0.889 → Meritorious (sangat baik)

4.3 3. Non-Multikolinieritas (VIF)

VIF < 3.3 menunjukkan tidak ada multikolinieritas antar indikator yang mengancam estimasi.

model_vif <- lm(wb1 ~ sm1 + sm2 + sm3 + sm4 +
                      anx1 + anx2 + anx3 +
                      se1 + se2 + se3 +
                      wb2 + wb3, data = df)

vif_values <- vif(model_vif)

data.frame(
  Indikator = names(vif_values),
  VIF       = round(vif_values, 3),
  Status    = ifelse(vif_values < 3.3, "Aman", "Bermasalah")
) %>%
  kable(caption = "Nilai VIF per Indikator (Threshold < 3.3)") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = FALSE) %>%
  column_spec(3, bold = TRUE,
              color = ifelse(vif_values < 3.3, "darkgreen", "red"))
Nilai VIF per Indikator (Threshold < 3.3)
Indikator VIF Status
sm1 sm1 1.453 Aman
sm2 sm2 1.969 Aman
sm3 sm3 1.673 Aman
sm4 sm4 1.354 Aman
anx1 anx1 2.310 Aman
anx2 anx2 1.645 Aman
anx3 anx3 2.271 Aman
se1 se1 1.481 Aman
se2 se2 1.060 Aman
se3 se3 1.298 Aman
wb2 wb2 1.616 Aman
wb3 wb3 1.227 Aman

4.4 4. Matriks Korelasi Antar Indikator

corrplot(r_matrix,
         method      = "color",
         type        = "upper",
         order       = "hclust",
         tl.cex      = 0.8,
         tl.col      = "black",
         addCoef.col = "black",
         number.cex  = 0.58,
         title       = "Matriks Korelasi Antar Indikator",
         mar         = c(0, 0, 1.5, 0))

Indikator dalam satu konstruk yang sama seharusnya berkorelasi lebih tinggi satu sama lain dibandingkan dengan indikator dari konstruk yang berbeda.


5 Outer Model — Evaluasi per Konstruk

5.1 Fungsi Pembantu Evaluasi

eval_outer <- function(fit_obj, construct_name) {
  cat("--------------------------------------\n")
  cat(" Konstruk:", construct_name, "\n")
  cat("--------------------------------------\n\n")

  # Convergence guard — skip detailed output if model did not converge
  if (!lavaan::lavInspect(fit_obj, "converged")) {
    cat("[PERINGATAN] Model tidak konvergen. Periksa spesifikasi atau kualitas indikator.\n\n")
    return(invisible(NULL))
  }

  # Loading Factor
  cat(">> Loading Factor (Standardized)\n")
  sl <- standardizedsolution(fit_obj)
  lf <- sl[sl$op == "=~", c("lhs", "rhs", "est.std", "pvalue")]
  names(lf) <- c("Konstruk", "Indikator", "Loading Std", "p-value")
  lf$Status <- ifelse(abs(lf$`Loading Std`) >= 0.70, "Ideal",
               ifelse(abs(lf$`Loading Std`) >= 0.50, "Cukup", "Drop"))
  print(lf, row.names = FALSE)

  # Model Fit
  cat("\n>> Model Fit\n")
  fi <- fitMeasures(fit_obj, c("chisq", "df", "pvalue",
                                "cfi", "tli", "rmsea", "srmr"))
  fi_df <- data.frame(
    Indeks    = names(fi),
    Nilai     = round(fi, 4),
    Threshold = c("—", "—", "> 0.05", "≥ 0.90", "≥ 0.90", "< 0.08", "< 0.08"),
    Status    = c("—", "—",
                  ifelse(fi["pvalue"] > 0.05, "Lulus", "Gagal"),
                  ifelse(fi["cfi"]    >= 0.90, "Lulus", "Gagal"),
                  ifelse(fi["tli"]    >= 0.90, "Lulus", "Gagal"),
                  ifelse(fi["rmsea"]  <  0.08, "Lulus", "Gagal"),
                  ifelse(fi["srmr"]   <  0.08, "Lulus", "Gagal"))
  )
  print(fi_df, row.names = FALSE)

  # Reliabilitas & AVE (semTools::reliability menerima objek lavaan)
  rel <- semTools::reliability(fit_obj)
  cat("\n>> Reliabilitas & Validitas Konvergen\n")
  rel_df <- data.frame(
    Ukuran = c("Cronbach Alpha", "Omega / CR", "AVE"),
    Nilai  = round(c(rel["alpha", 1], rel["omega", 1], rel["avevar", 1]), 4),
    Threshold = c("≥ 0.70", "≥ 0.70", "≥ 0.50"),
    Status = c(
      ifelse(rel["alpha",  1] >= 0.70, "Lulus", "Gagal"),
      ifelse(rel["omega",  1] >= 0.70, "Lulus", "Gagal"),
      ifelse(rel["avevar", 1] >= 0.50, "Lulus", "Gagal")
    )
  )
  print(rel_df, row.names = FALSE)
  cat("\n")
}

5.2 CFA: Social Media Use (SMU)

model_smu <- 'SMU =~ sm1 + sm2 + sm3 + sm4'
fit_smu   <- cfa(model_smu, data = df, estimator = "MLR")

eval_outer(fit_smu, "Social Media Use")
## --------------------------------------
##  Konstruk: Social Media Use 
## --------------------------------------
## 
## >> Loading Factor (Standardized)
##  Konstruk Indikator Loading.Std p.value Status
##       SMU       sm1       0.608       0  Cukup
##       SMU       sm2       0.735       0  Ideal
##       SMU       sm3       0.664       0  Cukup
##       SMU       sm4       0.563       0  Cukup
## 
## >> Model Fit
##  Indeks   Nilai Threshold Status
##   chisq 10.2158         —      —
##      df  2.0000         —      —
##  pvalue  0.0060    > 0.05  Gagal
##     cfi  0.9790    ≥ 0.90  Lulus
##     tli  0.9371    ≥ 0.90  Lulus
##   rmsea  0.0927    < 0.08  Gagal
##    srmr  0.0267    < 0.08  Lulus
## 
## >> Reliabilitas & Validitas Konvergen
##          Ukuran  Nilai Threshold Status
##  Cronbach Alpha 0.7276    ≥ 0.70  Lulus
##      Omega / CR 0.7310    ≥ 0.70  Lulus
##             AVE 0.4088    ≥ 0.50  Gagal
semPaths(fit_smu, what = "std", layout = "tree",
         edge.label.cex = 0.9, sizeMan = 8, sizeLat = 10,
         fade = FALSE, title = FALSE, mar = c(3, 3, 3, 3))
title("CFA — Social Media Use", line = 2)

5.3 CFA: Anxiety (ANX)

model_anx <- 'ANX =~ anx1 + anx2 + anx3'
fit_anx   <- cfa(model_anx, data = df, estimator = "MLR")

eval_outer(fit_anx, "Anxiety")
## --------------------------------------
##  Konstruk: Anxiety 
## --------------------------------------
## 
## >> Loading Factor (Standardized)
##  Konstruk Indikator Loading.Std p.value Status
##       ANX      anx1       0.745       0  Ideal
##       ANX      anx2       0.611       0  Cukup
##       ANX      anx3       0.884       0  Ideal
## 
## >> Model Fit
##  Indeks Nilai Threshold Status
##   chisq     0         —      —
##      df     0         —      —
##  pvalue    NA    > 0.05   <NA>
##     cfi     1    ≥ 0.90  Lulus
##     tli     1    ≥ 0.90  Lulus
##   rmsea     0    < 0.08  Lulus
##    srmr     0    < 0.08  Lulus
## 
## >> Reliabilitas & Validitas Konvergen
##          Ukuran  Nilai Threshold Status
##  Cronbach Alpha 0.7855    ≥ 0.70  Lulus
##      Omega / CR 0.7990    ≥ 0.70  Lulus
##             AVE 0.5780    ≥ 0.50  Lulus
semPaths(fit_anx, what = "std", layout = "tree",
         edge.label.cex = 0.9, sizeMan = 8, sizeLat = 10,
         fade = FALSE, title = FALSE, mar = c(3, 3, 3, 3))
title("CFA — Anxiety", line = 2)

5.4 CFA: Self-Esteem (SE)

model_se <- 'SE =~ se1 + se2 + se3'
# bounds = TRUE mencegah Heywood case (residual variance negatif) akibat
# korelasi rendah se2 (Q16 mengukur sentimen, bukan frekuensi seperti se1/se3)
fit_se   <- cfa(model_se, data = df, estimator = "MLR", bounds = TRUE)

eval_outer(fit_se, "Self-Esteem")
## --------------------------------------
##  Konstruk: Self-Esteem 
## --------------------------------------
## 
## >> Loading Factor (Standardized)
##  Konstruk Indikator Loading.Std p.value Status
##        SE       se1       0.402   0.000   Drop
##        SE       se2       0.152   0.001   Drop
##        SE       se3       1.025   0.000  Ideal
## 
## >> Model Fit
##  Indeks  Nilai Threshold Status
##   chisq 3.1419         —      —
##      df 0.0000         —      —
##  pvalue     NA    > 0.05   <NA>
##     cfi 0.9688    ≥ 0.90  Lulus
##     tli 1.0000    ≥ 0.90  Lulus
##   rmsea 0.0000    < 0.08  Lulus
##    srmr 0.0301    < 0.08  Lulus
## 
## >> Reliabilitas & Validitas Konvergen
##          Ukuran  Nilai Threshold Status
##  Cronbach Alpha 0.4210    ≥ 0.70  Gagal
##      Omega / CR 0.6009    ≥ 0.70  Gagal
##             AVE 0.4259    ≥ 0.50  Gagal
semPaths(fit_se, what = "std", layout = "tree",
         edge.label.cex = 0.9, sizeMan = 8, sizeLat = 10,
         fade = FALSE, title = FALSE, mar = c(3, 3, 3, 3))
title("CFA — Self-Esteem", line = 2)

5.5 CFA: Wellbeing (WB)

model_wb <- 'WB =~ wb1 + wb2 + wb3'
fit_wb   <- cfa(model_wb, data = df, estimator = "MLR")

eval_outer(fit_wb, "Wellbeing")
## --------------------------------------
##  Konstruk: Wellbeing 
## --------------------------------------
## 
## >> Loading Factor (Standardized)
##  Konstruk Indikator Loading.Std p.value Status
##        WB       wb1       0.760       0  Ideal
##        WB       wb2       0.647       0  Cukup
##        WB       wb3       0.484       0   Drop
## 
## >> Model Fit
##  Indeks Nilai Threshold Status
##   chisq     0         —      —
##      df     0         —      —
##  pvalue    NA    > 0.05   <NA>
##     cfi     1    ≥ 0.90  Lulus
##     tli     1    ≥ 0.90  Lulus
##   rmsea     0    < 0.08  Lulus
##    srmr     0    < 0.08  Lulus
## 
## >> Reliabilitas & Validitas Konvergen
##          Ukuran  Nilai Threshold Status
##  Cronbach Alpha 0.6525    ≥ 0.70  Gagal
##      Omega / CR 0.6591    ≥ 0.70  Gagal
##             AVE 0.3966    ≥ 0.50  Gagal
semPaths(fit_wb, what = "std", layout = "tree",
         edge.label.cex = 0.9, sizeMan = 8, sizeLat = 10,
         fade = FALSE, title = FALSE, mar = c(3, 3, 3, 3))
title("CFA — Wellbeing", line = 2)


6 First Order CFA — Validitas Diskriminan

6.1 Spesifikasi & Estimasi Model

model_cfa1 <- '
  SMU =~ sm1 + sm2 + sm3 + sm4
  ANX =~ anx1 + anx2 + anx3
  SE  =~ se1 + se2 + se3
  WB  =~ wb1 + wb2 + wb3
'
fit_cfa1 <- cfa(model_cfa1, data = df, estimator = "MLR", bounds = TRUE)
summary(fit_cfa1, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-21 ended normally after 46 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        32
##   Row rank of the constraints matrix                32
## 
##   Number of observations                           478
## 
## Model Test User Model:
##                                               Standard      Scaled
##   Test Statistic                               222.216     205.961
##   Degrees of freedom                                59          59
##   P-value (Chi-square)                           0.000       0.000
##   Scaling correction factor                                  1.079
##     Yuan-Bentler correction (Mplus variant)                       
## 
## Model Test Baseline Model:
## 
##   Test statistic                              2036.771    1787.843
##   Degrees of freedom                                78          78
##   P-value                                        0.000       0.000
##   Scaling correction factor                                  1.139
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.917       0.914
##   Tucker-Lewis Index (TLI)                       0.890       0.886
##                                                                   
##   Robust Comparative Fit Index (CFI)                         0.919
##   Robust Tucker-Lewis Index (TLI)                            0.892
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)              -9450.234   -9450.234
##   Scaling correction factor                                  1.002
##       for the MLR correction                                      
##   Loglikelihood unrestricted model (H1)      -9339.126   -9339.126
##   Scaling correction factor                                  1.052
##       for the MLR correction                                      
##                                                                   
##   Akaike (AIC)                               18964.468   18964.468
##   Bayesian (BIC)                             19097.896   19097.896
##   Sample-size adjusted Bayesian (SABIC)      18996.332   18996.332
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.076       0.072
##   90 Percent confidence interval - lower         0.066       0.062
##   90 Percent confidence interval - upper         0.087       0.083
##   P-value H_0: RMSEA <= 0.050                    0.000       0.000
##   P-value H_0: RMSEA >= 0.080                    0.283       0.112
##                                                                   
##   Robust RMSEA                                               0.075
##   90 Percent confidence interval - lower                     0.064
##   90 Percent confidence interval - upper                     0.086
##   P-value H_0: Robust RMSEA <= 0.050                         0.000
##   P-value H_0: Robust RMSEA >= 0.080                         0.239
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.048       0.048
## 
## 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
##   SMU =~                                                                
##     sm1               1.000                               0.610    0.560
##     sm2               1.655    0.155   10.709    0.000    1.010    0.766
##     sm3               1.405    0.147    9.526    0.000    0.857    0.684
##     sm4               1.391    0.149    9.323    0.000    0.849    0.536
##   ANX =~                                                                
##     anx1              1.000                               0.910    0.778
##     anx2              0.922    0.076   12.159    0.000    0.839    0.657
##     anx3              1.202    0.064   18.830    0.000    1.094    0.816
##   SE =~                                                                 
##     se1               1.000                               1.062    0.757
##     se2               0.070    0.083    0.845    0.398    0.074    0.070
##     se3               0.636    0.104    6.116    0.000    0.675    0.542
##   WB =~                                                                 
##     wb1               1.000                               0.943    0.722
##     wb2               0.931    0.063   14.857    0.000    0.878    0.700
##     wb3               0.708    0.069   10.227    0.000    0.668    0.458
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   SMU ~~                                                                
##     ANX               0.461    0.055    8.330    0.000    0.830    0.830
##     SE                0.334    0.050    6.633    0.000    0.515    0.515
##     WB                0.418    0.056    7.474    0.000    0.727    0.727
##   ANX ~~                                                                
##     SE                0.545    0.070    7.744    0.000    0.564    0.564
##     WB                0.755    0.064   11.884    0.000    0.880    0.880
##   SE ~~                                                                 
##     WB                0.699    0.079    8.805    0.000    0.698    0.698
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .sm1               0.815    0.062   13.260    0.000    0.815    0.687
##    .sm2               0.718    0.081    8.866    0.000    0.718    0.413
##    .sm3               0.836    0.064   13.084    0.000    0.836    0.532
##    .sm4               1.786    0.112   15.934    0.000    1.786    0.712
##    .anx1              0.541    0.054   10.058    0.000    0.541    0.395
##    .anx2              0.927    0.086   10.820    0.000    0.927    0.569
##    .anx3              0.602    0.079    7.642    0.000    0.602    0.335
##    .se1               0.841    0.171    4.925    0.000    0.841    0.427
##    .se2               1.105    0.065   16.905    0.000    1.105    0.995
##    .se3               1.094    0.107   10.207    0.000    1.094    0.706
##    .wb1               0.818    0.075   10.883    0.000    0.818    0.479
##    .wb2               0.803    0.073   10.935    0.000    0.803    0.510
##    .wb3               1.676    0.099   17.013    0.000    1.676    0.790
##     SMU               0.372    0.068    5.494    0.000    1.000    1.000
##     ANX               0.828    0.083    9.945    0.000    1.000    1.000
##     SE                1.128    0.185    6.101    0.000    1.000    1.000
##     WB                0.889    0.097    9.145    0.000    1.000    1.000

6.2 Loading Factor Gabungan

std_sol <- standardizedsolution(fit_cfa1)
lf_all  <- std_sol[std_sol$op == "=~",
                   c("lhs", "rhs", "est.std", "se", "z", "pvalue")]
names(lf_all) <- c("Konstruk", "Indikator", "Loading Std", "SE", "z-value", "p-value")

lf_all %>%
  mutate(
    `Loading Std` = round(`Loading Std`, 3),
    SE            = round(SE, 3),
    `z-value`    = round(`z-value`, 3),
    `p-value`    = round(`p-value`, 4),
    Status       = case_when(
      abs(`Loading Std`) >= 0.70 ~ "Ideal",
      abs(`Loading Std`) >= 0.50 ~ "Cukup",
      TRUE                       ~ "Drop"
    )
  ) %>%
  kable(caption = "Loading Factor Standardized — First Order CFA") %>%
  kable_styling(bootstrap_options = c("striped", "hover")) %>%
  pack_rows("Social Media Use", 1, 4) %>%
  pack_rows("Anxiety", 5, 7) %>%
  pack_rows("Self-Esteem", 8, 10) %>%
  pack_rows("Wellbeing", 11, 13) %>%
  column_spec(7, bold = TRUE,
              color = ifelse(abs(lf_all$`Loading Std`) >= 0.70, "darkgreen",
                      ifelse(abs(lf_all$`Loading Std`) >= 0.50, "orange", "red")))
Loading Factor Standardized — First Order CFA
Konstruk Indikator Loading Std SE z-value p-value Status
Social Media Use
SMU sm1 0.560 0.044 12.754 0.0000 Cukup
SMU sm2 0.766 0.031 24.541 0.0000 Ideal
SMU sm3 0.684 0.030 22.646 0.0000 Cukup
SMU sm4 0.536 0.042 12.796 0.0000 Cukup
Anxiety
ANX anx1 0.778 0.027 28.698 0.0000 Ideal
ANX anx2 0.657 0.039 16.896 0.0000 Cukup
ANX anx3 0.816 0.027 30.401 0.0000 Ideal
Self-Esteem
SE se1 0.757 0.058 13.069 0.0000 Ideal
SE se2 0.070 0.080 0.883 0.3771 Drop
SE se3 0.542 0.060 9.082 0.0000 Cukup
Wellbeing
WB wb1 0.722 0.031 22.930 0.0000 Ideal
WB wb2 0.700 0.032 21.590 0.0000 Ideal
WB wb3 0.458 0.044 10.342 0.0000 Drop

6.3 Model Fit — First Order CFA

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

data.frame(
  Indeks    = names(fit_idx),
  Nilai     = round(fit_idx, 4),
  Threshold = c("—", "—", "> 0.05",
                "≥ 0.90", "≥ 0.90",
                "< 0.08", "—", "—", "< 0.08"),
  Status    = c("—", "—",
                ifelse(fit_idx["pvalue"] > 0.05, "Lulus", "Gagal"),
                ifelse(fit_idx["cfi"]    >= 0.90, "Lulus", "Gagal"),
                ifelse(fit_idx["tli"]    >= 0.90, "Lulus", "Gagal"),
                ifelse(fit_idx["rmsea"]  <  0.08, "Lulus", "Gagal"),
                "—", "—",
                ifelse(fit_idx["srmr"]   <  0.08, "Lulus", "Gagal"))
) %>%
  kable(caption = "Model Fit — First Order CFA") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE) %>%
  column_spec(4, bold = TRUE,
              color = case_when(
                grepl("Lulus", c("—","—",
                                  ifelse(fit_idx["pvalue"] > 0.05, "Lulus","Gagal"),
                                  ifelse(fit_idx["cfi"]   >= 0.90, "Lulus","Gagal"),
                                  ifelse(fit_idx["tli"]   >= 0.90, "Lulus","Gagal"),
                                  ifelse(fit_idx["rmsea"] <  0.08, "Lulus","Gagal"),
                                  "—","—",
                                  ifelse(fit_idx["srmr"]  <  0.08, "Lulus","Gagal"))) ~ "darkgreen",
                grepl("Gagal", c("—","—",
                                  ifelse(fit_idx["pvalue"] > 0.05, "Lulus","Gagal"),
                                  ifelse(fit_idx["cfi"]   >= 0.90, "Lulus","Gagal"),
                                  ifelse(fit_idx["tli"]   >= 0.90, "Lulus","Gagal"),
                                  ifelse(fit_idx["rmsea"] <  0.08, "Lulus","Gagal"),
                                  "—","—",
                                  ifelse(fit_idx["srmr"]  <  0.08, "Lulus","Gagal"))) ~ "red",
                TRUE ~ "gray"
              ))
Model Fit — First Order CFA
Indeks Nilai Threshold Status
chisq chisq 222.2163
df df 59.0000
pvalue pvalue 0.0000 > 0.05 Gagal
cfi cfi 0.9167 ≥ 0.90 Lulus
tli tli 0.8898 ≥ 0.90 Gagal
rmsea rmsea 0.0761 < 0.08 Lulus
rmsea.ci.lower rmsea.ci.lower 0.0656
rmsea.ci.upper rmsea.ci.upper 0.0869
srmr srmr 0.0478 < 0.08 Lulus

6.4 Reliabilitas & AVE — Semua Konstruk

rel_all <- semTools::reliability(fit_cfa1)

as.data.frame(t(rel_all)) %>%
  rownames_to_column("Konstruk") %>%
  select(Konstruk,
         `Cronbach Alpha` = alpha,
         `Omega (CR)`     = omega,
         AVE              = avevar) %>%
  mutate(
    across(where(is.numeric), ~ round(.x, 4)),
    `Status Alpha` = ifelse(`Cronbach Alpha` >= 0.70, "Lulus", "Gagal"),
    `Status CR`    = ifelse(`Omega (CR)`     >= 0.70, "Lulus", "Gagal"),
    `Status AVE`   = ifelse(AVE              >= 0.50, "Lulus", "Gagal")
  ) %>%
  kable(caption = "Reliabilitas Konstruk & Validitas Konvergen (AVE)") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Reliabilitas Konstruk & Validitas Konvergen (AVE)
Konstruk Cronbach Alpha Omega (CR) AVE Status Alpha Status CR Status AVE
SMU 0.7276 0.7270 0.4066 Lulus Lulus Gagal
ANX 0.7855 0.7961 0.5686 Lulus Lulus Lulus
SE 0.4210 0.5189 0.3432 Gagal Gagal Gagal
WB 0.6525 0.6525 0.3896 Gagal Gagal Gagal

6.5 Validitas Diskriminan

6.5.1 Fornell-Larcker Criterion

lv_cor   <- lavInspect(fit_cfa1, "cor.lv")
ave_vec  <- rel_all["avevar", ]
fl_mat   <- lv_cor
diag(fl_mat) <- sqrt(ave_vec)

round(fl_mat, 3) %>%
  kable(caption = "Fornell-Larcker Criterion — Diagonal = √AVE") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Fornell-Larcker Criterion — Diagonal = √AVE
SMU ANX SE WB
SMU 0.638 0.830 0.515 0.727
ANX 0.830 0.754 0.564 0.880
SE 0.515 0.564 0.586 0.698
WB 0.727 0.880 0.698 0.624

Kriteria: Nilai diagonal (√AVE) harus lebih besar dari semua nilai off-diagonal pada baris/kolom yang sama.

6.5.2 HTMT Ratio

htmt_result <- htmt(model_cfa1, data = df)

round(htmt_result, 3) %>%
  kable(caption = "HTMT Ratio — Threshold < 0.85 (ketat) atau < 0.90") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
HTMT Ratio — Threshold < 0.85 (ketat) atau < 0.90
SMU ANX SE WB
SMU 1.000 0.786 0.746 0.718
ANX 0.786 1.000 0.513 0.909
SE 0.746 0.513 1.000 0.754
WB 0.718 0.909 0.754 1.000

Kriteria: Semua nilai HTMT < 0.85 menunjukkan validitas diskriminan terpenuhi.

6.6 Path Diagram — First Order CFA

semPaths(fit_cfa1,
         what           = "std",
         layout         = "tree2",
         rotation       = 2,
         edge.label.cex = 0.75,
         sizeMan        = 6,
         sizeLat        = 9,
         fade           = FALSE,
         title          = FALSE,
         mar            = c(2, 2, 2, 2))
title("First Order CFA — Semua Konstruk", line = 1.5)


7 Inner Model — Full SEM

7.1 Spesifikasi Model

model_sem <- '
  # ── OUTER MODEL ──────────────────────────────
  SMU =~ sm1 + sm2 + sm3 + sm4
  ANX =~ anx1 + anx2 + anx3
  SE  =~ se1 + se2 + se3
  WB  =~ wb1 + wb2 + wb3

  # ── INNER MODEL ──────────────────────────────
  ANX ~ SMU          # H1: SMU → ANX
  SE  ~ SMU          # H2: SMU → SE
  WB  ~ SMU + ANX + SE  # H3, H4, H5
'
fit_sem <- sem(model_sem, data = df, estimator = "MLR")

7.2 Ringkasan Hasil SEM

summary(fit_sem, fit.measures = TRUE, standardized = TRUE, rsquare = TRUE)
## lavaan 0.6-21 ended normally after 42 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        31
## 
##   Number of observations                           478
## 
## Model Test User Model:
##                                               Standard      Scaled
##   Test Statistic                               229.683     212.454
##   Degrees of freedom                                60          60
##   P-value (Chi-square)                           0.000       0.000
##   Scaling correction factor                                  1.081
##     Yuan-Bentler correction (Mplus variant)                       
## 
## Model Test Baseline Model:
## 
##   Test statistic                              2036.771    1787.843
##   Degrees of freedom                                78          78
##   P-value                                        0.000       0.000
##   Scaling correction factor                                  1.139
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.913       0.911
##   Tucker-Lewis Index (TLI)                       0.887       0.884
##                                                                   
##   Robust Comparative Fit Index (CFI)                         0.915
##   Robust Tucker-Lewis Index (TLI)                            0.890
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)              -9453.968   -9453.968
##   Scaling correction factor                                  0.996
##       for the MLR correction                                      
##   Loglikelihood unrestricted model (H1)      -9339.126   -9339.126
##   Scaling correction factor                                  1.052
##       for the MLR correction                                      
##                                                                   
##   Akaike (AIC)                               18969.935   18969.935
##   Bayesian (BIC)                             19099.193   19099.193
##   Sample-size adjusted Bayesian (SABIC)      19000.803   19000.803
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.077       0.073
##   90 Percent confidence interval - lower         0.067       0.063
##   90 Percent confidence interval - upper         0.088       0.083
##   P-value H_0: RMSEA <= 0.050                    0.000       0.000
##   P-value H_0: RMSEA >= 0.080                    0.327       0.132
##                                                                   
##   Robust RMSEA                                               0.076
##   90 Percent confidence interval - lower                     0.065
##   90 Percent confidence interval - upper                     0.087
##   P-value H_0: Robust RMSEA <= 0.050                         0.000
##   P-value H_0: Robust RMSEA >= 0.080                         0.277
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.050       0.050
## 
## 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
##   SMU =~                                                                
##     sm1               1.000                               0.597    0.547
##     sm2               1.679    0.156   10.761    0.000    1.002    0.760
##     sm3               1.438    0.150    9.582    0.000    0.858    0.685
##     sm4               1.402    0.151    9.265    0.000    0.836    0.528
##   ANX =~                                                                
##     anx1              1.000                               0.920    0.787
##     anx2              0.899    0.073   12.341    0.000    0.827    0.648
##     anx3              1.186    0.063   18.898    0.000    1.091    0.814
##   SE =~                                                                 
##     se1               1.000                               1.018    0.726
##     se2               0.094    0.085    1.104    0.270    0.095    0.091
##     se3               0.689    0.102    6.732    0.000    0.702    0.564
##   WB =~                                                                 
##     wb1               1.000                               0.935    0.718
##     wb2               0.934    0.063   14.817    0.000    0.874    0.699
##     wb3               0.709    0.069   10.211    0.000    0.663    0.456
## 
## Regressions:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   ANX ~                                                                 
##     SMU               1.312    0.152    8.634    0.000    0.851    0.851
##   SE ~                                                                  
##     SMU               0.984    0.155    6.366    0.000    0.576    0.576
##   WB ~                                                                  
##     SMU              -0.266    0.274   -0.972    0.331   -0.170   -0.170
##     ANX               0.844    0.171    4.930    0.000    0.831    0.831
##     SE                0.340    0.087    3.899    0.000    0.370    0.370
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .sm1               0.832    0.061   13.669    0.000    0.832    0.700
##    .sm2               0.734    0.079    9.239    0.000    0.734    0.423
##    .sm3               0.835    0.062   13.355    0.000    0.835    0.531
##    .sm4               1.807    0.112   16.199    0.000    1.807    0.721
##    .anx1              0.522    0.052   10.046    0.000    0.522    0.381
##    .anx2              0.946    0.085   11.086    0.000    0.946    0.580
##    .anx3              0.607    0.078    7.748    0.000    0.607    0.338
##    .se1               0.932    0.147    6.318    0.000    0.932    0.473
##    .se2               1.102    0.065   16.926    0.000    1.102    0.992
##    .se3               1.057    0.108    9.820    0.000    1.057    0.682
##    .wb1               0.821    0.075   10.911    0.000    0.821    0.484
##    .wb2               0.800    0.074   10.844    0.000    0.800    0.512
##    .wb3               1.676    0.099   16.998    0.000    1.676    0.792
##     SMU               0.356    0.067    5.342    0.000    1.000    1.000
##    .ANX               0.234    0.052    4.493    0.000    0.276    0.276
##    .SE                0.693    0.143    4.841    0.000    0.668    0.668
##    .WB                0.135    0.062    2.165    0.030    0.155    0.155
## 
## R-Square:
##                    Estimate
##     sm1               0.300
##     sm2               0.577
##     sm3               0.469
##     sm4               0.279
##     anx1              0.619
##     anx2              0.420
##     anx3              0.662
##     se1               0.527
##     se2               0.008
##     se3               0.318
##     wb1               0.516
##     wb2               0.488
##     wb3               0.208
##     ANX               0.724
##     SE                0.332
##     WB                0.845

7.3 Model Fit — Full SEM

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

data.frame(
  Indeks    = c("Chi-Square (scaled)", "df", "p-value",
                "CFI (robust)", "TLI (robust)",
                "RMSEA (robust)", "RMSEA CI Lower", "RMSEA CI Upper",
                "SRMR"),
  Nilai     = round(sem_fit_idx, 4),
  Threshold = c("—", "—", "> 0.05",
                "≥ 0.90", "≥ 0.90",
                "< 0.08", "—", "—", "< 0.08"),
  Status    = c("—", "—",
                ifelse(sem_fit_idx["pvalue.scaled"]  > 0.05, "Lulus", "Gagal"),
                ifelse(sem_fit_idx["cfi.robust"]     >= 0.90, "Lulus", "Gagal"),
                ifelse(sem_fit_idx["tli.robust"]     >= 0.90, "Lulus", "Gagal"),
                ifelse(sem_fit_idx["rmsea.robust"]   <  0.08, "Lulus", "Gagal"),
                "—", "—",
                ifelse(sem_fit_idx["srmr"]           <  0.08, "Lulus", "Gagal"))
) %>%
  kable(caption = "Indeks Kesesuaian Model — Full SEM") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Indeks Kesesuaian Model — Full SEM
Indeks Nilai Threshold Status
chisq.scaled Chi-Square (scaled) 212.4543
df.scaled df 60.0000
pvalue.scaled p-value 0.0000 > 0.05 Gagal
cfi.robust CFI (robust) 0.9154 ≥ 0.90 Lulus
tli.robust TLI (robust) 0.8900 ≥ 0.90 Gagal
rmsea.robust RMSEA (robust) 0.0758 < 0.08 Lulus
rmsea.ci.lower.robust RMSEA CI Lower 0.0649
rmsea.ci.upper.robust RMSEA CI Upper 0.0870
srmr SRMR 0.0498 < 0.08 Lulus

7.4 Koefisien Jalur (Path Coefficients)

std_sem  <- standardizedsolution(fit_sem)
path_df  <- std_sem[std_sem$op == "~",
                    c("lhs", "rhs", "est.std", "se", "z", "pvalue")]
names(path_df) <- c("Endogen", "Eksogen", "Beta Std", "SE", "z-value", "p-value")

path_df %>%
  mutate(
    across(where(is.numeric), ~ round(.x, 4)),
    Signifikan = case_when(
      `p-value` < 0.001 ~ "*** (p<0.001)",
      `p-value` < 0.010 ~ "**  (p<0.01)",
      `p-value` < 0.050 ~ "*   (p<0.05)",
      TRUE              ~ "ns"
    ),
    Hipotesis = case_when(
      Endogen == "ANX" & Eksogen == "SMU" ~ "H1",
      Endogen == "SE"  & Eksogen == "SMU" ~ "H2",
      Endogen == "WB"  & Eksogen == "SMU" ~ "H3",
      Endogen == "WB"  & Eksogen == "ANX" ~ "H4",
      Endogen == "WB"  & Eksogen == "SE"  ~ "H5",
      TRUE ~ NA_character_
    )
  ) %>%
  select(Hipotesis, everything()) %>%
  kable(caption = "Koefisien Jalur — Full SEM (Standardized)") %>%
  kable_styling(bootstrap_options = c("striped", "hover")) %>%
  column_spec(8, bold = TRUE,
              color = ifelse(path_df[["p-value"]] <= 0.05, "darkgreen", "red")) %>%
  footnote(general = "*** p<0.001 | ** p<0.01 | * p<0.05 | ns = tidak signifikan")
Koefisien Jalur — Full SEM (Standardized)
Hipotesis Endogen Eksogen Beta Std SE z-value p-value Signifikan
14 H1 ANX SMU 0.8506 0.0363 23.4625 0.0000 *** (p<0.001)
15 H2 SE SMU 0.5763 0.0609 9.4660 0.0000 *** (p<0.001)
16 H3 WB SMU -0.1697 0.1696 -1.0001 0.3172 ns
17 H4 WB ANX 0.8306 0.1517 5.4737 0.0000 *** (p<0.001)
18 H5 WB SE 0.3704 0.0827 4.4782 0.0000 *** (p<0.001)
Note:
*** p<0.001 | ** p<0.01 | * p<0.05 | ns = tidak signifikan

7.5 R-Square

r2 <- lavInspect(fit_sem, "r2")

data.frame(
  Konstruk = names(r2),
  R_Square = round(r2, 4),
  Kategori = case_when(
    r2 >= 0.67 ~ "Substansial",
    r2 >= 0.33 ~ "Moderat",
    r2 >= 0.19 ~ "Lemah",
    TRUE       ~ "Sangat Lemah"
  )
) %>%
  kable(caption = "R-Square per Konstruk Endogen (Hair et al., 2017)") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE) %>%
  column_spec(3, bold = TRUE,
              color = case_when(
                r2 >= 0.67 ~ "darkgreen",
                r2 >= 0.33 ~ "orange",
                TRUE       ~ "red"
              ))
R-Square per Konstruk Endogen (Hair et al., 2017)
Konstruk R_Square Kategori
sm1 sm1 0.2997 Lemah
sm2 sm2 0.5774 Moderat
sm3 sm3 0.4688 Moderat
sm4 sm4 0.2790 Lemah
anx1 anx1 0.6188 Moderat
anx2 anx2 0.4196 Moderat
anx3 anx3 0.6622 Moderat
se1 se1 0.5268 Moderat
se2 se2 0.0082 Sangat Lemah
se3 se3 0.3179 Lemah
wb1 wb1 0.5156 Moderat
wb2 wb2 0.4882 Moderat
wb3 wb3 0.2078 Lemah
ANX ANX 0.7236 Substansial
SE SE 0.3321 Moderat
WB WB 0.8453 Substansial

7.6 Path Diagram — Full SEM

semPaths(fit_sem,
         what           = "std",
         layout         = "tree2",
         rotation       = 2,
         edge.label.cex = 0.78,
         sizeMan        = 5,
         sizeLat        = 9,
         fade           = FALSE,
         edge.color     = "steelblue",
         posCol         = "darkgreen",
         negCol         = "firebrick",
         title          = FALSE,
         mar            = c(2, 3, 2, 3))
title("Full SEM — Social Media Use & Mental Health", line = 1)


8 Pengujian Hipotesis & Interpretasi

8.1 Tabel Rangkuman Hipotesis

std_sem2  <- standardizedsolution(fit_sem)
paths2    <- std_sem2[std_sem2$op == "~", ]

hipotesis_df <- data.frame(
  Hipotesis = case_when(
    paths2$lhs == "ANX" & paths2$rhs == "SMU" ~ "H1",
    paths2$lhs == "SE"  & paths2$rhs == "SMU" ~ "H2",
    paths2$lhs == "WB"  & paths2$rhs == "SMU" ~ "H3",
    paths2$lhs == "WB"  & paths2$rhs == "ANX" ~ "H4",
    paths2$lhs == "WB"  & paths2$rhs == "SE"  ~ "H5",
    TRUE ~ NA_character_
  ),
  Jalur         = c("SMU → ANX", "SMU → SE", "SMU → WB",
                    "ANX → WB", "SE → WB"),
  `Beta Std`    = round(paths2$est.std, 4),
  `p-value`     = round(paths2$pvalue, 4),
  Keputusan     = ifelse(paths2$pvalue <= 0.05, "Diterima", "Ditolak"),
  Interpretasi  = c(
    "Penggunaan medsos berpengaruh terhadap tingkat kecemasan pengguna",
    "Penggunaan medsos berpengaruh terhadap harga diri pengguna",
    "Penggunaan medsos berpengaruh langsung terhadap kesejahteraan psikologis",
    "Kecemasan berpengaruh terhadap kesejahteraan psikologis",
    "Harga diri berpengaruh terhadap kesejahteraan psikologis"
  )
)

hipotesis_df %>%
  kable(caption = "Rangkuman Pengujian Hipotesis (α = 5%)") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed")) %>%
  column_spec(5, bold = TRUE,
              color = ifelse(hipotesis_df$Keputusan == "Diterima",
                             "darkgreen", "red"))
Rangkuman Pengujian Hipotesis (α = 5%)
Hipotesis Jalur Beta.Std p.value Keputusan Interpretasi
H1 SMU → ANX 0.8506 0.0000 Diterima Penggunaan medsos berpengaruh terhadap tingkat kecemasan pengguna
H2 SMU → SE 0.5763 0.0000 Diterima Penggunaan medsos berpengaruh terhadap harga diri pengguna
H3 SMU → WB -0.1697 0.3172 Ditolak Penggunaan medsos berpengaruh langsung terhadap kesejahteraan psikologis
H4 ANX → WB 0.8306 0.0000 Diterima Kecemasan berpengaruh terhadap kesejahteraan psikologis
H5 SE → WB 0.3704 0.0000 Diterima Harga diri berpengaruh terhadap kesejahteraan psikologis

9 Kesimpulan

9.1 Evaluasi Outer Model

Model pengukuran (outer model) dievaluasi melalui tiga kriteria utama:

  • Validitas konvergen — dievaluasi melalui loading factor (≥ 0.70) dan AVE (≥ 0.50)
  • Reliabilitas konstruk — dievaluasi melalui Cronbach’s Alpha dan Composite Reliability/Omega (≥ 0.70)
  • Validitas diskriminan — dievaluasi melalui Fornell-Larcker Criterion (√AVE > korelasi antar konstruk) dan HTMT (< 0.85)

9.2 Evaluasi Inner Model

Model struktural (inner model) dievaluasi menggunakan indeks kesesuaian model (CFI, TLI, RMSEA, SRMR) dan koefisien jalur (path coefficient) dengan uji signifikansi pada α = 5%.

9.3 Temuan Utama

Berdasarkan hasil analisis CB-SEM menggunakan data survei Social Media and Mental Health (n = 478) dengan estimator MLR (Robust Maximum Likelihood):

Hasil keputusan hipotesis selengkapnya dapat dilihat pada tabel pengujian hipotesis di atas.

Temuan ini konsisten dengan Social Comparison Theory (Festinger, 1954) yang menyatakan bahwa paparan terhadap konten media sosial mendorong perilaku membandingkan diri, yang pada gilirannya menurunkan harga diri dan memperburuk kondisi psikologis secara keseluruhan.

9.4 Implikasi

Intensitas penggunaan media sosial yang tidak terkontrol berpotensi memperburuk kondisi kesehatan mental melalui dua jalur utama: peningkatan kecemasan dan penurunan harga diri. Hal ini menggarisbawahi pentingnya literasi digital dan pengelolaan waktu layar (screen time management) sebagai intervensi preventif, khususnya bagi populasi remaja dan dewasa muda.


10 Referensi

  • Festinger, L. (1954). A Theory of Social Comparison Processes. Human Relations, 7(2), 117–140.
  • Hair, J. F., et al. (2017). Multivariate Data Analysis (8th ed.). Cengage Learning.
  • Kline, R. B. (2015). Principles and Practice of Structural Equation Modeling (4th ed.). Guilford Press.
  • Rosseel, Y. (2012). lavaan: An R Package for Structural Equation Modeling. Journal of Statistical Software, 48(2), 1–36.
  • Souvikahmed071. (2022). Social Media and Mental Health. Kaggle. https://www.kaggle.com/datasets/souvikahmed071/social-media-and-mental-health

Analisis dilakukan menggunakan R 4.5.2 dengan package lavaan 0.6.21