繁体   English   中英

如何使用精确时刻生成样本数据

[英]How to generate sample data with exact moments

如何生成确切的数据?

在R中,我们可以选择使用rnorm从具有某些特征的人群中进行采样(例如,均值= 0,sd = 1),但是我们如何获得具有精确均值= 0,sd = 1的数据?

这是一个简单的例子。 我还对应用获取精确数据的方法的更一般方法感兴趣(例如,具有0.2的精确相关性的多变量数据)

只需缩放您的结果。 在单变量情况下:

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)

多变量情况涉及更多,但可能。

听起来你想在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的乘积来推广这一点。

(请注意,当您运行代码时,您可能无法获得精确的值,但机器精度内的值...这是我们所希望的全部)

您只需重新缩放数据即可。

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的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM