一、大数定律
#函数四:大数定律的验证
###########大数定律,生成的数叫y2,要加和,直接生成叫y1
LLN <- function(m,n,fun='Normal',...){
#m是画图的抽样样本数(列向量),n是加和样本数-大样本(按行生成)
#Y1根据可加性规律直接生成m个样本,并标准化
#rf按照定义,生成m行n列个子样本
#sumrf按行求和得到m个所需要的样本,
#Y2 sumrf的标准化
args <- list(...)
####################################
if(fun=='Binomial'){
######参数说明dbinom(x, size, prob, log = FALSE)
#args[[1]]=p 伯努利分布EX=p,DX=pq
#Y1 <- (rbinom(m,n,args[[1]])-n*args[[1]])/sqrt(n*args[[1]]*(1-args[[1]]))
X <- matrix(rbinom(m*n, size=1, prob=args[[2]]), nrow = m,ncol = n) #n行m列矩阵,服从b(1,p)
g1 <- function(x){args[[2]]+3*sqrt(args[[2]]*(1-args[[2]])/x)}
g2 <- function(x){args[[2]]-3*sqrt(args[[2]]*(1-args[[2]])/x)}
miu <- args[[2]]
}else if(fun=='Poisson'){
######参数说明dpois(x, lambda, log = FALSE)
#args[[1]]=lamda 泊松分布 EX=lamda,DX=lamda
#Y1 <- (rpois(m,n*args[[1]])-n*args[[1]])/sqrt(n*args[[1]])
X <- matrix(rpois(m*n, lambda = args[[1]]), nrow = m,ncol = n) #m行n列矩阵,服从b(1,p)
g1 <- function(x){args[[1]]+3*sqrt(args[[1]]/x)}
g2 <- function(x){args[[1]]-3*sqrt(args[[1]]/x)}
miu <- args[[1]]
}else if(fun=='Normal'){
#####参数说明dnorm(x, mean = 0, sd = 1, log = FALSE)
#args[[1]]=miu,ard[[2]]=sigma^2 正态分布 EX=miu,DX=sigma^2
#Y1 <- (rnorm(m,n*args[[1]],sqrt(n)*args[[2]])-n*args[[1]])/(sqrt(n)*args[[2]])
X <- matrix(rnorm(m*n, mean = args[[1]], sd = args[[2]]), nrow = m,ncol = n) #n行m列矩阵,服从b(1,p)
g1 <- function(x){args[[1]]+3*args[[2]]/sqrt(x)}
g2 <- function(x){args[[1]]-3*args[[2]]/sqrt(x)}
miu <- args[[1]]
}else if(fun=='Gamma'){
#####参数说明dgamma(x, shape, rate = 1, scale = 1/rate, log = FALSE)
#args[[1]]=alpha,args[[2]]=lamda gamma分布 EX=alpha/lamda,DX=alpha^2/lamda
#Y1 <- (rgamma(m,n*args[[1]],args[[2]])-n*args[[1]]/args[[2]])/sqrt(n*args[[1]]/(args[[2]]^2))
X <- matrix(rgamma(m*n, shape = args[[1]], rate = args[[2]]), nrow = m,ncol = n) #n行m列矩阵,服从b(1,p)
g1 <- function(x){args[[1]]/args[[2]]+3*sqrt(args[[1]]/x)/args[[2]]}
g2 <- function(x){args[[1]]/args[[2]]-3*sqrt(args[[1]]/x)/args[[2]]}
miu <- args[[1]]/args[[2]]
}else if(fun == 'Chi-Aquared'){
#####参数说明dchisq(x, df, ncp = 0, log = FALSE)
#args[[1]]='n',卡方分布 EX='n',DX = '2n'
#Y1 <- (rchisq(m,n*args[[1]])-n*args[[1]])/sqrt(n*2*args[[1]])
X <- matrix(rchisq(m*n, df = args[[1]]), nrow = m,ncol = n) #m行n列矩阵,服从b(1,p)
g1 <- function(x){args[[1]]+3*sqrt(2*args[[1]]/x)}
g2 <- function(x){args[[1]]-3*sqrt(2*args[[1]]/x)}
miu <- args[[1]]
}
Y3 <- apply(X, 1, function(z)(cumsum(z)/seq_along(z)))
Y3 <- matrix(Y3,nrow = m*n,ncol = 1)
Y <- as.data.frame(cbind(rep(1:n,m),rep(1:m,each = n),Y3))
colnames(Y) <- c('num','sig','y3')
#画图
ggplot(Y) +
geom_line(
aes(x = num,
y = y3,
colour=sig,
group=sig
)
) +
stat_function(
data = data.frame(x = 1:n, Legend = factor(1)),
fun = g1,col = 'red',size = 1,linetype = 2
)+
stat_function(
data = data.frame(x = 1:n, Legend = factor(2)),
fun = g2,col = 'red',size = 1,linetype = 2
)+
geom_hline(
yintercept = miu,
#Legend = factor(1),
color = 'black',size = 1.5,linetype = 3
)+
labs(
title = 'Large Numbers Theorem ',
subtitle = fun,
x = 'n', y = 'rf'
) +
theme_light()+
theme(legend.position = 'none')
}
LLN(100,1000,fun = 'Binomial',size = 1,prob = 0.3)

