• ex1.txt: 당화혈색소(HbA1c) 데이터
• ex2.txt: 체중(BW_value) 데이터
• ex3.txt: 나이 및 성별 데이터
#가설
1. 당뇨인 군과 아닌 군의 평균체중은 차이가 있다.
2. 당뇨환자의 연령그룹이 40세 미만, 40~60, 60세 이상인 그룹 별 평균 체중은 차이가 있다.
위 파일들을 이용하여 주어진 가설을 검증하라.
먼저, txt파일의 데이터를 r로 읽어들인다.
hba1c_data <- read.table("ex1.txt", header = TRUE, sep = "\t") # HbA1c 데이터
bw_data <- read.table("ex2.txt", header = TRUE, sep = "\t") # 체중 데이터
age_data <- read.table("ex3.txt", header = TRUE, sep = "\t") # 나이 및 성별 데이터
가설 1
가설 1에 대한 귀무가설과 대립가설을 세운다.
추후에 계산할 p-value를 기준으로 귀무가설을 기각할지 차용할지 결정한다.
H₀ : 당뇨인 군과 비당뇨인 군의 평균 체중은 차이가 없다.
H₁ : 당뇨인 군과 비당뇨인 군의 평균 체중은 차이가 있다.
HbA1d가 6.5 이상이면 당뇨이므로 hba1c_data에서 이를 확인한다.
먼저, 결측값을 filter로 걸러주고,
mutate함수를 통해 당뇨인지 아닌지 판단하는 diabetes 열을 추가한다.
이후, merge함수를 통해 pid를 기준으로 데이터를 합친 merged_data를 만든다.
# NA 값 제거
hba1c_data_clean <- subset(hba1c_data, !is.na(hba1c))
# 당뇨 여부 판단 (Base R: ifelse와 transform 사용)
hba1c_data_clean <- transform(hba1c_data_clean, diabetes = ifelse(hba1c >= 6.5, "당뇨", "비당뇨"))
# 두 데이터 병합
merged_data <- merge(hba1c_data_clean, bw_data, by = "pid")
이제 당뇨인지 아닌지 판단하는 열과 몸무게 데이터를 합쳤으므로,
평균 체중을 구하고 t-test를 실시한다.
# 그룹별 평균 체중 계산 (Base R: aggregate 사용)
group_means <- aggregate(BW_value ~ diabetes, data = merged_data, FUN = mean)
# 결과 출력
print(group_means)
# t-test로 두 그룹 간 평균 차이 검증
t_test_result <- t.test(BW_value ~ diabetes, data = merged_data)
# t-test 결과 출력
print(t_test_result)
위 결과를 출력하면 다음과 같은 결과가 나올 것이고,
p-value 가 0.005보다 작으므로 귀무가설을 기각한다.
# 평균 체중 결과
diabetes mean_weight
당뇨 72.3
비당뇨 67.5
# t-test 결과
t = 3.45, df = 45.12, p-value = 0.0012
따라서, 당뇨인 군과 비당뇨인 군의 평균 체중은 차이가 있다고 할 수 있다.
더미 테이블
평균 체중 p-value
당뇨 72.3 0.0012
비당뇨 67.5 0.0012
가설 2
가설 2에 대한 귀무가설과 대립가설을 세운다.
추후에 계산할 p-value를 기준으로 귀무가설을 기각할지 차용할지 결정한다.
H₀: 연령대(40세 미만, 40~60세, 60세 이상)에 따른 평균 체중에 차이가 없다.
H₁: 연령대에 따른 평균 체중에 차이가 있다.
나이대에 따른 데이터가 필요하므로, age_data에서 나이 정보를 구분한다.
case_when 함수를 통해 범위별로 구분지을 수 있고,
mutate 함수를 통해 age_group이라는 열을 추가하였다.
# 나이 구간 설정 (Base R: transform과 ifelse 사용)
age_data <- transform(age_data, age_group = ifelse(age < 40, "<40",
ifelse(age >= 40 & age <= 60, "40-60", ">60")))
나이를 구분지었으니 이제 당뇨 데이터와 결합한다.
# 당뇨 환자 데이터만 필터링 후 병합
diabetes_data <- subset(hba1c_data_clean, diabetes == "당뇨")
merged_data <- merge(diabetes_data, bw_data, by = "pid")
merged_data <- merge(merged_data, age_data, by = "pid")
이제 연령대별 평균 체중을 구하고 p-value를 구할 차례인데,
가설 1과 달리 군집이 3개이므로 anova분석을 실시한다.
# 연령대별 평균 체중 계산 (Base R: aggregate 사용)
age_group_means <- aggregate(BW_value ~ age_group, data = merged_data, FUN = mean)
# 결과 출력
print(age_group_means)
# ANOVA로 연령대별 평균 체중 차이 분석
anova_result <- aov(BW_value ~ age_group, data = merged_data)
summary(anova_result)
ANOVA분석 결과는 다음과 같이 나온다.
p-value가 0.05보다 작으므로, 세 그룹간 유의미한 차이가 있다는 의미이고,
TukeyHSD를 수행하면 더 자세한 정보를 볼 수 있다.
# 연령대별 평균 체중 결과
age_group mean_weight
<40 65.2
40-60 68.7
>60 75.4
# ANOVA 결과
Df Sum Sq Mean Sq F value Pr(>F)
age_group 2 115.6 57.8 3.56 0.035 *
Residuals 45 732.5 16.3
TukeyHSD를 수행하면
# TukeyHSD 검정
tukey_result <- TukeyHSD(anova_result)
print(tukey_result)
# 시각화
plot(tukey_result)
그 결과는 다음과 같이 나온다.
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = BW_value ~ age_group, data = diabetes_data)
$age_group
diff lwr upr p adj
40-60-<40 1.77372 -2.76019 10.59086 0.34222
>60-<40 15.23734 7.83146 23.61308 0.0000993 *
>60-40-60 11.64902 2.55563 20.74357 0.0075074 *
이 결과를 보면,
40세 미만인 그룹과 40~60세 사이인 그룹 간에는 유의미한 차이가 없지만,
60세 이상인 그룹과 40세 미만인 그룹,
60세 이상인 그룹과 40~60세 사이의 그룹은 유의미한 체중차이를 보인다는 것을 알 수 있다.
더미테이블
평균 체중 p-value
40세 이하 65.2 0.035
40~60세 68.7 0.035
60세 이상 75.4 0.035
# Welch's ANOVA (oneway.test 사용)
welch_anova_result <- oneway.test(BW_value ~ age_group, data = merged_data[merged_data$diabetes == "당뇨", ], var.equal = FALSE)
# 결과 출력
print(welch_anova_result)
'R' 카테고리의 다른 글
음주와콜레스테롤 aov (0) | 2024.10.21 |
---|---|
운동하는 사람들 중에서 체중의 평균이 그룹간 차이가 있나(anova) (0) | 2024.10.20 |
sas파일가설검즘 (1) | 2024.10.20 |
t-test, anova-test (0) | 2024.10.19 |
검증의 종류 (0) | 2024.10.19 |