R

귀무가설의 검증(비교군집이 2개일 때, 3개일 때 구분)

S0LL 2024. 10. 14. 16:50

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