R语言小白学习笔记12—概率分布
- 学习笔记12—概率分布
- 12.1 正态分布
- 12.2 二项分布
- 12.3 泊松分布
- 12.4 其他分布
学习笔记12—概率分布
R语言是统计编程语言,所以易于处理一些统计问题,其中概率分布在统计中占据核心地位。
12.1 正态分布
正态分布又称高斯分布,定义式:
μ是均值,σ是标准差。
我们用rnorm函数来抽取服从正态分布的随机数,同时对均值和标准差进行设置
例:
> rnorm(n = 10, mean = 100, sd = 20)
[1] 110.32908 107.67034 110.30984 85.56377 88.75340
[6] 86.68074 94.36524 118.92754 107.87610 132.73329
dnorm用于计算正态分布的概率密度
其返回的是一个特定值的概率
例:
> randNorm10 <- rnorm(10)
> randNorm10
[1] -0.007795891 0.915999325 0.513491417 -0.065681391
[5] 1.166448550 0.916629337 -0.745279887 0.517869510
[9] 0.337601316 -0.625649967
> dnorm(randNorm10)
[1] 0.3989302 0.2622477 0.3496666 0.3980827 0.2020501
[6] 0.2620963 0.3022020 0.3488780 0.3768433 0.3280276
接下来我们产生一些变量并绘图
> randNorm <- rnorm(30000)
> randDensity <- dnorm(randNorm)
> library(ggplot2)
> ggplot(data.frame(x=randNorm, y=randDensity)) + aes(x=x, y=y) + geom_point() + labs(x="Random Normal Variables", y="Density")
pnorm函数计算分布的分布,即累计概率,曲线下面积
例:
> pnorm(randNorm10)
[1] 0.002573215 0.462999528 0.944438605 0.997887002
[5] 0.497449393 0.255477128 0.117798244 0.136126932
[9] 0.903424405 0.989672991
默认情况为左侧概率。
可以用两个概率相减计算出落在两个值之间的概率
例:
> pnorm(1) - pnorm(0)
[1] 0.3413447
绘制图形:
首先绘制出正态分布图层
> p <- ggplot(data.frame(x=randNorm, y=randDensity)) + aes(x=x, y=y) + geom_line() + labs(x="x", y="Density")
然后用seq函数生成从随机数randNorm最小值到-1的增长率为0.1的数。(seq函数表示生成一组从from到to的数)
> neg1Seq <- seq(from=min(randNorm), to=-1, by=.1)
之后形成数据框,x为neg1Seq,y为randDensity
> lessThanNeg1 <- data.frame(x=neg1Seq, y=dnorm(neg1Seq))
> head(lessThanNeg1)
x y
1 -3.711379 0.0004072403
2 -3.611379 0.0005873033
3 -3.511379 0.0008385543
4 -3.411379 0.0011853783
5 -3.311379 0.0016589750
6 -3.211379 0.0022986865
接下来进行行合并,将数据的范围确定下来
> lessThanNeg1 <- rbind(c(min(randNorm), 0),
+ lessThanNeg1,
+ c(max(lessThanNeg1$x), 0))
然后用geom_polygon进行填充
> p + geom_polygon(data=lessThanNeg1, aes(x=x, y=y))
这是一侧的概率,同样我们也可以画出落在两个值之间概率的图形
> neg1Pos1Seq <- seq(from=-1, to=1, by=.1)
> neg1To1 <- data.frame(x=neg1Pos1Seq, y=dnorm(neg1Pos1Seq))
> head(neg1To1)
x y
1 -1.0 0.2419707
2 -0.9 0.2660852
3 -0.8 0.2896916
4 -0.7 0.3122539
5 -0.6 0.3332246
6 -0.5 0.3520653
> neg1To1 <- rbind(c(min(neg1To1$x), 0),
+ neg1To1,
+ c(max(neg1To1$x), 0))
> p + geom_polygon(data=neg1To1, aes(x=x, y=y))
同时我们还可以用之前随机的数据画出标准分布函数
> randProb <- pnorm(randNorm)
> ggplot(data.frame(x=randNorm, y=randProb)) + aes(x=x, y=y) + geom_point() + labs(x="Random Normal Variables", y="Probability")
pnorm函数的反函数是qnorm,即输入概率,返回分位数
例:
> randNorm10
[1] -2.797722545 -0.092879796 1.593166745 2.860780500
[5] -0.006393468 -0.657352548 -1.186065361 -1.097886934
[9] 1.301313435 2.314249912
> qnorm(pnorm(randNorm10))
[1] -2.797722545 -0.092879796 1.593166745 2.860780500
[5] -0.006393468 -0.657352548 -1.186065361 -1.097886934
[9] 1.301313435 2.314249912
12.2 二项分布
二项分布函数式:
其中,n是实验次数,p是实验成功概率,均值为np,方差为np(1-p)
我们用rbinom函数产生二项分布的随机数
例:
进行十次实验,每次实验成功概率为0.4,整个过程运行十次,返回每个过程十次实验中成功的次数
> rbinom(n=10, size=10, prob = .4)
[1] 5 2 4 4 5 4 3 5 4 5
其中size是实验次数,prob是成功概率,n是运行次数
接下来对二项分布进行可视化
例:
随机产生10000次实验,每次实验大小为10,成功概率0.3
> binomData <- data.frame(Success=rbinom(n=10000, size=10, prob=.3))
> ggplot(binomData, aes(x=Success)) + geom_histogram(binwidth = 1)
可以看到成功次数为3出现最多
类似于正态分布函数,dbinom和pbinom分别返回的是二项分布的密度(精确概率值)和分布(累计概率)
12.3 泊松分布
泊松分布概率质量函数:
λ既是均值又是方差
生成随机数、密度、分布和分位数的函数分别为:rpois、dpois、ppois、qpois
随着λ的增大,泊松分布开始类似于正态分布。
例:
模拟10000个来自泊松分布的样本画出其直方图
> pois1 <- rpois(n=10000, lambda = 1)
> pois2 <- rpois(n=10000, lambda = 2)
> pois5 <- rpois(n=10000, lambda = 5)
> pois10 <- rpois(n=10000, lambda = 10)
> pois20 <- rpois(n=10000, lambda = 20)
> pois <- data.frame(Lambda.1=pois1, Lambda.2=pois2, Lambda.5=pois5, Lambda.10=pois10, Lambda.20=pois20)
> library(reshape2)
> pois <- melt(data=pois, variable.name = "Lambda", value.name = "x")
> library(stringr)
> pois$Lambda <- as.factor(as.numeric(str_extract(string=pois$Lambda, pattern = "\\d+")))
> head(pois)
Lambda x
1 1 0
2 1 0
3 1 0
4 1 2
5 1 2
6 1 1
> library(ggplot2)
> ggplot(pois, aes(x=x)) + geom_histogram(binwidth = 1) + facet_wrap(~ Lambda) + ggtitle("Probability Mass Function")
可以看到直方图趋于正态分布
我们也可以观察其密度函数
> ggplot(pois, aes(x=x)) +
+ geom_density(aes(group=Lambda, color=Lambda,
+ fill=Lambda),
+ adjust=4, alpha=1/2) +
+ scale_color_discrete() + scale_fill_discrete() +
+ ggtitle("Probability Mass Function")
12.4 其他分布