'args=list(df=1))'에 해당되는 글 2건

  1. 2015.09.30 R 카이제곱 분포 (chi-squared distribution) : chisq() 2
  2. 2015.09.24 R t-분포 (Student’s t-distribution) : t()

연속형 확률분포 (Continuous probability distribution)에는

 

 - 정규분포 (normal distribution)

   : norm()

 

 - 균등분포 (uniform distribution)

   : unif()

 

  - 지수분포 (exponential distribution)

   : exp()

 

 - t-분포 (t-distribution)

   : t()

 

 - F-분포 (F-distribution)

   : f()

 

  - 카이제곱분포(chisq-distribution)

   : chisq()

 

등이 있습니다.  

 

표본분포를 나타낼 때 t-분포, F-분포, 카이제곱 분포 등을 사용하는데요, 이번 포스팅에서는 이중에서 카이제곱 분포 (chi-squared distribution)에 대해서 소개하도록 하겠습니다.

 

카이제곱 분포 (chi-squared distribution)은 k개의 서로 독립적이고 표준정규분포를 따르는 확률변수 X 를 제곱한 값들을 합하였을 때의 분포이며, 이때 k 는 자유도 (degrees of freedom) 로서 카이제곱 분포의 parameter 가 됩니다.

 

 

 

 

위에서 카이제곱 분포는 표본분포 중의 하나이며, 정규분포와도 관련이 있다고 했는데요, 카이제곱 분포 (chi-squared distribution)은 모집단의 분산에 대한 추정과 검정에 활용됩니다.  그리고 F-분포와도 관련이 있는데요, F-분포가 카이제곱 분포를 따르는 두 개의 확률변수를 가지고 자유도 2개를 parameter로 사용하는 분포이구요, 카이제곱 분포는 정규분포를 따르는 확률변수를 가지고 제곱해서 합한 값의 분포로서 자유도 1개만을 parameter로 사용하는 분포가 되겠습니다. 

 

 

R을 활용한 카이제곱 분포 함수 및 parameter는 다음과 같습니다. 그래프 모양부터 확인하고 함수를 하나씩 예를 들어보겠습니다.   카이제곱 분포를 활용해서 집단 독립성 여부 가설에 대해 검정하는 예도 마지막에 들어보겠습니다(이것이 카이제곱 분포 공부하는 이유! ^^).

 

함수 구분

함수 / parameter

 chisq()

  밀도함수

  (density function) 

d

  dchisq(df)

  누적분포함수

 (cumulative distribution function)

p

  pchisq(df, lower.tail=TRUE/FALSE)

  분위수 함수

 (quantile function)

q

  qchisq(df, lower.tail=TRUE/FALSE)

  난수 발생

  (random number generation)

r

  rchisq(n, df)

 

 

 

(1) 카이제곱 분포 그래프 (chi-squared distribution plot by degrees of freedom)
    : stat_function(fun=dchisq, args=list(df))

 

위의 카이제곱 분포 정의에서 보다시피 확률변수 Xi를 제곱한 값을 summation 한 값의 분포가 카이제곱 분포이므로 모두 + 값만을 가지고 되어 0 보다 오른쪽에 있게 됩니다.  (표준정규분포는 0을 중심으로 + 와 - 가 양분)  그리고 왼쪽으로 심하게 치우쳐 있고, 오른쪽으로 꼬리가 길게 늘어서 있습니다.  오른쪽으로 갈 수록 값이 큰 경우의 도수가 현저하게 줄어드고, 0 에 가까운 왼쪽으로 갈 수록 도수가 급격하게 증가하는, 심하게 왼쪽으로 쏠린 분포라고 하겠습니다.  자유도 k 에 따라서 그래프가 바뀌는 모양은 아래의 3개 case를 통해서 확인해보기 바랍니다. (자유도 3의 경우 F 분포와 모양이 유사하지요?)

 

 

> library(ggplot2)
> 
> 
> ggplot(data.frame(x=c(0,10)), aes(x=x)) +
+   stat_function(fun=dchisq, args=list(df=1), colour="black", size=1.2) +
+   geom_text(x=0.6, y=1, label="df=1") +
+    
+   stat_function(fun=dchisq, args=list(df=2), colour="blue", size=1.2) +
+   geom_text(x=0, y=0.55, label="df=2") +
+      
+   stat_function(fun=dchisq, args=list(df=3), colour="red", size=1.2) +
+   geom_text(x=0.5, y=0.05, label="df=3") +
+      
+   ggtitle("Chisq-Distribution")

 

 

 

 

 

 

