User Tools

Site Tools


c:ms:2025:lecture_note_week_04

Variance

Why n-1 for 모집단

# variance 
# why we use n-1 when calculating 
# population variance (instead of N)
a <- rnorm2(100000000, 100, 10)
a.mean <- mean(a)
ss <- sum((a-a.mean)^2)
n <- length(a)
df <- n-1
ss/n
ss/df

Variance output

> # variance 
> # why we use n-1 when calculating 
> # population variance (instead of N)
> a <- rnorm2(100000000, 100, 10)
> a.mean <- mean(a)
> ss <- sum((a-a.mean)^2)
> n <- length(a)
> df <- n-1
> ss/n
[1] 100
> ss/df
[1] 100
> 

rule of SD

# standard deviation 68, 85, 99 rule 
one.sd <- .68
two.sd <- .95
thr.sd <- .99
1-one.sd
(1-one.sd)/2
qnorm(0.16)
qnorm(1-0.16)

1-two.sd
(1-two.sd)/2
qnorm(0.025)
qnorm(0.975)

1-thr.sd
(1-thr.sd)/2
qnorm(0.005)
qnorm(1-0.005)

rule of SD output

> # standard deviation 68, 85, 99 rule 
> one.sd <- .68
> two.sd <- .95
> thr.sd <- .99
> 1-one.sd
[1] 0.32
> (1-one.sd)/2
[1] 0.16
> qnorm(0.16)
[1] -0.9944579
> qnorm(1-0.16)
[1] 0.9944579
> 
> 1-two.sd
[1] 0.05
> (1-two.sd)/2
[1] 0.025
> qnorm(0.025)
[1] -1.959964
> qnorm(0.975)
[1] 1.959964
> 
> 1-thr.sd
[1] 0.01
> (1-thr.sd)/2
[1] 0.005
> qnorm(0.005)
[1] -2.575829
> qnorm(1-0.005)
[1] 2.575829
> 
> 

Sampling distribution

OR the distribution of sample means

# sampling distribution 
n.ajstu <- 100000
mean.ajstu <- 100
sd.ajstu <- 10

set.seed(1024)
ajstu <- rnorm2(n.ajstu, mean=mean.ajstu, sd=sd.ajstu)

mean(ajstu)
sd(ajstu)
var(ajstu)
min.value <- min(ajstu)
max.value <- max(ajstu)
min.value
max.value

iter <- 10000 # # of sampling 

n.4 <- 4
means4 <- rep (NA, iter)
for(i in 1:iter){
  means4[i] = mean(sample(ajstu, n.4))
}

n.25 <- 25
means25 <- rep (NA, iter)
for(i in 1:iter){
  means25[i] = mean(sample(ajstu, n.25))
}

n.100 <- 100
means100 <- rep (NA, iter)
for(i in 1:iter){
  means100[i] = mean(sample(ajstu, n.100))
}

n.400 <- 400
means400 <- rep (NA, iter)
for(i in 1:iter){
  means400[i] = mean(sample(ajstu, n.400))
}

n.900 <- 900
means900 <- rep (NA, iter)
for(i in 1:iter){
  means900[i] = mean(sample(ajstu, n.900))
}

n.1600 <- 1600
means1600 <- rep (NA, iter)
for(i in 1:iter){
  means1600[i] = mean(sample(ajstu, n.1600))
}

n.2500 <- 2500
means2500 <- rep (NA, iter)
for(i in 1:iter){
  means2500[i] = mean(sample(ajstu, n.2500))
}

h4 <- hist(means4)
h25 <- hist(means25)
h100 <- hist(means100)
h400 <- hist(means400)
h900 <- hist(means900)
h1600 <- hist(means1600)
h2500 <- hist(means2500)


plot(h4, ylim=c(0,3000), col="red")
plot(h25, add = T, col="blue")
plot(h100, add = T, col="green")
plot(h400, add = T, col="grey")
plot(h900, add = T, col="yellow")


sss <- c(4,25,100,400,900,1600,2500) # sss sample sizes
ses <- rep (NA, length(sss)) # std errors
for(i in 1:length(sss)){
  ses[i] = sqrt(var(ajstu)/sss[i])
}
ses.means4 <- sqrt(var(means4))
ses.means25 <- sqrt(var(means25))
ses.means100 <- sqrt(var(means100))
ses.means400 <- sqrt(var(means400))
ses.means900 <- sqrt(var(means900))
ses.means1600 <- sqrt(var(means1600))
ses.means2500 <- sqrt(var(means2500))
ses.real <- c(ses.means4, ses.means25,
              ses.means100, ses.means400,
              ses.means900, ses.means1600,
              ses.means2500)
ses.real 

