2013-04-20 29 views
3

如何生成精確數據?如何生成精確時刻的樣本數據

在該R,我們必須使用rnorm選項從具有特定特徵的人羣(比如,平均值= 0,SD = 1),但是我們如何得到的數據與正是平均值= 0,SD = 1來樣?

這是一個簡單的例子。我也有興趣在應用方面得到確切的數據(例如,多元數據與0.2的確切的相關性)

+0

你想樣本的平均值與總體平均值完全相等嗎?我懷疑它是否可能。 – Nishanth 2013-04-20 16:23:42

+0

你問在R或Python中如何做到這一點?或者呢?您始終可以使用線性變換強制生成的數據具有感興趣的均值和標準偏差。 – Dason 2013-04-20 16:30:26

+0

另外,你只是對高斯情況做這件事感興趣,或者你想爲任何分佈做一般? – Dason 2013-04-20 16:31:51

回答

4

只需擴展您的結果更普遍的方式。在單變量情況:

set.seed(21) 
x <- rnorm(1000) 
mean(x) 
sd(x) 
y <- x-mean(x) 
y <- y/sd(x) 
mean(y) # within floating point precision of 0 
sd(y) 

多因素情況下是多一點參與,但有可能。

+3

此外,'y < - scale(x)' – flodel 2013-04-20 16:34:28

+0

也許顯示乘法和加法,然後得到一個確切的任意結果。 – John 2013-04-20 16:35:11

+0

@ flodel:pssh,太簡單了! ;-) – 2013-04-20 16:35:19

3

這聽起來像你想的MASS包mvrnorm。

sigma <- matrix(c(1.0, 0.0, -0.5, 
        0.0, 1.0, 0.5, 
       -0.5, 0.5, 1.0), 3, byrow = TRUE) 
mat <- mvrnorm(10, c(0,0,0), sigma, empirical = TRUE) 
cor(mat) 
#  [,1] [,2] [,3] 
#[1,] 1.0 0.0 -0.5 
#[2,] 0.0 1.0 0.5 
#[3,] -0.5 0.5 1.0 

注意,通過選擇1 SDS爲每個組我簡單的事情,因爲協方差將等於無關,但你可以記住的相關性是通過SDS的產品分成協方差概括這一點。

(注意,當您運行的代碼,你可能不機牀精度內得到確切值,但值...這是我們所希望的)

2

你可以簡單地重新調整數據。

n <- 100 
x <- rnorm(n) 
x <- (x - mean(x))/sd(x) 
mean(x) # 0, up to machine precision 
sd(x)  # 1 

你也可以使用ppoints有均勻間距的點 (你還是要重新調整,雖然)。

x <- qnorm(ppoints(n)) 
x <- (x - mean(x))/sd(x) 
mean(x) 
sd(x) 

在更高維度上,轉換有點棘手。 如果x是高斯向量,均值爲零,方差單位矩陣,然後 是C %*% x高斯,具有零均值,方差和矩陣V = CC'CV的喬列斯基變換; 它可以被看作是平方根的用於 (對稱,半正定)矩陣的類似物。

其中兩個實際需要的變換: 第一個將方差設置爲標識,第二個將其設置爲期望值。

# Desired variance matrix 
V <- matrix(c(1,.2,.2, .2,1,.2, .2,.2,1), 3, 3) 

# Random data 
n <- 100 
k <- 3 
x <- matrix(rnorm(k*n), nc=3) 

# Set the mean to 0, and the variance to the identity 
x <- t(t(x) - colMeans(x)) 
colMeans(x) # 0 
C1 <- chol(var(x)) 
x <- x %*% solve(C1) 
var(x) # identity matrix 

# Set the variance to the desired value 
C2 <- chol(V) 
x <- x %*% C2 
var(x) - V # zero