User Tools

Site Tools


estimated_standard_deviation

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
estimated_standard_deviation [2020/12/05 19:06] hkimscilestimated_standard_deviation [2025/08/12 20:00] (current) – [R 에서 SS값이 최소인 v값을 찾기] hkimscil
Line 11: Line 11:
  
 \begin{eqnarray*} \begin{eqnarray*}
-\hat{\sigma}^{2} \frac {\displaystyle\sum_{i=1}^{n}{(X_{i}-\overline{X})}} {n} +\hat{\sigma}^{2} \neq \frac {\displaystyle\sum_{i=1}^{n}{(X_{i}-\overline{X})}} {n} 
 \end{eqnarray*} \end{eqnarray*}
  
Line 22: Line 22:
  
 ====== 직관적 이해 ====== ====== 직관적 이해 ======
-위에서 n-1 을 사용하기 위해서 추하는 은 +분산은 $SS/df$ 라고 배웠는데, SS = Sum of Something Square라고 설명고, 여기서 Something 은 error 값이라고 (개인의 점수를 평균으로 측했을 때 틀린 만큼의 에러값) 하였다. 그리고 평균으로 예측하는 방법이 가장 작은 오차를 갖는 (예측이 들 틀리는) 방법이라고 하였다 (개인점수 중에서 평균이 제일 많이 나오므로, 평균으로 개인점수를 예측하면 제일 들 틀린다). 따라서 어느 한 집합에서 (샘플에서) 개인점수에서 평균을 빼고 이른 제곱하여 모두 더한 값은 (평균이 아닌) 다른 값으로 구한 값보다 항상 작게 된다 (최소값을 갖는다).
  