ses
se.1 <- ses
se.2 <- 2 * ses 

lower.s2 <- mean(ajstu)-se.2
upper.s2 <- mean(ajstu)+se.2
data.frame(cbind(sss, ses, ses.real, lower.s2, upper.s2))

min.value <- min(ajstu)
max.value <- max(ajstu)
min.value
max.value
# means25 분포에서 population의 가장 최소값인 
# min.value가 나올 확률은 얼마나 될까?
m.25 <- mean(means25)
sd.25 <- sd(means25)
m.25
sd.25
pnorm(min.value, m.25, sd.25)
# 위처럼 최소값, 최대값의 probability를 가지고
# 확률을 구하는 것은 의미가 없음. 즉, 어떤 샘플의
# 평균이 원래 population에서 나왔는지를 따지는 것을
# 그 pop의 최소값으로 판단하는 것은 의미가 없음.
# 그 보다는 sd.25와 같은 standard deviation을 가지
# 고 보는 것이 타당함. 이 standard deviation 을
# standard error라고 부름
se.25 <- sd.25
se.25.2 <- 2 * sd.25
mean(means25)+c(-se.25.2, se.25.2)
# 위처럼 95% certainty를 가지고 구간을 판단하거나
# 아래 처럼 점수를 가지고 probability를 볼 수도
# 있음
pnorm(95.5, m.25, sd.25)
# 혹은 
pnorm(95.5, m.25, sd.25) * 2
# 매우중요. 위의 이야기는 내가 25명의 샘플을 취
# 했을 때, 그 점수가 95.5가 나올 확률을 구해 본것
# 다른 예로
pnorm(106, m.25, sd.25, lower.tail = F)
# 혹은 
2 * pnorm(106, m.25, sd.25, lower.tail = F)

Sampling distribution output

> # sampling distribution 
> n.ajstu <- 100000
> mean.ajstu <- 100
> sd.ajstu <- 10
> 
> set.seed(1024)
> ajstu <- rnorm2(n.ajstu, mean=mean.ajstu, sd=sd.ajstu)
> 
> mean(ajstu)
[1] 100
> sd(ajstu)
[1] 10
> var(ajstu)
     [,1]
[1,]  100
> min.value <- min(ajstu)
> max.value <- max(ajstu)
> min.value
[1] 57.10319
> max.value
[1] 141.9732
> 
> iter <- 10000 # # of sampling 
> 
> n.4 <- 4
> means4 <- rep (NA, iter)
> for(i in 1:iter){
+   means4[i] = mean(sample(ajstu, n.4))
+ }
> 
> n.25 <- 25
> means25 <- rep (NA, iter)
> for(i in 1:iter){
+   means25[i] = mean(sample(ajstu, n.25))
+ }
> 
> n.100 <- 100
> means100 <- rep (NA, iter)
> for(i in 1:iter){
+   means100[i] = mean(sample(ajstu, n.100))
+ }
> 
> n.400 <- 400
> means400 <- rep (NA, iter)
> for(i in 1:iter){
+   means400[i] = mean(sample(ajstu, n.400))
+ }
> 
> n.900 <- 900
> means900 <- rep (NA, iter)
> for(i in 1:iter){
+   means900[i] = mean(sample(ajstu, n.900))
+ }
> 
> n.1600 <- 1600
> means1600 <- rep (NA, iter)
> for(i in 1:iter){
+   means1600[i] = mean(sample(ajstu, n.1600))
+ }
> 
> n.2500 <- 2500
> means2500 <- rep (NA, iter)
> for(i in 1:iter){
+   means2500[i] = mean(sample(ajstu, n.2500))
+ }
> 
> h4 <- hist(means4)
> h25 <- hist(means25)
> h100 <- hist(means100)
> h400 <- hist(means400)
> h900 <- hist(means900)
> h1600 <- hist(means1600)
> h2500 <- hist(means2500)
> 
> 
> plot(h4, ylim=c(0,3000), col="red")
> plot(h25, add = T, col="blue")
> plot(h100, add = T, col="green")
> plot(h400, add = T, col="grey")
> plot(h900, add = T, col="yellow")
> 
> 
> sss <- c(4,25,100,400,900,1600,2500) # sss sample sizes
> ses <- rep (NA, length(sss)) # std errors
> for(i in 1:length(sss)){
+   ses[i] = sqrt(var(ajstu)/sss[i])
+ }
> ses.means4 <- sqrt(var(means4))
> ses.means25 <- sqrt(var(means25))
> ses.means100 <- sqrt(var(means100))
> ses.means400 <- sqrt(var(means400))
> ses.means900 <- sqrt(var(means900))
> ses.means1600 <- sqrt(var(means1600))
> ses.means2500 <- sqrt(var(means2500))
> ses.real <- c(ses.means4, ses.means25,
+               ses.means100, ses.means400,
+               ses.means900, ses.means1600,
+               ses.means2500)
> ses.real 
[1] 4.9719142 2.0155741 0.9999527 0.5034433 0.3324414
[6] 0.2466634 0.1965940
> 
> ses
[1] 5.0000000 2.0000000 1.0000000 0.5000000 0.3333333
[6] 0.2500000 0.2000000
> se.1 <- ses
> se.2 <- 2 * ses 
> 
> lower.s2 <- mean(ajstu)-se.2
> upper.s2 <- mean(ajstu)+se.2
> data.frame(cbind(sss, ses, ses.real, lower.s2, upper.s2))
   sss       ses  ses.real lower.s2 upper.s2
