전산통계학 3주차 강의 - dnorm, pnorm, qnorm, rnorm, F test, T, var test

코딩 공부/R-전산 통계학 2019. 11. 14. 15:37
반응형

Statistical Distributions

 

dnorm

dnorm(x,mean,sd)       sd는 standard devaition 이므로 sigma^2 의 분포를 따르면 sigma 값만 적어줘야만 한다
dnorm(8,5,10)              교수님이 적어주신 f(x=n)=~~ 식만 보고도 구할 줄 알아야 한다"


pnorm

"X~N(5,10^2)을 따를 때, 분포표 상에서 우측에서부터 0.025의 영역 너비를 가지게끔 하는(=P(X,x0)=0.975)) 좌표 x0를 구할수 있는가?"
위의 0.975 식을 가지게끔 하는 식을 다시 변경하면,    P(z < (x0-5)/10 )=0.975
그런데 (x0-5)/10 = 1.96 <- standard normal 에서 찾는 거고, 이 값을 식에 대입해서 구하면 된다.
이거를 norm 식으로 구할수 있을까???
pnorm = "스탠다드 노말 분포표에서 왼쪽 끝에서부터 1.96까지의 좌표 영역너비를 뜻한다"


pnorm(1.96,0,1)
pnorm(1.96,0,1, lower.tail = T)
pnorm(1.96,0,1, lower.tail = F)            "lower.tail = 오른쪽 끝에서부터 영역 계산 ; 0.025값이 나온다."


<첨언>

응용문제로 -1.28~2.3 까지의 영역너비도 구할 수 있을까?
pnorm(2.3,0,1)-pnorm(-1.28,0,1)                     "0.9893-0.1003 을 직접적으로 계산해서 구함" 


qnorm (pnorm 과 짝꿍이다)

qnorm = "식에 너비값을 대입하면 그만큼 차지하게끔 하는 좌표가 나온다"
qnorm(0.88)


<문제>

응용문제로 가운데에서 부터 왼쪽 너비는 0.4 ; 오른쪽 너비는 0.32가 되게끔 하는 좌표를 찾고 , 두 점 사이의 거리도 같이 구하여라 
x1<-qnorm(0.82)
x2<- -qnorm(0.9) (또는  qnorm(0.1) 에 대해서 생각해도 상관없다))
x1-x2


<문제>

좀 더 심화시켜서 응용문제로 이제는 standard normal 이 아닌 N(5,10^2) 을 따를 때, 

가운데 영역이 0.94가 되게끔 되는 양쪽 점 좌표 및 거리도 구하여라
qnorm(0.94/2+0.5)
qnorm(0.94/2+0.5,lower.tail=F)


rnorm

rnorm(n,mean,sd) <- "X1...Xn ~ N(u,sigma^2) 을 의미함
rnorm(10,5,10)


t (t distribution)
qt ="t분포에서 너비를 입력하면 그만큼의 좌표가 나옴"
qt(0.023,21)
qt(0.99,21)
qt(0.5+0.31,15) ; qt(0.5-0.363,15)                이 두 명령어는 그럼 어떤 것을 구한 것인지 쉽게 알 수 있다


<첨언>

pt 는 어떤 의미일까? (norm 에서 이미 다뤘으므로, 추측 가능)


f distribution

"f분포는 degree of freedom 이 2개임을 수리통계학 시간에 배웠다"
qf(0.85,10,15)
qf(0.035,10,15)      <-"qt(1-0.035,10,15, lower.tail=F) 와 같이 써도 무관"


<문제>

응용문제로 시작점부터 0.1만큼의 면적을 가지게끔 하는 점에서 1.5의 거리뒤에 있는 좌표 x1을 구하고, x1의 오른쪽 영역 너비를 구하여라
x1<-qf(0.1,15,20)+1.5
x1
1-pf(x1,15,20)


alpha & d.f ?
alpha = 0.1  이라고 가정해보자
"수업시간에 반대영역은 역수하고 degree of freedom 을 뒤엎은 것임을 알고있다."
a<-qf(0.9,10,15)
b<-qf(0.1,15,10)

all.equal(a,1/b)              "두 값이 같은지를 확인"


<문제>

 "X~B(n=100, P=0.1" 을 따를 때," P(8<=X<=12) = f(X=8)+ ~ + f(x=12) = 바이노미얼 식" 을 함수로 만들 수 있겠는가?

choose(3,2)
a=dbinom(8,100,0.1)
b=choose(100,8)*(0.1)^8*(0.9)^92                          
all.equal(a,b)                                                           
pbinom(12,100,0.1) - pbinom(7,100,0.1)

 

함수식 만들기

sa<-function(n,p,x1,x2){
  yo=0
  for(i in x1:x2) {
    yo=yo+choose(n,i)*(p^i)*(1-p)^(n-i)
  }
  cat(yo)
}
sa(100,0.1,8,12) 

 

( Q ) cat은 생성한 함수의 결과값을 어떤 것으로 정리해서 나오게 할지 정하는 것이다, 따라서 cat을 안 쓴다면 함수의 마지막에 'yo'를 적자)