-\begin{eqnarray*} +  
-\sum_{i=1}^{n} {(X_{i}-\mu)} > \sum_{i=1}^{n} {(X_{i}-\overline{X})} +이를 그림으로도 설명할 수 있다. 아래에서 녹색의 세로선은 모집단의 평균값이고, 붉은색의 세로선은 3개로 이루어진 샘플의 평균값이다. 그리고 녹색 가로선은 3개의 샘플요소와 모집단평균과의 ($\mu$) 차이값들이고, 적색가로선은 3개의 샘플요소와 샘플평균과의 ($\overline{X}$) 차이값이다. 이 차이값들을 모아서 길이를 비교한 것이 그래프의 하단이다. 적색가로선 세개의 합이 녹색가로선 세개의 합보다 작다. 이는 샘플평균을 사용했을 때와 모집단의 평균을 사용했을 때를 비교하는 것이지만 모집단 평균외에 다른 값을 썼어도 마찬가지이다. 
-\end{eqnarray*} +
- +
-라는 점이다. 따라서 n 대신 n-1로 나눠주어서 "작은 값을 갖는 경향의 문제점을" 상쇄한다. +
- +
-아래는 20개의 원소를 갖는 k 집합을 예이다. +
-''k = {6, 4, 16, 12, 4, 13, 18, 16, 7, 11, 5, 11, 9, 11, 18, 1, 7, 2, 5, 3}'' +
- +
-우리는 이 집합의 평균과 분산값이 각각 8.95 와 27.2475 임을 알고 있다. 이 때 분산값은 24.2475는 SS값을 구한 후, 이를 N으로 나눈 값이다.  +
- +
-위의 모집단에서 3개의 샘플을 취하여 S1 = {4, 11, 18}을 얻었고, 그 평균값은 11이다. 위의 샘플에서 모집단의 분산값을 예측한다고 할 때, 모집단의 (N=20인) 평균값을 안다고 하면 우리는  +
-| s1 | mu | deviation score | ds<sup>2</sup>  +
-| 4  | 8.95  | -4.95  | 24.5025   | +
-| 11  | 8.95  | 2.05  | 4.2025   | +
-| 18  | 8.95  | 9.05  | 81.9025   | +
-|    |    | SS<sub>pop</sub>  | 110.6075 +
- +
-SS<sub>pop</sub> 값으로 110.6075 값을 얻는다. 그러나, 위의 경우는 특별한 예이고 대개의 경우 우리는 모집단의 평균값을 알지 못한다. 이 경우 우리는 3개로 취한 샘플의 평균값을 이용하여 SS 부분을 구하게 된다 (SS<sub>samp</sub>). +
- +
-| s1 | $\overline{X}$ | deviation score | ds<sup>2</sup> +
-| 4  | 11  | -7  | 49   | +
-| 11  | 11  | 0  | 0   | +
-| 18  | 11  | 7  | 49   | +
-|    |    | SS<sub>samp</sub>  | 98  | +
- +
-이렇게 얻은 SS<sub>samp</sub>값은 98인데, 이 값은 SS<sub>pop</sub> 값보다 작다. 아래의 R code는 이를 확인해 보는 작업이다. 각각의 샘플에서 (n=3) 취한 SS<sub>samp</sub> 값은 대개는 SS<sub>pop</sub>값보다 작은 경향을 띈다. 따라서 이 작은 값을 상쇄하기 위해서 n 대신 n-1 로 SS<sub>samp</sub> 값을 나누어 준다. +
- +
- +
- +
- +
-<code> +
-############ +
-set.seed(1010)  +
-n.pop <- 20 +
-k <- sample(1:20, n.pop, replace = T) +
-+
-k.mean <- mean(k)  +
-k.pvar <- var(k)*((n.pop-1)/n.pop) ## population var(k) +
-k.mean +
-k.pvar +
- +
-############ +
-n.samp <- 3 +
-ks <- sample(k, n.samp) +
-ks +
-ks.mean <- mean(ks) +
-ks.var <- var(ks) +
-ks.pvar <- var(ks)*((n.samp-1)/n.samp) +
-############ +
-ks-k.mean +
-ks-ks.mean +
-sum((ks-k.mean)^2) +
-sum((ks-ks.mean)^2) +
-</code> +
- +
-<code> +
-############ +
-set.seed(3) # another sample +
-n.samp <- 3 +
-ks <- sample(k, n.samp) +
-ks +
-ks.mean <- mean(ks) +
-ks.var <- var(ks) +
-ks.pvar <- var(ks)*((n.samp-1)/n.samp) +
-############ +
-ks-k.mean +
-ks-ks.mean +
-sum((ks-k.mean)^2) +
-sum((ks-ks.mean)^2) +
- +
-############ +
-set.seed(5) # another sample +
-n.samp <- 3 +
-ks <- sample(k, n.samp) +
-ks +
-ks.mean <- mean(ks) +
-ks.var <- var(ks) +
-ks.pvar <- var(ks)*((n.samp-1)/n.samp) +
-############ +
-ks-k.mean +
-ks-ks.mean +
-sum((ks-k.mean)^2) +
-sum((ks-ks.mean)^2) +
- +
-############ +
-set.seed(7) # another sample +
-n.samp <- 3 +
-ks <- sample(k, n.samp) +
-ks +
-ks.mean <- mean(ks) +
-ks.var <- var(ks) +
-ks.pvar <- var(ks)*((n.samp-1)/n.samp) +
-############ +
-ks-k.mean +
-ks-ks.mean +
-sum((ks-k.mean)^2) +
-sum((ks-ks.mean)^2) +
-</code> +
- +
-<code> +
-> ############ +
-> set.seed(1010)  +
-> n.pop <- 20 +
-> k <- sample(1:20, n.pop, replace = T) +
-> k +
- [1]  6  4 16 12  4 13 18 16  7 11  5 11  9 11 18  1  7  2  5  3 +
-> k.mean <- mean(k)  +
-> k.pvar <- var(k)*((n.pop-1)/n.pop) ## population var(k) +
-> k.mean +
-[1] 8.95 +
-> k.pvar +
-[1] 27.2475 +
-> ############ +
-> n.samp <- 3 +
-> ks <- sample(k, n.samp) +
-> ks +
-[1] 11 13 18 +
-> ks.mean <- mean(ks) +
-> ks.var <- var(ks) +
-> ks.pvar <- var(ks)*((n.samp-1)/n.samp) +
-> ############ +
-> ks-k.mean +
-[1] 2.05 4.05 9.05 +
-> ks-ks.mean +
-[1] -3 -1  4 +
-> sum((ks-k.mean)^2) +
-[1] 102.5075 +
-> sum((ks-ks.mean)^2) +
-[1] 26 +
-</code> +
- +
-<code> +
-> ############ +
-> set.seed(3) # another sample +
-> n.samp <- 3 +
-> ks <- sample(k, n.samp) +
-> ks +
-[1]  4 11 18 +
-> ks.mean <- mean(ks) +
-> ks.var <- var(ks) +
-> ks.pvar <- var(ks)*((n.samp-1)/n.samp) +
-> ############ +
-> ks-k.mean +
-[1] -4.95  2.05  9.05 +
-> ks-ks.mean +
-[1] -7  0  7 +
-> sum((ks-k.mean)^2) +
-[1] 110.6075 +
-> sum((ks-ks.mean)^2) +
-[1] 98 +
->  +
- +
-> ############ +
-> set.seed(5) # another sample +
-> n.samp <- 3 +
-> ks <- sample(k, n.samp) +
-> ks +
-[1]  4  5 18 +
-> ks.mean <- mean(ks) +
-> ks.var <- var(ks) +
-> ks.pvar <- var(ks)*((n.samp-1)/n.samp) +
-> ############ +
-> ks-k.mean +
-[1] -4.95 -3.95  9.05 +
-> ks-ks.mean +
-[1] -5 -4  9 +
-> sum((ks-k.mean)^2) +
-[1] 122.0075 +
-> sum((ks-ks.mean)^2) +
-[1] 122 +
- +
- +
-> ############ +
-> set.seed(7) # another sample +
-> n.samp <- 3 +
-> ks <- sample(k, n.samp) +
-> ks +
-[1] 11  5 18 +
-> ks.mean <- mean(ks) +
-> ks.var <- var(ks) +
-> ks.pvar <- var(ks)*((n.samp-1)/n.samp) +
-> ############ +
-> ks-k.mean +
-[1]  2.05 -3.95  9.05 +
-> ks-ks.mean +
-[1] -0.3333333 -6.3333333  6.6666667 +
-> sum((ks-k.mean)^2) +
-[1] 101.7075 +
-> sum((ks-ks.mean)^2) +
-[1] 84.66667 +
->  +
-</code> +
-위의 코드에서  +
-''sum%%(%%%%(%%ks-k.mean)^2) '' = $\sum({X_{i}-\mu})^{2}$ +
-''sum%%(%%%%(%%ks-ks.mean)^2) '' = $\sum({X_{i}-\overline{X}})^{2}$ +
-인데, 위의 케이스를 보면  +
- +
-''sum%%(%%%%(%%ks-k.mean)^2) '' > ''sum%%(%%%%(%%ks-ks.mean)^2) ''  즉, +
-$\sum({X_{i}-\mu})^{2} > \sum({X_{i}-\overline{X}})^{2}$ 의 경향이 있다. +
- +
-이를 그림으로 설명하면 다음과 같다. 아래에서 녹색의 세로선은 모집단의 평균값이고, 붉은색의 세로선은 3개로 이루어진 샘플의 평균값이다. 그리고 녹색 가로선은 3개의 샘플요소와 모집단평균과의 ($\mu$) 차이값들이고, 적색가로선은 3개의 샘플요소와 샘플평균과의 ($\overline{X}$) 차이값이다. 이 차이값들을 모아서 길이를 비교한 것이 그래프의 하단이다. 적색가로선 세개의 합이 녹색가로선 세개의 합보다 작다. +
 {{:pasted:20200412-002825.png?800}} {{:pasted:20200412-002825.png?800}}
  
