在R中生成随机序列和图

时间:2010-08-25 22:37:43

标签: r

我想生成一个由3000个点组成的随机序列,它遵循正态分布。平均值为c,标准差为d。但我希望这些3000点位于[a,b]的范围内。

你能告诉我怎么在R吗?

如果我想绘制这个序列,如果Y轴使用生成的3000个点,那么我应该如何生成与X轴相对应的点。

4 个答案:

答案 0 :(得分:5)

您可以使用标准的R函数执行此操作:

c <- 1
d <- 2

a <- -2
b <- 3.5

ll <- pnorm(a, c, d)
ul <- pnorm(b, c, d)

x <- qnorm( runif(3000, ll, ul), c, d )
hist(x)
range(x)
mean(x)
sd(x)
plot(x, type='l')

pnorm函数用于查找用于统一分布的限制,然后从统一生成数据,然后将其转换回法线。

使用distr包更简单:

library(distr)

N <- Norm(c,d)
N2 <- Truncate(N, lower=a, upper=b)

plot(N2)
x <- r(N2)(3000)
hist(x)
range(x)
mean(x)
sd(x)
plot(x, type='l')

请注意,在这两种情况下,均值不是c而sd不是d。如果您希望生成的截断数据的均值和sd为c和d,那么您需要父分布(截断前)具有不同的值(更高的sd,平均值取决于截断值),找到这些值将是数学/统计理论课程的良好作业问题。如果这是您真正需要的,那么添加评论或编辑问题,以便具体说明。

如果要从未截断的法线生成数据,但只绘制[a,b]范围内的数据,则只需使用ylim参数绘制:

plot( rnorm(3000, c, d), ylim=c(a,b) )

答案 1 :(得分:3)

在R中生成任意概率分布的随机数字序列非常容易。特别为正态分布执行此操作

c = 1
d = 2
x <- rnorm(3000, c, d)

剪切x中的值以使它们仅在给定范围内对于想要处理正态分布中的样本是一件奇怪的事情。也许你真正想做的是采样统一分布。

a = 0
b = 3
x2 <- runif(3000, a, b)

至于情节如何分配,我不确定我是否按照你的问题。您可以使用此代码

绘制样本的密度估计值
plot(density(x))

但是,如果你想将这些数据绘制成某种散点图,你实际上需要生成第二个数字样本。

答案 2 :(得分:1)

  

如果我想绘制这个序列,如果Y轴使用生成的3000个点,那么我应该如何生成与X轴相对应的点。

如果你只是产生积分,就像JoFrhwld用

说的那样
y <- rnorm(3000, 1, 2)

然后

plot(y)

将使用数组索引自动绘制它们作为x轴

答案 3 :(得分:0)

a = -2; b = 3
plot(dnorm, xlim = c(a, b))