library(haven)
library(psych)
library(lavaan)
library(semTools)

# 1. Load Data and Prepare Variables

mydata <- read_sav(file.choose())

scale_items_raw <- mydata[, c("Cause_1", "Cause_2", "Cause_3", "Cause_4", "Cause_5",
                              "Cause_6", "Cause_7", "Cause_8", "Cause_9", "Cause_10")]

scale_items <- scale_items_raw
names(scale_items) <- c("Self_Defense",           # Cause_1
                        "Cost_Benefit",           # Cause_2
                        "Power_Asymmetry",        # Cause_3
                        "Win_Lose_Setup",         # Cause_4
                        "Behavioral_Norms",       # Cause_5
                        "Emotional_Reactivity",   # Cause_6
                        "Emotional_Distress",     # Cause_7
                        "Social_Pressure",        # Cause_8
                        "Bounded_Rationality",    # Cause_9
                        "Overconfidence")         # Cause_10

print(paste("N =", nrow(scale_items)))

# 2. Tetrachoric Correlation Matrix

tetra <- tetrachoric(scale_items)
print(round(tetra$rho, 2))

# 3. Factorability Assessment

kmo_result <- KMO(tetra$rho)
cat("Overall MSA:", round(kmo_result$MSA, 3), "\n")
print(round(kmo_result$MSAi, 3))

bart <- cortest.bartlett(tetra$rho, n = nrow(scale_items))
cat("Chi-square:", round(bart$chisq, 2), "\n")
cat("df:", bart$df, "\n")
cat("p-value:", format(bart$p.value, scientific = TRUE), "\n")

# 4. Parallel Analysis

pa_result <- fa.parallel(tetra$rho, n.obs = nrow(scale_items), 
                         fa = "fa", fm = "pa")

eigenvalues <- eigen(tetra$rho)$values
cat("First 5 eigenvalues:", round(eigenvalues[1:5], 3), "\n")

# 5. Exploratory Factor Analysis (EFA)

efa_1 <- fa(r = tetra$rho, nfactors = 1, n.obs = nrow(scale_items),
            fm = "pa", rotate = "oblimin")
print(efa_1$loadings, cutoff = 0.20)
print(efa_1$Vaccounted)

efa_2 <- fa(r = tetra$rho, nfactors = 2, n.obs = nrow(scale_items),
            fm = "pa", rotate = "oblimin")
print(efa_2$loadings, cutoff = 0.20)
print(round(efa_2$Phi, 3))
print(efa_2$Vaccounted)

efa_3 <- fa(r = tetra$rho, nfactors = 3, n.obs = nrow(scale_items),
            fm = "pa", rotate = "oblimin")
print(efa_3$loadings, cutoff = 0.20)
print(round(efa_3$Phi, 3))
print(efa_3$Vaccounted)
print(round(efa_3$communality, 3))

efa_4 <- fa(r = tetra$rho, nfactors = 4, n.obs = nrow(scale_items),
            fm = "pa", rotate = "oblimin")
print(efa_4$loadings, cutoff = 0.20)
print(round(efa_4$Phi, 3))
print(efa_4$Vaccounted)

efa_5 <- fa(r = tetra$rho, nfactors = 5, n.obs = nrow(scale_items),
            fm = "pa", rotate = "oblimin")
print(efa_5$loadings, cutoff = 0.20)
print(round(efa_5$Phi, 3))
print(efa_5$Vaccounted)

# 6. Confirmatory Factor Analysis (CFA)

cfa_model_2f <- '
  Nonrational =~ Self_Defense + Emotional_Reactivity + Emotional_Distress + Power_Asymmetry
  Rational =~ Cost_Benefit + Behavioral_Norms + Social_Pressure + Bounded_Rationality + Overconfidence + Win_Lose_Setup
'

cfa_2f <- cfa(cfa_model_2f, 
              data = scale_items,
              estimator = "WLSMV",
              ordered = TRUE)

fit_2f <- fitMeasures(cfa_2f, c("chisq", "df", "pvalue", "cfi", "tli", 
                                "rmsea", "rmsea.ci.lower", "rmsea.ci.upper", "srmr"))
print(round(fit_2f, 3))

std_2f <- standardizedSolution(cfa_2f)
loadings_2f <- std_2f[std_2f$op == "=~", c("lhs", "rhs", "est.std", "se", "pvalue")]
print(loadings_2f)

cor_2f <- std_2f[std_2f$op == "~~" & std_2f$lhs != std_2f$rhs, ]
print(cor_2f[, c("lhs", "rhs", "est.std")])

cfa_model_3f <- '
  Nonrational =~ Self_Defense + Emotional_Reactivity + Emotional_Distress + Power_Asymmetry + Win_Lose_Setup
  Rational =~ Cost_Benefit + Bounded_Rationality + Overconfidence
  Transitional =~ Behavioral_Norms + Social_Pressure
