R语言中dnorm, pnorm, qnorm与rnorm以及随机数

Python021

R语言中dnorm, pnorm, qnorm与rnorm以及随机数,第1张

-- title: R语言中dnorm, pnorm, qnorm与rnorm以及随机数 date: 2018-09-07 12:02:00 type: "tags" tags: 在R语言中,与正态分布(或者说其它分布)有关的函数有四个,分别为dnorm,pnorm,qnorm和rnorm,其中,dnorm表示密度函数,pnorm表示分布函数,qnorm表示分位数函数,rnorm表示生成随机数的函数。在R中与之类似的函数还有很多,具体的可以通过 help(Distributions) 命令去查看,对于分位数或百分位数的一些介绍可以看这篇笔记 《分位数及其应用》 ,关于正态分布的知识可以看这篇笔记 《正态分布笔记》 。 现在这篇笔记就介绍一下这些函数的区别。 R提供了多种随机数生成器(random number generators, RNG),默认采用的是Mersenne twister方法产生的随机数,该方法是由Makoto Matsumoto和Takuji Nishimura于1997年提出来的,其循环周期是 。R里面还提供了了Wichmann-Hill、Marsaglia-Multicarry、Super-Duper、Knuth-TAOCP-2002、Knuth-TAOCP和L'Ecuyer-CMRG等几种随机数生成方法,可以通过 RNGkind() 函数进行更改,例如,如果要改为WIchmann-Hill方法,就使用如下语句: 在R中使用随机数函数,例如 rnorm() 函数来生成的随机数是不一样的,有时我们在做模拟时,为了比较不同的方法,就需要生成的随机数都一样,即重复生成相同的随机数,此时就可以使用 set.seed() 来设置随机数种子,其参数为整数,如下所示:dnorm 中的 d 表示 density , norm 表示正态贫,这个函数是正态分布的 概率密度(probability density)函数 。 正态分布的公式如下所示:给定x,μ和σ后, dnorm() 这个函数返回的就是会返回上面的这个公式的值,这个值就是Z-score,如果是标准正态分布,那么上述的公式就变成了这个样子,如下所示:现在看一个案例,如下所示:dnorm(0,mean=0,sd=1) 由于是标准正态分布函数的概率密度,这个命令其实可以直接写为 dnorm(0) 即可,如下所示: 再看一个非标准正态分布的案例,如下所示: 虽然在 dnorm() 中,x是一个概率密度函数(PDF,Probability Density Function)的独立变量,但它也能看作是一组经过Z转换后的一组变量,现在我们看一下使用 dnorm 来绘制一个正态分布的概率密度函数曲线,如下所示: 现在使用 dnorm() 函数计算一下Z_scores的概率密度,如下所示: 现在绘图,如下所示: 从上面的结果可以看出,在每个Z-score处, dnorm 可以绘制出这个Z-score对应的正态分布的pdf的高度。pnorm 函数中的 p 表示Probability,它的功能是,在正态分布的PDF曲线上,返回从负无穷到 q 的积分,其中这个 q 指的是一个Z-score。现在我们大概就可以猜测出 pnorm(0) 的值是0.5,因为在标准正态分布曲线上,当Z-score等于0时,这个点正好在标准正态分布曲线的正中间,那么从负无穷到0之间的曲线面积就是整个标准正态分布曲线下面积的一半,如下所示:pnorm 函数还能使用 lower.tail 参数,如果 lower.tail 设置为 FALSE ,那么 pnorm() 函数返回的积分就是从 q 到正无穷区间的PDF下的曲线面积,因此我们就知道了, pnorm(q) 与 1-pnorm(q,lower.tail=FALSE) 的结果是一样的,如下所示: 在计算机出现之前的时代里,统计学家们使用正态分布进行统计时,通常是要查正态分布表的,但是,在计算机时代,通常都不使用正态分布表了,在R中, pnorm() 这个函数完全可以取代正态分布表了,现在我们使用一个Z-scores的向量来计算一下相应的累积概率,如下所示: 以上就是标准正态分布的 累积分布函数(CDF,Cumulative Distribution Function) 曲线。 简单来说, qnorm 是正态分布 累积分布函数(CDF,Cumulative Distribution Function) 的反函数,也就是说它可以视为 pnorm 的反函数,这里的 q 指的是quantile,即分位数。 使用 qnorm 这个函数可以回答这个问题:正态分布中的第p个分位数的Z-score是多少? 现在我们来计算一下,在正态分布分布中,第50百分位数的Z-score是多少,如下所示: 再来看一个案例:在正态分布中,第96个百分位的Z-score是多少,如下所示: 再来看一个案例:在正态分布中,第99个百分位的Z-score是多少,如下所示: 再来看一下 pnorm() 这个函数,如下所示: 从上面我们可以看到, pnorm 这个函数的功能是,我们知道某个Z-score是多少,它位于哪个分位数上。 接着我们进一步举例来说明一下 qnorm 和 pnorm 的具体功能,如下所示: 现在进行绘图,如下所示:rnomr() 函数的功能用于生成一组符合正态分布的随机数,在学习各种统计学方法时, rnorm 这个函数应该是最常用的,它的参数有 n , mean , sd ,其中n表示生成的随机数,mean与sd分别表示正态分布的均值与标准差,现在举个例子,如下所示: 现在我们绘制一下上面的几个向量的直方图,看一下它们的均值是否在70附近,如下所示: 在R语言中,生成不同分布的各种类型的函数都是以d,p,q,r开头的,使用原理跟上面的正态分布都一样。sample() 函数是一个用于生成随机数的重要的核心函数,如果仅传递一个数值n给它,就会返回一个从1到n的自然数的排列,如果传递是 n:m 就是生成从n到m的随机数,如是是 7,5 ,则会生成5个小于7的随机数,如下所示: 从上面的结果可以看出来,这些数字都是不同的,也就是说,sample函数默认情况下是不重复抽样,每个值只出现一次,如果允许有重复抽样,需要添加参数 replace = TRUE ,如下所示: sample函数通常会从某些向量中随机挑一些参数,如下所示: 也可以挑日期,如下所示: 上述分布函数前面加上r,p、q、d就可以表示相应的目的:

