我想在间隔[-50,50]中生成100个正态分布的随机数。但是,在下面的代码中,生成的随机数范围是[-50,50]。
n <- rnorm(100, -50,50)
plot(n)
答案 0 :(得分:5)
由于您似乎不完全了解rnorm
函数,所以会询问您的问题。
rnorm(100, -50,50)
生成由以-50为中心的正态分布给出的100个点的样本,标准偏差为50。因此,您需要通过以下方式指定所需的值:
100 normally distributed random number in interval [-50,50]
。在正态分布中,您没有给出上限和下限:绘制的概率永远不会为0,而与均值相差几个标准偏差时,绘制概率就很小。所以:
rnorm(100, 0,50)
,但是您将得到大于50且小于-50的值。
sd <- 50
n <- data.frame(draw = rnorm(1000, 0,sd))
final <- sample(n$draw[!with(n, draw > 50 | draw < -50)],100)
以下是它对两种不同的sd
执行的操作的示例:
sd <- 10
n1 <- data.frame(draw = rnorm(1000, 0,sd))
final1 <- sample(n$draw[!with(n, draw > 50 | draw < -50)],100)
sd <- 50
n2 <- data.frame(draw = rnorm(1000, 0,sd))
final2 <- sample(n$draw[!with(n, draw > 50 | draw < -50)],100)
par(mfrow = c(1,2))
hist(final1,main = "sd = 10")
hist(final2,main = "sd = 50")
sample(-50:50,100,replace = T)
答案 1 :(得分:0)
你必须做出牺牲。您的随机变量不是因为尾部被切除而没有正态分布,或者您在边界处折衷。您可以将随机变量定义为“实际上”位于某个范围内,这表示您接受很小的百分比位于外部。出于您的目的,也许可以选择1%。
my_range <- setNames(c(-50, 50), c("lower", "upper"))
prob <- 0.01 # probability to lie outside of my_range
# you have to define this, 1 % in this case
my <- mean(my_range)
z_value <- qnorm(prob/2)
sigma <- (my - my_range["lower"]) / (-1 * z_value)
# proof
N <- 100000 # large number
sim_vec <- rnorm(N, my, sigma)
chk <- 1 - length(sim_vec[sim_vec >= my_range["lower"] &
sim_vec <= my_range["upper"]]) / length(sim_vec)
cat("simulated proportion outside range:", chk, "\n")