写在前面:
概率分布函数乍一看十分复杂,很容易让学习者陷入困境。对于非数学专业的人来说,并不需要记忆与推导这些公式,但是需要了解不同分布的特点。对此,我们可以在R中调用相应的概率分布函数并进行可视化,可以非常直观的辅助学习。
R中拥有众多的概率函数,既有概率密度函数,也有概率分布函数,可以调用函数,也可以产生随机数,其使用规则如下所示:
代码语言:javascript复制[dpqr]distribution_abbreviation()
其中前面字母为函数类型,含义如下:
d=密度函数(density)
p=分布函数(distributionfunction)
q=分位数函数(quantilefunction)
r=生成随机数(随机偏差)
distribution_abbreviation为概率分布名称的缩写,R中的概率分布类型如下所示:
对于概率密度函数和分布函数,其使用方法举例如下:例如正态分布概率密度函数为dnorm(),概率分布函数pnorm(),生成符合正态分布的随机数rnorm()。
代码语言:javascript复制x=pretty(c(-3,3),100)
y=dnorm(x)
plot(x, y)
作图结果如下所示:
对于生成随机数,其使用方法举例如下:
代码语言:javascript复制rnorm(n, mean=0, sd=1) #产生n个正态分布的数,mena平均值,sd标准差
runif(n, min=0, max=1) #产生n个均匀分布的数,min最小值,max最大值
接下来我们产生符合正态分布的随机数并作图:
代码语言:javascript复制library(ggplot2)
y=rnorm(10000, mean=0, sd=1)
x=1:10000
data=data.frame(x=x, y=y)
ggplot(data, aes(x=y))
geom_histogram(position='identity', alpha=0.5, binwidth=0.1, aes(y=..density..), fill="cyan")
stat_density(geom='line', position='identity', color="cyan4")
作图结果如下所示:
可以看到数据分布图像与正态函数图像基本相同。R也可以产生多维随机变量,例如MASS包中的mvrnorm()函数可以产生一维或者多维正态分布的随机变量,其使用方法如下所示:
代码语言:javascript复制mvrnorm(n=1, mu, Sigma...)
其中n为随机数的个数,mu为数值向量,给出均值,Sigma为对称的数值矩阵给出协方差矩阵。
当有多个随机变量都服从正态分布时,为多元正态性。接下来我们产生相关系数不同(1、0.75、0.25、0)的二维正太随机变量,并绘制其密度图,来观察区别,具体如下:
代码语言:javascript复制library(MASS)
#相关系数1
Sigma1=matrix(c(1, 1, 1, 1), 2, 2)
X1=mvrnorm(n=1000, c(0, 0), Sigma1) #总共1000个点
K1=kde2d(X1[,1], X1[,2], n=100) #n为估计密度所用点数,不能太大
col.palette=colorRampPalette(c("white","red")) #自定义颜色
filled.contour(K1, color=col.palette)
#相关系数0.75
Sigma2=matrix(c(1, 0.75, 0.75, 1), 2, 2)
X2=mvrnorm(n=1000, c(0, 0), Sigma2)
K2=kde2d(X2[,1], X2[,2], n=100)
filled.contour(K2, color=col.palette)
#相关系数0.25
Sigma3=matrix(c(1, 0.25, 0.25, 1), 2, 2)
X3=mvrnorm(n=1000, c(0, 0), Sigma3)
K3=kde2d(X3[,1], X3[,2], n=100)
filled.contour(K3, color=col.palette)
#相关系数0
Sigma4=matrix(c(1, 0, 0, 1), 2, 2)
X4=mvrnorm(n=1000, c(0, 0), Sigma4)
K4=kde2d(X4[,1], X4[,2], n=100)
filled.contour(K4, color=col.palette)
作图结果如下所示:
上面程序中kde2d()函数根据二维坐标来估计数据点的分布密度,并画出等密度线(可以使用contour(K4, lwd=1,add=T, xlim, ylim...)函数添加边界线并标注数据比例),然后自定义颜色并并填充进去形成图像,实际上展示了三维信息。但是我们仍可以用persp()函数来展示出3D图:
代码语言:javascript复制persp(K1, col="orange", theta=95, phi=30, d=2)