Python 如何生成具有精确矩的样本数据
如何生成精确的数据 在R中,我们可以选择使用Python 如何生成具有精确矩的样本数据,python,r,Python,R,如何生成精确的数据 在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 fl
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)
set.seed(21)
x听起来您希望在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
sigma您可以简单地重新缩放数据
n <- 100
x <- rnorm(n)
x <- ( x - mean(x) ) / sd(x)
mean(x) # 0, up to machine precision
sd(x) # 1
在更高的维度中,转换有点棘手。
如果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
#所需方差矩阵
你希望样本平均数与总体平均数完全相等吗?我怀疑这是否可能。您是在问如何在R或python中实现这一点吗?或者两者都有?您可以使用线性变换强制生成的数据具有感兴趣的平均值和标准偏差。您是否只对高斯情况感兴趣,还是希望对任何一般分布进行此操作?@Dason any distribution,在两种语言中。也许显示乘法和加法,然后得到一个精确的任意结果。@flodel:pssh,太简单了!;-)
# 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