|
# 두집단 비교를 위하여 패캐지 설치: 정규성 검정 후
> library(dplyr)
> library(openxlsx)
# 분석할 변수 설정
general_vars <- c("height", "weight", "rtleglength", "ltleglength", "age", "edu", "mmse")
gait_vars <- c("loadingresponsetime", "loadingresponsegc", "midstancetime", "midstancegc",
"terminalstancetime", "terminalstancegc", "preswingtime", "preswinggc",
"swingphasetime", "swingphasesi", "firstdsp", "firstdspsi", "seconddsp",
"seconddspsi", "cadence", "cadencero", "cadencesi", "stancetimesi",
"swingtimesi", "stridetimesi", "cofsi")
categorical_vars <- c("sex") # 범주형 변수
# 결과 저장용 데이터프레임 초기화
comparison_results <- data.frame(
Variable = character(),
Group1_Value = character(),
Group2_Value = character(),
P_Value = numeric(),
Result = character(),
stringsAsFactors = FALSE
)
# ✅ 연속형 변수 비교 (일반 특성 + 보행 특성)
for (var in c(general_vars, gait_vars)) {
group1_data <- na.omit(data[[var]][data$group == "Normal"])
group2_data <- na.omit(data[[var]][data$group == "Cognitive Impairment"])
if (length(group1_data) < 3 | length(group2_data) < 3) next
# 평균 및 표준편차 계산
mean_g1 <- mean(group1_data)
sd_g1 <- sd(group1_data)
mean_g2 <- mean(group2_data)
sd_g2 <- sd(group2_data)
# 정규성 검정
shapiro_g1 <- shapiro.test(group1_data)
shapiro_g2 <- shapiro.test(group2_data)
# 정규성 여부에 따른 테스트 선택
if (shapiro_g1$p.value > 0.05 & shapiro_g2$p.value > 0.05) {
test <- t.test(group1_data, group2_data)
test_type <- "t-test"
} else {
test <- wilcox.test(group1_data, group2_data)
test_type <- "Mann-Whitney U test"
}
코딩 설명
if (shapiro_g1$p.value > 0.05 & shapiro_g2$p.value > 0.05)
→ 두 그룹 모두 정규성을 만족할 경우:
else
→ 하나라도 정규성을 따르지 않는 경우:
# 결과 저장
comparison_results <- rbind(
comparison_results,
data.frame(
Variable = var,
Group1_Value = paste0(round(mean_g1, 2), " ± ", round(sd_g1, 2)),
Group2_Value = paste0(round(mean_g2, 2), " ± ", round(sd_g2, 2)),
P_Value = round(test$p.value, 5),
Result = ifelse(test$p.value < 0.05, paste0("유의한 차이 있음 (", test_type, ")"), "유의한 차이 없음")
)
)
}
# ✅ 범주형 변수 비교 (성별)
for (var in categorical_vars) {
cat_table <- table(data[[var]], data$group)
if (any(cat_table < 5)) {
cat_test <- fisher.test(cat_table)
test_type <- "Fisher's Exact Test"
} else {
cat_test <- chisq.test(cat_table)
test_type <- "Chi-squared Test"
}
# 비율 계산
cat_prop <- prop.table(cat_table, margin = 2) * 100
group1_ratio <- paste0(round(cat_prop[1, 1], 2), "% (여성), ", round(cat_prop[2, 1], 2), "% (남성)")
group2_ratio <- paste0(round(cat_prop[1, 2], 2), "% (여성), ", round(cat_prop[2, 2], 2), "% (남성)")
# 결과 저장
comparison_results <- rbind(
comparison_results,
data.frame(
Variable = var,
Group1_Value = group1_ratio,
Group2_Value = group2_ratio,
P_Value = round(cat_test$p.value, 5),
Result = ifelse(cat_test$p.value < 0.05, paste0("유의한 차이 있음 (", test_type, ")"), "유의한 차이 없음")
)
)
}
# 결과 출력
print(comparison_results)
# ✅ 엑셀 파일로 저장
write.xlsx(comparison_results, "general_gait_comparison.xlsx", row.names = FALSE)
cat("두 집단 비교 결과가 'general_gait_comparison.xlsx'에 저장되었습니다.\n")