2013-04-20 3 views
3

Как сгенерировать точные данные?Как сгенерировать данные образца с точными моментами

В R мы имеем возможность использовать rnorm для выборки из генеральной совокупности с определенными характеристиками (например, среднее значение = 0, с.о. = 1), но, как мы получаем данные с точно среднее = 0, с.о. = 1 ?

Это простой пример. Меня также интересовали бы более общие способы применения способов получения точных данных (например, многомерные данные с точной корреляцией 0,2)

+0

Вы хотите, чтобы образец имел среднее значение, равное населению? Я сомневаюсь, что это возможно. – Nishanth

+0

Вы спрашиваете, как это сделать в R или python? Или другое? Вы всегда можете просто заставить свои сгенерированные данные иметь среднее и стандартное отклонение интереса, используя линейное преобразование. – Dason

+0

Также вы просто заинтересованы в том, чтобы сделать это для случая Гаусса или вы хотите сделать это для любого распространения в целом? – Dason

ответ

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

+0

Возможно, покажите умножение и добавление, чтобы получить точный произвольный результат. – John

+0

@flodel: pssh, слишком просто! ;-) –

3

Похоже, вы хотите mvrnorm в пакете MASS.

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 

Обратите внимание, что при выборе SdS из 1 для каждой группы я упростил вещи, потому что ковариация будет равна корреляции, но вы можете обобщить это, помня о том, что корреляция ковариация делится на произведение ПКО.

(обратите внимание, что при запуске кода, который вы не можете получить точные значения, но значения в пределах точности машины ... что все, что мы можем надеяться)

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'. C - преобразование Холецкого V; его можно рассматривать как аналог квадратного корня для (симметричных, положительных полуопределенных) матриц.

Необходимы две из этих преобразований: первый, чтобы установить дисперсию на идентичность, а второй - на нужное значение.

# 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 
Смежные вопросы