如何通过标记x轴的特定部分来绘制正态分布?

时间:2012-05-07 20:54:59

标签: r

我使用以下代码在R中创建标准正态分布:

x <- seq(-4, 4, length=200)
y <- dnorm(x, mean=0, sd=1)
plot(x, y, type="l", lwd=2)

我需要在平均值和平均值上下三个标准偏差处标记x轴。如何添加这些标签?

7 个答案:

答案 0 :(得分:19)

最简单(但不是一般)的方法是限制x轴的限制。 +/- 1:3 sigma将被标记为这样,并且平均值将标记为0 - 表示与平均值的0偏差。

plot(x,y, type = "l", lwd = 2, xlim = c(-3.5,3.5))

enter image description here

另一种选择是使用更具体的标签:

plot(x,y, type = "l", lwd = 2, axes = FALSE, xlab = "", ylab = "")
axis(1, at = -3:3, labels = c("-3s", "-2s", "-1s", "mean", "1s", "2s", "3s"))

答案 1 :(得分:15)

使用this answer中的代码,您可以跳过创建x并在curve()函数上使用dnorm

curve(dnorm, -3.5, 3.5, lwd=2, axes = FALSE, xlab = "", ylab = "")
axis(1, at = -3:3, labels = c("-3s", "-2s", "-1s", "mean", "1s", "2s", "3s"))

但是这不再使用给定的代码了。

答案 2 :(得分:5)

基于蒙特卡罗模拟思想的极其低效且不寻常但又美观的解决方案是:

  1. 模拟来自给定分布的许多绘制(或样本)(比如正常)。
  2. 使用rnorm绘制这些绘图的密度。 rnorm函数作为参数( A,B,C )并从以 B为中心的正态分布返回 A 样本的向量,标准差 C
  3. 因此,从标准法线(即平均值为0且标准差为1的法线)中取出大小为50,000的样本,并绘制其密度,我们执行以下操作:

    x = rnorm(50000,0,1)
    
    plot(density(x))
    

    随着绘制次数变为无穷大,这将在正态分布中收敛。为了说明这一点,请参见下图,其中显示了从左到右,从上到下的5000,50000,500000和500万个样本。 5000,50000,500000, and 5 million samples from the normal PDF

答案 3 :(得分:4)

如果您喜欢在不使用R内置功能的情况下做某事或者想要在R之外执行此操作,那么您可以使用以下公式。

enter image description here

{{1}}

答案 4 :(得分:3)

一般情况下,例如:正常(2,1)

f <- function(x) dnorm(x, 2, 1)
plot(f, -1, 5)

这是非常通用的,f可以使用任何给定的参数自由定义,例如:

f <- function(x) dbeta(x, 0.1, 0.1)
plot(f, 0, 1)

答案 5 :(得分:1)

我特别喜欢莱迪思这个目标。它可以轻松实现图形信息,例如曲线下的特定区域,在处理概率问题时通常需要的信息,例如找到P(a

var params = window.location.split('?')[1];

enter image description here

在此示例中,我将library(lattice) e4a <- seq(-4, 4, length = 10000) # Data to set up out normal e4b <- dnorm(e4a, 0, 1) xyplot(e4b ~ e4a, # Lattice xyplot type = "l", main = "Plot 2", panel = function(x,y, ...){ panel.xyplot(x,y, ...) panel.abline( v = c(0, 1, 1.5), lty = 2) #set z and lines xx <- c(1, x[x>=1 & x<=1.5], 1.5) #Color area yy <- c(0, y[x>=1 & x<=1.5], 0) panel.polygon(xx,yy, ..., col='red') }) z = 1之间的区域突出显示。您可以根据问题轻松移动此参数。

轴标签是自动的。

答案 6 :(得分:1)

这是在函数中编写它的方法:

normalCriticalTest <- function(mu, s) {
  x <- seq(-4, 4, length=200) # x extends from -4 to 4
  y <- (1/(s * sqrt(2*pi))) * exp(-((x-mu)^2)/(2*s^2)) # y follows the formula 
of the normal distribution: f(Y)
  plot(x,y, type="l", lwd=2, xlim = c(-3.5,3.5))
  abline(v = c(-1.96, 1.96), col="red") # draw the graph, with 2.5% surface to 
either side of the mean
}
normalCriticalTest(0, 1) # draw a normal distribution with vertical lines.

最终结果:

enter image description here