如何生成确切的数据?
在R中,我们可以选择使用rnorm
从具有特定特征的人群中进行抽样(例如,均值= 0,sd = 1),但我们如何使用精确地获取数据 mean = 0,sd = 1?
这是一个简单的例子。我也对应用获取精确数据的方法的更一般方法感兴趣(例如,具有0.2的精确相关性的多变量数据)
答案 0 :(得分: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)
多变量案例涉及更多,但可能。
答案 1 :(得分: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的SD,我简化了事物,因为协方差将等于相关性,但您可以通过记住相关性是协方差除以SD的乘积来推广这一点。
(请注意,当您运行代码时,您可能无法获得精确的值,但机器精度范围内的值...这是我们所希望的全部内容)
答案 2 :(得分: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
的Cholesky变换;
它可以看作是平方根的类比
(对称的,正半正定的)矩阵。
实际上需要其中两个转换: 第一个将方差设置为标识,第二个将方差设置为所需的值。
# 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