(2) 누적 카이제곱 분포 그래프 (cumulative chi-squared distribution plot)

   : stat_function(fun=pchisq, args=list(df))

 

 

> # (2) 누적 카이제곱 분포 그래프 (cumulative chi-squared distribution plot) > > ggplot(data.frame(x=c(0,10)), aes(x=x)) + + stat_function(fun=pchisq, args=list(df=1), colour="black", size=1.2) + + geom_text(x=2.5, y=0.93, label="df=1") + + + stat_function(fun=pchisq, args=list(df=2), colour="blue", size=1.2) + + geom_text(x=2.5, y=0.77, label="df=2") + + + stat_function(fun=pchisq, args=list(df=3), colour="red", size=1.2) + + geom_text(x=2.5, y=0.45, label="df=3") + + + ggtitle("Cumulative Chisq-Distribution")

 

 

 

 

 

(3) 누적 카이제곱 분포 확률 값 계산 (chisq-distribution probability)

    : pchisq(q, df, lower.tail = TRUE)

 

 

> # (3) 누적 카이제곱 분포 확률 값 계산 (cumulative probability at q quantile of chisq-distribution) > pchisq(q=2.5, df=1, lower.tail = TRUE) [1] 0.8861537 >

> pchisq(q=2.5, df=2, lower.tail = TRUE)
[1] 0.7134952
> 
> pchisq(q=2.5, df=3, lower.tail = TRUE)
[1] 0.5247089
 

 

 

 

(4) 카이제곱 분포 분위수 계산 (quantile value for specific probability of chisq-distribution)

 : qchisq(p, df, lower.tail=TRUE) 

 

위 (3)번의 pchisq()와 역의 관계에 있는 아래 (4)번의 qchisq() 함수 예제는 아래와 같습니다.

 

 
> # (4) 카이제곱 분포 분위수 계산 (quantile value for specific probability of chisq-distribution)
> 
> qchisq(p=0.8861537, df=1, lower.tail = TRUE)
[1] 2.5
> 
> qchisq(p=0.7134952, df=2, lower.tail = TRUE)
[1] 2.5
> 
> qchisq(p=0.5247089, df=3, lower.tail = TRUE)
[1] 2.5

 

 

 

 

(5) 카이제곱 분포 난수 발생

 

> # (5) 카이제곱 분포 난수 발생 (chisq-distribution random number generation) : rchisq(n, df)
> 
> rchisq <- rchisq(n=100, df=2)
> rchisq
  [1]  5.55032676  0.11525963  2.07644124  0.51528086  0.11859888  0.42973604  0.70499599  0.14487303
  [9]  5.97267125  1.56690348  0.58191202  0.70909369  3.35827777  0.21920825  0.61245462  0.38701193
 [17]  0.24927629  1.57808212  0.88996040  0.64965766  0.25870279  1.49434540  3.54133658  0.42318565
 [25] 11.70768889  2.13877942  1.06981339  5.29613195  1.51610509  2.70021112  1.01412157  0.64321783
 [33]  0.12791346  0.34348613  3.98654362  0.66337839  5.49603471  2.08228802  0.03906119  1.58919877
 [41]  0.38777794  2.31990975  3.21569380  0.19971089  1.50807461  4.54283466  2.97805146  3.27722149
 [49]  3.22608707  3.59353437  6.00263483  2.61364942  0.40056050  2.41963582  0.33523347  2.36712127
 [57]  8.51839523  0.13128607  1.41192196  5.25834986  0.83043323  5.23781460  1.70021291  3.83561464
 [65]  4.29016862  2.77080963  0.73163409  9.30564564  0.68487159  1.74665897  3.43854539  1.57618785
 [73]  2.15393289  0.56409968  0.03347495  0.21295686  2.33164034  0.12940326  2.08870172  2.88493676
 [81]  0.28369908  6.03088340  0.15760641  0.67655815  1.46900015  0.41068896  3.06536991  0.48259672
 [89]  0.13034650  1.31484537  0.38220237  1.68373899  2.75310928  0.94021333  0.50195281  0.55858578
 [97]  2.15590237 11.30222464  1.45066890  0.09005381
> 
> hist(rchisq, breaks=20)

 

 

 

 

 

 

