데이터 전처리/R

R에서 포아송분포,매클로린급수 그리기

JSMATH 2024. 8. 2. 18:19

https://pastryofjsmath.tistory.com/53

 

R에서 for문 안에 함수를 정의하면 생기는 문제

매우 쉬운 문제입니다. x의 범위를 [0,1]에서 점별수렴성을 본다면 n->inf일 때 0으로 수렴하겠죠.하지만 괴랄한 수식의 수렴성을 판단 할 때도 있지 않을까해서 이 문제를 가지고 시각화 코드를 짜

pastryofjsmath.tistory.com

https://pastryofjsmath.tistory.com/54

 

R에서 for문 밖에 함수를 정의하면 생기는 문제

https://pastryofjsmath.tistory.com/53inf일 때 0으로 수렴하겠죠.하지만 괴랄한 수식의 수렴성을 판단 할 때도 있지 않을까해서 이 문제를 가지고 시각화 코드를 짜" data-og-host="pastryofjsmath.tistory.com" data-og-s

pastryofjsmath.tistory.com

for문과 정의함수가 왜 이렇게 짜지는지 모르시겠다면 위의 글을 참조하세요.

#포아송분포 람다값에 따라 그려보기####
library(ggplot2)
poi <- function(x) (exp(-lambda)*lambda^2)/factorial(x)
poi <- NULL
for( i in 1:10){
  poi <- c(poi,local({
    lambda <- i
    function(x) (exp(-lambda)*lambda^x)/factorial(x)
  }))
}
x <- seq(0,20,by=1)
df_list <- lapply(1:10,function(col){
  data.frame(x=x,y=poi[[col]](x),function_name = paste0('f(x,lambda=',col,')'))
})
df <- do.call(rbind,df_list)
ggplot(df,aes(x = x,y=y,color=function_name))+
  geom_line()+
  labs(title='Poisson dist. lambda=1,2,3,..,10',x='x',y='y')+
  theme_minimal()

 

#멱급수 그려보기####
#sum_{n=0} (1/factorial(n))*x^n
# 항을 늘려가야함.
#안되는예시#### 
power_serize 
sums<- 0 
for(i in 1: 15){
  sums <- sums + function(x) (1/factorial(i))*x^i
}
#되는예시####
power_serize <- function(n){
  sums<-0
  for(i in 1:n){
    sums <- sums + (1/factorial(i))*x^i
  }
  return(sums)
}
power_serize()
#20항까지 만들어서 e^x 그래프와 유사한지 확인하라.
x <- seq(-10,10,by=1)
df2 <- data.frame(x=x,y=power_serize(20))

View(df2)
ggplot(df2,aes(x=x,y=y,color='red'))+
  geom_line()+
  geom_vline(xintercept = 0,color='black')+
  geom_hline(yintercept = 0,color='black')

power_serize()라는 함수의 변수는 n(=i)에 해당합니다. 20항까지 만들어서 하려면 n=20이면 됩니다. 

20개의 항에서의 급수

 

#10개에서 20개의 항을 이용하여
#각 항 마다의 그래프는 어떻게 될지 확인하라.
df2_list <- lapply(10:14,function(col){
  data.frame(x=x,y=power_serize(col),function_name = paste0('p(',col,')'))
})
df2 <- do.call(rbind,df2_list)

ggplot(df2,aes(x=x,y=y,color=function_name))+
  geom_line()+
  geom_vline(xintercept = 0,color='black')+
  geom_hline(yintercept = 0,color='black')+
  theme_minimal()

lapply부분을 들여다보면 power_serize() = p()라고 할 때

p(1) = x, p(2) = x +1/2! x^2 , p(3) x+1/2! x^2 + 1/3! x^3 ...

x의 범위를 [-10,10]으로 지정해둔 상태에서 p(1),p(2) .. 를 입력하면

p(1)=x에서의 [-10,10]의 값이 y로 list형태로 1개

p(2) = x+ 1/2! x^2 에서의 [-10,10]의 값이 y로 list형태로 1개

... 반복.

위에서는 10:14이니까 p(10),p(11),p(12),p(13),p(14)를 각 정의역 마다 반복한다고 보시면됩니다.

#위의 매크로린 급수는 exp(x)에 근삿값이다. exp(x)와 비교해서 그래프를 그려라.
exp_x<- function(x) exp(x)
exp_df <- data.frame(x=x,y=exp_x(x),function_name='exp')
new_df <- rbind.data.frame(df2,exp_df)

new_df$function_name<-as.factor(new_df$function_name)
str(new_df$function_name)
p<- ggplot(new_df,aes(x=x,y=y,color=function_name))+
  geom_line()+
  geom_vline(xintercept = 0,color='black')+
  geom_hline(yintercept = 0,color='black')+
  theme_minimal()
p+geom_line(data=new_df[new_df$function_name=='exp',],aes(x=x,y=y),color='red',lwd=1.5)