LLN(100,1000,fun = 'Poisson',lambda = 2)

LLN(100,1000,fun = 'Normal',mean = 5, sd = 1.5)#正态分布标准化,n=1就可

LLN(100,1000,fun = 'Gamma',shape = 2, rate = 3)

LLN(100,1000,fun = 'Chi-Aquared',df = 3.5)

二、概率分布的可加性
#函数一:可加性验证
Add <- function(n = 2,m = 20000,fun='Normal',...){
#m是画图的抽样样本数,n是加和样本数-大样本
args <- list(...)
if(fun=='Binomial'){
######参数说明dbinom(x, size, prob, log = FALSE)
rf <- matrix(rbinom(m*n,args[[1]],args[[2]]),nrow = m,ncol = n,byrow = TRUE)
sumrf <- rowSums(rf)
x <- seq(500,1200,by = 1)
y <- dbinom(x,sum(args[[1]]),args[[2]][1])
}else if(fun=='Poisson'){
######参数说明dpois(x, lambda, log = FALSE)
rf <- matrix(rpois(m*n,args[[1]]),nrow = m,ncol = n,byrow = TRUE)
sumrf <- rowSums(rf)
x <- seq(0,50,by = 1)#必须是整数
y <- dpois(x,sum(args[[1]]))
}else if(fun=='Normal'){
#####参数说明dnorm(x, mean = 0, sd = 1, log = FALSE)
rf <- matrix(rnorm(m*n,args[[1]],args[[2]]),nrow = m,ncol = n,byrow = TRUE)
sumrf <- rowSums(rf)
x <- seq(-50,50,by = 0.1)
y <- dnorm(x,sum(args[[1]]),sqrt(sum(args[[2]]^2)))
}else if(fun=='Gamma'){
#####参数说明dgamma(x, shape, rate = 1, scale = 1/rate, log = FALSE)
rf <- matrix(rgamma(m*n,args[[1]],args[[2]]),nrow = m,ncol = n,byrow = TRUE)
sumrf <- rowSums(rf)
x <- seq(0,20,by = 0.1)
y <- dgamma(x,sum(args[[1]]),args[[2]][1])
}else if(fun == 'Chi-Aquared'){
#####参数说明dchisq(x, df, ncp = 0, log = FALSE)
rf <- matrix(rchisq(m*n,args[[1]]),nrow = m,ncol = n,byrow = TRUE)
sumrf <- rowSums(rf)
x <- seq(0,50,by = 0.1)
y <- dchisq(x,sum(args[[1]]))
}
#画图
ggplot() +
geom_histogram(#绘制抽得的随机数直方图
aes(x = sumrf, y = ..density..),
bins = 30,
fill = 'cornflowerblue',
color = 'darkgrey'
) +
geom_line(#绘制抽样密度曲线【按行加和的】
aes(x = sumrf,color = 'red'),
stat = 'density',
size = 1.2
) +
geom_line(#绘制理论密度曲线【直接加和的版本】
aes(x = x,y = y,color = 'green'),
size = 1.2
) +
scale_colour_manual(
name = 'Legend',
values = c('red', 'green'),
labels = c( "Theoretical probability density","Sampling probability density")
) +
labs(#加题目,改x,y轴
title = 'Additivity of the density function',
subtitle = fun,
x = 'X-axis',
y = ' Density'
) +
theme_light() +
theme(legend.position = c(0.85,0.9))
}
Add(n=3,m=10000,fun='Binomial',Size = c(1000,2000,1500), Prob = 0.2)#Prob参数一样