(6) 범주형 데이터에 대한 분할표와 카이제곱 검정 (contingency table and chisq-test for categorical data)

  : CrossTable(x, y, chisq = TRUE)

 

vcd 패키지에 들어있는, 류머티스 관점염 환자에 대한 신약 테스트 결과를 모아놓은 Arthritis 데이터 프레임을 가지고 예를 들겠습니다.  gmodels 패키지를 사용해서 분할표를 집계하고, chisq=TRUE 옵션을 추가해서 카이제곱 검정 (신약이 류머티즘성 관점염에 효과가 있는지 없는지, 독립적인지 아닌지) 을 해보았습니다.  p-value = 0.001462643  인 것으로  봐서는 유의수준 5% 에서 통계적으로 효과가 있다고 봐야겠네요. (효과가 없다는 귀무가설을 기각하고, 효과가 있다(즉 독립이 아니다)는 대립가설 채택)

 

> # (6) chisq-test
> library(gmodels)
> library(vcd)
> 
> str(Arthritis)
'data.frame':	84 obs. of  5 variables:
 $ ID       : int  57 46 77 17 36 23 75 39 33 55 ...
 $ Treatment: Factor w/ 2 levels "Placebo","Treated": 2 2 2 2 2 2 2 2 2 2 ...
 $ Sex      : Factor w/ 2 levels "Female","Male": 2 2 2 2 2 2 2 2 2 2 ...
 $ Age      : int  27 29 30 32 46 58 59 59 63 63 ...
 $ Improved : Ord.factor w/ 3 levels "None"<"Some"<..: 2 1 1 3 3 3 1 3 1 1 ...
> 
> attach(Arthritis)
> 
> CrossTable(Treatment, Improved, 
+            expected = TRUE, # expected frequency
+            chisq = TRUE) # chisq-test 

 
   Cell Contents
|-------------------------|
|                       N |
|              Expected N |
| Chi-square contribution |
|           N / Row Total |
|           N / Col Total |
|         N / Table Total |
|-------------------------|

 
Total Observations in Table:  84 

 
             | Improved 
   Treatment |      None |      Some |    Marked | Row Total | 
-------------|-----------|-----------|-----------|-----------|
     Placebo |        29 |         7 |         7 |        43 | 
             |    21.500 |     7.167 |    14.333 |           | 
             |     2.616 |     0.004 |     3.752 |           | 
             |     0.674 |     0.163 |     0.163 |     0.512 | 
             |     0.690 |     0.500 |     0.250 |           | 
             |     0.345 |     0.083 |     0.083 |           | 
-------------|-----------|-----------|-----------|-----------|
     Treated |        13 |         7 |        21 |        41 | 
             |    20.500 |     6.833 |    13.667 |           | 
             |     2.744 |     0.004 |     3.935 |           | 
             |     0.317 |     0.171 |     0.512 |     0.488 | 
             |     0.310 |     0.500 |     0.750 |           | 
             |     0.155 |     0.083 |     0.250 |           | 
-------------|-----------|-----------|-----------|-----------|
Column Total |        42 |        14 |        28 |        84 | 
             |     0.500 |     0.167 |     0.333 |           | 
-------------|-----------|-----------|-----------|-----------|

 
Statistics for All Table Factors


Pearson's Chi-squared test 
------------------------------------------------------------
Chi^2 =  13.05502     d.f. =  2     p =  0.001462643 


 
> 
> detach(Arthritis)

 

 

많은 도움 되었기를 바랍니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡'를 꾸욱 눌러주세요. ^^

 

 

728x90
반응형
Posted by Rfriend
,

 

연속형 확률분포 (Continuous probability distribution)에는

 

 - 정규분포 (normal distribution)

   : norm()

 

 - 균등분포 (uniform distribution)

   : unif()

 

  - 지수분포 (exponential distribution)

   : exp()

 

 - t-분포 (t-distribution)

   : t()

 

 - F-분포 (F-distribution)

   : f()

 

  - 카이제곱분포(chisq-distribution)

   : chisq()

 

등이 있습니다.  

 

