c:ms:2025:lecture_note_week_05
Coding
# z-test 정리 # rnorm2 <- function(n,mean,sd) { mean+sd*scale(rnorm(n)) } set.seed(101) # 평균이 80, 표준편차가 10인 모집단을 가정 # 아래 sa 샘플은 모집단의 구성원에게 머리가 # 좋아지는 약을 투여한 후에 얻은 수학시험 # 점수 # 약의 효과가 있었을까? p.mean <- 80 p.sigma <- 10 n <- 100 sa <- rnorm2(n, 83, 10) # 가설? # 영가설? # confidence interval with 95% certainty? # 83 != 80 # If 83 = 80 ? # se for population (when sample size is 100) se <- sqrt(p.sigma^2/n) se se2 <- se*2 # se를 위로 두 개 아래로 두 개 쓴 범위는 p.mean + c(-se2, +se2) # 영가설이 맞다면 백중 95의 확률로 # 샘플의 평균이 78-82 사이에서 # 나와야 함 (왜냐하면 약을 먹은 샘플 # 100명도 모집단의 평범한 사람들일테니까) # 그런데 샘플의 평균이 83이므로 영가설을 # 부정함. 이 샘플과 모집단의 평균은 # 다름. 즉, 샘플의 평균이 모집단에 나오기 # 힘든 평균이므로 이 샘플은 다른 # 모집단에서 나온 샘플이라고 생각하게 됨 # 따라서 연구가설을 채택하여 # 두 집단 간에 차이가 있다는 것을 받아들임 # 다른 방법. se를 단위로 하는 표준점수는? sa.zs <- (mean(sa)-p.mean)/se sa.zs # 즉 z-score는 sa.zs # 이렇게 따지면 z-score는 +-2 범위 밖이면 # 영가설을 부정하고 연구가설을 채택할 수 # 있음 # 우리는 이 점수를 가지고 pnorm 을 구해 # 볼 수 있음 pnorm(sa.zs, lower.tail = F) # 양방향 테스트일 경우 pnorm(sa.zs, lower.tail = F) * 2 # 즉, 만약에 영가설이 맞다면 # 샘플 평균 83점 혹은 이에 해당하는 낮은 점수가 # 나올 확률은 [1] 0.002699796 라는 것. # 이것은 5/100보다 작으므로 영가설을 부정하고 # 연구가설을 채택 # 옛날 방식 qnorm(0.05/2) abs(qnorm(0.05/2)) sa.zs # statistical test # 두 집단 간의 평균 차이 / random error # 로 나누어 주는 것 # se = random error # t-test # sample의 숫자가 작을 때 30미만일 # 때 구하는 z score 는 부 정확 # 즉, 이 z score로 구하는 probability도 # 부정확하여 보정이 필요함 # 이 보정되는 probability는 샘플의 크기에 # 따라서 달라짐 # 따라서 우리는 normal distribution에서 # probability를 구하지 않고 (pnorm을 사 # 용하지 않고), 따로 계산하여 구한 # distribution을 사용함. 이것이 t distribution # pnorm 처럼 pt를 사용함 set.seed(102) n <- 16 sb <- rnorm2(n, 86, 10) se <- sqrt(p.sigma^2/n) se se2 <- se*2 p.mean + c(-se2, +se2) sb.tscore <- (mean(sb)-p.mean)/se sb.tscore pt(sb.tscore, df=n-1, lower.tail = F) * 2 # 옛날방식 qt(0.05/2, df=n-1) qt(0.05/2, df=n-1, lower.tail = F) sb.tscore # 샘플의 숫자가 클 때에는? set.seed(103) n <- 2500 sc <- rnorm2(n, 80.75, 10) se <- sqrt(p.sigma^2/n) se se2 <- se*2 p.mean + c(-se2, +se2) sc.tscore <- (mean(sc)-p.mean)/se sc.tscore pt(sc.tscore, df = n-1, lower.tail = F) * 2 pnorm(sc.tscore, lower.tail = F) * 2 # 따라서 샘플숫자가 클 때에는 z-test # 대신 t-test를 해도 됨. 따라서, # 모든 경우 t-test를 하게 됨 # 알파와 베타 # type 1 error 와 type 2 error set.seed(102) n <- 16 sb1 <- rnorm2(n, 86, 10) se <- sqrt(p.sigma^2/n) se se2 <- se*2 p.mean + c(-se2, +se2) sb1.tscore <- (mean(sb1)-p.mean)/se sb1.tscore pt(sb1.tscore, df=n-1, lower.tail = F) * 2 # 위에서 범할 수 있는 오류는? # 그렇다면 아래는 set.seed(102) n <- 16 sb2 <- rnorm2(n, 84, 10) se <- sqrt(p.sigma^2/n) se se2 <- se*2 p.mean + c(-se2, +se2) sb2.tscore <- (mean(sb2)-p.mean)/se sb2.tscore pt(sb2.tscore, df=n-1, lower.tail = F) * 2 # see http://commres.net/wiki/types_of_error ###################################### ## 두 그룹 간의 차이 비교 테스트 ###################################### # see http://commres.net/wiki/t-test set.seed(109) ssz <- 100 ts.t1 <- rnorm2(ssz, 50, 5) ts.t2 <- rnorm2(ssz, 52, 5) ts.diff <- ts.t2-ts.t1 mean(ts.diff) sd(ts.diff) var(ts.diff) mean(ts.t2) - mean(ts.t1) m.diff <- mean(ts.diff) se <- sd(ts.diff)/sqrt(ssz) t.cal <- m.diff/se t.cal pt(t.cal, df=ssz-1, lower.tail = F) * 2 # t.test(ts.t1, ts.t2, paired = T) ################################## set.seed(109) na <- 100 nb <- 100 df.a <- na-1 df.b <- nb-1 ts.a <- rnorm2(na, 103, 10) ts.b <- rnorm2(nb, 100, 10) m.diff <- mean(ts.a)-mean(ts.b) m.diff ss.a <- var(ts.a) * df.a ss.b <- var(ts.b) * df.b ss.a ss.b v.pool <- (ss.a + ss.b)/(df.a + df.b) se <- sqrt((v.pool/na)+(v.pool/nb)) t.cal <- m.diff/se t.cal pt(t.cal, df=df.a + df.b, lower.tail = F) * 2 # t.test(ts.a, ts.b) ######################################### set.seed(104) n <- 30 tsk <- rnorm2(n, 106, 9) mu <- 100 m.tsk <- mean(tsk) sd.tsk <- sd(tsk) m.tsk sd.tsk m.diff <- m.tsk - mu se <- 9/sqrt(n) m.diff se t.cal <- m.diff/se t.cal pt(t.cal, df=n-1, lower.tail = F) * 2 # t.test(tsk, mu=100)
Output
> # z-test > # > rnorm2 <- function(n,mean,sd) { mean+sd*scale(rnorm(n)) } > set.seed(101) > # 평균이 80, 표준편차가 10인 모집단을 가정 > # 아래 sa 샘플은 모집단의 구성원에게 머리가 > # 좋아지는 약을 투여한 후에 얻은 수학시험 > # 점수 > # 약의 효과가 있었을까? > p.mean <- 80 > p.sigma <- 10 > n <- 100 > sa <- rnorm2(n, 83, 10) > > # 가설? > # 영가설? > # confidence interval with 95% certainty? > > # 83 != 80 > # If 83 = 80 ? > # se for population (when sample size is 100) > se <- sqrt(p.sigma^2/n) > se [1] 1 > se2 <- se*2 > # se를 위로 두 개 아래로 두 개 쓴 범위는 > p.mean + c(-se2, +se2) [1] 78 82 > # 영가설이 맞다면 백중 95의 확률로 > # 샘플의 평균이 78-82 사이에서 > # 나와야 함 (왜냐하면 약을 먹은 샘플 > # 100명도 모집단의 평범한 사람들일테니까) > > # 그런데 샘플의 평균이 83이므로 영가설을 > # 부정함. 이 샘플과 모집단의 평균은 > # 다름. 즉, 샘플의 평균이 모집단에 나오기 > # 힘든 평균이므로 이 샘플은 다른 > # 모집단에서 나온 샘플이라고 생각하게 됨 > # 따라서 연구가설을 채택하여 > # 두 집단 간에 차이가 있다는 것을 받아들임 > > > # 다른 방법. se를 단위로 하는 표준점수는? > sa.zs <- (mean(sa)-p.mean)/se > sa.zs [1] 3 > # 즉 z-score는 sa.zs > # 이렇게 따지면 z-score는 +-2 범위 밖이면 > # 영가설을 부정하고 연구가설을 채택할 수 > # 있음 > # 우리는 이 점수를 가지고 pnorm 을 구해 > # 볼 수 있음 > pnorm(sa.zs, lower.tail = F) [1] 0.001349898 > # 양방향 테스트일 경우 > pnorm(sa.zs, lower.tail = F) * 2 [1] 0.002699796 > # 즉, 만약에 영가설이 맞다면 > # 샘플 평균 83점이 나올 확률은 > # [1] 0.002699796 라는 것. 이것은 5/100보다 > # 작으므로 영가설을 부정하고 연구가설을 채택 > > # 옛날 방식 > qnorm(0.05/2) [1] -1.959964 > abs(qnorm(0.05/2)) [1] 1.959964 > sa.zs [1] 3 > > # statistical test > # 두 집단 간의 평균 차이 / random error > # 로 나누어 주는 것 > # se = random error > > > # t-test > # sample의 숫자가 작을 때 30미만일 > # 때 구하는 z score 는 부 정확 > # 즉, 이 z score로 구하는 probability도 > # 부정확하여 보정이 필요함 > # 이 보정되는 probability는 샘플의 크기에 > # 따라서 달라짐 > > # 따라서 우리는 normal distribution에서 > # probability를 구하지 않고 (pnorm을 사 > # 용하지 않고), 따로 계산하여 구한 > # distribution을 사용함. 이것이 t distribution > # pnorm 처럼 pt를 사용함 > > set.seed(102) > n <- 16 > sb <- rnorm2(n, 86, 10) > > se <- sqrt(p.sigma^2/n) > se [1] 2.5 > se2 <- se*2 > p.mean + c(-se2, +se2) [1] 75 85 > > sb.tscore <- (mean(sb)-p.mean)/se > sb.tscore [1] 2.4 > pt(sb.tscore, df=n-1, lower.tail = F) * 2 [1] 0.02982493 > > # 옛날방식 > qt(0.05/2, df=n-1) [1] -2.13145 > qt(0.05/2, df=n-1, lower.tail = F) [1] 2.13145 > sb.tscore [1] 2.4 > > # 샘플의 숫자가 클 때에는? > set.seed(103) > n <- 2500 > sc <- rnorm2(n, 80.75, 10) > > se <- sqrt(p.sigma^2/n) > se [1] 0.2 > se2 <- se*2 > p.mean + c(-se2, +se2) [1] 79.6 80.4 > > sc.tscore <- (mean(sc)-p.mean)/se > sc.tscore [1] 3.75 > pt(sc.tscore, df = n-1, lower.tail = F) * 2 [1] 0.0001808498 > pnorm(sc.tscore, lower.tail = F) * 2 [1] 0.0001768346 > > > # 따라서 샘플숫자가 클 때에는 z-test > # 대신 t-test를 해도 됨. 따라서, > # 모든 경우 t-test를 하게 됨 > > # 알파와 베타 > # type 1 error 와 type 2 error > > set.seed(102) > n <- 16 > sb1 <- rnorm2(n, 86, 10) > > se <- sqrt(p.sigma^2/n) > se [1] 2.5 > se2 <- se*2 > p.mean + c(-se2, +se2) [1] 75 85 > > sb1.tscore <- (mean(sb1)-p.mean)/se > sb1.tscore [1] 2.4 > pt(sb1.tscore, df=n-1, lower.tail = F) * 2 [1] 0.02982493 > > # 위에서 범할 수 있는 오류는? > > # 그렇다면 아래는 > set.seed(102) > n <- 16 > sb2 <- rnorm2(n, 84, 10) > > se <- sqrt(p.sigma^2/n) > se [1] 2.5 > se2 <- se*2 > p.mean + c(-se2, +se2) [1] 75 85 > > sb2.tscore <- (mean(sb2)-p.mean)/se > sb2.tscore [1] 1.6 > pt(sb2.tscore, df=n-1, lower.tail = F) * 2 [1] 0.130445 > > # see http://commres.net/wiki/types_of_error > > ###################################### > ## 두 그룹 간의 차이 비교 테스트 > ###################################### > # see http://commres.net/wiki/t-test > > set.seed(109) > ssz <- 100 > ts.t1 <- rnorm2(ssz, 50, 5) > ts.t2 <- rnorm2(ssz, 52, 5) > ts.diff <- ts.t2-ts.t1 > mean(ts.diff) [1] 2 > sd(ts.diff) [1] 7.010937 > var(ts.diff) [,1] [1,] 49.15323 > mean(ts.t2) - mean(ts.t1) [1] 2 > m.diff <- mean(ts.diff) > se <- sd(ts.diff)/sqrt(ssz) > t.cal <- m.diff/se > t.cal [1] 2.852686 > pt(t.cal, df=ssz-1, lower.tail = F) * 2 [1] 0.005278446 > # > t.test(ts.t1, ts.t2, paired = T) Paired t-test data: ts.t1 and ts.t2 t = -2.8527, df = 99, p-value = 0.005278 alternative hypothesis: true mean difference is not equal to 0 95 percent confidence interval: -3.3911219 -0.6088781 sample estimates: mean difference -2 > > ################################## > set.seed(109) > na <- 100 > nb <- 100 > df.a <- na-1 > df.b <- nb-1 > ts.a <- rnorm2(na, 103, 10) > ts.b <- rnorm2(nb, 100, 10) > > m.diff <- mean(ts.a)-mean(ts.b) > m.diff [1] 3 > ss.a <- var(ts.a) * df.a > ss.b <- var(ts.b) * df.b > ss.a [,1] [1,] 9900 > ss.b [,1] [1,] 9900 > > v.pool <- (ss.a + ss.b)/(df.a + df.b) > se <- sqrt((v.pool/na)+(v.pool/nb)) > > t.cal <- m.diff/se > t.cal [,1] [1,] 2.12132 > pt(t.cal, df=df.a + df.b, lower.tail = F) * 2 [,1] [1,] 0.03513866 > # > t.test(ts.a, ts.b) Welch Two Sample t-test data: ts.a and ts.b t = 2.1213, df = 198, p-value = 0.03514 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: 0.2111461 5.7888539 sample estimates: mean of x mean of y 103 100 > > ######################################### > set.seed(104) > n <- 30 > > tsk <- rnorm2(n, 106, 9) > mu <- 100 > m.tsk <- mean(tsk) > sd.tsk <- sd(tsk) > m.tsk [1] 106 > sd.tsk [1] 9 > > m.diff <- m.tsk - mu > se <- 9/sqrt(n) > m.diff [1] 6 > se [1] 1.643168 > > t.cal <- m.diff/se > t.cal [1] 3.651484 > pt(t.cal, df=n-1, lower.tail = F) * 2 [1] 0.001021295 > # > t.test(tsk, mu=100) One Sample t-test data: tsk t = 3.6515, df = 29, p-value = 0.001021 alternative hypothesis: true mean is not equal to 100 95 percent confidence interval: 102.6393 109.3607 sample estimates: mean of x 106 > > >
c/ms/2025/lecture_note_week_05.txt · Last modified: 2025/03/31 08:57 by hkimscil