Line 479: Line 279:
 \end{eqnarray*} \end{eqnarray*}
  
 +
 +----
 만약에 우리가 population의 variance를 구하듯이 n을 이용한다고 하면,  만약에 우리가 population의 variance를 구하듯이 n을 이용한다고 하면, 
  
Line 485: Line 287:
 & = & \dfrac{1}{n} E \left[\sum{(X_{i}-\overline{X})^{2}} \right] \\ & = & \dfrac{1}{n} E \left[\sum{(X_{i}-\overline{X})^{2}} \right] \\
 & = & \dfrac{1}{n} (n-1) \sigma^{2} \\ & = & \dfrac{1}{n} (n-1) \sigma^{2} \\
-& = & (\dfrac{n-1}{n}) \sigma^{2} \\+& = & \left(\dfrac{n-1}{n}\right) \sigma^{2} \\
 \end{eqnarray*} \end{eqnarray*}
  
Line 491: Line 293:
  
  
 +====== R 에서 SS값이 최소인 v값을 찾기 ======
 +<code>
 +#library(ggplot2)
 +#library(ggpmisc)
  
-{{tag>"research methods" "조사방법론" "표준편차" "n-1" "자유도" "degrees of freedom" "n-1" "표준오차"}}+rm(list=ls()) 
 +rnorm2 <- function(n,mean,sd) 
 +  mean+sd*scale(rnorm(n))  
 +}
  
 +# set.seed(191)
 +nx <- 20
 +mx <- 50
 +sdx <- mx * 0.15
 +x <- rnorm2(nx, mx, sdx)
 +
 +mean(x)
 +sd(x)
 +length(x)
 +hist(x)
 +
 +x.span <- seq(from = mean(x)-6*sd(x), 
 +              to = mean(x)+6*sd(x), 
 +              by = 0.1)
 +
 +residuals <- function(x, v) {
 +  return(x - v)
 +}
 +
 +ssr <- function(x, v) {
 +  residuals <- (x - v)
 +  return(sum(residuals^2))
 +}
 +
 +msr <- function(x, v) {
 +  residuals <- (x - v)
 +#  return((sum(residuals^2))/(length(x)-1))
 +  return((mean(residuals^2)))
 +}
 +
 +srs <- c() # sum of residuals
 +ssrs <- c() # sum of square residuals
 +msrs <- c() # mean square residuals = variance
 +vs <- c() # the value of v in (x - v)
 +
 +for (i in x.span) {
 +  res.x <- residuals(x,i)
 +  srs.x <- sum(res.x)  
 +  ssr.x <- ssr(x,i)
 +  msr.x <- msr(x,i)
 +  srs <- append(srs, srs.x)
 +  ssrs <- append(ssrs, ssr.x)
 +  msrs <- append(msrs, msr.x)
 +  vs <- append(vs, i)
 +}
 +plot(srs)
 +plot(msrs)
 +plot(srs)
 +
 +min(msrs)
 +min.pos.msrs <- which(msrs == min(msrs))
 +min.pos.msrs
 +print(vs[min.pos.msrs])
 +
 +plot(vs, msrs)
 +plot(vs, srs)
 +
 +
 +
 +# the above no gradient
 +# mse 값으로 계산 rather than sse 
 +# 후자는 값이 너무 커짐
 +
 +gradient <- function(x, v){
 +  residuals = x - v
 +  dx = -2 * mean(residuals)
 +  return(list("ds" = dx))
 +} # function returns ds value
 +
 +residuals <- function(x, v) {
 +  return(x - v)
 +}
 +
 +ssr <- function(x, v) {
 +  residuals <- (x - v)
 +  return(sum(residuals^2))
 +}
 +
 +msr <- function(x, v) {
 +  residuals <- (x - v)
 +  return((sum(residuals^2))/(length(x)-1))
 +#  return(mean(residuals^2))
 +}
 +
 +# pick one random v in (x-v)
 +v <- rnorm(1)
 +# Train the model with scaled features
 +learning.rate = 1e-1
 +
 +ssrs <- c()
 +msrs <- c()
 +mres <- c()
 +vs <- c()
 +# Record Loss for each epoch:
 +zx <- (x-mean(x))/sd(x)
 +
 +nlen <- 100
 +for (epoch in 1:nlen) {
 +  residual <- residuals(zx, v)
 +  ssr.x <- ssr(zx, v)
 +  msr.x <- msr(zx, v)
 +  ssrs <- append(ssrs, ssr.x)
 +  msrs <- append(msrs, msr.x)
 +  
 +  grad <- gradient(zx, v)
 +  
 +  step.v <- grad$ds * learning.rate
 +  v <- v - step.v
 +  vs <- append(vs, v)
 +}
 +
 +tail(srs)
 +tail(msrs)
 +tail(ssrs)
 +tail(vs)
 +
 +plot(srs)
 +plot(msrs)
 +plot(ssrs)
 +plot(vs)
 +# scaled
 +v
 +v.orig <- (v*sd(x))+mean(x) 
 +v.orig
 +
 +</code>
 +====== output ======
 +<code>
 +> #library(ggplot2)
 +> #library(ggpmisc)
 +
 +> rm(list=ls())
 +> rnorm2 <- function(n,mean,sd){ 
 ++   mean+sd*scale(rnorm(n)) 
 ++ }
 +
 +> # set.seed(191)
 +> nx <- 20
 +> mx <- 50
 +> sdx <- mx * 0.15
 +> x <- rnorm2(nx, mx, sdx)
 +
 +> mean(x)
 +[1] 50
 +> sd(x)
 +[1] 7.5
 +> length(x)
 +[1] 20
 +> hist(x)
 +
 +> x.span <- seq(from = mean(x)-6*sd(x), 
 ++               to = mean(x)+6*sd(x), 
 ++               by = 0.1)
 +
 +> residuals <- function(x, v) {
 ++   return(x - v)
 ++ }
 +
 +> ssr <- function(x, v) {
 ++   residuals <- (x - v)
 ++   return(sum(residuals^2))
 ++ }
 +
 +> msr <- function(x, v) {
 ++   residuals <- (x - v)
 ++ #  return((sum(residuals^2))/(length(x)-1))
 ++   return((mean(residuals^2)))
 ++ }
 +
 +> srs <- c() # sum of residuals
 +> ssrs <- c() # sum of square residuals
 +> msrs <- c() # mean square residuals = variance
 +> vs <- c() # the value of v in (x - v)
 +
 +> for (i in x.span) {
 ++   res.x <- residuals(x,i)
 ++   srs.x <- sum(res.x)  
 ++   ssr.x <- ssr(x,i)
 ++   msr.x <- msr(x,i)
 ++   srs <- append(srs, srs.x)
 ++   ssrs <- append(ssrs, ssr.x)
 ++   msrs <- append(msrs, msr.x)
 ++   vs <- append(vs, i)
 ++ }
 +> plot(srs)
 +> plot(msrs)
 +> plot(srs)
 +
 +> min(msrs)
 +[1] 53.4375
 +> min.pos.msrs <- which(msrs == min(msrs))
 +> min.pos.msrs
 +[1] 451
 +> print(vs[min.pos.msrs])
 +[1] 50
 +
 +> plot(vs, msrs)
 +> plot(vs, srs)
 +
 +
 +
 +> # the above no gradient
 +> # mse 값으로 계산 rather than sse 
 +> # 후자는 값이 너무 커짐
 +
 +> gradient <- function(x, v){
 ++   residuals = x - v
 ++   dx = -2 * mean(residuals)
 ++   return(list("ds" = dx))
 ++ } # function returns ds value
 +
 +> residuals <- function(x, v) {
 ++   return(x - v)
 ++ }
 +
 +> ssr <- function(x, v) {
 ++   residuals <- (x - v)
 ++   return(sum(residuals^2))
 ++ }
 +
 +> msr <- function(x, v) {
 ++   residuals <- (x - v)
 ++   return((sum(residuals^2))/(length(x)-1))
 ++ #  return(mean(residuals^2))
 ++ }
 +
 +> # pick one random v in (x-v)
 +> v <- rnorm(1)
 +> # Train the model with scaled features
 +> learning.rate = 1e-1
 +
 +> ssrs <- c()
 +> msrs <- c()
 +> mres <- c()
 +> vs <- c()
 +> # Record Loss for each epoch:
 +> zx <- (x-mean(x))/sd(x)
 +
 +> nlen <- 100
 +> for (epoch in 1:nlen) {
 ++   residual <- residuals(zx, v)
 ++   ssr.x <- ssr(zx, v)
 ++   msr.x <- msr(zx, v)
 ++   ssrs <- append(ssrs, ssr.x)
 ++   msrs <- append(msrs, msr.x)
 ++   
 ++   grad <- gradient(zx, v)
 ++   
 ++   step.v <- grad$ds * learning.rate
 ++   v <- v - step.v
 ++   vs <- append(vs, v)
 ++ }
 +
 +> tail(srs)
 +[1] -890 -892 -894 -896 -898 -900
 +> tail(msrs)
 +[1] 1 1 1 1 1 1
 +> tail(ssrs)
 +[1] 19 19 19 19 19 19
 +> tail(vs)
 +[1] 2.936258e-11 2.349006e-11 1.879204e-11 1.503363e-11 1.202690e-11 9.621523e-12
 +
 +> plot(srs)
 +> plot(msrs)
 +> plot(ssrs)
 +> plot(vs)
 +> # scaled
 +> v
 +[1] 9.621523e-12
 +> v.orig <- (v*sd(x))+mean(x) 
 +> v.orig
 +[1] 50
 +
 +
 +</code>
 +====== tags ======
 +{{tag>"research methods" "조사방법론" "표준편차" "n-1" "자유도" "degrees of freedom" "n-1" "표준오차"}}
  
estimated_standard_deviation.1607162773.txt.gz · Last modified: 2020/12/05 19:06 by hkimscil

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki