2021년 1학기 R입문 기말고사 예상문제 (ver 0.71)
아래와 같은 수식을 고려하자.
$$y_i= 1.5+ 5\sin(t_i)+ 3 \cos(4 t_i)+\epsilon_i, \quad i=1,2,\dots, 1000$$
여기에서 $t_i=\frac{2\pi i}{1000}$ 이다. 그리고 $\epsilon_i \sim i.i.d~ N(0,1)$, 즉 서로 독립인 표준정규분포에서 추출된 샘플이다.
epsilon = rnorm(1000, 0, 1)
head(epsilon)
(2)
$\big\{\sin(t_i) \big\}_{i=1}^{1000}$와 $\big\{\cos(4t_i) \big\}_{i=1}^{1000}$를 각각 생성하고 이를 ${\bf x}_1$와 ${\bf x}_2$에 저장하라. 즉 아래와 같은 2개의 벡터를 생성하라.
- ${\bf x}_1=\big(\sin(\frac{2\pi}{1000}),\sin(\frac{4\pi}{1000}),\dots,\sin(2\pi)\big)$
- ${\bf x}_2=\big(\cos(\frac{8\pi}{1000}),\cos(\frac{16\pi}{1000}),\dots,\cos(8\pi)\big)$
t = c()
for (i in 1:1000) t[i] = (2*pi*i)/1000
head(t)
x1 = c()
for(i in 1:1000) x1[i] = sin(t[i])
head(x1)
x2 = c()
for(i in 1:1000) x2[i] = cos(4*t[i])
head(x2)
y = c()
for(i in 1:1000) y[i] = 1.5+5*x1[i]+3*x2[i]+epsilon[i]
head(y)
plot(t,y)
x0 = rep(1, times = 1000)
head(x0)
X = cbind(x0, x1, x2)
head(X)
b = rbind(1.5, 5, 3)
b
rl = X %*% b
plot(t,y)
points(t, rl, type = 'l', lwd = 5, col = "red")
여기에서 ${\bf X}$와 ${\bf y}$는 각각 아래와 같다.
- ${\bf X}=\begin{bmatrix} 1 & \sin(\frac{2\pi}{1000}) & \cos(\frac{4\pi}{1000})\\ 1 & \sin(\frac{8\pi}{1000}) & \cos(\frac{16\pi}{1000})\\ \dots & \dots & \dots \\ 1 & \sin(2\pi) & \cos(8\pi)\\ \end{bmatrix}$, $\quad {\bf y}=\begin{bmatrix} y_1\\ y_2\\ \dots \\ y_{1000}\\ \end{bmatrix}$
또한 ${\bf X}^\top$는 ${\bf X}$의 전치행렬(transpose) 그리고 $({\bf X}^\top {\bf X})^{-1}$은 ${\bf X}^\top {\bf X}$의 역행렬을 의미한다.
X
y1 = cbind(y)
head(y1)
bhat = solve(t(X) %*% X) %*% t(X) %*% y1
bhat
print(cbind(c(b),c(bhat)))
bl = X %*% bhat
bl
plot(t,y)
points(t, rl, type = 'l', lwd = 5, col = "red")
points(t, bl, type = 'l', lwd = 5, lty = 2, col = "blue")
x=seq(-1.96, 1.96, 0.01)
y=(1/sqrt(2*pi))*exp((-1/2)*x^2)
min(y)
max(y)
plot(x,y,type = 'l')
xx = runif(10000, -2, 2)
yy = runif(10000, 0.05, 0.40)
plot(xx,yy)
plot(xx, yy)
lines(x,y,col = 'red', lwd = 3)
test = function(xx,yy){
yy < (1/sqrt(2*pi))*exp((-1/2)*xx^2)
}
print(c(xx[1],yy[1]))
print((1/sqrt(2*pi))*exp((-1/2)*xx[1]^2))
test(xx[1],yy[1])
plot(xx,yy,col='gray')
lines(x,y,col='red',lwd=3)
points(xx[1],yy[1], col='blue')
points(xx[1],(1/sqrt(2*pi))*exp((-1/2)*xx[1]^2), col = 'red')
tst = c()
for (i in 1:10000) tst[i] = test(xx[i], yy[i])
head(tst)
plot(xx,yy,col='gray')
lines(x,y,col='red', lwd=3)
points(xx[tst],yy[tst],col='red')
sum(tst)
sum(tst)/10000 * 4*0.4
X = rnorm(1000)
head(X)
Z = c()
for (i in 1:1000) Z[i] = -1.96 < X[i] & X[i] < 1.96
Z
sum(Z)
10명의 참가자가 (유리,강화유리)의 쌍으로 이루어진 징검다리를 건너는 게임을 시작한다. (유리,강화유리)의 쌍은 총 20개 있다. 따라서 유리는 총 40장이 있다. 참가자는 강화유리로 된 징검다리를 밟으면 살아남지만 유리로 된 징검다리를 밟으면 죽는다. 10명의 참가자의 특징은 아래와 같다.
- 1번~8번 참가자, 10번 참가자: 50퍼센트의 확률로 강화유리를 고를 수 있다.
- 9번 참가자: 95퍼센트의 확률로 강화유리를 고를 수 있다.
다리를 건너는 순서는 아래와 같이 번호의 오름차순으로 건너는 방법과 번호의 내림차순으로 건너는 2가지 방법이 있다고 하자.
- Type A: 10번 참가자부터 다리를 건너고 그 뒤로 9번, 8번, ... 1번 순으로 다리를 건넌다.
- Type B: 1번 참가자부터 다리를 건너고 그 뒤로 2번, 3번, ... 10번 순으로 다리를 건넌다.
8번 참가자는 Type A 와 Type B 중 어떠한 경우에 살아남을 확률이 높은가?
library(tidyverse)
rm(list=ls())
SIMULATE1 = function(){
### 변수들의 모음
ARR = c('N1','N2','N3','N4','N5','N6','N7','N8','N9','N10')
SURV = 10
PLAYER = ARR[SURV]
STAGE = 0
TOSSRSLT = NA
### Subfunction들의 모음
toss = function(p) rbinom(n=1,size=1,prob=p) %>% as.logical
reset = function(){
TOSSRSLT <<- NA
SURV <<- 10
STAGE <<- 0
PLAYER <<- ARR[SURV]
}
record = function(){
list(PRE_TOSSRSLT=TOSSRSLT, SURV=SURV, STAGE=STAGE, PLAYER=PLAYER)
}
go = function(){
PROB <<- 0.5+ (PLAYER=='N9')*0.45
TOSSRSLT <<- toss(PROB)
if (TOSSRSLT==FALSE) SURV <<- SURV - 1
STAGE <<- STAGE + 1
PLAYER <<- ARR[SURV]
}
gogo = function() for(i in 1:10) go()
gogo_history = function(){
rslt_ = as_tibble(record()) ## go를 시작하기전의 결과가 티블로 만들어짐
for(i in 1:10){
go()
rslt_ = rbind(rslt_, as_tibble(record()))
}
print(rslt_)
}
simulate_once = function(){
reset()
gogo()
return(record()$SURV )
}
### BODY
simrslt = c()
for (i in 1:1000) simrslt[i] = simulate_once() > 7
sum(simrslt)
}
rslt1 = SIMULATE1()
rslt1/1000*100
SIMULATE2 = function(){
### 변수들의 모음
ARR = c('N10','N9','N8','N7','N6','N5','N4','N3','N2','N1')
SURV = 10
PLAYER = ARR[SURV]
STAGE = 0
TOSSRSLT = NA
### Subfunction들의 모음
toss = function(p) rbinom(n=1,size=1,prob=p) %>% as.logical
reset = function(){
TOSSRSLT <<- NA
SURV <<- 10
STAGE <<- 0
PLAYER <<- ARR[SURV]
}
record = function(){
list(PRE_TOSSRSLT=TOSSRSLT, SURV=SURV, STAGE=STAGE, PLAYER=PLAYER)
}
go = function(){
PROB <<- 0.5+ (PLAYER=='N9')*0.45
TOSSRSLT <<- toss(PROB)
if (TOSSRSLT==FALSE) SURV <<- SURV - 1
STAGE <<- STAGE + 1
PLAYER <<- ARR[SURV]
}
gogo = function() for(i in 1:10) go()
gogo_history = function(){
rslt_ = as_tibble(record()) ## go를 시작하기전의 결과가 티블로 만들어짐
for(i in 1:10){
go()
rslt_ = rbind(rslt_, as_tibble(record()))
}
print(rslt_)
}
simulate_once = function(){
reset()
gogo()
return(record()$SURV )
}
### BODY
simrslt = c()
for (i in 1:1000) simrslt[i] = simulate_once() > 2
sum(simrslt)
}
rslt2 = SIMULATE2()
rslt2/1000*100
아래는 한국의 코로나확진자 발생수를 tibble로 불러오는 코드와 그 결과이다.
library(tidyverse)
df=read_csv('https://raw.githubusercontent.com/guebin/2021IR/master/_notebooks/covid19.csv')
head(df)
year1 = df %>% filter(year == 2020 | year == 2021)
total_cases = year1 %>% summarize(sum_cases = sum(cases))
total_cases
즉 아래를 각각 계산하고 2020년 2월1일 ~ 2020년 2월15일 기간동안 발생한 확진자의 합이 가장 큰 지역을 찾으면 된다.
- 2020년2월1일 ~ 2020년2월15일 기간 서울에서 발생한 확진자의 합 = 2020년2월1일 서울에서 발생한 확진자수 + ... + 2020년2월15일 서울에서 발생한 확진자수
- ...
- 2020년2월1일 ~ 2020년2월15일 기간 제주에서 발생한 확진자의 합 = 2020년2월1일 제주에서 발생한 확진자수 + ... + 2020년2월15일 제주에서 발생한 확진자수
year2 = df %>% filter(year == 2020 & month == 2 & day > 0 & day < 16 )
prov_cases1 = year2 %>% group_by(prov) %>% summarize(sum_cases = sum(cases)) %>% arrange(desc(sum_cases)) %>% head(1)
prov_cases1
즉 아래를 각각 계산하고 2020년 2월16일 ~ 2020년 2월29일 기간동안 발생한 확진자의 합이 가장 큰 지역을 찾으면 된다.
- 2020년2월16일 ~ 2020년2월29일 기간 서울에서 발생한 확진자의 합 = 2020년2월16일 서울에서 발생한 확진자수 + ... + 2020년2월29일 서울에서 발생한 확진자수
- ...
- 2020년2월16일 ~ 2020년2월29일 기간 제주에서 발생한 확진자의 합 = 2020년2월16일 제주에서 발생한 확진자수 + ... + 2020년2월29일 제주에서 발생한 확진자수
year3 = df %>% filter(year == 2020 & month == 2 & day > 15 & day < 30 )
prov_cases2 = year3 %>% group_by(prov) %>% summarize(sum_cases = sum(cases)) %>% arrange(desc(sum_cases)) %>% head(1)
prov_cases2