|
본 연구에서는 다변량 분산분석과 anova를 모두 사용함
✅ 1. MANOVA vs. ANOVA 차이점
항목MANOVAANOVA
분석 대상 | 다중 종속변수 (여러 변수의 조합을 고려) | 단일 종속변수 (하나의 변수만 분석) |
주요 목적 | 집단 간의 전체적인 차이 확인 | 각 변수에 대한 개별 차이 확인 |
상호작용 효과 | 여러 종속변수 간의 상관성까지 고려 | 상호작용은 고려하지 않음 |
출력 결과 | Wilks' Lambda, Pillai's Trace 등의 통계량 사용 | F-통계량과 p-value 제공 |
해석 난이도 | 복잡하지만 포괄적인 결과 제공 | 단순하고 직관적인 해석 가능 |
✅ 2. 왜 두 분석을 모두 하는가?🔹 ① MANOVA: 전체적인 차이 확인
💡 예시:
"인지손상군과 정상군이 전반적인 보행 특성에서 차이가 있는가?"
🔹 ② ANOVA: 개별 변수의 차이 분석
💡 예시:
"어떤 보행 변수(예: 걸음 속도, 보폭 등)에서 인지손상군과 정상군의 차이가 두드러지는가?"
🔹 ③ 보완적 접근
✅ 3. 분석 순서
✅ 4. 예시: 보행 연구에 적용
상황: 정상군과 인지손상군의 보행 특성 비교
1️⃣ MANOVA 결과
2️⃣ ANOVA 결과
보행 변수F-valuep-value해석
보행 속도 | 15.34 | < 0.001 | ✅ 유의미한 차이 |
보폭 | 5.67 | 0.021 | ✅ 유의미한 차이 |
두발 간 거리 | 1.12 | 0.310 | ❌ 유의미하지 않음 |
→ 결론: 인지손상군은 보행 속도와 보폭에서 유의미한 차이를 보임
✅ 5. 요약: 두 분석을 함께 수행하는 이유
목표사용하는 분석
전체적인 차이 존재 여부 확인 | ✅ MANOVA |
어떤 변수에서 차이가 나는지 파악 | ✅ ANOVA |
변수 간 상관관계 고려 | ✅ MANOVA |
개별 변수에 대한 상세 분석 | ✅ ANOVA |
과도한 오류 위험 방지 (Type I 오류) | ✅ MANOVA → ANOVA |
💡 결론:
분석 코딩법
MANOVA 적용 전 고려사항
# 필요한 패키지 설치
install.packages("biotools") # Box's M Test
install.packages("car") # Levene's Test
install.packages("vegan") # PERMANOVA
# 패키지 불러오기
library(biotools)
library(car)
library(vegan)
# ✅ 그룹 및 조건 변수 범주형 변환
data_인지제외_$group <- factor(data_인지제외_$group, levels = c(1, 2), labels = c("정상군", "인지손상군"))
data_인지제외_$condition <- factor(data_인지제외_$condition, levels = c(1, 2, 3), labels = c("평지보행", "물컵들고 보행", "숫자세기 보행"))
# 변수 구조 확인
str(data_인지제외_$group)
str(data_인지제외_$condition)
# 레벨(level) 확인
cat("Group 변수 수준:\n")
print(levels(data_인지제외_$group))
cat("\nCondition 변수 수준:\n")
print(levels(data_인지제외_$condition))
# 보행 변수 목록
gait_vars <- c("loadingresponsetime", "loadingresponsegc", "midstancetime", "midstancegc",
"terminalstancetime", "terminalstancegc", "preswingtime", "preswinggc",
"swingphasetime", "swingphasesi", "firstdsp", "firstdspsi", "seconddsp",
"seconddspsi", "cadence", "cadencero", "cadencesi", "stancetimesi",
"swingtimesi", "stridetimesi", "cofsi")
# 수치형 확인
sapply(data_인지제외_[, gait_vars], class)
# 만약 비수치형이 있다면 숫자형으로 변환
data_인지제외_[, gait_vars] <- lapply(data_인지제외_[, gait_vars], as.numeric)
# 📦 필요한 패키지 설치
install.packages("biotools") # Box's M Test
install.packages("readr") # CSV 저장용
# 📚 패키지 불러오기
library(biotools)
library(readr)
# 📊 ✅ Box's M Test 수행
box_m_result <- boxM(data_인지제외_[, gait_vars], data_인지제외_$group)
# 📋 결과 출력
print(box_m_result)
# ✅ 결과를 데이터프레임으로 변환
# boxM 결과에서 필요한 통계량 추출
box_m_summary <- data.frame(
Chi_Square = box_m_result$statistic,
df = box_m_result$parameter,
p_value = box_m_result$p.value
)
# ✅ 기본 함수 사용하여 CSV 저장
write.csv(box_m_summary, "D:/data/R/box_m_test_results.csv", row.names = FALSE)
# ✅ 저장 완료 메시지
cat("📁 ✅ Box's M Test 결과가 'D:/data/R/box_m_test_results.csv'에 저장되었습니다.\n")
결과 해석
본 연구 결과
Box's M-test for Homogeneity of Covariance Matrices data: data_인지제외_[, gait_vars] Chi-Sq (approx.) = 2809.9, df = 231, p-value < 2.2e-16
즉, 등분산성 위반 확인
Levene’s Test 결과
# 📦 필요한 패키지 설치 및 불러오기
install.packages("car")
library(car)
# ✅ Levene's Test 수행
levene_results <- list()
# 결과를 저장할 데이터프레임 초기화
levene_summary <- data.frame(
Variable = character(),
F_value = numeric(),
df1 = numeric(),
df2 = numeric(),
p_value = numeric(),
stringsAsFactors = FALSE
)
# ✅ Levene's Test 수행 (반복문)
for (var in gait_vars) {
result <- leveneTest(as.formula(paste(var, "~ group")), data = data_인지제외_)
cat("\nLevene's Test for", var, ":\n")
print(result)
# 결과를 데이터프레임에 저장
levene_summary <- rbind(levene_summary, data.frame(
Variable = var,
F_value = result$`F value`[1],
df1 = result$Df[1],
df2 = result$Df[2],
p_value = result$`Pr(>F)`[1]
))
}
# ✅ CSV 파일로 저장
write.csv(levene_summary, "D:/data/R/levene_test_results.csv", row.names = FALSE)
# ✅ 저장 완료 메시지
cat("📁 ✅ Levene's Test 결과가 'D:/data/R/levene_test_results.csv'에 저장되었습니다.\n")
해석 기준
변수별로 등분산이 다름
등분산성 충족 변수
다음 변수들은 등분산성 가정이 충족되었습니다 (p-value ≥ 0.05):
변수F-값p-value해석
midstancetime | 0.0148 | 0.9033 | 등분산성 충족 |
midstancegc | 0.0748 | 0.7847 | 등분산성 충족 |
terminalstancegc | 0.0439 | 0.8343 | 등분산성 충족 |
swingphasetime | 1.9029 | 0.1689 | 등분산성 충족 |
swingphasesi | 1.2089 | 0.2726 | 등분산성 충족 |
cadence | 0.2776 | 0.5987 | 등분산성 충족 |
stancetimesi | 1.2881 | 0.2574 | 등분산성 충족 |
swingtimesi | 0.0258 | 0.8726 | 등분산성 충족 |
cofsi | 0.8 | 0.3719 | 등분산성 충족 |
2. 등분산성 위반 변수
다음 변수들은 등분산성 가정이 위반되었습니다 (p-value < 0.05):
변수F-값p-value해석
loadingresponsetime | 16.153 | 7.619e-05 | 등분산성 위반 |
loadingresponsegc | 32.677 | 2.925e-08 | 등분산성 위반 |
terminalstancetime | 12.624 | 0.0004507 | 등분산성 위반 |
preswingtime | 18.072 | 2.95e-05 | 등분산성 위반 |
preswinggc | 35.491 | 8.124e-09 | 등분산성 위반 |
firstdsp | 16.962 | 5.101e-05 | 등분산성 위반 |
firstdspsi | 24.65 | 1.232e-06 | 등분산성 위반 |
seconddsp | 23.25 | 2.401e-06 | 등분산성 위반 |
seconddspsi | 22.603 | 3.273e-06 | 등분산성 위반 |
cadencero | 7.7496 | 0.005759 | 등분산성 위반 |
cadencesi | 17.127 | 4.7e-05 | 등분산성 위반 |
stridetimesi | 15.408 | 0.0001105 | 등분산성 위반 |
Box’s M Test vs. Levene’s Test 차이점
항목Box’s M TestLevene’s Test
검정 목적 | 공분산 행렬의 동질성 검정 | 개별 변수의 분산 동질성 검정 |
적용 대상 | 여러 종속변수의 공분산 행렬 전체 | 개별 변수 각각의 분산 |
출력 형태 | 전체 보행변수를 통합한 단일 검정 결과 | 변수별로 각각의 결과 제공 |
사용 상황 | MANOVA의 사전 조건 검정 | ANOVA 또는 MANOVA 전 변수별 등분산성 확인 |
p-value 해석 | 전체 변수의 공분산 행렬이 집단 간 동일한지 여부 평가 | 각 변수의 분산이 집단 간 동일한지 여부 평가 |
민감도 | 공분산 행렬에 민감 (변수가 많을수록 민감) | 개별 변수 수준에서 정밀한 분석 가능 |
분석 방법 요약
검정 결과적합한 분석 방법
Box’s M Test & Levene’s Test → 둘 다 충족 | MANOVA |
Box’s M Test 위반, Levene’s Test 충족 | Pillai’s Trace |
Box’s M Test 충족, Levene’s Test 위반 | Welch’s ANOVA |
둘 다 위반 | PERMANOVA 또는 비모수 검정 |