R语言小白学习笔记12—概率分布

  • 学习笔记12—概率分布
  • 12.1 正态分布
  • 12.2 二项分布
  • 12.3 泊松分布
  • 12.4 其他分布

学习笔记12—概率分布

R语言是统计编程语言,所以易于处理一些统计问题,其中概率分布在统计中占据核心地位。

12.1 正态分布

正态分布又称高斯分布,定义式:

r语言求经验分布函数 r语言各种分布_正态分布

μ是均值,σ是标准差。

我们用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")

r语言求经验分布函数 r语言各种分布_r语言_02


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))

r语言求经验分布函数 r语言各种分布_大数据_03


这是一侧的概率,同样我们也可以画出落在两个值之间概率的图形

> 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))

r语言求经验分布函数 r语言各种分布_大数据_04

同时我们还可以用之前随机的数据画出标准分布函数

> randProb <- pnorm(randNorm)
> ggplot(data.frame(x=randNorm, y=randProb)) + aes(x=x, y=y) + geom_point() + labs(x="Random Normal Variables", y="Probability")

r语言求经验分布函数 r语言各种分布_r语言_05


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 二项分布

二项分布函数式:

r语言求经验分布函数 r语言各种分布_大数据_06


其中,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)

r语言求经验分布函数 r语言各种分布_二项分布_07


可以看到成功次数为3出现最多

类似于正态分布函数,dbinom和pbinom分别返回的是二项分布的密度(精确概率值)和分布(累计概率)

12.3 泊松分布

泊松分布概率质量函数:

r语言求经验分布函数 r语言各种分布_二项分布_08


λ既是均值又是方差

生成随机数、密度、分布和分位数的函数分别为: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")

r语言求经验分布函数 r语言各种分布_r语言_09


可以看到直方图趋于正态分布

我们也可以观察其密度函数

> 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")

r语言求经验分布函数 r语言各种分布_二项分布_10

12.4 其他分布

r语言求经验分布函数 r语言各种分布_二项分布_11