'

cfa_3f <- cfa(cfa_model_3f, 
              data = scale_items,
              estimator = "WLSMV",
              ordered = TRUE)

fit_3f <- fitMeasures(cfa_3f, c("chisq", "df", "pvalue", "cfi", "tli", 
                                "rmsea", "rmsea.ci.lower", "rmsea.ci.upper", "srmr"))
print(round(fit_3f, 3))

std_3f <- standardizedSolution(cfa_3f)
loadings_3f <- std_3f[std_3f$op == "=~", c("lhs", "rhs", "est.std", "se", "pvalue")]
print(loadings_3f)

cor_3f <- std_3f[std_3f$op == "~~" & std_3f$lhs != std_3f$rhs, ]
print(cor_3f[, c("lhs", "rhs", "est.std")])

comparison_table <- data.frame(
  Model = c("2-Factor (EFA-based)", "3-Factor (EFA-based)"),
  Chi_Square = round(c(fit_2f["chisq"], fit_3f["chisq"]), 2),
  df = c(fit_2f["df"], fit_3f["df"]),
  CFI = round(c(fit_2f["cfi"], fit_3f["cfi"]), 3),
  TLI = round(c(fit_2f["tli"], fit_3f["tli"]), 3),
  RMSEA = round(c(fit_2f["rmsea"], fit_3f["rmsea"]), 3),
  RMSEA_Lower = round(c(fit_2f["rmsea.ci.lower"], fit_3f["rmsea.ci.lower"]), 3),
  RMSEA_Upper = round(c(fit_2f["rmsea.ci.upper"], fit_3f["rmsea.ci.upper"]), 3),
  SRMR = round(c(fit_2f["srmr"], fit_3f["srmr"]), 3)
)

print(comparison_table)

print(cor_2f[, c("lhs", "rhs", "est.std")])

print(cor_3f[, c("lhs", "rhs", "est.std")])

# 7. Reliability Analysis (Based on 3-Factor Solution)

nonrat_items <- scale_items[, c("Self_Defense", "Emotional_Reactivity", 
                                 "Emotional_Distress", "Power_Asymmetry", "Win_Lose_Setup")]
rat_items <- scale_items[, c("Cost_Benefit", "Bounded_Rationality", "Overconfidence")]
trans_items <- scale_items[, c("Behavioral_Norms", "Social_Pressure")]

alpha_nonrat <- alpha(nonrat_items, check.keys = FALSE)
alpha_rat <- alpha(rat_items, check.keys = FALSE)
alpha_trans <- alpha(trans_items, check.keys = FALSE)

cat("\nNonrational alpha (raw):", round(alpha_nonrat$total$raw_alpha, 3))
cat("\nRational alpha (raw):", round(alpha_rat$total$raw_alpha, 3))
cat("\nTransitional alpha (raw):", round(alpha_trans$total$raw_alpha, 3))

alpha_ord_nonrat <- psych::alpha(nonrat_items, check.keys = FALSE)$total$std.alpha
alpha_ord_rat <- psych::alpha(rat_items, check.keys = FALSE)$total$std.alpha
alpha_ord_trans <- psych::alpha(trans_items, check.keys = FALSE)$total$std.alpha

cat("\nNonrational ordinal alpha:", round(alpha_ord_nonrat, 3))
cat("\nRational ordinal alpha:", round(alpha_ord_rat, 3))
cat("\nTransitional ordinal alpha:", round(alpha_ord_trans, 3))

omega_3f <- reliability(cfa_3f)
print(omega_3f)

nonrat_loadings <- loadings_3f[loadings_3f$lhs == "Nonrational", "est.std"]
trans_loadings <- loadings_3f[loadings_3f$lhs == "Transitional", "est.std"]
rat_loadings <- loadings_3f[loadings_3f$lhs == "Rational", "est.std"]

ave_nonrat <- mean(nonrat_loadings^2)
ave_trans <- mean(trans_loadings^2)
ave_rat <- mean(rat_loadings^2)

cat("\nNonrational AVE:", round(ave_nonrat, 3))
cat("\nTransitional AVE:", round(ave_trans, 3))
cat("\nRational AVE:", round(ave_rat, 3))

cor_nonrat_trans <- cor_3f[cor_3f$lhs == "Nonrational" & cor_3f$rhs == "Transitional", "est.std"]
cor_nonrat_rat <- cor_3f[cor_3f$lhs == "Nonrational" & cor_3f$rhs == "Rational", "est.std"]
cor_trans_rat <- cor_3f[cor_3f$lhs == "Transitional" & cor_3f$rhs == "Rational", "est.std"]