c:ms:2023:schedule:week06_t-test_and_anova_note
This is an old revision of the document!
R
output
> ##
>
> ## different approach
> #
>
> A
[1] 20.994218 31.148068 16.961481 27.240217 28.354539 38.331534
[7] 31.914700 23.459605 35.361796 22.182136 30.847396 15.575648
[13] 41.264878 7.808831 22.026979 22.527973
> B
[1] 12.941146 21.270062 13.235378 1.931364 19.232163 27.231465
[7] 18.276359 7.308871 27.560815 7.799787 25.017185 19.639663
[13] 25.018756 25.302096 28.941002 23.293888
> dat <- c(A,B)
> dat
[1] 20.994218 31.148068 16.961481 27.240217 28.354539 38.331534
[7] 31.914700 23.459605 35.361796 22.182136 30.847396 15.575648
[13] 41.264878 7.808831 22.026979 22.527973 12.941146 21.270062
[19] 13.235378 1.931364 19.232163 27.231465 18.276359 7.308871
[25] 27.560815 7.799787 25.017185 19.639663 25.018756 25.302096
[31] 28.941002 23.293888
>
> var.total <- var(dat)
> df.total <- length(dat)-1
> ss.total <- var.total*df.total
> ss.total.check <- sum((dat-mean(dat))^2)
> ss.total
[1] 2552
> ss.total.check
[1] 2552
> mean.total <- mean(dat)
> mean.total
[1] 22.5
>
> mean.a <- mean(A)
> mean.b <- mean(B)
>
> # mean.total 에서 그룹a의 평균까지의 차이를 구한 후
> # 이를 제곱하여 A의 숫자만큼 더한다 =
> # 즉, SS를 구하는 방법.
> # 전체평균에서 그룹평균을 뺀 것의 제곱을
> # 그룹 구성원 숫자만큼 더하는 것
>
>
> length(A)*((mean.total - mean.a)^2)
[1] 196
> length(B)*((mean.total - mean.b)^2)
[1] 196
> ss.between <-
+ length(A)*((mean.total - mean.a)^2) +
+ length(B)*((mean.total - mean.b)^2)
>
> ss.between
[1] 392
>
> # 한편 ss.a 와 ss.b는 각 그룹 내의
> # 분산을 알아보기 위한 방법
> ss.a <- var(A) * df.a
> ss.b <- var(B) * df.b
> ss.within <- ss.a + ss.b
>
> # Now check this
> ss.total
[1] 2552
> ss.between
[1] 392
> ss.within
[1] 2160
> ss.total == ss.between + ss.within
[1] FALSE
>
> # 한편 df는
> # df.total 30 - 1
> df.between <- 2-1 # 그룹숫자 - 1
> df.a <- length(A)-1 # a 구성원 - 1
> df.b <- length(B)-1 # b 구성원 - 1
> df.within <- df.a + df.b
>
> df.total
[1] 31
> df.between
[1] 1
> df.within
[1] 30
> df.total == df.between + df.within
[1] TRUE
>
> # 분산을 구하는 방법은 SS/df 이므로
> # 분산을 ms 라고 표기하면 우리는
> # ms.total, ms.between, ms.within을 구할 수 있다
>
> ms.total <- ss.total / df.total
> ms.between <- ss.between / df.between
> ms.within <- ss.within / df.within
>
> # 위에서 ms.between은 그룹의 차이때문에 생긴
> # 분산으로 IV 혹은 treatment 때문에 생기는
> # 차이에 기인하는 분산이고
>
> # ms.within은 각 그룹 내부에서 일어나는 분산이므로
> # (variation이므로) 연구자의 관심사와는 상관이 없이
> # 나타나는 random한 분산이라고 하면
>
> # t test 때와 마찬가지로
> # 그룹의 차이 / 랜덤 차이를 (에러 -> 분산은 에러라고도 했다)
> # 구해볼 수 있다. 이것을 f.calculated 이라고 하고
> # 이를 프린트아웃 한다
>
> f.calculated <- ms.between / ms.within
> f.calculated
[1] 5.444444
>
> # 한편, t test를 했었을 때 (A, B 그룹을 가지고 independent
> # samples t-test를) 아웃 풋은
> t.result
Two Sample t-test
data: A and B
t = 2.3333, df = 30, p-value = 0.02652
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
0.8731826 13.1268174
sample estimates:
mean of x mean of y
26 19
>
> # 여기엣 t 값은 t.result$statistic 으로 프린트아웃할 수 있다
> # 이 값이 2.33333 이었다
> t.result$statistic
t
2.333333
> # 혹은 우리가 계산한 값이었던
> # t.calculated
> t.calculated
[1] 2.333333
>
> # 그런데 위의 값을 제곱한 값이 바로 f.calculated 값
> f.calculated
[1] 5.444444
> t.calculated^2
[1] 5.444444
>
> # 혹은 f.calculated 값을 제곱근한 값이 t.calculated
> sqrt(f.calculated)
[1] 2.333333
> t.calculated
[1] 2.333333
>
>
> # 한 편
>
> A
[1] 20.994218 31.148068 16.961481 27.240217 28.354539 38.331534
[7] 31.914700 23.459605 35.361796 22.182136 30.847396 15.575648
[13] 41.264878 7.808831 22.026979 22.527973
> B
[1] 12.941146 21.270062 13.235378 1.931364 19.232163 27.231465
[7] 18.276359 7.308871 27.560815 7.799787 25.017185 19.639663
[13] 25.018756 25.302096 28.941002 23.293888
> comb <- stack(list(a=A, b=B))
> comb
values ind
1 20.994218 a
2 31.148068 a
3 16.961481 a
4 27.240217 a
5 28.354539 a
6 38.331534 a
7 31.914700 a
8 23.459605 a
9 35.361796 a
10 22.182136 a
11 30.847396 a
12 15.575648 a
13 41.264878 a
14 7.808831 a
15 22.026979 a
16 22.527973 a
17 12.941146 b
18 21.270062 b
19 13.235378 b
20 1.931364 b
21 19.232163 b
22 27.231465 b
23 18.276359 b
24 7.308871 b
25 27.560815 b
26 7.799787 b
27 25.017185 b
28 19.639663 b
29 25.018756 b
30 25.302096 b
31 28.941002 b
32 23.293888 b
> colnames(comb)[1] <- "values"
> colnames(comb)[2] <- "group"
> comb
values group
1 20.994218 a
2 31.148068 a
3 16.961481 a
4 27.240217 a
5 28.354539 a
6 38.331534 a
7 31.914700 a
8 23.459605 a
9 35.361796 a
10 22.182136 a
11 30.847396 a
12 15.575648 a
13 41.264878 a
14 7.808831 a
15 22.026979 a
16 22.527973 a
17 12.941146 b
18 21.270062 b
19 13.235378 b
20 1.931364 b
21 19.232163 b
22 27.231465 b
23 18.276359 b
24 7.308871 b
25 27.560815 b
26 7.799787 b
27 25.017185 b
28 19.639663 b
29 25.018756 b
30 25.302096 b
31 28.941002 b
32 23.293888 b
>
> a.res <- aov(values ~ group, data=comb)
> a.res.sum <- summary(a.res)
> a.res.sum
Df Sum Sq Mean Sq F value Pr(>F)
group 1 392 392 5.444 0.0265 *
Residuals 30 2160 72
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
> # 위에서 F value는 5.444
> # 그리고 전체적인 아웃풋을 보면
> # Df group 과 Df Residuals
> # Sum Sq group 과 Residuals
> # Mean Sq (MS) group 과 MS residuals
>
> # MS.group =
> ms.between
[1] 392
>
> # MS.within =
> ms.within
[1] 72
>
> # F value
> ms.between / ms.within
[1] 5.444444
> f.calculated
[1] 5.444444
>
> # 아래는 기존의 아웃풋에서 확인하는 것
> str(a.res.sum)
List of 1
$ :Classes ‘anova’ and 'data.frame': 2 obs. of 5 variables:
..$ Df : num [1:2] 1 30
..$ Sum Sq : num [1:2] 392 2160
..$ Mean Sq: num [1:2] 392 72
..$ F value: num [1:2] 5.44 NA
..$ Pr(>F) : num [1:2] 0.0265 NA
- attr(*, "class")= chr [1:2] "summary.aov" "listof"
> a.res.sum[[1]][1,4]
[1] 5.444444
> sqrt(a.res.sum[[1]][1,4])
[1] 2.333333
> t.result$statistic
t
2.333333
>
c/ms/2023/schedule/week06_t-test_and_anova_note.1681254097.txt.gz · Last modified: by hkimscil
