c:ps1-1:note_on_statistical_test_2
This is an old revision of the document!
# from the quiz questions # stu should understand the logic of the ttest set.seed(101) rnorm2 <- function(n,mean,sd){ mean+sd*scale(rnorm(n)) } 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) t.test(A,B, var.equal = T) # 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 # 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 # 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 <- 2*pt(-t.result$statistic, df = df.a + df.b) p.value 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 mean.total <- mean(dat) var.total <- var(dat) # variance를 ms라고 부르기도 한다 ms.total <- var.total df.total <- length(dat)-1 ss.total <- var.total*df.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 멤버의 숫자만큼 더한다 = # 즉, SS를 구하는 방법. # 전체평균에서 그룹평균을 뺀 것의 제곱을 # 그룹 구성원 숫자만큼 더하는 것 # 그리고 이들을 다시 모두 더하여 # 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.within <- ss.a + ss.b df.a <- length(A)-1 df.b <- length(B)-1 df.within <- df.a + df.b ms.within <- ss.within / df.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 # percentage of f distribution with # df1 and df2 option # 이는 그림의 왼쪽을 나타내므로 # 차이가 점점 커지게 되는 오른쪽을 # 계산하기 위해서는 1-x를 취한다 f.calculated.pvalue <- 1-pf(f.calculated, df1=df.between, df2=df.within) 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^2 # 혹은 f.calculated 값을 제곱근한 값이 t.calculated sqrt(f.calculated) t.calculated # Now check this 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 # 한 편 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
c/ps1-1/note_on_statistical_test_2.1701652947.txt.gz · Last modified: 2023/12/04 10:22 by hkimscil