2010-08-25 54 views
7

我想生成一個由3000個點組成的隨機序列,它遵循正態分佈。平均值是c,標準偏差是d。但我想這3000點在[a,b]的範圍內。生成隨機序列並繪製在R

你能告訴我如何在R中做到這一點?

如果我想繪製這個序列,如果Y軸使用了生成的3000個點,那麼我應該如何生成對應於X軸的點。

回答

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函數用於查找用於均勻分佈的限制,然後從統一生成數據,然後將其轉換回正常。

此使用頗包裝就更簡單了:

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)) 
3

任何概率分佈生成數字的隨機序列是R.很容易只給定範圍內正態分佈專門

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

剪輯在x數值,以便使他們做到這一點對於想從正態分佈中抽取樣本來說,這是一件奇怪的事情。也許你真正想要做的是採樣一個統一的分佈。

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

至於如何陰謀的分佈,我不知道我按照你的問題。您可以繪製的樣品密度估計與此代碼

plot(density(x)) 

但是,如果你想繪製這個數據作爲某種類型的散點圖,你實際上需要生成數字的第二個樣本。

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

這不會做什麼OP要求。他想要正常分配3000點,所以'rnorm'是要走的路 – nico 2010-08-26 08:10:31

+0

這是一個形式不太好的問題......我猜測。如果它只是真正繪製y軸上的隨機值,作爲它的一部分表明,x軸限制請求到底是什麼?這個不成立。我的猜測是隨機值被要求像@joFrhwld和@Joris Mays一樣產生密度函數。這是生成密度函數的正確方法。 – John 2010-08-26 10:52:33

1

如果我想要繪製此序列,如果Y軸使用所產生的3000點,那麼我應該如何生成對應於X軸的點。

如果你只是生成您的積分,就像JoFrhwld與

y <- rnorm(3000, 1, 2) 

然後說

plot(y) 

會自動使用數組索引爲x軸繪製出來