표본분포를 나타낼 때 t-분포, F-분포, 카이제곱 분포 등을 사용하는데요, 이번 포스팅에서는 이중에서 t-분포 (Student's t-distribution)에 대해서 소개하도록 하겠습니다. 

 

스튜던트 t-분포 (Student's t-distribution)을 줄여서 t-분포 (t-distribution)라고 보통 부르곤 합니다.  스튜던트 t-분포 (Student's t-distribution)의 유래를 살펴보면 아래와 같습니다.

 

 

[ 스튜던트 t-분포 (Student's t-distribution)의 유래 ]

 

프리드리히 로베르트 헬메르트(독일어: Friedrich Robert Helmert)가 1875년에 도입하였다. 이듬해 야코프 뤼로트(독일어: Jacob Lüroth)도 같은 분포를 재발견하였다. 그러나 헬메르트와 뤼로트의 논문은 영문 학계에 널리 알려지지 않았다.
1908년에 윌리엄 고셋이 "스튜던트"(영어: Student, ‘학생’)라는 필명으로 1908년 재발견하였다. 고셋은 기네스 양조 공장에서 일했고, 맥주에 사용되는 보리의 질을 시험하기 위해 이 분포를 도입하였고, 경쟁사들에게 기네스의 획기적인 통계 기법을 숨기기 위해 필명을 사용하였다고 한다. 이후 저명한 통계학자인 로널드 피셔는 이 분포를 "스튜던트 분포"라고 불렀고, t라는 기호를 사용하였다. 피셔 이후 이 분포는 고셋의 필명을 따 "스튜던트 t 분포"로 알려지게 되었다.

 

   - source : wikipedia

 

 

 

 

정규분포에서는 모분산(σ2)을 알고 있다고 가정하는데요, 실전의 현실세계에서는 모분산(σ2)을 모르는 경우가 대부분이다보니 표본을 추출해서 표본분산(s2)을 계산하여 사용하는 경우가 다반사입니다.  이러다 보니 표준정규분포 통계량 Z 값을 사용할 수 없고 표본확률분포를 사용해야 하는데 그중의 하나가 T통계량을 사용하는 t-분포가 되겠습니다.

 

 

 

 

 

 

t-분포는 평균이 0 이고, 평균을 중심으로 좌우 대칭형태로 되어있으며, 정규분포보다 가운데의 높이가 조금 낮고 좌우의 옆 부분은 정규분포보다 조금 더 높은 형태를 취하고 있습니다.  t-분포는 자유가를 모수로 가지고 있으며, 자유도가 높을 수록, 즉 표본의 갯수가 증가할 수록 중심극한의 정리(central limit theorem)에 의해 정규분포에 근사하게 됩니다.  (보통은 표본의 갯수 30개를 기준으로 이보다 많으면 정규분포, 적으면 t-분포를 사용)

 

표본의 수가 많으면 모집단을 대표할 신뢰도가 높아지게 되어 좋기는 합니다만, 많은 경우는 비용과 시간의 한계로 인해서 한정된 수의 표본만을 추출해서 분석해야 하는 경우가 생기게 됩니다.  표본의 수가 적은 경우에 표본이 모집단의 어느 한쪽으로 쏠려서 추출될 경우 모집단을 잘 대표할 수 없는 신뢰도 이슈를 보완하기 위해서, 정규분포일 때보다 평균에서 양쪽으로 멀어지는 바깥쪽 부분의 확률의 수준을 더 높인 분포가 t-분포(t-distribution)이 되겠습니다.

 

아래에 정규분포와 t-분포를 겹쳐서 그려보았는데요, 위의 설명을 이해하는데 도움이 될 것입니다.

 

 

> install.packages("ggplot2") # install

> library(ggplot2)
> ggplot(data.frame(x=c(-3,3)), aes(x=x)) +
+   stat_function(fun=dnorm, colour="blue", size=1) +
+   stat_function(fun=dt, args=list(df=3), colour="red", size=2) +
+   stat_function(fun=dt, args=list(df=1), colour="yellow", size=3) +
+   annotate("segment", x=1.5, xend=2, y=0.4, yend=0.4, colour="blue", size=1) +
+   annotate("segment", x=1.5, xend=2, y=0.37, yend=0.37, colour="red", size=2) + 
+   annotate("segment", x=1.5, xend=2, y=0.34, yend=0.34, colour="yellow", size=3) + 
+   annotate("text", x=2.4, y=0.4, label="N(0,1)") +
+   annotate("text", x=2.4, y=0.37, label="t(3)") + 
+   annotate("text", x=2.4, y=0.34, label="t(1)") + 
+   ggtitle("Normal Distribution, t-distribution")
 

 

 

 

 

R에서 t-분포 (t-distribution)을 위해 사용하는 함수 및 Parameter는 아래와 같습니다.  정규분포(normal distribution)는 평균(mean)과 표준편차(sd)를 parameter로 사용하고, 균등분포(uniform distribution)는 구간의 최소값(min)과 최대값(max)를 parameter로 사용하며, 지수분포(exponential distribution)는 Lamda(λ, rate)를 parameter로 사용하는데 반해, t-분포(t-distribution)은 자유도(df, degrees of freedom) 를 parameter로 사용합니다.

 

참고로 자유도 (df, degrees of freedom)은 통계량을 구성하는 확률변수들 중에서 자유롭게 선택가능한 확률변수의 개수를 의미합니다. 

 

 

 함수 구분

함수/ Parameter 

t() 

  밀도함수

  (density function) 

  dt(x, df)

  누적분포함수

 (cumulative distribution function) 

p

  pt(q, df, lower.tail = TRUE/FALSE)

  분위수 함수

 (quantile function)

q

  qt(p, df, lower.tail = TRUE/FALSE)

  난수 발생

  (random number generation)

r

  rt(n, df)

 

 

R 함수를 차례대로 하나씩 예를 들어보겠습니다.

 

위에서 t분포 밀도함수 : dt(x, df) 의 그래프를 정규분포와 비교해서 그려보았으며, 아래에는 t-분포의 누적분포함수를 그래프로 그려보고 누적분포확률도 계산해보겠습니다.

 

(1) t분포 누적분포함수 그래프 : stat_function(fun = pt, args=list(df=1))

 

 

> # 누적 t분포 그래프 (Cumulative t-distribution plot) : fun=pt > ggplot(data.frame(x=c(-3,3)), aes(x=x)) + + stat_function(fun=pt, args=list(df=1), colour="brown", size=1.5) + + ggtitle("Cumulative t-Distribution : t(1)")

 

 

 

 

 

(2) t분포 누적분포함수 : pt(q, df, lower.tail = TRUE/FALSE)

 

위의 t(df=1) 그래프에서 x(-inf, 1) 범위의 누적분포확률은 0.75 임을 알 수 있습니다.

 

 

> # 누적 t분포 확률 값 계산 : pt(q, df, lower.tail=TRUE/FALSE) > pt(q=1, df=1, lower.tail = TRUE) [1] 0.75

 

 

 

 

(3) t분포 분위수 함수 : qt(p, df, lower.tail = TRUE/FALSE)

 

누적확률분포와 분위수 함수는 역의 관계에 있는데요, 위의 pt(q=1, df=1, lower.tail=T) = 0.75 였으므로, 누적확률분포값이 0.75가 되는 분위수 q는 '1'이 되는지 아래 R script로 확인해보겠습니다.

 

 

> # t분포 분위수 함수 값 계산 : qt(p, df, lower.tail=TRUE/FALSE) > qt(p=0.75, df=1, lower.tail = TRUE) [1] 1

 

 

 

 

(4) t분포 난수 발생 : rt(n, df)

 

마지막으로 t분포에서 rt(n, df) 함수를 이용해서 난수를 발생시켜보겠습니다.  난수는 매번 생성할 때마다 바뀌므로 매 시행마다 아래의 예제와는 조금씩 달라지게 됩니다만, 평균 0을 중심으로 좌우 대칭형태 (정규분포와 유사)를 띨 것입니다.

 

 

> rt <- rt(50, df=1)
> rt
 [1] -1.89734826 -1.40787172 -2.38022561 -0.21218535  0.71259957 -0.37759519 -0.46671360 -0.20455553
 [9] -0.54603347  2.88325761  0.13593286  0.09719242  1.35843796 -1.86861627  5.69879846  1.23054665
[17] -1.24953468 -0.76327864  1.87092396 -0.39719483 -0.42141574  0.10862682  0.54106231  0.30827837
[25] -1.25508149  0.54352324 -1.92825750  0.22491497 -0.63797793 -0.37089263  7.31876302  2.25023970
[33] -1.60455685 -1.64779189 -5.54583982 -8.82959795  0.53445244 -0.47451960 -2.52582931  1.57372391
[41]  2.30557669 -0.04118914 -0.71146732 -0.27621122 -7.29220086 -0.52472800 -0.78465027 -2.07649916
[49]  0.38322764 -1.71782797
>
> hist(rt, breaks=20)
 

 

 

 

많은 도움이 되었기를 바랍니다. 

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡'를 꾸욱 눌러주세요. ^^

 

 

728x90
반응형
Posted by Rfriend
,