Add(n=3,m=10000,fun='Poisson',Lamda = c(1,2,3))

Add(n=3,m=10000,fun='Normal',Mean = c(1,3,5),Sd = c(5,6,2))

Add(n=3,m=10000,fun='Gamma',Shape = c(5,4,6), rate = 7) #Rate参数一样

Add(n=3,m=10000,fun='Chi-Aquared',Df = c(10,15,4))

三、中心极限定理
#函数二:三条比较
Comp <- function(m,n,fun='Normal',...){
#m是画图的抽样样本数(列向量),n是加和样本数-大样本(按行生成)
#Y1根据可加性规律直接生成m个样本,并标准化
#rf按照定义,生成m行n列个子样本
#sumrf按行求和得到m个所需要的样本,
#Y2 sumrf的标准化
timestart<-Sys.time()#比较两种生成方法的
args <- list(...)
####################################
if(fun=='Binomial'){
######参数说明dbinom(x, size, prob, log = FALSE)
#args[[1]]=p 伯努利分布EX=p,DX=pq
timestart1<-Sys.time()
Y1 <- (rbinom(m,n,args[[2]])-n*args[[2]])/sqrt(n*args[[2]]*(1-args[[2]]))
timeend1<-Sys.time()
timestart2<-Sys.time()
rf <- matrix(rbinom(m*n,1,args[[2]]),nrow = m,ncol = n)
sumrf <- rowSums(rf)
Y2 <- (sumrf-n*args[[2]])/sqrt(n*args[[2]]*(1-args[[2]]))
timeend2<-Sys.time()
}else if(fun=='Poisson'){
######参数说明dpois(x, lambda, log = FALSE)
#args[[1]]=lamda 泊松分布 EX=lamda,DX=lamda
timestart1<-Sys.time()
Y1 <- (rpois(m,n*args[[1]])-n*args[[1]])/sqrt(n*args[[1]])
timeend1<-Sys.time()
timestart2<-Sys.time()
rf <- matrix(rpois(m*n,args[[1]]),nrow = m,ncol = n)
sumrf <- rowSums(rf)
Y2 <- (sumrf-n*args[[1]])/sqrt(n*args[[1]])
timeend2<-Sys.time()
}else if(fun=='Normal'){
#####参数说明dnorm(x, mean = 0, sd = 1, log = FALSE)
timestart1<-Sys.time()
Y1 <- (rnorm(m,n*args[[1]],sqrt(n)*args[[2]])-n*args[[1]])/(sqrt(n)*args[[2]])
timeend1<-Sys.time()
timestart2<-Sys.time()
rf <- matrix(rnorm(m*n,args[[1]],args[[2]]),nrow = m,ncol = n)
sumrf <- rowSums(rf)
Y2 <- (sumrf-n*args[[1]])/(sqrt(n)*args[[2]])
timeend2<-Sys.time()
}else if(fun=='Gamma'){
#####参数说明dgamma(x, shape, rate = 1, scale = 1/rate, log = FALSE)
timestart1<-Sys.time()
Y1 <- (rgamma(m,n*args[[1]],args[[2]])-n*args[[1]]/args[[2]])/sqrt(n*args[[1]]/(args[[2]]^2))
timeend1<-Sys.time()
timestart2<-Sys.time()
rf <- matrix(rgamma(m*n,args[[1]],args[[2]]),nrow = m,ncol = n)
sumrf <- rowSums(rf)
Y2 <- (sumrf-n*args[[1]]/args[[2]])/sqrt(n*args[[1]]/(args[[2]]^2))
timeend2<-Sys.time()
}else if(fun == 'Chi-Aquared'){
#####参数说明dchisq(x, df, ncp = 0, log = FALSE)
timestart1<-Sys.time()
Y1 <- (rchisq(m,n*args[[1]])-n*args[[1]])/sqrt(n*2*args[[1]])
timeend1<-Sys.time()
timestart2<-Sys.time()
rf <- matrix(rchisq(m*n,args[[1]]),nrow = m,ncol = n)
sumrf <- rowSums(rf)
Y2 <- (sumrf-n*args[[1]])/sqrt(n*2*args[[1]])
timeend2<-Sys.time()
}
#画图
x = seq(-7,7,by = 0.1)
Plot <- ggplot() +
geom_line(#绘制可加性抽样
aes(x = Y1,color = 'red'),
stat = 'density',
size = 1.2
) +
geom_line(#绘制单独抽样
aes(x = Y2,color = 'green'),
stat = 'density',
size = 1.2
) +
geom_line(#绘制理论密度曲线N(0,1)
aes(x = x,y = dnorm(x),color = 'blue'),
size = 1.2
) +
scale_colour_manual(
name = 'Legend',
values = c('red', 'green','blue'),
labels = c( "Additively sampling probability density",
"Respectively sampling probability density",
"Theoretical probability density")
) +
labs(#加题目,改x,y轴
title = 'Three probability distribution curves comparation',
subtitle = fun,
x = 'X-axis',
y = ' Density'
) +
theme_light() +
theme(legend.position = c(0.8,0.9))
#运行计时
runningtime1<-c('generate random numbers additively',timeend1-timestart1,'s')
runningtime2<-c('generate random numbers respectively',timeend2-timestart2,'s')
#输出
print(c(runningtime1,runningtime2))
Plot
}
Comp(m = 10000,n = 100,fun = 'Binomial',size = 1,prob = 0.3)
## [1] "generate random numbers additively"
## [2] "0.00200009346008301"
## [3] "s"
## [4] "generate random numbers respectively"
## [5] "0.0820000171661377"
## [6] "s"

Comp(m = 10000,n = 10,fun = 'Poisson',lambda = 2)
## [1] "generate random numbers additively"
## [2] "0.000999927520751953"
## [3] "s"
## [4] "generate random numbers respectively"
## [5] "0.00600004196166992"
## [6] "s"

Comp(m = 10000,n = 10,fun = 'Normal',mean = 5, sd = 1.5)#正态分布标准化,n=1就可
## [1] "generate random numbers additively"
## [2] "0.00199985504150391"
## [3] "s"
## [4] "generate random numbers respectively"
## [5] "0.00999999046325684"
## [6] "s"

Comp(m = 10000,n = 100,fun = 'Gamma',shape = 2, rate = 3)
## [1] "generate random numbers additively"
## [2] "0.000999927520751953"
## [3] "s"
## [4] "generate random numbers respectively"
## [5] "0.226000070571899"
## [6] "s"

Comp(m = 10000,n = 100,fun = 'Chi-Aquared',df = 3.5)
## [1] "generate random numbers additively"
## [2] "0.00200009346008301"
## [3] "s"
## [4] "generate random numbers respectively"
## [5] "0.226999998092651"
## [6] "s"
