21

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

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

我需要将 x 轴标记为平均值以及平均值上下三个标准差的点。如何添加这些标签?

4

7 回答 7

22

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

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

在此处输入图像描述

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

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"))
于 2012-05-07T21:40:15.330 回答
16

使用此答案中的代码,您可以跳过创建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"))

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

于 2012-05-07T23:41:24.383 回答
5

一个非常低效和不寻常但非常漂亮的解决方案,它基于蒙特卡罗模拟的思想,是这样的:

  1. 从给定分布(比如正态分布)模拟许多抽取(或样本)。
  2. 使用 绘制这些绘图的密度rnorm。该rnorm函数以 ( A,B,C ) 作为参数,并从以B为中心的正态分布中返回A样本的向量,标准差为C

因此,要从标准正态(即平均值为 0,标准差为 1 的正态)中抽取大小为 50,000 的样本,并绘制其密度,我们执行以下操作:

x = rnorm(50000,0,1)

plot(density(x))

随着抽签次数趋于无穷,这将在分布中收敛到正常。为了说明这一点,请参见下图,从左到右、从上到下显示 5000、50000、500000 和 500 万个样本。5000,50000,500000 和 500 万个来自普通 PDF 的样本

于 2015-05-27T17:52:10.767 回答
4

如果您喜欢在不使用 R 内置函数的情况下做某事的艰难方式,或者您想在 R 之外执行此操作,则可以使用以下公式。

在此处输入图像描述

x<-seq(-4,4,length=200)
s = 1
mu = 0
y <- (1/(s * sqrt(2*pi))) * exp(-((x-mu)^2)/(2*s^2))
plot(x,y, type="l", lwd=2, col = "blue", xlim = c(-3.5,3.5))
于 2015-09-25T14:36:00.277 回答
4

一般情况下,例如:Normal(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)
于 2015-12-06T21:33:47.717 回答
2

我特别喜欢 Lattice 的这个目标。它可以轻松实现图形信息,例如曲线下的特定区域,这是您在处理诸如 find P(a < X < b) 等概率问题时通常需要的信息。请看一下:

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突出z = 1.5。您可以根据您的问题轻松移动此参数。

轴标签是自动的。

于 2016-04-26T07:56:49.747 回答
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.

最后结果:

在此处输入图像描述

于 2018-12-04T16:59:51.487 回答