在 R 中绘制正态、左右偏态分布

Posted

技术标签:

【中文标题】在 R 中绘制正态、左右偏态分布【英文标题】:Plot normal, left and right skewed distribution in R 【发布时间】:2013-12-13 18:43:56 【问题描述】:

我想创建 3 个图用于说明目的: - 正态分布 - 右偏分布 - 左偏分布

这应该是一件容易的事,但我只找到了this link,它只显示了一个正态分布。剩下的怎么办?

【问题讨论】:

从正态分布中抽取样本,选择参数以使结果全部为正(即均值 > 3*sd)。对它们进行平方根和平方,并绘制所得三个分布的直方图(或对它们进行对数和取幂)。 我对 R 真的很缺乏经验。我该怎么做? 【参考方案1】:

如果你不是太拘泥于正态,那么我建议你使用 beta 分布,它可以根据形状参数对称、右偏或左偏。

hist(rbeta(10000,5,2))
hist(rbeta(10000,2,5))
hist(rbeta(10000,5,5))

【讨论】:

使用连续图代替直方图是一种简单的方法吗?【参考方案2】:

终于我搞定了,但在你们的帮助下,我依靠的是this site。

 N <- 10000
 x <- rnbinom(N, 10, .5)
 hist(x, 
 xlim=c(min(x),max(x)), probability=T, nclass=max(x)-min(x)+1, 
   col='lightblue', xlab=' ', ylab=' ', axes=F,
   main='Positive Skewed')
lines(density(x,bw=1), col='red', lwd=3)

这也是一个有效的解决方案:

curve(dbeta(x,8,4),xlim=c(0,1))
title(main="posterior distrobution of p")

【讨论】:

这应该是公认的答案吗?这只是部分回答了您的问题并使用了混合方法:您无法使用 rnbinom 生成右偏分布,并且 beta 分布仅定义在 0 和 1 之间,与您要与之比较的正态分布相比,它的表现不佳。【参考方案3】:

只需使用fGarch 包和这些功能:

dsnorm(x, mean = 0, sd = 1, xi = 1.5, log = FALSE)
psnorm(q, mean = 0, sd = 1, xi = 1.5)
qsnorm(p, mean = 0, sd = 1, xi = 1.5)
rsnorm(n, mean = 0, sd = 1, xi = 1.5)

** mean, sd, xi 位置参数mean,尺度参数sd,偏度参数xi。 例子

## snorm -
   # Ranbdom Numbers:
   par(mfrow = c(2, 2))
   set.seed(1953)
   r = rsnorm(n = 1000)
   plot(r, type = "l", main = "snorm", col = "steelblue")

   # Plot empirical density and compare with true density:
   hist(r, n = 25, probability = TRUE, border = "white", col = "steelblue")
   box()
   x = seq(min(r), max(r), length = 201)
   lines(x, dsnorm(x), lwd = 2)

   # Plot df and compare with true df:
   plot(sort(r), (1:1000/1000), main = "Probability", col = "steelblue",
     ylab = "Probability")
   lines(x, psnorm(x), lwd = 2)

   # Compute quantiles:
   round(qsnorm(psnorm(q = seq(-1, 5, by = 1))), digits = 6)

【讨论】:

以上是关于在 R 中绘制正态、左右偏态分布的主要内容,如果未能解决你的问题,请参考以下文章

怎么把偏态分布转换为正态分布

正态分布与偏态分布的概念

scipy中的偏斜正态分布

求高手啥是正偏分布和负偏分布

(多元)偏正态分布正态分布对数正态分布的随机数的产生(R语言)

(多元)偏正态分布正态分布对数正态分布的随机数的产生(R语言)