difference / random error
## ## t-test 이해 확인 ## remember t test = diff / rand error ## # iter <- 100000 # # of sampling set.seed(201) n <- 25 means <- rep (NA, iter) for(i in 1:iter){ means[i] = mean(rnorm(n, mean=100, sd=10)) } # from data mean(means) sd(means) # from CLT m.means <- 100 sd.means <- 10/sqrt(n) m.means sd.means # sample n의 평균과 표준편차가 정확히 # mean, sd값을 갖도록 하는 변형된 펑션 rnorm2 <- function(n, mean, sd) { mean + sd * scale(rnorm(n)) } mu <- 100 sig <- 10 sigsq <- sig^2 n <- 100 s1 <- rnorm2(n, 105, 10) s1 diff <- mean(s1) - mu se <- sig/sqrt(n) diff se t.cal <- diff/se t.cal pt(t.cal, n-1, lower.tail = F) t.test(s1, mu=100) se <- sig/sqrt(n) c2 <- qt(.975, df=99) c2 mean(s1) + c(-c2, c2) ############################## # two sample t-test # independent two sample t-test ############################## set.seed(101) A <- rnorm2(16, 26, sqrt(1160/15)) B <- rnorm2(16, 19, sqrt(1000/15)) A <- c(A) B <- c(B) # we know sqrt(1160/15) is A's sdev # hence, A's var is sqrt(1160/15)^2 # hence, A's SS is sqrt(1160/15)^2 * 15 # this is 1160 # from the above, # the difference between the A and B means # remember we try to find # difference due to the treatment / # / random chance of error diff <- mean(A) - mean(B) # for se # we know that the situation refers to # #2 se two independent samples t-test # which is sqrt(pooled.var/na + pooled.var/nb) SSa <- 1160 SSb <- 1000 n.a <- 16 n.b <- 16 df.a <- n.a - 1 df.b <- n.b - 1 # 확률과통계 수업 학생은 아래에서 # se값을 구한 결과만 보고 이것이 # se = sqrt(sigma^2/n)에 # 대응하는 값으로 생각하세요 # we know that we are testing the difference # between two independent sample means. # Hence, we need to use poole variance between # the two group. See # http://commres.net/wiki/t-test#t-test_%EB%B9%84%EA%B5%90 pooled.var <- (SSa + SSb) / (df.a + df.b) se <- sqrt( (pooled.var/n.a) + (pooled.var/n.b) ) # Remember t test calculation is based on # diff / random error t.calculated <- diff / se pooled.var diff se t.calculated pt(t.calculated, df=(n.a-1+n.b-1), lower.tail = F)*2 # Now use t.test function for two group # (independent sample) t-test # with an assumption that variances of # the two gorup are the same. t.result <- t.test(A, B, var.equal = T) t.result # t.result$statistic = t.calculated # t.result$p.value = probability level of # wrong decision with the t calculated value str(t.result) t.result$statistic t.result$p.value # the above p.value can be obtained with # pt function p.value.calculated <- 2*pt(t.calculated, df = df.a + df.b, lower.tail=FALSE) p.value.calculated t.result$p.value ## ## different approach (분산으로 분석) ## # A combined group with group A and B # We call it group total # we can obtain its mean, variance, ss, df, etc. # A B dat <- c(A,B) dat # just to remind mean(A) mean(B) sd(A) sd(B) mean.total <- mean(dat) var.total <- var(dat) mean.total var.total # variance를 ms라고 부르기도 한다 # ms = mean square (square 값을 n 으로 나눈 값이 분산이므로) ms.total <- var.total df.total <- length(dat) - 1 ss.total <- var.total * df.total # ss.total 은 아래처럼 구해도 된다 ss.total.check <- sum((dat-mean(dat))^2) mean.total var.total ms.total df.total ss.total ss.total.check # Now for each group mean.a <- mean(A) mean.b <- mean(B) mean.a mean.b # 그룹 간의 차이에서 나타나는 분산 # 수업시간에 설명을 잘 들을 것 # mean.total 에서 그룹a의 평균까지의 차이를 구한 후 # 이를 제곱하여 그룹 A 멤버의 숫자만큼 곱한다 # 이를 그룹b의 평균과도 다시 계산하고 # 이 둘을 더하여 # ss.between에 저장 length(A) * ((mean.total - mean.a)^2) length(B) * ((mean.total - mean.b)^2) ss.between <- length(A)*((mean.total - mean.a)^2) + length(B)*((mean.total - mean.b)^2) ss.between # df between group은 연구에 사용된 # 그룹의 숫자에서 1을 뺀 숫자 df.between <- 2 - 1 # 이 그룹 간 차이에 기인하는 분산 값은 ms.between <- ss.between / df.between # 한편 아래 ss.a 와 ss.b는 각 그룹 내의 # 분산을 알아보기 위한 방법 ss.a <- var(A) * df.a ss.b <- var(B) * df.b ss.a ss.b ss.within <- ss.a + ss.b df.a <- length(A)-1 df.b <- length(B)-1 df.within <- df.a + df.b df.within ms.within <- ss.within / df.within ms.within # 여기까지 우리는 # 전체분산 # 그룹간분산 # 그룹내분산 값을 # 구한 것 # ms.between은 그룹의 차이때문에 생긴 # 분산으로 IV 혹은 treatment 때문에 생기는 # 차이에 기인하는 분산이다. # ms.within은 각 그룹 내부에서 일어나는 분산이므로 # (variation이므로) 연구자의 관심사와는 상관이 없이 # 나타나는 random한 차이를 알려주는 분산이라고 하면 # t test 때와 마찬가지로 # 그룹의 차이 / 랜덤 차이를 (에러 -> 분산은 에러라고도 했다) # 구해볼 수 있다. # 즉, 그룹갑분산은 사실 = diff (between groups) # 그리고 그룹내 분산은 사실 = re # 따라서 우리는 위 둘 간의 비율을 t test와 같이 # 살펴볼 수 있다 # 이것을 f.calculated 이라고 하고 f.calculated <- ms.between / ms.within # 이 값을 출력해 본다 f.calculated # 이 계산은 차이와 랜덤에러의 비율이 # df에 따라서 얼마나 되어야 그 차이가 # 충분히 큰 것인지를 판단하기 위해서 # 쓰인다. 여기서 df에는 두 가지 종류가 # 있다. df.between 그리고 df.within # 이 정보를 이용하여 f.calculated 값에 대한 # probability를 구할 수 있다 (t-test때 처럼) # percentage of f distribution with # df1 and df2 option # 이는 그림의 왼쪽을 나타내므로 # 차이가 점점 커지게 되는 오른쪽을 # 계산하기 위해서는 1-x를 취한다 f.calculated.pvalue <- pf(f.calculated, df1=df.between, df2=df.within, lower.tail = F) f.calculated.pvalue # 위가 의미하는 것은? # 한편, t test를 했었을 때 (A, B 그룹을 가지고 independent # samples t-test를) 아웃 풋은 t.result # 그리고 f 계산에서의 p value는 t test에서의 p.value와 같다 f.calculated.pvalue t.result$p.value # 또한 # 여기엣 t 값은 t.result$statistic 으로 프린트아웃할 수 있다 # 이 값이 2.33333 이었다 t.result$statistic # 혹은 우리가 계산한 값이었던 # t.calculated t.calculated # 그런데 위의 값을 제곱한 값이 바로 f.calculated 값 f.calculated t.calculated t.calculated^2 # 혹은 f.calculated 값을 제곱근한 값이 t.calculated f.calculated sqrt(f.calculated) t.calculated # 또한 우리는 계산한 ms.total의 분자 부분인 ss.total은 # 독립변인이 영향을 주는 ss.between 값과 # 독립변인이 있음에도 불구하고 여전히 남는 ss.within # 으로 이루어짐을 아래처럼 확인한다. ss.total ss.between ss.within ss.total ss.between + ss.within # 한편 df는 # df.total 30 - 1 df.total df.between df.within df.total df.between + df.within # 한 편 # 아래는 위의 분산을 쪼개서 분석하는 펑션인 # aov를 이용해서 통계분석을 한 결과이다. A B comb <- stack(list(a=A, b=B)) comb colnames(comb)[1] <- "values" colnames(comb)[2] <- "group" comb a.res <- aov(values ~ group, data=comb) a.res.sum <- summary(a.res) a.res.sum # 위에서 F value는 5.444 # 그리고 전체적인 아웃풋을 보면 # Df group 과 Df Residuals # Sum Sq group 과 Residuals # Mean Sq (MS) group 과 MS residuals # MS.group = ms.between # MS.within = ms.within # F value ms.between / ms.within f.calculated # 아래는 기존의 아웃풋에서 확인하는 것 str(a.res.sum) a.res.sum[[1]][1,4] sqrt(a.res.sum[[1]][1,4]) t.result$statistic
> > > ## > ## t-test 이해 확인 > ## remember t test = diff / rand error > ## > > # > iter <- 100000 # # of sampling > > set.seed(201) > n <- 25 > means <- rep (NA, iter) > for(i in 1:iter){ + means[i] = mean(rnorm(n, mean=100, sd=10)) + } > > # from data > mean(means) [1] 100.0073 > sd(means) [1] 2.006801 > > # from CLT > m.means <- 100 > sd.means <- 10/sqrt(n) > m.means [1] 100 > sd.means [1] 2 > > # sample n의 평균과 표준편차가 정확히 > # mean, sd값을 갖도록 하는 변형된 펑션 > > rnorm2 <- function(n, mean, sd) { + mean + sd * scale(rnorm(n)) + } > > mu <- 100 > sig <- 10 > sigsq <- sig^2 > > n <- 100 > s1 <- rnorm2(n, 105, 10) > s1 [,1] [1,] 94.82673 [2,] 100.67062 [3,] 86.56655 [4,] 102.50826 [5,] 115.06784 [6,] 112.31035 [7,] 120.18990 [8,] 110.75772 [9,] 98.72139 [10,] 115.53427 [11,] 113.08491 [12,] 115.15631 [13,] 109.03973 [14,] 109.80571 [15,] 112.59637 [16,] 110.05880 [17,] 98.12066 [18,] 102.55201 [19,] 107.48263 [20,] 121.72817 [21,] 93.28985 [22,] 119.32581 [23,] 100.53356 [24,] 102.47885 [25,] 83.84757 [26,] 114.45743 [27,] 104.89082 [28,] 88.02556 [29,] 117.62567 [30,] 99.43814 [31,] 101.09237 [32,] 118.65687 [33,] 93.25172 [34,] 105.57357 [35,] 118.83922 [36,] 96.54377 [37,] 82.22041 [38,] 96.65677 [39,] 111.01699 [40,] 110.31354 [41,] 111.67834 [42,] 97.06930 [43,] 106.48119 [44,] 112.62763 [45,] 109.52175 [46,] 117.83589 [47,] 106.59963 [48,] 95.41232 [49,] 118.29291 [50,] 102.73511 [51,] 102.07018 [52,] 103.52060 [53,] 97.40788 [54,] 97.62230 [55,] 114.44623 [56,] 101.93851 [57,] 121.84801 [58,] 80.19037 [59,] 98.76738 [60,] 86.28351 [61,] 109.94310 [62,] 113.33271 [63,] 107.60982 [64,] 111.13329 [65,] 123.62779 [66,] 89.83115 [67,] 120.45166 [68,] 97.78465 [69,] 114.37189 [70,] 104.57338 [71,] 111.63632 [72,] 110.01555 [73,] 101.47403 [74,] 108.06043 [75,] 107.34460 [76,] 100.78840 [77,] 102.86933 [78,] 112.86528 [79,] 107.89393 [80,] 111.71369 [81,] 102.47335 [82,] 111.80243 [83,] 101.35135 [84,] 88.35982 [85,] 104.51148 [86,] 112.76071 [87,] 95.75548 [88,] 107.23106 [89,] 87.08389 [90,] 110.88797 [91,] 96.50021 [92,] 87.04557 [93,] 108.36235 [94,] 82.16950 [95,] 112.75471 [96,] 98.58600 [97,] 103.24843 [98,] 97.48461 [99,] 118.06208 [100,] 109.04152 attr(,"scaled:center") [1] -0.1008262 attr(,"scaled:scale") [1] 1.043405 > > diff <- mean(s1) - mu > se <- sig/sqrt(n) > diff [1] 5 > se [1] 1 > t.cal <- diff/se > t.cal [1] 5 > pt(t.cal, n-1, lower.tail = F) [1] 0.000001240698 > > t.test(s1, mu=100) One Sample t-test data: s1 t = 5, df = 99, p-value = 0.000002481 alternative hypothesis: true mean is not equal to 100 95 percent confidence interval: 103.0158 106.9842 sample estimates: mean of x 105 > > se <- sig/sqrt(n) > c2 <- qt(.975, df=99) > c2 [1] 1.984217 > mean(s1) + c(-c2, c2) [1] 103.0158 106.9842 > > > ############################## > # two sample t-test > # independent two sample t-test > ############################## > set.seed(101) > A <- rnorm2(16, 26, sqrt(1160/15)) > B <- rnorm2(16, 19, sqrt(1000/15)) > A <- c(A) > B <- c(B) > > # we know sqrt(1160/15) is A's sdev > # hence, A's var is sqrt(1160/15)^2 > # hence, A's SS is sqrt(1160/15)^2 * 15 > # this is 1160 > > # from the above, > # the difference between the A and B means > # remember we try to find > # difference due to the treatment / > # / random chance of error > diff <- mean(A) - mean(B) > > # for se > # we know that the situation refers to > # #2 se two independent samples t-test > # which is sqrt(pooled.var/na + pooled.var/nb) > > SSa <- 1160 > SSb <- 1000 > n.a <- 16 > n.b <- 16 > df.a <- n.a - 1 > df.b <- n.b - 1 > > # 확률과통계 수업 학생은 아래에서 > # se값을 구한 결과만 보고 이것이 > # se = sqrt(sigma^2/n)에 > # 대응하는 값으로 생각하세요 > > # we know that we are testing the difference > # between two independent sample means. > # Hence, we need to use poole variance between > # the two group. See > # http://commres.net/wiki/t-test#t-test_%EB%B9%84%EA%B5%90 > pooled.var <- (SSa + SSb) / (df.a + df.b) > se <- sqrt( (pooled.var/n.a) + (pooled.var/n.b) ) > > # Remember t test calculation is based on > # diff / random error > t.calculated <- diff / se > pooled.var [1] 72 > diff [1] 7 > se [1] 3 > t.calculated [1] 2.333333 > pt(t.calculated, df=(n.a-1+n.b-1), lower.tail = F)*2 [1] 0.02652366 > > # Now use t.test function for two group > # (independent sample) t-test > # with an assumption that variances of > # the two gorup are the same. > t.result <- t.test(A, B, var.equal = T) > 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.result$statistic = t.calculated > # t.result$p.value = probability level of > # wrong decision with the t calculated value > str(t.result) List of 10 $ statistic : Named num 2.33 ..- attr(*, "names")= chr "t" $ parameter : Named num 30 ..- attr(*, "names")= chr "df" $ p.value : num 0.0265 $ conf.int : num [1:2] 0.873 13.127 ..- attr(*, "conf.level")= num 0.95 $ estimate : Named num [1:2] 26 19 ..- attr(*, "names")= chr [1:2] "mean of x" "mean of y" $ null.value : Named num 0 ..- attr(*, "names")= chr "difference in means" $ stderr : num 3 $ alternative: chr "two.sided" $ method : chr " Two Sample t-test" $ data.name : chr "A and B" - attr(*, "class")= chr "htest" > t.result$statistic t 2.333333 > t.result$p.value [1] 0.02652366 > > # the above p.value can be obtained with > # pt function > p.value.calculated <- 2*pt(t.calculated, df = df.a + df.b, lower.tail=FALSE) > p.value.calculated [1] 0.02652366 > t.result$p.value [1] 0.02652366 > > ## > ## different approach (분산으로 분석) > ## > > # A combined group with group A and B > # We call it group total > # we can obtain its mean, variance, ss, df, etc. > # > 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 > > # just to remind > mean(A) [1] 26 > mean(B) [1] 19 > sd(A) [1] 8.793937 > sd(B) [1] 8.164966 > > mean.total <- mean(dat) > var.total <- var(dat) > mean.total [1] 22.5 > var.total [1] 82.32258 > # variance를 ms라고 부르기도 한다 > # ms = mean square (square 값을 n 으로 나눈 값이 분산이므로) > ms.total <- var.total > > df.total <- length(dat) - 1 > ss.total <- var.total * df.total > # ss.total 은 아래처럼 구해도 된다 > ss.total.check <- sum((dat-mean(dat))^2) > > mean.total [1] 22.5 > var.total [1] 82.32258 > ms.total [1] 82.32258 > df.total [1] 31 > ss.total [1] 2552 > ss.total.check [1] 2552 > > # Now for each group > mean.a <- mean(A) > mean.b <- mean(B) > mean.a [1] 26 > mean.b [1] 19 > > # 그룹 간의 차이에서 나타나는 분산 > # 수업시간에 설명을 잘 들을 것 > > # mean.total 에서 그룹a의 평균까지의 차이를 구한 후 > # 이를 제곱하여 그룹 A 멤버의 숫자만큼 곱한다 > # 이를 그룹b의 평균과도 다시 계산하고 > # 이 둘을 더하여 > # ss.between에 저장 > > 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 > > # df between group은 연구에 사용된 > # 그룹의 숫자에서 1을 뺀 숫자 > df.between <- 2 - 1 > > # 이 그룹 간 차이에 기인하는 분산 값은 > ms.between <- ss.between / df.between > > # 한편 아래 ss.a 와 ss.b는 각 그룹 내의 > # 분산을 알아보기 위한 방법 > ss.a <- var(A) * df.a > ss.b <- var(B) * df.b > ss.a [1] 1160 > ss.b [1] 1000 > > ss.within <- ss.a + ss.b > > df.a <- length(A)-1 > df.b <- length(B)-1 > df.within <- df.a + df.b > df.within [1] 30 > > ms.within <- ss.within / df.within > ms.within [1] 72 > > # 여기까지 우리는 > # 전체분산 > # 그룹간분산 > # 그룹내분산 값을 > # 구한 것 > > # ms.between은 그룹의 차이때문에 생긴 > # 분산으로 IV 혹은 treatment 때문에 생기는 > # 차이에 기인하는 분산이다. > > # ms.within은 각 그룹 내부에서 일어나는 분산이므로 > # (variation이므로) 연구자의 관심사와는 상관이 없이 > # 나타나는 random한 차이를 알려주는 분산이라고 하면 > > # t test 때와 마찬가지로 > # 그룹의 차이 / 랜덤 차이를 (에러 -> 분산은 에러라고도 했다) > # 구해볼 수 있다. > > # 즉, 그룹갑분산은 사실 = diff (between groups) > # 그리고 그룹내 분산은 사실 = re > # 따라서 우리는 위 둘 간의 비율을 t test와 같이 > # 살펴볼 수 있다 > > # 이것을 f.calculated 이라고 하고 > f.calculated <- ms.between / ms.within > > # 이 값을 출력해 본다 > f.calculated [1] 5.444444 > > # 이 계산은 차이와 랜덤에러의 비율이 > # df에 따라서 얼마나 되어야 그 차이가 > # 충분히 큰 것인지를 판단하기 위해서 > # 쓰인다. 여기서 df에는 두 가지 종류가 > # 있다. df.between 그리고 df.within > # 이 정보를 이용하여 f.calculated 값에 대한 > # probability를 구할 수 있다 (t-test때 처럼) > > # percentage of f distribution with > # df1 and df2 option > # 이는 그림의 왼쪽을 나타내므로 > # 차이가 점점 커지게 되는 오른쪽을 > # 계산하기 위해서는 1-x를 취한다 > f.calculated.pvalue <- pf(f.calculated, + df1=df.between, df2=df.within, + lower.tail = F) > f.calculated.pvalue [1] 0.02652366 > # 위가 의미하는 것은? > > > # 한편, 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 > > # 그리고 f 계산에서의 p value는 t test에서의 p.value와 같다 > f.calculated.pvalue [1] 0.02652366 > t.result$p.value [1] 0.02652366 > > # 또한 > # 여기엣 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 [1] 2.333333 > t.calculated^2 [1] 5.444444 > > # 혹은 f.calculated 값을 제곱근한 값이 t.calculated > f.calculated [1] 5.444444 > sqrt(f.calculated) [1] 2.333333 > t.calculated [1] 2.333333 > > # 또한 우리는 계산한 ms.total의 분자 부분인 ss.total은 > # 독립변인이 영향을 주는 ss.between 값과 > # 독립변인이 있음에도 불구하고 여전히 남는 ss.within > # 으로 이루어짐을 아래처럼 확인한다. > ss.total [1] 2552 > ss.between [1] 392 > ss.within [1] 2160 > ss.total [1] 2552 > ss.between + ss.within [1] 2552 > > # 한편 df는 > # df.total 30 - 1 > df.total [1] 31 > df.between [1] 1 > df.within [1] 30 > df.total [1] 31 > df.between + df.within [1] 31 > > # 한 편 > # 아래는 위의 분산을 쪼개서 분석하는 펑션인 > # aov를 이용해서 통계분석을 한 결과이다. > > 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 >