2013-04-20 3 views
3

정확한 데이터를 생성하는 방법은 무엇입니까? R에서정확한 순간으로 샘플 데이터를 생성하는 방법

우리는 어떤 특성을 가진 집단 (예를 들어, 평균 = 0, SD = 1), 그러나 우리는 데이터를 얻는 방법을 정확하게 평균 = 0, SD = 1에서 맛볼 수 rnorm를 사용하는 옵션이 있습니다 ?

이것은 간단한 예입니다. 또한 정확한 데이터를 얻는 방법을 적용하는 일반적인 방법에 관심이 있습니다 (예 : 0.2의 정확한 상관 관계가있는 다 변수 데이터).

+0

샘플 평균이 모집단 평균과 정확히 같아지기를 원하십니까? 나는 그것이 가능한지 의심 스럽다. – Nishanth

+0

R 또는 python에서 이것을 수행하는 방법을 묻는 중입니까? 아니면 둘 중 하나? 선형 변환을 사용하여 생성 된 데이터에 평균 및 표준 편차를 적용하도록 할 수 있습니다. – Dason

+0

또한 Gaussian 케이스에 대해서만 관심이 있습니까? 아니면 일반적으로 모든 배포판에 적용하고 싶습니까? – 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을 사용하려는 것 같습니다. 공분산은 상관 동일하지만 당신이 상관 관계가 표준 편차의 곱으로 나눈 공분산임을 기억하여이를 일반화 할 수 있기 때문에 각 그룹에 대해 하나의 표준 편차를 선택하여 내가 일을 단순화하는 것이

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 

참고.

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은 가우시안이며 평균은 0이며 분산 행렬은 V = CC'입니다. C은 Cholesky 변환 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 
관련 문제