Cómo generar datos de muestra con momentos exactos.

¿Cómo generar datos exactos?

En R tenemos la opción de usar rnorm para muestrear de una población con ciertas características (por ejemplo, media = 0, sd = 1), pero ¿cómo obtenemos datos con una media exacta = 0, sd = 1?

Este es un ejemplo simple. También estaría interesado en formas más generales de aplicar formas de obtener datos exactos (por ejemplo, datos multivariados con una correlación exacta de 0.2)

Simplemente escala tus resultados. En el caso univariado:

 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) 

El caso multivariado es un poco más complicado, pero es posible.

Parece que quieres mvrnorm en el paquete 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 

Tenga en cuenta que al seleccionar las SD de 1 para cada grupo, simplifiqué las cosas porque la covarianza será igual a la correlación, pero puede generalizar esto recordando que la correlación es la covarianza dividida por el producto de las SD.

(tenga en cuenta que cuando ejecute el código puede que no obtenga los valores exactos sino los valores dentro de la precisión de la máquina ... que es todo lo que podemos esperar)

Simplemente puede volver a escalar los datos.

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

También puede usar ppoints para tener puntos espaciados uniformemente (aunque todavía tiene que volver a escalar).

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

En una dimensión más alta, la transformación es un poco más complicada. Si x es un vector gaussiano, con media cero y varianza la matriz de identidad, entonces C %*% x es gaussiano, con media cero y matriz de varianza V = CC' . C es la transformada de Cholesky de V ; se puede ver como un análogo de la raíz cuadrada para matrices (simétricas, semideterminadas positivas).

Dos de esas transformaciones son realmente necesarias: la primera para establecer la varianza de la identidad, la segunda para establecerla en el valor deseado.

 # 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