전산통계학 7주차 강의 - Attributes, class, do.call, RCBD, RCD, scheffe, bonferroni

코딩 공부/R-전산 통계학 2019. 11. 17. 18:08
반응형

Inf or NaN
1/0
1/Inf
0/0 

 

R에서도 infinite , not a number 이 존재함을 볼 수 있다


is
is.na(0/0) 

"na == Not available ; 모른다 , 사용할 수 없다"
is.nan(0/0)
"na > nan ; na가 포함하는 + 더 큰 개념"



x <- c(1, 2, NA, 10, 3)
is.na(x) 
is.nan(x)
"두 결과가 다른 이유는? , NA와 NaN의 차이로 생각하면 됨"


<첨언>

명령어를 입력해보고 어떤 결과가 나오는지 확인해보자

x <- c(1, 2, NaN, NA, 4)
is.na(x) 
is.nan(x)


<문제>

! 가 붙고, 붙지않고 의 의미를 파악해보자

x <- c(1, 2, NA, 4, NA, 5)
bad <- is.na(x)
bad
x[bad]
x[!bad]


data type (numeric, character, logical)

x <- vector("numeric",length = 10)
x

x <- vector("character",length = 10)
x

x <- vector("logical",length = 10)
x


세 타입의 상하관계 ?

y <- c(1, "a")
  ; "벡터에 숫자(뉴메릭) 와 문자(캐릭터)가 들어가면 문자로 다 인식해버림"
class(y)

y <- c(FALSE, 2)
  ;"로지칼과 뉴메릭이 같이 들어가면 뉴메릭으로 다 인식해버림  ,  TRUE=1, FALSE=0"
class(y)

y <- c("a", TRUE)
y   ; "로지칼 < 캐릭터" 
class(y)


as

x <- 0:6
class(x)              x의 타입을 확인할 수 있다


as.numeric(x)
as.logical(x)
as.character(x)
as.complex(x)
class(as.complex(x))


<첨언>

다음 명령어를 입력해보고, 실행 여부를 확인 후에 의미를 파악해보자

x <- c("a", "b", "c")
as.numeric(x)
as.logical(x)


attributes

x <- cbind(a = 1:3, pi = pi)
x
attributes(x)

dim(m)                     "attributes 에 비해서 몇행,몇열인지만 가르쳐줌"

attributes(m)            "m 에 대해서 더 자세한 내용"


m <- matrix(nrow = 2, ncol = 3)

"missing value ; 빈 공간이다"


<첨언>

캐릭터 사이에도 비교(상하관계) 를 할 수 있을까?

x <- c("a", "b", "c", "c", "d", "a")
x[x > "a"]

u <- x > "a"
u                                 
 ;  "캐릭터 사이도 비교를 해주었다"


<문제>

다음 명령어를 입력하면, 값은 동일하게 나옴을 확인할 수 있다. 도대체 무슨 차이가 있는걸까?

(사진을 보면 알 수 있듯이, 스칼라와 매트릭스 꼴로 나와있다, 어떤 명령어가 그렇게 만들었을까?)

 


do.call(funname, args)  (다른 함수에서 이미 썻던 함수를 불러오는 것)

f<- function(x) print (x^2)
f(5)
do.call(f,list(5)) 

 

"만약 f 함수의 변수가 2개였다면 list 안에 값도 2개를 넣어여함"
g<-function(x,y) print(x^2+y)
g(1,5)
do.call(g,list(1,5))


R.C.D ANOVA (randomized complete design)

DATA는 교재의 '514p. ANOVA - RCD ; 석탄문제' 로 할 것이다
#DATA
y=list()
y[[1]]<-c(1.51, 1.92, 1.08, 2.04, 2.14, 1.76, 1.17)
y[[2]]<-c(1.69, 0.64, 0.90, 1.41, 1.01, 0.84, 1.28, 1.59)
y[[3]]<-c(1.56, 1.22, 1.32, 1.39, 1.33, 1.54, 1.04, 2.25, 1.49)
y[[4]]<-c(1.30, 0.75, 1.26, 0.69, 0.62, 0.90, 1.20, 0.32)
y[[5]]<-c(0.73, 0.80, 0.90, 1.24, 0.82, 0.72, 0.57, 1.18, 0.54, 1.30)
y

smanova<-function(y) {
  k<-length(y)
  n<-c()
  t<-c()

  for (i in 1:k) {
    n[i] <- length (y[[i]]) 
    t[i] <- sum(y[[i]])
  }
  
  N<-sum(n)
  t..<-sum(t)
  tn<-c()
  
  for (i in 1:k) {
   tn[i]<- sum(t[i]^2/n[i])
  }
  sstrt<-sum(tn)-(t..^2)/N
  
  yij<-0
  
  for (i in 1:k) {
    for (j in 1:n[i]) {
      yij<-yij+(y[[i]][j])^2
    }
    yij
  }
  sstot <- yij-(t..^2)/N
  sse <- sstot-sstrt

  mstrt <- sstrt/(k-1)
  mse   <- sse/(N-k)
  
  fstar <- (mstrt/mse)
  pvalue <- pf(fstar, (k-1), (N-k), lower.tail = F)
  
  cat ("fstar=",fstar,"    pvalue=",pvalue)
}
 smanova(y)


<첨언>

위에서는 데이터를 list를 채워서 넣는 방법이였더라면 (2019년 방식)

, 데이터 안에서 나누는 방법도 존재합니다 (2018년 방식)

 

