model_data <- mca_data %>%
mutate(
Happiness_group = ordered(
Happiness_group,
levels = c("幸福感低", "幸福感中", "幸福感高")
)
)
candidate_vars <- c(
"SM_time_group",
"FB_use",
"IG_use",
"TikTok_use",
"Dcard_use",
"PTT_use",
"XHS_use",
"Threads_use",
"Gender",
"Age_group",
"Edu_group"
)
model_level_check <- sapply(model_data[candidate_vars], function(x) length(unique(x)))
model_vars <- names(model_level_check[model_level_check >= 2])
if ("SM_time_group" %in% model_vars) {
model_data$SM_time_group <- relevel(model_data$SM_time_group, ref = "低使用時間")
}
if ("FB_use" %in% model_vars) {
model_data$FB_use <- relevel(model_data$FB_use, ref = "FB_無使用")
}
if ("IG_use" %in% model_vars) {
model_data$IG_use <- relevel(model_data$IG_use, ref = "IG_無使用")
}
if ("TikTok_use" %in% model_vars) {
model_data$TikTok_use <- relevel(model_data$TikTok_use, ref = "TikTok_無使用")
}
if ("Dcard_use" %in% model_vars) {
model_data$Dcard_use <- relevel(model_data$Dcard_use, ref = "Dcard_無使用")
}
if ("PTT_use" %in% model_vars) {
model_data$PTT_use <- relevel(model_data$PTT_use, ref = "PTT_無使用")
}
if ("XHS_use" %in% model_vars) {
model_data$XHS_use <- relevel(model_data$XHS_use, ref = "小紅書_無使用")
}
if ("Threads_use" %in% model_vars) {
model_data$Threads_use <- relevel(model_data$Threads_use, ref = "Threads_無使用")
}
if ("Gender" %in% model_vars) {
model_data$Gender <- relevel(model_data$Gender, ref = "男")
}
if ("Age_group" %in% model_vars) {
model_data$Age_group <- relevel(model_data$Age_group, ref = "50歲以上")
}
if ("Edu_group" %in% model_vars) {
model_data$Edu_group <- relevel(model_data$Edu_group, ref = "高中職以下")
}
formula_text <- paste(
"Happiness_group ~",
paste(model_vars, collapse = " + ")
)
model_formula <- as.formula(formula_text)
model <- polr(
model_formula,
data = model_data,
Hess = TRUE
)
ctable <- coef(summary(model))
p_value <- pnorm(abs(ctable[, "t value"]), lower.tail = FALSE) * 2
reg_result <- data.frame(
Variable = rownames(ctable),
Estimate = ctable[, "Value"],
Std_Error = ctable[, "Std. Error"],
t_value = ctable[, "t value"],
p_value = p_value,
OR = exp(ctable[, "Value"])
)
reg_result <- reg_result %>%
mutate(
p_label = case_when(
p_value < .001 ~ "< .001",
TRUE ~ sprintf("%.3f", p_value)
),
sig = case_when(
p_value < .001 ~ "***",
p_value < .01 ~ "**",
p_value < .05 ~ "*",
TRUE ~ ""
)
)
knitr::kable(
reg_result,
digits = 3,
caption = "序次 Logistic 迴歸結果"
)