1    4 5.0000000 4.9719142 90.00000 110.0000
2   25 2.0000000 2.0155741 96.00000 104.0000
3  100 1.0000000 0.9999527 98.00000 102.0000
4  400 0.5000000 0.5034433 99.00000 101.0000
5  900 0.3333333 0.3324414 99.33333 100.6667
6 1600 0.2500000 0.2466634 99.50000 100.5000
7 2500 0.2000000 0.1965940 99.60000 100.4000
> 
> min.value <- min(ajstu)
> max.value <- max(ajstu)
> min.value
[1] 57.10319
> max.value
[1] 141.9732
> # means25 분포에서 population의 가장 최소값인 
> # min.value가 나올 확률은 얼마나 될까?
> m.25 <- mean(means25)
> sd.25 <- sd(means25)
> m.25
[1] 100.0394
> sd.25
[1] 2.015574
> pnorm(min.value, m.25, sd.25)
[1] 5.414963e-101
> # 위처럼 최소값, 최대값의 probability를 가지고
> # 확률을 구하는 것은 의미가 없음. 즉, 어떤 샘플의
> # 평균이 원래 population에서 나왔는지를 따지는 것을
> # 그 pop의 최소값으로 판단하는 것은 의미가 없음.
> # 그 보다는 sd.25와 같은 standard deviation을 가지
> # 고 보는 것이 타당함. 이 standard deviation 을
> # standard error라고 부름
> se.25 <- sd.25
> se.25.2 <- 2 * sd.25
> mean(means25)+c(-se.25.2, se.25.2)
[1]  96.00822 104.07051
> # 위처럼 95% certainty를 가지고 구간을 판단하거나
> # 아래 처럼 점수를 가지고 probability를 볼 수도
> # 있음
> pnorm(95.5, m.25, sd.25)
[1] 0.01215658
> # 혹은 
> pnorm(95.5, m.25, sd.25) * 2
[1] 0.02431317
> # 매우중요. 위의 이야기는 내가 25명의 샘플을 취
> # 했을 때, 그 점수가 95.5가 나올 확률을 구해 본것
> # 다른 예로
> pnorm(106, m.25, sd.25, lower.tail = F)
[1] 0.001551781
> # 혹은 
> 2 * pnorm(106, m.25, sd.25, lower.tail = F)
[1] 0.003103562
> 
> 
> 

mean and variance of sample means

위에서 standard deviation of sample means (샘플평균들로 이루어진 집합의 표준편차) 값을 standard error라고 부른다. 그리고 이 standard error 값은 원래 population의 $\sigma^2$ 값을 샘플의 사이즈로 나누어준 값을 ($\sigma^2/n$) 갖게 된다. 또한 이 샘플평균들의 집합의 평균은 (샘플평균들의 기대값, the mean of sample means) population의 평균값을 ($\mu$) 갖게 된다. 이에 대한 수학적 증명 문서는 mean and variance of the sample mean.

Hypothesis testing

먼저 이해하기

  • pnorm (and rnorm, qnorm)
  • 표준점수
  • sampling distribution
  • = distribution of sample means
  • = distribution of the sample mean
  • standard error
  • = standard deviation of sample means
  • = standard deviation of sampling distribution
  • CLT
  • $\overline{X} \sim N(\mu, \displaystyle \frac{\sigma^2}{n}) $

위를 이해한다면 이제 우리는 차이의가설을 만들어 테스트해볼 수 있다. hypothesis testing

# 가설 테스트 
set.seed(2000)
pop <- rnorm2(1000000, 50, 10)
m.pop <- mean(pop)
sd.pop <- sd(pop)
var.pop <- var(pop)

