提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
以模拟硬币实验为例,本实例要达成以下目标:
抛n次硬币,统计结果。计算正面向上的频率。
重复此试验m次,统计每次试验所得的正面向上的频率pi(i=1,2,3…m)。
画出pi的折线统计图,表示m次试验过程中频率的浮动情况.
最终得出以下结论:
在抛硬币试验中,每次试验中抛硬币的次数n越大,正面向上的频率越容易达到理论频率0.5.
体现在折现统计图中,当n较小时,m次试验后频率波动的幅度越大。当n较大时,频率波动幅度较小(稳定在0.5附近)
一、加载宏包
library(ggplot2)
二、作图过程
x = sample(0:1,10,replace=TRUE); #通过sample()函数,从0和1两个整数中随机抽样,模拟抛硬币的结果,0代表反面,1代表正面. 这条代码中进行了10次抽样.并将结果保存在变量x中.
p = length(x[x==1])/10; #利用length()函数计算结果中1出现的次数。除以10计算频率,然后保存为变量p。
上面的操作我们要进行100次,并把每次的结果保存下来,接下来将利用循环语句实现这个过程。
M = cbind(seq(1,100,by=1),rep(0,100)) #创建一个100×2的向量用于储存结果。
j = 1 #用于每次循环中指定m的行指标
for (i in 1:100){
x = sample(0:1,10,replace=TRUE)
p = length(x[x==1])/10;
M[j,2] = p; #把频率t 保存在矩阵m[j,2]中
j = j+1 #进行一次循环后行+1
}
运行一次上面代码后,我们就得到了一个矩阵M(100×2),第一列向量是试验次数,第二列向量是每次试验所得的正面向上频率.
接下来利用ggplot2绘制折线图:
M = as.data.frame(M) #将矩阵m转换为数据框
f = ggplot(M)+
geom_point(aes(x=M[,1],y=M[,2]))+ # 描点(散点图)
geom_line(aes(x=M[,1],y=M[,2]))+ # 折线图
geom_line(aes(x=M[,1],y=0.5)) #在图像中间添加一条直线y=0.5作参考.
print(f)
调整一下x轴和y轴:
f = ggplot(M)+
geom_point(aes(x=M[,1],y=M[,2]))+ # 描点(散点图)
geom_line(aes(x=M[,1],y=M[,2])) + # 折线图
geom_line(aes(x=M[,1],y=0.5)) #在图像中间添加一条直线y=0.5作参考.
scale_x_continuous( limits=c(1,100),breaks=seq(0,100,by=10) )+ #x轴刻度
scale_y_continuous( limits=c(0,1), breaks=seq(0,1,by=0.25) )#y轴刻度
print(f)
完整代码:
library(ggplot2)
M = cbind(seq(1,100,by=1),rep(0,100)) #创建一个100×2的向量用于储存结果。
j = 1 #用于每次循环中指定m的行指标
for (i in 1:100){
x = sample(0:1,10,replace=TRUE)
p = length(x[x==1])/10;
M[j,2] = p; #把频率t 保存在矩阵m[j,2]中
j = j+1 #进行一次循环后行+1
}
M = as.data.frame(M) #将矩阵m转换为数据框
f = ggplot(M)+
geom_point(aes(x=M[,1],y=M[,2]))+ # 描点(散点图)
geom_line(aes(x=M[,1],y=M[,2])) + # 折线图
geom_line(aes(x=M[,1],y=0.5)) + #在图像中间添加一条直线y=0.5作参考.
scale_x_continuous( limits=c(1,100),breaks=seq(0,100,by=10) )+ #x轴刻度
scale_y_continuous( limits=c(0,1), breaks=seq(0,1,by=0.25) ) #y轴刻度
print(f)
绘图结果:
修改相关参数,更改每次试验抛硬币次数为100,再进行100次试验。
library(ggplot2)
M = cbind(seq(1,100,by=1),rep(0,100)) #创建一个100×2的向量用于储存结果。
j = 1 #用于每次循环中指定m的行指标
for (i in 1:100){
x = sample(0:1,100,replace=TRUE)
p = length(x[x==1])/100;
M[j,2] = p; #把频率t 保存在矩阵m[j,2]中
j = j+1 #进行一次循环后行+1
}
M = as.data.frame(M) #将矩阵m转换为数据框
f = ggplot(M)+
geom_point(aes(x=M[,1],y=M[,2]))+ # 描点(散点图)
geom_line(aes(x=M[,1],y=M[,2])) + # 折线图
geom_line(aes(x=M[,1],y=0.5)) + #在图像中间添加一条直线y=0.5作参考.
scale_x_continuous( limits=c(1,100),breaks=seq(0,100,by=10) )+ #x轴刻度
scale_y_continuous( limits=c(0,1), breaks=seq(0,1,by=0.25) ) #y轴刻度
print(f)
结果:
可以看到,每次抛100次硬币时,频率更容易稳定在0.5附近.
代码改进
为了方便设置参数。可在代码前面设置变量的值,在后面的代码中引用变量.
library(ggplot2)
n = 100; #每次试验抛硬币次数
m = 100; #试验次数
M = cbind(seq(1,m,by=1),rep(0,m)) #创建一个m×2的向量用于储存结果。
j = 1 #用于每次循环中指定m的行指标
for (i in 1:m){
x = sample(0:1,n,replace=TRUE)
p = length(x[x==1])/n;
M[j,2] = p; #把频率t 保存在矩阵m[j,2]中
j = j+1 #进行一次循环后行+1
}
M = as.data.frame(M) #将矩阵m转换为数据框
f = ggplot(M)+
geom_point(aes(x=M[,1],y=M[,2]))+ # 描点(散点图)
geom_line(aes(x=M[,1],y=M[,2])) + # 折线图
geom_line(aes(x=M[,1],y=0.5)) + #在图像中间添加一条直线y=0.5作参考.
scale_x_continuous( limits=c(1,m),breaks=seq(0,m,by=10) )+ #x轴刻度
scale_y_continuous( limits=c(0,1), breaks=seq(0,1,by=0.25) ) #y轴刻度
print(f)