x <-c(rep(1,7),rep(2,8),rep(3,9),rep(4,8),rep(5,10))
y<-c(1.51, 1.92, 1.08, 2.04, 2.14, 1.76, 1.17,
     1.69, 0.64, 0.9, 1.41, 1.01, 0.84, 1.28, 1.59, 
     1.56, 1.22, 1.32, 1.39, 1.33,1.54, 1.04, 2.25, 1.49, 
     1.30, 0.75, 1.26, 0.69, 0.62, 0.90, 1.20, 0.32, 
     0.73, 0.80, 0.90, 1.24, 0.82, 0.72, 0.57, 1.18, 0.54, 1.30)

 

z <- data.frame(y,factor(x))

x를 factor 로써 y안의 데이터를 1~5까지 나누어서 분류하고 있음을 알 수 있다


R.C.B.D ANOVA (randomized complete block design)

DATA는 교재의 '535p. 예제 13.5.1 ; ANOVA - RCBD ; 버스+타이어사 문제' 로 할 것이다
#DATA
x<-matrix(c(9.1,17.1,20.8,11.8,
            13.4,20.3,28.3,16.0,
            15.6,24.6,23.7,16.2,
            11.0,18.2,21.4,14.1,
            12.7,19.8,25.1,15.8) ,  nrow = 5, ncol = 4,byrow = T)

smanova<- function (x,alpha1, alpha2) {
  b<-nrow(x) ; k<-ncol(x)
  t..<-sum(x)
  
  ti.<-apply(x,2,sum) 
  sstrt<-sum(ti.^2/b) - t..^2/(k*b)
  
  t.i<-apply(x,1,sum) 
  ssblock<-sum(t.i^2/k) - t..^2/(k*b)
  
  sstotal <- sum(x^2) -t..^2/(k*b) 
  sserror <- sstotal-(sstrt+ssblock)

 


"Mean Square"

mstrt <- sstrt/(k-1)
msblock <- ssblock/(b-1)
mserror <-  sserror/((k-1)*(b-1))


"F star"
f1star <- mstrt/mserror
f2star <- msblock/mserror

pvalue1 <- pf(f1star,(k-1),(k-1)*(b-1),lower.tail = F)
pvalue2 <- pf(f2star,(b-1),(k-1)*(b-1),lower.tail = F)


ifelse (pvalue1<alpha1, A<-"test1 is reject H0" , A<-"test1 is accept H0")
ifelse (pvalue2<alpha2, B<-"test2 is reject H0" , B<-"test2 is accept H0")

cat("f1star=",f1star, "#1.pvalue=",pvalue1, "result:",A,
    "\nf2star=",f2star, "#2.pvalue=",pvalue2, "result:",B)
}
smanova(x,0.1,0.05)

아마 필자의 코딩을 보고 좀 어색하거나, 찝찝~한 명령문들이 몇 개 보였다면 알아차린 분들은 정말 수리통계학을 열심히 배우고 공부하는 사람들이라고 말씀드리고 싶군요... 사실 R상에서는 큰 문제 없이 돌아가지만, 그래도 독자들이 직접 만들때는 올바른 문자를 쓰시길....

(못 알아차렸다면, R.C.B.D 의 데이터 구성은 어떻게 되있고, treatment 와 block 의 범위를 생각하고 T 의 문자를 다시한번 봅시다)

필자가 했던 밑의 <문제>도 같은 문자를 썼으니, 독자들은 꼭 올바르게 고쳐서 코딩을 해봅시다


<문제>

수리 통계학 시간 때, 아마도 reject H0 이후에 각 그룹별로 어떻게 차이나는지 검증하는 '1. Bonferroni' 와 '2. Scheffe' 를 배웠을 것이다

이 것도 프로그램화 시킬 수 있을 것이다

 

2019년에는 '1. Bonferroni' 를 했었으니, 예시로 보여주겠다 (그러니까, 2. Scheffe 를 해보도록 합시다~ ^^)

smanova<- function (x,overallalpha,c) {
  b<-nrow(x) ; k<-ncol(x)
  t..<-sum(x)
  
  ti.<-apply(x,2,sum) 
  sstrt<-sum(ti.^2/b) - t..^2/(k*b)
  
  
  t.i<-apply(x,1,sum) 
  ssblock<-sum(t.i^2/k) - t..^2/(k*b)
  sstotal <- sum(x^2) -t..^2/(k*b) 
  sserror <- sstotal-(sstrt+ssblock)
  
  
  "Mean Square"
  
  mstrt <- sstrt/(k-1)
  msblock <- ssblock/(b-1)
  mserror <-  sserror/((k-1)*(b-1))
  
  
  "F star"
  f1star <- mstrt/mserror
  f2star <- msblock/mserror
  
  pvalue1 <- pf(f1star,(k-1),(k-1)*(b-1),lower.tail = F)
  pvalue2 <- pf(f2star,(b-1),(k-1)*(b-1),lower.tail = F)
  
  ifelse (pvalue1<(overallalpha/c), A<-"test1 is reject H0" , A<-"test1 is accept H0")
  ifelse (pvalue2<(overallalpha/c), B<-"test2 is reject H0" , B<-"test2 is accept H0")
  
  cat("f1star=",f1star, "#1.pvalue=",pvalue1, "result:",A,
      "\nf2star=",f2star, "#2.pvalue=",pvalue2, "result:",B)
}

smanova(x,0.1,2)

TAG