# 시뮬레이션 시작
iter <- 10000 # 사실은 무한대 
n <-100 # sample size
means <-rep(NA, iter) # means memory reservation
for(i in 1:iter){
  means[i] = mean(sample(pop, n))
}
m.empirical <- mean(means)
se.empirical <- sd(means)
m.empirical
se.empirical
se <- sd.pop/sqrt(n)
se2 <- se * 2
se3 <- se * 3

vlines <- c(m.empirical, 
            m.empirical+c(-se,se),
            m.empirical+c(-se2,se2),
            m.empirical+c(-se3,se3))
colors = c("blue", 
           "red", "red", 
           "darkgreen", "darkgreen", 
           "black", "black")

hist(means)
abline(v=vlines, col=colors, lwd=2, lty="dashed")

# 아래는 n=100 샘플을 하여 평균을 구해본 것
s1 <- sample(pop, n)
s1
mean(s1)
s2 <- sample(pop, n)
mean(s2)

# set.seed(2000)
iter <- 20
n <-100
means <-rep(NA, iter)
for(i in 1:iter){
  means[i] = mean(sample(pop, n))
}
means
means < 48
means > 52
table(means<48)
table(means>52)
table(means<48|means>52)

s3 <- rnorm2(n, 53.2, 10)
m.s3 <- mean(s3)
m.s3

p.val.one.tail <- 
  pnorm(m.s3, m.pop, se, lower.tail = F)
p.val.two.tail <- 
  pnorm(m.s3, m.pop, se, lower.tail = F) * 2
p.val.one.tail
p.val.two.tail

set.seed(1010)
s4 <- rnorm(100, 54, 10)
m.s4 <- mean(s4)
m.s4

p.val.two.tail <- pnorm(m.s4, 
                        m.pop, 
                        se, lower.tail = F) * 2
p.val.two.tail
p.val.one.tail <-p.val.two.tail/2
p.val.one.tail
z.score <- (m.s4-m.pop)/se
z.score
pnorm(z.score, lower.tail = F)*2

# 만약에 pnorm을 이용하여 정확한 
# probability를 구할 수 없는 상황
# 이라고 가정하면
# 우리는 CLT 정리를 생각하여 
# n = 100인 샘플을 무한 반복하여 
# 샘플링 하고, 각 샘플의 평균을 
# 기록하여 모아둔다면 그 분포는 
# N(mu, sigma^2/n) 이라는 것을 
# 안다. N(50, 100/100)
# 따라서 이 집합의 표준편차값은 
# sigma/sqrt(n) = 1
# 대충 바로 위의  그래프와 같은 
# 모습이고, 이 그래프에서 sd를 
# 위로 두개, 밑으로 두개 쓴 구간은
# 녹색에 해당하는 48-52 이다. 
# 이 구간에서 샘플의 평균이 나타날
# 확률은 95%라고 하였다. 따라서 
# 우리가 가지고 있는 m.s4의 값은 
# 52점 밖에 존재하므로 
# 5%의 확률로서만 얻을 수 있는 샘플
# 평균이라는 것을 알수 있다. 

# 위의 결과를 가지고 두가지 판단을 할 수 
# 있다. 하나는 이 샘플의 평균이 모집단
# 평균이 50이고 표준편차가 10인 집단에서
# 나올 수 있는 샘플일 확률이 1/20밖에 
# 안되므로 이 샘플은 우리가 염두에 둔 
# 원래 모집단에서 나온 것이 아니라는 
# 생각이다. 

# 두 번째는 이 샘플이 그 모집단에서 
# 나오기는 했다. 그러나 1/20 확률에 
# 우연찮게 이번에 걸려서 m.s4의 평균값이
# 나왔다. 

# 이것은 1/20확률에 근거한 판단이므로 첫
# 번째 판단을 나의 주 판단으로 한다. 즉, 
# 이 샘플은 원래 모집단에서 나올 샘플이 
# 아닌 다른 집단에서 나온 샘플이다. 

# 그런데 여기서 추가로 주목할 점은 내가 샘플이 
# 정상적인지 아니면 비정상적인지 판단하는 기준
# 선을 표준점수 +- 2에 두었다는 점이다. 
# m.s4의 점수는 53.2 이므로 m.s4-m.pop(50)
# 인 3.2는 샘플평균들의 집합에서 구하는 
# 표준편차가 3.2만큼 떨어진 것을 알 수 있다. 
# 우리는 이것을 표준점수라고 하였으므로 
# 우리가 구한 z-score = 3.2라는 것을 알 수 있고
# 이 점수가 표준편차값 2개를 위아래로 적용한 선보다 
# 밖에 존재하므로 샘플이 모집단에서 나오지 않은 
# 특별한 샘플이라는 것을 주장할 수 있다.
c/ms/2025/lecture_note_week_04.txt · Last modified: 2025/03/26 07:41 by hkimscil

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki