正态分布
R语言中与正态分布有关的函数有四个,分别为dnorm,pnorm,qnorm和rnorm,其中,dnorm表示密度函数,pnorm表示分布函数,qnorm表示分位数函数,rnorm表示生成随机数的函数。
dnorm
dnorm
:正态分布的概率密度函数(PDF,Probability Density Function)
。d
表示density
,norm
表示正态。
正态分布的公式如下所示:
$$f(x | \mu, \sigma)=\frac{1}{\sigma \sqrt{2 \pi}} e^{-\frac{(x-\mu)^{2}}{2 \sigma^{2}}}$$dnorm
函数会返回上式的值。如果是标准正态分布,$\mu = 0,\sigma=1$。
$$f(x | \mu, \sigma)=\frac{1}{\sqrt{2 \pi}} e^{-\frac{x^{2}}{2}}$$
# 标准正态分布
# mean=0,sd=1 默认值可省略
dnorm(0,mean=0,sd=1) # 0.3989423
# 非标准正态分布
dnorm(2, mean = 5, sd = 3) # 0.08065691
# PDF曲线
z_scores <- seq(-4,4,0.1)
z_scores
# 计算z_scores的概率密度
dvalues <- dnorm(z_scores)
dvalues
# plot
plot(z_scores,dvalues,
type = "l",
main = "pdf of the Standard Normal",
xlab= "Z-score")
![](https://blog.guyinzhong.com/wp-content/uploads/2022/04/image-5.png)
pnorm
pnorm
:正态分布的
,累积概率密度函数
(CDF,Cumulative Distribution Function)p
表示Probability,计算$P[X ≤ x]$的概率。lower.tail
参数默认True
,如果lower.tail = FALSE
,返回的$P[X > x]$的概率(即pnorm(q) = 1-pnorm(q,lower.tail=FALSE)
)
在R中,pnorm()
这个函数完全可以取代正态分布表。
# pnorm()默认的参数与dnorm()一样,都是标准正态分布
pnorm(0) # 0.5
# lower.tail参数
pnorm(2, mean = 5, sd = 3) # 0.1586553
pnorm(2, mean = 5, sd = 3, lower.tail = FALSE) # 0.8413447
1 - pnorm(2, mean = 5, sd = 3, lower.tail = FALSE) # 0.1586553
用一组Z-scores计算一下相应的累积概率:
z_scores <- seq(-4,4,0.1)
z_scores
pvalues <- pnorm(z_scores)
pvalues
plot(pvalues,
xaxt = "n", # 不绘制x轴的刻度
type = "l", # 使用曲线将各点连接起来
main = "标准正态分布的CDF曲线",
xlab= "分位数(Quantiles)",
ylab="概率密度(Probability Density)")
# 以下是添加x轴的刻度
axis(1, at=which(pvalues == pnorm(-2)), labels=round(pnorm(-2), 2))
axis(1, at=which(pvalues == pnorm(-1)), labels=round(pnorm(-1), 2))
axis(1, at=which(pvalues == pnorm(0)), labels=c(.5))
axis(1, at=which(pvalues == pnorm(1)), labels=round(pnorm(1), 2))
axis(1, at=which(pvalues == pnorm(2)), labels=round(pnorm(2), 2))
![](https://blog.guyinzhong.com/wp-content/uploads/2022/04/image-6.png)
qnorm
qnorm
可视作pnorm
的反函数,计算正态分布中的第p分位对应的Z-score。
例如计算在标准正态分布分布中,第50百分位的Z-score是多少?
qnorm(0.5) # 0
pnorm(qnorm(0)) # 0
rnorm
rnomr()
函数的功能用于生成一组符合正态分布的随机数,它的参数有n
,mean
,sd
,其中n表示生成的随机数,mean与sd分别表示正态分布的均值与标准差。(runif
生成的是均匀分布的随机数)
# 随机数种子
set.seed(100)
# 生成5个服从标准正态分布的随机数
rnorm(5)
# 生成1000个,服从均值为70,标准差为5的正态分布的随机数
n10000 <- rnorm(100, mean = 70, sd = 5)
# plot
par(mfrow=c(1,2))
hist(n10000, breaks = 20)
d <- density(n10000)
plot(d)
![](https://blog.guyinzhong.com/wp-content/uploads/2022/04/image-7.png)
其它分布
在R中与之类似的函数还有很多,具体的可以通过help(Distributions)
命令去查看。
分布 | 中文名称 | R中相应函数 | 参数 |
---|---|---|---|
Beta | 贝塔分布 | beta(a,b) | shape1、shape2 |
Binomial | 二项分布 | binom(n,p) | size、prob |
Cauchy | 柯西分布 | cauchy() | location、scale |
Chi-square | 卡方分布 | chisq(df) | df |
Exponential | 指数分布 | exp(lambda) | rate |
F | F分布 | f(df1,df2) | df1、df2 |
Gamma | 伽玛分布 | gamma() | shape、rate |
Geometric | 几何分布 | geom() | prob |
Hypergeometric | 超几何分布 | hyper() | m、n、k |
Logistic | 逻辑分布 | logis() | location、scale |
Negative binomial | 负二项分布 | nbinom() | size、prob |
Normal | 正态分布 | norm() | mean、sd |
Multivariate normal | 多元正态分布 | mvnorm() | mean、cov |
Poisson | 泊松分布 | pois() | lambda |
T | t分布 | t() | df |
Uniform | 均匀分布 | unif() | min、max |
Weibull | 威布尔分布 | weibull() | shape、scale |
Wilcoxon | 威尔考可森分布 | wilcox() | m、n |
上述分布函数前面加上r,p、q、d就可以表示相应的目的:
r
:相应分布的随机数;d
:相应分布的密度函数;p
:相应分布的累积概率密度函数;q
:相应分布累积概率密度函数的反函数。
参考资料
Introduction to dnorm, pnorm, qnorm, and rnorm for new biostatisticians