R语言中的统计分布函数

R语言中的各种统计分布函数使用方法。


正态分布

R语言中与正态分布有关的函数有四个,分别为dnorm,pnorm,qnorm和rnorm,其中,dnorm表示密度函数,pnorm表示分布函数,qnorm表示分位数函数,rnorm表示生成随机数的函数。

dnorm

dnorm:正态分布的概率密度函数(PDF,Probability Density Function)d表示densitynorm表示正态。

正态分布的公式如下所示:
$$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") 

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

qnorm

qnorm可视作pnorm的反函数,计算正态分布中的第p分位对应的Z-score。

例如计算在标准正态分布分布中,第50百分位的Z-score是多少?

qnorm(0.5)   # 0

pnorm(qnorm(0)) # 0

rnorm

rnomr()函数的功能用于生成一组符合正态分布的随机数,它的参数有n,meansd,其中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)

其它分布

在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
FF分布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
Tt分布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

留下评论