making function (program)

우선 x와 y의 데이터를 다음과 같이 주도록 하자 (교재 361p. 연습문제 13번)

#DATA

x<-c(1.79,1.87,1.62,1.96,1.75,1.74,2.06,1.69,1.67,1.94,1.33,1.70,1.65)
y<-c(2.39,2.56,2.36,2.62,2.51,2.29,2.58,2.41,2.86,2.49,2.33,1.94,2.14)

 

<문제>

"x가  1.5보다 작으면 0 ; 1.5이상~1.8미만이면 1 ; 1.8이상이면 2 (3개 조건부)" 가 되게끔 하는 프로그램을 짜보아라

x<-c(1.79,1.87,1.62,1.96,1.75,1.74,2.06,1.69,1.67,1.94,1.33,1.70,1.65)
for(i in 1:length(x)) { 
  if(x[i]<1.5) {x[i]<-0} 
  else if (x[i]>=1.5 & x[i]<1.8) {x[i]<-1}
  else {
    x[i]<-2
  }
  }

 


이번에는 "mm(x) 만 넣으면 mean값이 나오게끔 되는 함수 만들기"
mm=function(x){
  pro=0
  n=length(x)
  for (i in 1:n) {
    pro=pro+x[i]
  }
  cat(pro/n)
  }
mm(x)



"이번에는 s^2 이 나오게끔 하는 함수 식 만들기"
omg=function(x){
  hot=0
  for(i in 1: length(x)) {
    hot=hot+(x[i]-mean(x))^2
  }
  cat(hot/(n-1))
}
omg(x)   ; var(x)


Hyper Testing

"우선 두 그룹의 분산이 같은지 sigma 1^2 == sigma 2^2 임을 확인해보자

,그리고 f* 를 구해서 C.R 에 넣어 H_o 에 부정하는지 수긍하는지 에 대한 프로그램을 짤것이다"

1. "f*를 구하는 알고리즘"
fstar<-(var(x)/var(y))                  x,y 데이터는 위에 적혀있으니, 다시 입력해주어도 좋다
fstar

2. "Let a=0.05, f분포표에서 양쪽의 값을 구해보자"
alpha=0.05
q1=qf((alpha/2), (length(x)-1),length(y)-1)  ; qf(0.025,12,12)   
q2=qf((alpha/2), (length(x)-1),length(y)-1, lower.tail = F) ; qf(0.975,12,12)
q1
q2

3. "0.025~0.975 구간 안에 들어가면 accept H_o , 아니면 reject H_o 이게끔 하자"
ifelse (fstar>=q1 & fstar<=q2, "accept H0", "reject H0")


<문제>

위의 1~3 단계를 function 으로 만들어보자

sm <-  function(x1,x2,alpha) {
  fstar<-(var(x1)/var(x2))
  q1=qf((alpha/2), (length(x1)-1),length(x2)-1)
  q2=qf((alpha/2), (length(x1)-1),length(x2)-1, lower.tail = F) 
  ifelse (fstar>=q1 & fstar<=q2, "accept H0", "reject H0")
  }
sm(x1,x2,0.05)


var.test

"위에서는 (sigma 1^2 / sigma 2^2) = 1 (two-sided)  을 확인한 것이라면, 통상적으로 배울때 쓰는 l('엘')로 두고 한번 해보자"

?var.test                        ?+명령어(문) = R studio 내부의 가이드북을 볼 수 있도록 하니, 많이많이 쓰도록 하자

 var.test(x, y, ratio = 1, alternative = c("two.sided", "less", "greater")      명령어에서 각각 테스트의 1,2,3 중에 골라서 쓰는 것이다.
 conf.level = 0.95, ...) 은 유의 수준을 말한다.

var.test(x1,x2,ratio=1,alternative=c("two.sided"))  

명령어를 입력하면 fstar, degree of freedom, p-value, 1-a 에 해당하는 점 값 들이 나온다

뒤에 $를 붙이고 추가명령어를 쓰면 그 값만 나온다.
var.test(x1,x2,ratio=1,alternative=c("two.sided"))$'statistic'
var.test(x1,x2,ratio=1,alternative=c("two.sided"))$'p.value'


<문제>

 "f분포에서 0.5영역에 해당하는값 = b 로 두고 two-sided 에서 작은지 큰지를 구분 후, p.value 를 *2 해서 찾는 함수를 생성해라"

psm <- function(x1,x2,alpha) {
  fstar<-(var(x1)/var(x2))
  b <- qf(0.5,(length(x1)-1),length(x2)-1)
if(fstar < b) {oh<- pf(fstar,(length(x1)-1),length(x2)-1)}
else if (fstar > b) {oh<-(1- pf(fstar,(length(x1)-1),length(x2)-1))
}
  oh*2
}
psm(x1,x2,0.05)
all.equal (var.test(x1,x2,ratio=1,alternative=c("two.sided"))$'p.value', psm(x1,x2,0.05) )


그렇다면 이번에는 confidene interval (= 신뢰구간) 양쪽을 구하는 함수도 만들어 볼 수 있겠죠?

 

TAG