在R中,概率函数形如:

[dpqr]distribution_abbreviation

其中第一个字母表示其所指分布的某一方面:

d = 密度函数(density)

p = 分布函数(distribution function)

q = 分位数函数(quantile function)

r = 生成随机数(随机偏差)

以正态分布为例

1 什么是正态分布?

正态分布也被称为高斯分布,是统计学中极为常见的连续型概率分布。正态曲线呈钟型,两头低,中间高,左右对称因其曲线呈钟形,因此人们又经常称之为钟形曲线。

2 正态分布的两个参数及图形

正态分布有两个参数,即均数和标准差。 1)概率密度曲线在均值处达到最大,并且对称; 2)一旦均值和标准差确定,正态分布曲线也就确定; 3)当X的取值向横轴左右两个方向无限延伸时,曲线的两个尾端也无限渐近横轴,理论上永远不会与之相交; 4)正态随机变量在特定区间上的取值概率由正态曲线下的面积给出,而且其曲线下的总面积等于1;

5)均值可取实数轴上的任意数值,决定正态曲线的具体位置;标准差决定曲线的“陡峭”或“扁平”程度:标准差越大,正态曲线越扁平;标准差越小,正态曲线越陡峭。这是因为,标准差越小,意味着大多数变量值离均数的距离越短,因此大多数值都紧密地聚集在均数周围,图形所能覆盖的变量值就少些,于是都挤在一块,图形上呈现瘦高型。相反,标准差越大,数据跨度就比较大,分散程度大,所覆盖的变量值就越多,图形呈现“矮胖型”。

3 标准正态分布

如果不指定一个均值和一个标准差,则函数将假定其为标准正态分布(均值为0,标准差为1)。

4 正态分布的概率函数

概率密度函数为dnorm(),分布函数pnorm(),分位函数qnorm(),随机数生成函数rnorm()。

dnorm(x, mean = 0, sd = 1, log = FALSE)

pnorm(q, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE)

qnorm(p, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE)

rnorm(n, mean = 0, sd = 1)

x - 是数字的向量。

p - 是概率向量。

n - 是观察次数(样本量)。

mean - 是样本数据的平均值,默认值为零。

sd - 是标准偏差,默认值为1。

pretty()创建美观的分割点。选取n+1等间距的取整数,将连续变量x分割为n个区间。pretty(x,n)

x:它被定义为矢量数据。

n:结果向量的长度。

返回:等长区间的数据向量。

设定随机数种子

set.seed()

该函数是设定生成随机数的种子,种子是为了让结果具有重复性,保证你在执行和调试后,所创造的随机数保持不变。 24

runif(n, min = 0, max = 1)

该函数用于创建均匀分布的随机偏差。n表示观察次数,min和max分别为最小最大值。

其他概率分布见下表。

参考资料:

标准正态分布下mean=0,sd=1 95%置信区间为[mean-1.96*sd,mean+1.96*sd] 即左侧概率和为97.5%的数据减去左侧概率和为2.5%的数据,期间的数据概率即为95%的置信区间。那为什么是1.96倍呢,先看两个函数dnorm 中的 d 表示 density , norm 表示正态分布,这个函数是正态分布的 概率密度(probability density)函数 。 给定x,μ和σ后, dnorm() 这个函数返回的就是会返回上面的这个公式的值,如果是标准正态分布,dnorm(n,mean=0,sd=1)输出就是当取n时的概率值,就是正态分布图当x=n时y的值。 pnorm函数中的p表示Probability,它的功能是,在正态分布的PDF曲线上,返回从负无穷到q的积分,其中这个q指的是一个Z-score,x=(mean+Z-score*sd)时的Z-score。现在我们大概就可以猜测出pnorm(0)的值是0.5,因为在标准正态分布曲线上,当Z-score等于0时,这个点正好在标准正态分布曲线的正中间,那么从负无穷到0之间的曲线面积就是整个标准正态分布曲线下面积的一半,pnorm(n,mean=0,sd=1)输出从负无穷到mean+sd*n的概率总和 用的最多的是3倍sd,相当于在正态分布落在3倍sd区间的概率为99.73002%,落在1.96倍sd区间的概率为95.00042% 那怎么求标准正态分布下0.975%,0.025%对应的Z-score呢,利用qnorm函数,非标准正态下不能这么求,因为qnorm函数输入的是分位值。或者查询正态分布表。 rnorm()函数的功能用于生成一组符合正态分布的随机数,在学习各种统计学方法时,rnorm这个函数应该是最常用的,它的参数有n,mean,sd,表示随机生成n个正态分布均值为mean标准差为sd时的一组数据,如下所示: 当出现如图所示的分布,近似正态分布,但是左右胖瘦不太一致时,这是现实中普遍存在的分布情况,如高通量测序过程中的碱基GC分布,这种情况求95%区间的方法 -先求取左侧部分的sd,但是要补足右侧对称的数据 -同样求右侧部分的sd,同时补足左侧对称的数据 -用最高密度值时max_gc值加减1.96倍左右侧的sd 做出效果如图